import { createI18n } from "vue-i18n";
import en from "./en.json";
import ru from "./ru.json";
import uk from "./uk.json";
const STORAGE_KEY = "ltt.locale";
export const SUPPORTED_LOCALES = ["en", "ru", "uk"] as const;
export type Locale = (typeof SUPPORTED_LOCALES)[number];
/** Slavic three-form plural: one / few (2-4) / many — shared by ru and uk. */
function slavicPluralRules(choice: number, choicesLength: number): number {
const mod10 = choice % 10;
const mod100 = choice % 100;
if (mod10 === 1 && mod100 !== 11) return 0;
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) {
return Math.min(1, choicesLength - 1);
}
return choicesLength - 1;
}
function initialLocale(): Locale {
try {
const saved = localStorage.getItem(STORAGE_KEY) as Locale | null;
if (saved && SUPPORTED_LOCALES.includes(saved)) return saved;
} catch {
/* storage unavailable */
}
const nav = navigator.language.slice(0, 2);
return SUPPORTED_LOCALES.includes(nav as Locale) ? (nav as Locale) : "en";
}
export const i18n = createI18n({
legacy: false,
locale: initialLocale(),
fallbackLocale: "en",
messages: { en, ru, uk },
// vue-i18n's default rule is English-only; without this, Russian and
// Ukrainian plurals like "1 проекта" come out wrong
pluralRules: {
ru: slavicPluralRules,
uk: slavicPluralRules,
},
});
export function setLocale(locale: Locale) {
i18n.global.locale.value = locale;
try {
localStorage.setItem(STORAGE_KEY, locale);
} catch {
/* storage unavailable */
}
}