diff --git a/electron/createWindow.js b/electron/createWindow.js index 16e98327e..dd7f4d0be 100644 --- a/electron/createWindow.js +++ b/electron/createWindow.js @@ -2,10 +2,10 @@ import { WEBPACK_ELECTRON_PORT } from 'config'; import { app, BrowserWindow, dialog, shell, screen } from 'electron'; import isDev from 'electron-is-dev'; import windowStateKeeper from 'electron-window-state'; +import SUPPORTED_LANGUAGES from 'constants/supported_languages'; import setupBarMenu from './menu/setupBarMenu'; import * as PAGES from '../../ui/constants/pages'; -import setLanguage from './setLanguage'; export default appState => { // Get primary display dimensions from Electron. @@ -86,10 +86,9 @@ export default appState => { deepLinkingURI = ''; } - window.loadURL(rendererURL + deepLinkingURI); setupBarMenu(); - setLanguage(window); + window.loadURL(rendererURL + deepLinkingURI); window.on('close', event => { if (!appState.isQuitting && !appState.autoUpdateAccepted) { @@ -125,12 +124,25 @@ export default appState => { } ); }); + window.once('ready-to-show', () => { window.show(); }); window.webContents.on('did-finish-load', () => { window.webContents.session.setUserAgent(`LBRY/${app.getVersion()}`); + + // restore the user's previous language - we have to do this from here because only electron process can access app.getLocale() + window.webContents.executeJavaScript("localStorage.getItem('language')").then(storedLanguage => { + const language = + storedLanguage && storedLanguage !== 'undefined' && storedLanguage !== 'null' + ? storedLanguage + : app.getLocale().slice(0, 2); + if (language !== 'en' && SUPPORTED_LANGUAGES[language]) { + window.webContents.send('language-set', language); + } + }); + if (isDev) { window.webContents.openDevTools(); } diff --git a/src/platforms/electron/setLanguage.js b/src/platforms/electron/setLanguage.js deleted file mode 100644 index a8db87a0d..000000000 --- a/src/platforms/electron/setLanguage.js +++ /dev/null @@ -1,22 +0,0 @@ -import SUPPORTED_LANGUAGES from '../../ui/constants/supported_languages'; - -export default async function setLanguage(window) { - const storedLanguage = await window.webContents.executeJavaScript("localStorage.getItem('language')"); - const lang = storedLanguage || app.getLocale().slice(0, 2) || 'en'; - const supportedNonEnglish = Object.keys(SUPPORTED_LANGUAGES).filter(language => language !== 'en'); - - if (supportedNonEnglish.includes(lang)) { - fetch('https://lbry.com/i18n/get/lbry-desktop/app-strings/' + lang + '.json') - .then(response => response.json()) - .then(json => { - const messages = {}; - messages[lang] = json; - window.webContents.send('language-set', messages, lang); - }) - .catch(error => { - window.webContents.send('language-set', {}, lang, error); - }); - } else { - window.webContents.send('language-set', {}, lang); - } -} diff --git a/static/app-strings.json b/static/app-strings.json index fd6bb0771..1651d7378 100644 --- a/static/app-strings.json +++ b/static/app-strings.json @@ -860,5 +860,6 @@ "No results for %query%": "No results for %query%", "You haven't downloaded anything from LBRY yet.": "You haven't downloaded anything from LBRY yet.", "Explore new content": "Explore new content", - "Use this address to receive LBC.": "Use this address to receive LBC." + "Use this address to receive LBC.": "Use this address to receive LBC.", + "Embedded": "Embedded" } diff --git a/static/index-electron.html b/static/index-electron.html index 6af12eb1d..dcd2dd244 100644 --- a/static/index-electron.html +++ b/static/index-electron.html @@ -7,22 +7,6 @@
- + diff --git a/static/index-web.html b/static/index-web.html index 3a132c168..31f50570e 100644 --- a/static/index-web.html +++ b/static/index-web.html @@ -24,24 +24,23 @@ document.body.appendChild(script); } - function supportedNonEnglish(language) { - return language === 'pl' || - language === 'id' || - language === 'de' - } - let lang; try { - browserLocale = window.navigator.language.slice(0,2); + const browserLocale = window.navigator.language.slice(0,2); lang = window.localStorage.getItem('language') || browserLocale || 'en'; } catch { lang = 'en'; } - if (lang && supportedNonEnglish(lang)) { + + /*this should match doSetLanguage in action/settings.js*/ + if (lang && lang != 'en') { fetch('https://lbry.com/i18n/get/lbry-desktop/app-strings/' + lang + '.json') .then(r => r.json()) .then(j => { window.i18n_messages[lang] = j; loadUi(); }) - .catch(loadUi); + .catch(() => { + window.localStorage.removeItem('language'); + loadUi(); + }); } else { loadUi(); } diff --git a/ui/component/settingLanguage/index.js b/ui/component/settingLanguage/index.js index c024753ae..e2df344bd 100644 --- a/ui/component/settingLanguage/index.js +++ b/ui/component/settingLanguage/index.js @@ -1,8 +1,7 @@ import { connect } from 'react-redux'; import * as SETTINGS from 'constants/settings'; -import { doSetClientSetting } from 'redux/actions/settings'; +import { doSetLanguage } from 'redux/actions/settings'; import { makeSelectClientSetting } from 'redux/selectors/settings'; -import { doToast } from 'lbry-redux'; import SettingLanguage from './view'; const select = state => ({ @@ -10,8 +9,7 @@ const select = state => ({ }); const perform = dispatch => ({ - setClientSetting: (key, value) => dispatch(doSetClientSetting(key, value)), - showToast: options => dispatch(doToast(options)), + setLanguage: value => dispatch(doSetLanguage(value)), }); export default connect( diff --git a/ui/component/settingLanguage/view.jsx b/ui/component/settingLanguage/view.jsx index df8452bd6..8ef9b9707 100644 --- a/ui/component/settingLanguage/view.jsx +++ b/ui/component/settingLanguage/view.jsx @@ -3,43 +3,27 @@ import React, { useState } from 'react'; import { FormField } from 'component/common/form'; import Spinner from 'component/spinner'; -import { SETTINGS } from 'lbry-redux'; import SUPPORTED_LANGUAGES from '../../constants/supported_languages'; type Props = { language: string, - showToast: ({}) => void, - setClientSetting: (string, boolean) => void, + setLanguage: string => void, }; function SettingLanguage(props: Props) { - const [isFetching, setIsFetching] = useState(false); + const { language, setLanguage } = props; + + const [previousLanguage, setPreviousLanguage] = useState(null); const languages = SUPPORTED_LANGUAGES; - const { language, showToast, setClientSetting } = props; + if (previousLanguage && language !== previousLanguage) { + setPreviousLanguage(null); + } function onLanguageChange(e) { const { value } = e.target; - setIsFetching(true); - - // this should match the behavior/logic in the static index-XXX.html files - fetch('https://lbry.com/i18n/get/lbry-desktop/app-strings/' + value + '.json') - .then(r => r.json()) - .then(j => { - window.i18n_messages[value] = j; - }) - .then(() => { - setIsFetching(false); - window.localStorage.setItem(SETTINGS.LANGUAGE, value); - setClientSetting(SETTINGS.LANGUAGE, value); - }) - .catch(e => { - showToast({ - message: __('Failed to load translations.'), - error: true, - }); - setIsFetching(false); - }); + setPreviousLanguage(language); + setLanguage(value); } return ( @@ -60,7 +44,7 @@ function SettingLanguage(props: Props) { ))} - {isFetching && } + {previousLanguage && } ); } diff --git a/ui/index.jsx b/ui/index.jsx index b874c8000..a913aaba4 100644 --- a/ui/index.jsx +++ b/ui/index.jsx @@ -13,7 +13,7 @@ import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import { doConditionalAuthNavigate, doDaemonReady, doAutoUpdate, doOpenModal, doHideModal } from 'redux/actions/app'; import { Lbry, doToast, isURIValid, setSearchApi } from 'lbry-redux'; -import { doUpdateIsNightAsync } from 'redux/actions/settings'; +import { doSetLanguage, doUpdateIsNightAsync } from 'redux/actions/settings'; import { doAuthenticate, Lbryio, @@ -175,6 +175,10 @@ ipcRenderer.on('open-uri-requested', (event, uri, newSession) => { } }); +ipcRenderer.on('language-set', (event, language) => { + app.store.dispatch(doSetLanguage(language)); +}); + ipcRenderer.on('open-menu', (event, uri) => { if (uri && uri.startsWith('/help')) { app.store.dispatch(push('/$/help')); diff --git a/ui/modal/modalIncompatibleDaemon/view.jsx b/ui/modal/modalIncompatibleDaemon/view.jsx index 7eb63860e..cdda36455 100644 --- a/ui/modal/modalIncompatibleDaemon/view.jsx +++ b/ui/modal/modalIncompatibleDaemon/view.jsx @@ -27,7 +27,10 @@ class ModalIncompatibleDaemon extends React.PureComponent { {__( 'This app is running with an incompatible version of the LBRY protocol. You can still use it, but there may be issues. Re-run the installation package for best results.' )}{' '} -