diff options
author | Kristóf Marussy <kristof@marussy.com> | 2022-04-03 18:56:00 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2022-05-16 00:54:59 +0200 |
commit | 7a926c4b223c8be46a1defab4a86104d617eaaf9 (patch) | |
tree | 5e50a787397ff72268c22c6dffc67432dc76e184 /packages/renderer | |
parent | fix(main): Inconsistent RendererBridge snapshot (diff) | |
download | sophie-7a926c4b223c8be46a1defab4a86104d617eaaf9.tar.gz sophie-7a926c4b223c8be46a1defab4a86104d617eaaf9.tar.zst sophie-7a926c4b223c8be46a1defab4a86104d617eaaf9.zip |
refactor: Use i18next for language resolution
Due to https://github.com/i18next/i18next/issues/1564 we still have to
implement our own language resolution, but we can rely on
resolvedLanguage to determine which language to pass through to the
renderer.
We will use the language detected by chromium as the system locale, so
there is no need to use os-locale for detection any more.
We use i18next in the main process do resolve the language, then set the
resolve (not requested!) language in the renderer process to avoid doing
resolution twice. This avoids the need in the renderer process to know
the list of supported languages.
We set the language and the writing direction in HTML in the renderer.
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
Diffstat (limited to 'packages/renderer')
-rw-r--r-- | packages/renderer/src/components/ThemeProvider.tsx | 3 | ||||
-rw-r--r-- | packages/renderer/src/i18n/loadRendererLoalization.ts | 27 | ||||
-rw-r--r-- | packages/renderer/src/index.tsx | 9 |
3 files changed, 26 insertions, 13 deletions
diff --git a/packages/renderer/src/components/ThemeProvider.tsx b/packages/renderer/src/components/ThemeProvider.tsx index 18dc2a8..581563b 100644 --- a/packages/renderer/src/components/ThemeProvider.tsx +++ b/packages/renderer/src/components/ThemeProvider.tsx | |||
@@ -30,10 +30,11 @@ import { useStore } from './StoreProvider'; | |||
30 | export default observer( | 30 | export default observer( |
31 | ({ children }: { children: JSX.Element | JSX.Element[] }) => { | 31 | ({ children }: { children: JSX.Element | JSX.Element[] }) => { |
32 | const { | 32 | const { |
33 | shared: { shouldUseDarkColors }, | 33 | shared: { shouldUseDarkColors, writingDirection }, |
34 | } = useStore(); | 34 | } = useStore(); |
35 | 35 | ||
36 | const theme = createTheme({ | 36 | const theme = createTheme({ |
37 | direction: writingDirection, | ||
37 | palette: { | 38 | palette: { |
38 | mode: shouldUseDarkColors ? 'dark' : 'light', | 39 | mode: shouldUseDarkColors ? 'dark' : 'light', |
39 | }, | 40 | }, |
diff --git a/packages/renderer/src/i18n/loadRendererLoalization.ts b/packages/renderer/src/i18n/loadRendererLoalization.ts index b078aeb..4d7b84a 100644 --- a/packages/renderer/src/i18n/loadRendererLoalization.ts +++ b/packages/renderer/src/i18n/loadRendererLoalization.ts | |||
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | import { FALLBACK_LOCALE, SophieRenderer } from '@sophie/shared'; | 21 | import { FALLBACK_LOCALE, SophieRenderer } from '@sophie/shared'; |
22 | import i18next from 'i18next'; | 22 | import i18next from 'i18next'; |
23 | import { autorun } from 'mobx'; | 23 | import { reaction } from 'mobx'; |
24 | import { addDisposer } from 'mobx-state-tree'; | 24 | import { addDisposer } from 'mobx-state-tree'; |
25 | import { initReactI18next } from 'react-i18next'; | 25 | import { initReactI18next } from 'react-i18next'; |
26 | 26 | ||
@@ -68,17 +68,20 @@ export default function loadRendererLocalization( | |||
68 | } | 68 | } |
69 | 69 | ||
70 | await i18n.init(); | 70 | await i18n.init(); |
71 | const disposeChangeLanguage = autorun(() => { | 71 | |
72 | const { | 72 | const disposeChangeLanguage = reaction( |
73 | shared: { language }, | 73 | () => store.shared.language, |
74 | } = store; | 74 | (languageToSet) => { |
75 | if (i18n.language !== language) { | 75 | if (i18n.language !== languageToSet) { |
76 | log.debug('Setting language', language); | 76 | i18n.changeLanguage(languageToSet).catch((error) => { |
77 | i18n.changeLanguage(language).catch((error) => { | 77 | log.error('Failed to change language', error); |
78 | log.error('Failed to change language', error); | 78 | }); |
79 | }); | 79 | } |
80 | } | 80 | }, |
81 | }); | 81 | { |
82 | fireImmediately: true, | ||
83 | }, | ||
84 | ); | ||
82 | addDisposer(store, disposeChangeLanguage); | 85 | addDisposer(store, disposeChangeLanguage); |
83 | }; | 86 | }; |
84 | 87 | ||
diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx index 37116db..60ef714 100644 --- a/packages/renderer/src/index.tsx +++ b/packages/renderer/src/index.tsx | |||
@@ -56,6 +56,15 @@ if (isDevelopment) { | |||
56 | 56 | ||
57 | loadRendererLocalization(store, ipc, isDevelopment); | 57 | loadRendererLocalization(store, ipc, isDevelopment); |
58 | 58 | ||
59 | const disposeSetHtmlLang = autorun(() => { | ||
60 | const { | ||
61 | shared: { language, writingDirection }, | ||
62 | } = store; | ||
63 | document.documentElement.lang = language; | ||
64 | document.documentElement.dir = writingDirection; | ||
65 | }); | ||
66 | addDisposer(store, disposeSetHtmlLang); | ||
67 | |||
59 | const disposeSetTitle = autorun(() => { | 68 | const disposeSetTitle = autorun(() => { |
60 | const titlePrefix = isDevelopment ? '[dev] ' : ''; | 69 | const titlePrefix = isDevelopment ? '[dev] ' : ''; |
61 | const serviceTitle = store.settings.selectedService?.title; | 70 | const serviceTitle = store.settings.selectedService?.title; |