Fix language detection

This commit is contained in:
Samuel Elliott 2023-01-29 12:43:58 +00:00
parent f94bf1c221
commit 4dc85dace9
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
6 changed files with 20 additions and 31 deletions

19
package-lock.json generated
View File

@ -58,7 +58,6 @@
"electron": "^21.3.1",
"electron-builder": "^23.6.0",
"i18next": "^22.4.6",
"i18next-browser-languagedetector": "^7.0.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-i18next": "^12.1.1",
@ -2785,15 +2784,6 @@
"@babel/runtime": "^7.20.6"
}
},
"node_modules/i18next-browser-languagedetector": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz",
"integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.19.4"
}
},
"node_modules/iconv-corefoundation": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
@ -6892,15 +6882,6 @@
"@babel/runtime": "^7.20.6"
}
},
"i18next-browser-languagedetector": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz",
"integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==",
"dev": true,
"requires": {
"@babel/runtime": "^7.19.4"
}
},
"iconv-corefoundation": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",

View File

@ -81,7 +81,6 @@
"electron": "^21.3.1",
"electron-builder": "^23.6.0",
"i18next": "^22.4.6",
"i18next-browser-languagedetector": "^7.0.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-i18next": "^12.1.1",

View File

@ -3,7 +3,6 @@ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } fro
import { ColorSchemeName, I18nManager, LayoutChangeEvent, Platform, StyleProp, StyleSheet, useColorScheme, View, ViewStyle } from 'react-native';
import { i18n } from 'i18next';
import { I18nextProvider, initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import type { User as DiscordUser } from 'discord-rpc';
import { ErrorResponse } from '../../api/util.js';
import { DiscordPresence } from '../../discord/types.js';
@ -49,10 +48,11 @@ export function Root(props: React.PropsWithChildren<{
// @ts-expect-error
window.i18n = i18n;
await i18n
.use(LanguageDetector as unknown as typeof import('i18next-browser-languagedetector').default)
.use(initReactI18next)
.init();
i18n.use(initReactI18next);
await i18n.init({
lng: ipc.getLanguage(),
});
await i18n.loadNamespaces('app');
if (props.i18nNamespace) await i18n.loadNamespaces(props.i18nNamespace);

View File

@ -21,7 +21,7 @@ import { askUserForUri } from './util.js';
import { setAppInstance, updateMenuLanguage } from './app-menu.js';
import { handleAuthUri } from './na-auth.js';
import { CREDITS_NOTICE, GITLAB_URL, LICENCE_NOTICE } from '../../common/constants.js';
import createI18n from '../i18n/index.js';
import createI18n, { languages } from '../i18n/index.js';
const debug = createDebug('app:main');
@ -131,11 +131,13 @@ export class App {
}
static detectSystemLanguage() {
const languages = app.getPreferredSystemLanguages().map(l => l.toLowerCase());
const preferred = app.getPreferredSystemLanguages().map(l => l.toLowerCase());
const supported = Object.keys(languages).map(l => l.toLowerCase());
for (const language of languages) {
if (supported.some(l => language.startsWith(l) || l.startsWith(language))) return language;
debug('prefers %O, supports %O', preferred, supported);
for (const language of preferred) {
if (supported.some(l => language.startsWith(l) || l.startsWith(language))) return language;
}
return null;

View File

@ -28,6 +28,7 @@ export function setupIpc(appinstance: App, ipcMain: IpcMain) {
const t = appinstance.i18n.getFixedT(null, 'menus');
ipcMain.on('nxapi:browser:getwindowdata', e => e.returnValue = getWindowConfiguration(e.sender));
ipcMain.on('nxapi:app:language', e => e.returnValue = appinstance.i18n.resolvedLanguage ?? appinstance.i18n.language);
let accent_colour = systemPreferences.getAccentColor?.() || undefined;

View File

@ -82,6 +82,7 @@ const ipc = {
registerEventListener: (event: string, listener: (args: any[]) => void) => events.on(event, listener),
removeEventListener: (event: string, listener: (args: any[]) => void) => events.removeListener(event, listener),
getLanguage: () => language,
getAccentColour: () => accent_colour,
platform: process.platform,
@ -89,15 +90,20 @@ const ipc = {
export type NxapiElectronIpc = typeof ipc;
ipcRenderer.on('nxapi:app:update-language', (e, l: string) => events.emit('update-language', l));
ipcRenderer.on('nxapi:window:refresh', () => events.emit('window:refresh') || location.reload());
ipcRenderer.on('nxapi:accounts:shouldrefresh', () => events.emit('update-nintendo-accounts'));
ipcRenderer.on('nxapi:discord:shouldrefresh', () => events.emit('update-discord-presence-source'));
ipcRenderer.on('nxapi:discord:presence', (e, p: DiscordPresence) => events.emit('update-discord-presence', p));
ipcRenderer.on('nxapi:discord:user', (e, u: User) => events.emit('update-discord-user', u));
let language: string | undefined = invSync('app:language');
ipcRenderer.on('nxapi:app:update-language', (event, l: string) => {
language = l;
events.emit('update-language', l);
});
let accent_colour: string | undefined = invSync('systemPreferences:accent-colour');
ipcRenderer.on('nxapi:systemPreferences:accent-colour', (event, c) => {
ipcRenderer.on('nxapi:systemPreferences:accent-colour', (event, c: string) => {
accent_colour = c;
events.emit('systemPreferences:accent-colour', c);
});