diff --git a/lib/lang.js b/lib/lang.js index 61285514..64069b0c 100644 --- a/lib/lang.js +++ b/lib/lang.js @@ -22,34 +22,36 @@ export default lang /** * 获取当前语言字典 + * 提升兼容性 * @returns 不同语言对应字典 */ export function generateLocaleDict(langString) { - let userLocale = lang['en-US'] + const supportedLocales = Object.keys(lang) + let userLocale - switch (langString.toLowerCase()) { - case 'zh-cn': - case 'zh-sg': - userLocale = lang['zh-CN'] - break - case 'zh-hk': - userLocale = lang['zh-HK'] - break - case 'zh-tw': - userLocale = lang['zh-TW'] - break - case 'fr': - userLocale = lang['fr-FR'] - break - case 'tr': - userLocale = lang['tr-TR'] - break - case 'ja': - userLocale = lang['ja-JP'] - break - default: - userLocale = lang['en-US'] + // 将语言字符串拆分为语言和地区代码,例如将 "zh-CN" 拆分为 "zh" 和 "CN" + const [language, region] = langString.split(/[-_]/) + + // 优先匹配语言和地区都匹配的情况 + const specificLocale = `${language}-${region}` + if (supportedLocales.includes(specificLocale)) { + userLocale = lang[specificLocale] } + + // 然后尝试匹配只有语言匹配的情况 + if (!userLocale) { + const languageOnlyLocales = supportedLocales.filter(locale => locale.startsWith(language)) + if (languageOnlyLocales.length > 0) { + userLocale = lang[languageOnlyLocales[0]] + } + } + + // 如果还没匹配到,则返回最接近的语言包 + if (!userLocale) { + const fallbackLocale = supportedLocales.find(locale => locale.startsWith('en')) + userLocale = lang[fallbackLocale] + } + return mergeDeep({}, lang['en-US'], userLocale) }