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:
+72
-29
@@ -235,43 +235,66 @@ export function useI18n() {
|
||||
return DEFAULT_LANGUAGE;
|
||||
}
|
||||
|
||||
if (!ALL_LANGUAGES[browserLanguage]) {
|
||||
const languageKey = getLanguageKeyFromLanguageAlias(browserLanguage);
|
||||
|
||||
if (languageKey) {
|
||||
browserLanguage = languageKey;
|
||||
}
|
||||
// try to match the full browser language tag with full language tag in i18n file
|
||||
if (ALL_LANGUAGES[browserLanguage]) {
|
||||
return browserLanguage;
|
||||
}
|
||||
|
||||
// try to match the full browser language tag with language alias tags in i18n file
|
||||
let alternativeLanguage = getLanguageKeyFromLanguageAlias(browserLanguage);
|
||||
|
||||
if (alternativeLanguage && ALL_LANGUAGES[alternativeLanguage]) {
|
||||
return alternativeLanguage;
|
||||
}
|
||||
|
||||
if (!ALL_LANGUAGES[browserLanguage] && browserLanguage.split('-').length > 1) { // maybe language-script-region
|
||||
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];
|
||||
|
||||
if (!ALL_LANGUAGES[browserLanguage]) {
|
||||
const languageKey = getLanguageKeyFromLanguageAlias(browserLanguage);
|
||||
|
||||
if (languageKey) {
|
||||
browserLanguage = languageKey;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ALL_LANGUAGES[browserLanguage]) {
|
||||
browserLanguage = languageTagParts[0];
|
||||
const languageKey = getLanguageKeyFromLanguageAlias(browserLanguage);
|
||||
|
||||
if (languageKey) {
|
||||
browserLanguage = languageKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ALL_LANGUAGES[browserLanguage]) {
|
||||
return DEFAULT_LANGUAGE;
|
||||
}
|
||||
|
||||
// try to match language tag in language-script / language-region format with full language tag in i18n file
|
||||
if (ALL_LANGUAGES[browserLanguage]) {
|
||||
return browserLanguage;
|
||||
}
|
||||
|
||||
// try to match language tag in language-script / language-region format with language alias tags in i18n file
|
||||
alternativeLanguage = getLanguageKeyFromLanguageAlias(browserLanguage);
|
||||
|
||||
if (alternativeLanguage && ALL_LANGUAGES[alternativeLanguage]) {
|
||||
return alternativeLanguage;
|
||||
}
|
||||
}
|
||||
|
||||
// fallback to use marco language tag
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// 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 {
|
||||
for (const languageKey in ALL_LANGUAGES) {
|
||||
if (!Object.prototype.hasOwnProperty.call(ALL_LANGUAGES, languageKey)) {
|
||||
@@ -299,6 +322,26 @@ export function useI18n() {
|
||||
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 {
|
||||
if (error.errorCode === KnownErrorCode.ApiNotFound && SPECIFIED_API_NOT_FOUND_ERRORS[error.path]) {
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user