aboutsummaryrefslogtreecommitdiffstats
path: root/packages/renderer/src/i18n/loadRendererLoalization.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/renderer/src/i18n/loadRendererLoalization.ts')
-rw-r--r--packages/renderer/src/i18n/loadRendererLoalization.ts91
1 files changed, 91 insertions, 0 deletions
diff --git a/packages/renderer/src/i18n/loadRendererLoalization.ts b/packages/renderer/src/i18n/loadRendererLoalization.ts
new file mode 100644
index 0000000..d3ad252
--- /dev/null
+++ b/packages/renderer/src/i18n/loadRendererLoalization.ts
@@ -0,0 +1,91 @@
1/*
2 * Copyright (C) 2021-2022 Kristóf Marussy <kristof@marussy.com>
3 *
4 * This file is part of Sophie.
5 *
6 * Sophie is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as
8 * published by the Free Software Foundation, version 3.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: AGPL-3.0-only
19 */
20
21import { FALLBACK_LOCALE, SophieRenderer } from '@sophie/shared';
22import i18next from 'i18next';
23import { reaction } from 'mobx';
24import { addDisposer } from 'mobx-state-tree';
25import { initReactI18next } from 'react-i18next';
26
27import RendererStore from '../stores/RendererStore.js';
28import { getLogger } from '../utils/log.js';
29
30import RendererIpcI18nBackend from './RendererIpcI18nBackend.js';
31
32const log = getLogger('loadRendererLocalization');
33
34export default function loadRendererLocalization(
35 store: RendererStore,
36 ipc: SophieRenderer,
37 devMode: boolean,
38): void {
39 const loadAsync = async () => {
40 const i18n = i18next
41 .createInstance({
42 lng: store.shared.language,
43 fallbackLng: [FALLBACK_LOCALE],
44 interpolation: {
45 escapeValue: false, // Not needed for react
46 },
47 debug: devMode,
48 saveMissing: devMode,
49 })
50 .use(new RendererIpcI18nBackend(ipc, devMode))
51 .use(initReactI18next);
52
53 if (devMode) {
54 const reloadTranslationsAsync = async () => {
55 await i18n.reloadResources();
56 if (i18n.isInitialized) {
57 // Spuriously change language to re-trigger `useTranslation` hooks.
58 await i18n.changeLanguage(store.shared.language);
59 }
60 log.info('Reloaded translations');
61 };
62
63 ipc.onReloadTranslations(() => {
64 reloadTranslationsAsync().catch((error) => {
65 log.error('Failed to reload translations', error);
66 });
67 });
68 }
69
70 await i18n.init();
71
72 const disposeChangeLanguage = reaction(
73 () => store.shared.language,
74 (languageToSet) => {
75 if (i18n.language !== languageToSet) {
76 i18n.changeLanguage(languageToSet).catch((error) => {
77 log.error('Failed to change language', error);
78 });
79 }
80 },
81 {
82 fireImmediately: true,
83 },
84 );
85 addDisposer(store, disposeChangeLanguage);
86 };
87
88 loadAsync().catch((error) => {
89 log.error('Failed to connect to load localization', error);
90 });
91}