1- import { getI18nMessage , getI18nUILanguage } from "@addon-core/browser" ;
1+ import { getI18nMessage } from "@addon-core/browser" ;
22
33import AbstractLocale from "./AbstractLocale" ;
44
5- import { convertLocaleKey } from "@locale/utils" ;
5+ import { convertLocaleKey , resolveLanguage } from "@locale/utils" ;
66
7- import { isBrowser } from "@main/env" ;
8-
9- import { Language , LanguageCodes , LocaleCustomKeyForLanguage , LocaleProvider , LocaleStructure } from "@typing/locale" ;
10- import { Browser } from "@typing/browser" ;
7+ import { Language , LocaleCustomKeyForLanguage , LocaleProvider , LocaleStructure } from "@typing/locale" ;
118
129export interface LocaleNativeStructure extends LocaleStructure { }
1310
@@ -18,37 +15,47 @@ export default class NativeLocale extends AbstractLocale<LocaleNativeStructure>
1815 return ( NativeLocale . instance ??= new NativeLocale ( ) ) ;
1916 }
2017
21- public lang ( ) : Language {
22- let lang : Language | undefined ;
18+ private readonly language ?: Language ;
19+
20+ constructor ( ) {
21+ super ( ) ;
2322
2423 /**
25- * The Opera browser does not support RTL languages,
26- * and for Opera you need to directly indicate what kind of language it is.
27- * interface language is always different
24+ Locale detection note:
25+ Chrome does NOT expose an API to get the effective translation locale.
26+ getUILanguage() returns browser UI language (e.g., es-MX),
27+ even if extension translations fall back to default_locale (e.g., en).
28+ To detect the actual language used by i18n, we read a locale marker
29+ from messages.json via chrome.i18n.getMessage().
2830 */
29- if ( isBrowser ( Browser . Opera ) ) {
30- lang = getI18nMessage ( LocaleCustomKeyForLanguage ) as Language ;
31+ const markerLang = getI18nMessage ( LocaleCustomKeyForLanguage ) ;
32+ const resolvedLang = resolveLanguage ( markerLang ) ;
3133
32- if ( LanguageCodes . has ( lang ) ) {
33- return lang ;
34- }
34+ if ( ! resolvedLang ) {
35+ console . warn ( `[NativeLocale] Unsupported language detected: "${ markerLang } ".` ) ;
3536 }
3637
37- lang = getI18nUILanguage ( ) as Language ;
38+ if ( markerLang && resolvedLang && markerLang !== resolvedLang ) {
39+ console . info ( `[NativeLocale] Language normalized: using "${ resolvedLang } " instead of "${ markerLang } ".` ) ;
40+ }
3841
39- if ( ! lang ) {
40- throw new Error ( "Locale Native: Unable to get UI language" ) ;
42+ this . language = resolvedLang ;
43+ }
44+
45+ public lang ( ) : Language {
46+ if ( ! this . language ) {
47+ throw new Error ( "[NativeLocale] Language is not defined. Failed to determine a supported locale." ) ;
4148 }
4249
43- return lang ;
50+ return this . language ;
4451 }
4552
4653 public keys ( ) : Set < keyof LocaleNativeStructure > {
4754 try {
4855 // @ts -expect-error: __ADNBN_LOCALE_KEYS__ is a virtual variable generated by the bundler `src/cli/plugins/locale/index.ts`
4956 return new Set < string > ( __ADNBN_LOCALE_KEYS__ ) ;
5057 } catch ( e ) {
51- console . error ( "Locale Native: Unable to get keys" , e ) ;
58+ console . error ( "[NativeLocale] Failed to access locale keys. Ensure the bundler plugin is active. " , e ) ;
5259
5360 return new Set < string > ( ) ;
5461 }
@@ -59,7 +66,7 @@ export default class NativeLocale extends AbstractLocale<LocaleNativeStructure>
5966 // @ts -expect-error: __ADNBN_DEFINED_LOCALES__ is a virtual variable generated by the bundler `src/cli/plugins/locale/index.ts`
6067 return new Set < Language > ( __ADNBN_DEFINED_LOCALES__ ) ;
6168 } catch ( e ) {
62- console . error ( "Locale Native: Unable to get defined locales" , e ) ;
69+ console . error ( "[NativeLocale] Failed to access defined locales. Check virtual variables configuration. " , e ) ;
6370
6471 return new Set < Language > ( ) ;
6572 }
0 commit comments