mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Fix some fluent stuff (#447)
This commit is contained in:
@@ -12,16 +12,25 @@
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const fs = require('fs');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const path = require('path');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const process = require('process');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { execSync } = require('child_process');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { FluentBundle, FluentResource } = require('@fluent/bundle');
|
||||
|
||||
const PATH = '../public/i18n';
|
||||
const PATH = path.join(
|
||||
execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim(),
|
||||
'gui/public/i18n'
|
||||
);
|
||||
|
||||
const langs = fs.readdirSync(PATH).filter((x) => x !== 'en');
|
||||
const en = new FluentBundle('en');
|
||||
const enErrors = en.addResource(
|
||||
new FluentResource(fs.readFileSync(`${PATH}/en/translation.ftl`, 'utf-8'))
|
||||
new FluentResource(
|
||||
fs.readFileSync(path.join(PATH, 'en/translation.ftl'), 'utf-8')
|
||||
)
|
||||
);
|
||||
if (enErrors.length) {
|
||||
for (const error of enErrors) {
|
||||
@@ -34,7 +43,7 @@ const requiredMessages = [...en._messages.keys()];
|
||||
process.exitCode = 0;
|
||||
for (const lang of langs) {
|
||||
const resource = new FluentResource(
|
||||
fs.readFileSync(`${PATH}/${lang}/translation.ftl`, 'utf-8')
|
||||
fs.readFileSync(path.join(PATH, lang, 'translation.ftl'), 'utf-8')
|
||||
);
|
||||
const bundle = new FluentBundle(lang);
|
||||
const errors = bundle.addResource(resource);
|
||||
|
||||
@@ -70,6 +70,17 @@ function* lazilyParsedBundles(fetchedMessages: [string, string][]) {
|
||||
}
|
||||
}
|
||||
|
||||
function verifyLocale(locale: string | null): string | null {
|
||||
if (!locale) return null;
|
||||
try {
|
||||
new Intl.Locale(locale);
|
||||
return locale;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface AppLocalizationProviderProps {
|
||||
children: ReactNode;
|
||||
}
|
||||
@@ -85,21 +96,24 @@ export function AppLocalizationProvider(props: AppLocalizationProviderProps) {
|
||||
|
||||
async function changeLocales(userLocales: string[]) {
|
||||
const currentLocale = match(
|
||||
userLocales,
|
||||
userLocales.filter((x) => verifyLocale(x) !== null),
|
||||
langs.map((x) => x.key),
|
||||
DEFAULT_LOCALE
|
||||
);
|
||||
setCurrentLocales([currentLocale]);
|
||||
|
||||
const fetchedMessages = await fetchMessages(currentLocale);
|
||||
const fetchedMessages = [
|
||||
await fetchMessages(currentLocale),
|
||||
await fetchMessages(DEFAULT_LOCALE),
|
||||
];
|
||||
|
||||
const bundles = lazilyParsedBundles([fetchedMessages]);
|
||||
const bundles = lazilyParsedBundles(fetchedMessages);
|
||||
localStorage.setItem('i18nextLng', currentLocale);
|
||||
setL10n(new ReactLocalization(bundles));
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const lang = localStorage.getItem('i18nextLng');
|
||||
const lang = verifyLocale(localStorage.getItem('i18nextLng'));
|
||||
const array = [];
|
||||
if (lang) array.push(lang);
|
||||
changeLocales([...array, ...navigator.languages]);
|
||||
|
||||
Reference in New Issue
Block a user