diff --git a/src/public/app/services/i18n.ts b/src/public/app/services/i18n.ts index 449381f06..20ac6e286 100644 --- a/src/public/app/services/i18n.ts +++ b/src/public/app/services/i18n.ts @@ -1,10 +1,21 @@ import options from "./options.js"; import i18next from "i18next"; import i18nextHttpBackend from "i18next-http-backend"; +import server from "./server.js"; + +let locales: Locale[] | null; + +// TODO: Deduplicate with server. +export interface Locale { + id: string; + name: string; +} export async function initLocale() { const locale = (options.get("locale") as string) || "en"; + locales = await server.get("options/locales"); + await i18next.use(i18nextHttpBackend).init({ lng: locale, fallbackLng: "en", @@ -15,5 +26,13 @@ export async function initLocale() { }); } +export function getAvailableLocales() { + if (!locales) { + throw new Error("Tried to load list of locales, but localization is not yet initialized."); + } + + return locales; +} + export const t = i18next.t; export const getCurrentLanguage = () => i18next.language; diff --git a/src/public/app/widgets/note_language.ts b/src/public/app/widgets/note_language.ts index 9fd9bcfbe..6ff0bfd18 100644 --- a/src/public/app/widgets/note_language.ts +++ b/src/public/app/widgets/note_language.ts @@ -1,5 +1,6 @@ import { Dropdown } from "bootstrap"; import NoteContextAwareWidget from "./note_context_aware_widget.js"; +import { getAvailableLocales, type Locale } from "../services/i18n.js"; const TPL = `\ `; -// TODO: Deduplicate with server. -export interface Locale { - id: string; - name: string; -} - export default class LocalizationOptions extends OptionsWidget { private $localeSelect!: JQuery; @@ -53,7 +47,7 @@ export default class LocalizationOptions extends OptionsWidget { } async optionsLoaded(options: OptionMap) { - const availableLocales = await server.get("options/locales"); + const availableLocales = getAvailableLocales(); this.$localeSelect.empty(); for (const locale of availableLocales) { diff --git a/src/public/app/widgets/type_widgets/options/i18n/language.ts b/src/public/app/widgets/type_widgets/options/i18n/language.ts index 52f420077..b2b19b258 100644 --- a/src/public/app/widgets/type_widgets/options/i18n/language.ts +++ b/src/public/app/widgets/type_widgets/options/i18n/language.ts @@ -1,7 +1,6 @@ import OptionsWidget from "../options_widget.js"; import type { OptionMap } from "../../../../../../services/options_interface.js"; -import server from "../../../../services/server.js"; -import type { Locale } from "../appearance/i18n.js"; +import { getAvailableLocales } from "../../../../services/i18n.js"; const TPL = `
@@ -42,7 +41,7 @@ export default class LanguageOptions extends OptionsWidget { } async optionsLoaded(options: OptionMap) { - const availableLocales = await server.get("options/locales"); + const availableLocales = getAvailableLocales(); const enabledLanguages = (JSON.parse(options.languages) as string[]); this.$languagesContainer.empty();