Files
directus/app/src/lang/set-language.ts
Azri Kahar 1c93cc661e Reduce translate function calls in the App (#16038)
* translate fields during hydration

* patch untranslated raw values on field edit

* simplify/remove existing translate usages

* minor codestyle

* translate field note and validation_message

* stub api call in fleld-detail store test

* skip fields translation before user locale sets in

* optimize hydration calls

* use translateLiteral for note & validation_message

* cherry pick field meta properties to patch

* reduce setLanguage calls & settings requests

* settings store test & type update

* tweak variable casing

* test server store & fix existing type/ref issues

* update fields store test for skipTranslation

* fix render-display merge

* await field update before opening drawer

* fetch meta at the end to load relationships first

* add loading state to prevent editing some fields

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
2022-11-30 13:33:31 +01:00

41 lines
1.4 KiB
TypeScript

import { useCollectionsStore } from '@/stores/collections';
import { useFieldsStore } from '@/stores/fields';
import availableLanguages from './available-languages.yaml';
import { i18n, Language, loadedLanguages } from './index';
import { useTranslationStrings } from '@/composables/use-translation-strings';
import { loadDateFNSLocale } from '@/utils/get-date-fns-locale';
export async function setLanguage(lang: Language): Promise<boolean> {
const collectionsStore = useCollectionsStore();
const fieldsStore = useFieldsStore();
const { mergeTranslationStringsForLanguage } = useTranslationStrings();
if (Object.keys(availableLanguages).includes(lang) === false) {
// eslint-disable-next-line no-console
console.warn(`"${lang}" is not an available language in the Directus app.`);
} else {
if (loadedLanguages.includes(lang) === false) {
try {
const { default: translations } = await import(`./translations/${lang}.yaml`);
i18n.global.mergeLocaleMessage(lang, translations);
loadedLanguages.push(lang);
} catch (err: any) {
// eslint-disable-next-line no-console
console.warn(err);
}
}
i18n.global.locale.value = lang;
(document.querySelector('html') as HTMLElement).setAttribute('lang', lang);
}
mergeTranslationStringsForLanguage(lang);
collectionsStore.translateCollections();
fieldsStore.translateFields();
await loadDateFNSLocale(lang);
return true;
}