Fix some fluent stuff (#447)

This commit is contained in:
Uriel
2023-01-04 19:17:12 -03:00
committed by GitHub
parent 2450bb0abe
commit 3826a49837
2 changed files with 30 additions and 7 deletions

View File

@@ -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);

View File

@@ -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]);