From f420c38a32261a0eb07cc29278de3ce044a5ff17 Mon Sep 17 00:00:00 2001 From: Rostyslav Nihrutsa Date: Fri, 16 Jan 2026 15:53:49 +0200 Subject: [PATCH] refactor(Locale): streamline language detection and normalization logic --- src/cli/builders/locale/LocaleBuilder.ts | 11 ++---- src/locale/providers/NativeLocale.ts | 45 ++++++++++++------------ src/locale/utils.ts | 11 ++++++ 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/cli/builders/locale/LocaleBuilder.ts b/src/cli/builders/locale/LocaleBuilder.ts index b1ef72b7..e9fdcd58 100644 --- a/src/cli/builders/locale/LocaleBuilder.ts +++ b/src/cli/builders/locale/LocaleBuilder.ts @@ -43,15 +43,8 @@ export default class LocaleBuilder implements LocaleBuilderContract { } } - if (this.browser === Browser.Opera) { - /** - * The Opera browser does not support RTL languages, - * and for Opera you need to directly indicate what kind of language it is. - * interface language is always different - */ - - items.set(LocaleCustomKeyForLanguage, this.language); - } + // To accurately determine the language that the browser has detected + items.set(LocaleCustomKeyForLanguage, this.language); return (this.items = items); } diff --git a/src/locale/providers/NativeLocale.ts b/src/locale/providers/NativeLocale.ts index c3624977..c621d8ee 100644 --- a/src/locale/providers/NativeLocale.ts +++ b/src/locale/providers/NativeLocale.ts @@ -1,13 +1,10 @@ -import {getI18nMessage, getI18nUILanguage} from "@addon-core/browser"; +import {getI18nMessage} from "@addon-core/browser"; import AbstractLocale from "./AbstractLocale"; -import {convertLocaleKey} from "@locale/utils"; +import {convertLocaleKey, normalizeLocale} from "@locale/utils"; -import {isBrowser} from "@main/env"; - -import {Language, LanguageCodes, LocaleCustomKeyForLanguage, LocaleProvider, LocaleStructure} from "@typing/locale"; -import {Browser} from "@typing/browser"; +import {Language, LocaleCustomKeyForLanguage, LocaleProvider, LocaleStructure} from "@typing/locale"; export interface LocaleNativeStructure extends LocaleStructure {} @@ -18,29 +15,31 @@ export default class NativeLocale extends AbstractLocale return (NativeLocale.instance ??= new NativeLocale()); } - public lang(): Language { - let lang: Language | undefined; - - /** - * The Opera browser does not support RTL languages, - * and for Opera you need to directly indicate what kind of language it is. - * interface language is always different - */ - if (isBrowser(Browser.Opera)) { - lang = getI18nMessage(LocaleCustomKeyForLanguage) as Language; - - if (LanguageCodes.has(lang)) { - return lang; - } - } + private readonly language?: Language; - lang = getI18nUILanguage() as Language; + constructor() { + super(); + + const localeLang = getI18nMessage(LocaleCustomKeyForLanguage); + const lang = normalizeLocale(localeLang); if (!lang) { + console.warn(`Locale Native: Language "${localeLang}" is not supported yet by framework`); + } + + if (localeLang && lang && localeLang !== lang) { + console.info(`Locale Native: Instead of "${localeLang}" language, "${lang}" is used`); + } + + this.language = lang; + } + + public lang(): Language { + if (!this.language) { throw new Error("Locale Native: Unable to get UI language"); } - return lang; + return this.language; } public keys(): Set { diff --git a/src/locale/utils.ts b/src/locale/utils.ts index fa6aad9b..8e8bb564 100644 --- a/src/locale/utils.ts +++ b/src/locale/utils.ts @@ -1,5 +1,6 @@ import { Language, + LanguageCodes, LocaleDir, LocaleKeyMarker, LocaleKeysSeparator, @@ -55,3 +56,13 @@ export const getLocaleDir = (lang: Language): LocaleDir => { export const flattenLocaleMessages = (messages: LocaleMessages): Record => { return Object.fromEntries(Object.entries(messages).map(([key, value]) => [key, value.message])); }; + +export const normalizeLocale = (language?: string): Language | undefined => { + let lang: Language | undefined = language as Language; + + if (lang && !LanguageCodes.has(lang)) { + lang = lang.slice(0, 2) as Language; + } + + return LanguageCodes.has(lang) ? lang : undefined; +};