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.ts87
1 files changed, 87 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..19d1e2d
--- /dev/null
+++ b/packages/renderer/src/i18n/loadRendererLoalization.ts
@@ -0,0 +1,87 @@
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 { fallbackLng, SophieRenderer } from '@sophie/shared';
22import i18next from 'i18next';
23import { autorun } from 'mobx';
24import { addDisposer } from 'mobx-state-tree';
25import { initReactI18next } from 'react-i18next';
26
27import RendererStore from '../stores/RendererStore';
28import { getLogger } from '../utils/log';
29
30import RendererIpcI18nBackend from './RendererIpcI18nBackend';
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,
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 const disposeChangeLanguage = autorun(() => {
72 const {
73 shared: { language },
74 } = store;
75 if (i18n.language !== language) {
76 i18n.changeLanguage(language).catch((error) => {
77 log.error('Failed to change language', error);
78 });
79 }
80 });
81 addDisposer(store, disposeChangeLanguage);
82 };
83
84 loadAsync().catch((error) => {
85 log.error('Failed to connect to load localization', error);
86 });
87}