use the macro language tag to match the i18n file when the browser language tag cannot match any i18n files

This commit is contained in:
MaysWind
2025-06-22 18:53:25 +08:00
parent 481618037d
commit a69db9d299
+66 -23
View File
@@ -235,41 +235,64 @@ export function useI18n() {
return DEFAULT_LANGUAGE; return DEFAULT_LANGUAGE;
} }
if (!ALL_LANGUAGES[browserLanguage]) { // try to match the full browser language tag with full language tag in i18n file
const languageKey = getLanguageKeyFromLanguageAlias(browserLanguage); if (ALL_LANGUAGES[browserLanguage]) {
return browserLanguage;
if (languageKey) {
browserLanguage = languageKey;
}
} }
if (!ALL_LANGUAGES[browserLanguage] && browserLanguage.split('-').length > 1) { // maybe language-script-region // try to match the full browser language tag with language alias tags in i18n file
const languageTagParts = browserLanguage.split('-'); let alternativeLanguage = getLanguageKeyFromLanguageAlias(browserLanguage);
if (alternativeLanguage && ALL_LANGUAGES[alternativeLanguage]) {
return alternativeLanguage;
}
const languageTagParts = browserLanguage.split('-');
// maybe browser language is language-script-region format
if (languageTagParts.length > 2) {
// fallback to use language tag with language-script / language-region format
browserLanguage = languageTagParts[0] + '-' + languageTagParts[1]; browserLanguage = languageTagParts[0] + '-' + languageTagParts[1];
if (!ALL_LANGUAGES[browserLanguage]) { // try to match language tag in language-script / language-region format with full language tag in i18n file
const languageKey = getLanguageKeyFromLanguageAlias(browserLanguage); if (ALL_LANGUAGES[browserLanguage]) {
return browserLanguage;
if (languageKey) {
browserLanguage = languageKey;
}
} }
if (!ALL_LANGUAGES[browserLanguage]) { // try to match language tag in language-script / language-region format with language alias tags in i18n file
browserLanguage = languageTagParts[0]; alternativeLanguage = getLanguageKeyFromLanguageAlias(browserLanguage);
const languageKey = getLanguageKeyFromLanguageAlias(browserLanguage);
if (languageKey) { if (alternativeLanguage && ALL_LANGUAGES[alternativeLanguage]) {
browserLanguage = languageKey; return alternativeLanguage;
}
} }
} }
if (!ALL_LANGUAGES[browserLanguage]) { // fallback to use marco language tag
return DEFAULT_LANGUAGE; if (languageTagParts.length > 1) {
browserLanguage = languageTagParts[0];
// try to match marco language tag with full language tag in i18n file
if (ALL_LANGUAGES[browserLanguage]) {
return browserLanguage;
}
// try to match marco language tag with language alias tags in i18n file
alternativeLanguage = getLanguageKeyFromLanguageAlias(browserLanguage);
if (alternativeLanguage && ALL_LANGUAGES[alternativeLanguage]) {
return alternativeLanguage;
}
} }
return browserLanguage; // fallback to match marco language tag with marco language tag in i18n file
alternativeLanguage = getLanguageKeyFromMarcoLanguageTag(browserLanguage);
if (alternativeLanguage && ALL_LANGUAGES[alternativeLanguage]) {
return alternativeLanguage;
}
// fallback to use the default language
return DEFAULT_LANGUAGE;
} }
function getLanguageKeyFromLanguageAlias(alias: string): string | null { function getLanguageKeyFromLanguageAlias(alias: string): string | null {
@@ -299,6 +322,26 @@ export function useI18n() {
return null; return null;
} }
function getLanguageKeyFromMarcoLanguageTag(languageTag: string): string | null {
for (const languageKey in ALL_LANGUAGES) {
if (!Object.prototype.hasOwnProperty.call(ALL_LANGUAGES, languageKey)) {
continue;
}
if (languageKey.indexOf('-') < 0) {
continue;
}
const marcoLanguageTag = languageKey.split('-')[0];
if (marcoLanguageTag.toLowerCase() === languageTag.toLowerCase()) {
return languageKey;
}
}
return null;
}
function getLocalizedError(error: ErrorResponse): LocalizedError { function getLocalizedError(error: ErrorResponse): LocalizedError {
if (error.errorCode === KnownErrorCode.ApiNotFound && SPECIFIED_API_NOT_FOUND_ERRORS[error.path]) { if (error.errorCode === KnownErrorCode.ApiNotFound && SPECIFIED_API_NOT_FOUND_ERRORS[error.path]) {
return { return {