import 'dart:ui'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'language/en_us.dart'; // 英语 import 'language/zh_cn.dart'; // 简体中文 import 'language/es_es.dart'; // 西班牙语 import 'language/zh_hk.dart'; // 繁体中文(香港) import 'language/zh_tw.dart'; // 繁体中文 import 'language/pt_pt.dart'; // 添加葡萄牙语导入 import 'language/ja_jp.dart'; // 添加日语导入 import 'language/ko_kr.dart'; // 添加韩语导入 import 'language/fr_fr.dart'; // 添加法语导入 import 'language/de_de.dart'; // 添加德语导入 import 'language/ru_ru.dart'; // 添加俄语导入 import 'language/vi_vn.dart'; // 添加越南语导入 import 'language/it_it.dart'; // 添加意大利语导入 import 'language/hi_in.dart'; // 添加印度语导入 import 'language/id_id.dart'; // 添加印尼语导入 import 'language/th_Th.dart'; // 添加泰语导入 import 'language/ms_MY.dart'; // 添加马来语导入 import 'language/tr_TR.dart'; // 添加土耳其语导入 import 'language/pl_PL.dart'; // 添加波兰语导入 import 'language/tl_ph.dart'; // 新增菲律宾语导入 import 'language/da_dk.dart'; // 新增丹麦语导入 import 'language/nl_nl.dart'; // 新增荷兰语导入 import 'language/sv_se.dart'; // 新增瑞典语导入 import 'language/fi_fi.dart'; // 新增芬兰语导入 import 'language/cs_cz.dart'; // 新增捷克语导入 import 'language/hu_hu.dart'; // 新增匈牙利语导入 import 'language/nb_no.dart'; // 新增挪威语导入 import 'language/ro_ro.dart'; // 新增罗马尼亚语导入 import 'language/uk_ua.dart'; // 新增乌克兰语导入 import 'language/el_gr.dart'; // 新增希腊语导入 import 'language/bg_bg.dart'; // 新增保加利亚语导入 import 'language/hr_hr.dart'; // 新增克罗地亚语导入 import 'language/sk_sk.dart'; // 新增斯洛伐克语导入 import 'language/sl_si.dart'; // 新增斯洛文尼亚语导入 import 'language/lt_lt.dart'; // 新增立陶宛语导入 import 'language/lv_lv.dart'; // 新增拉脱维亚语导入 import 'language/et_ee.dart'; // 新增爱沙尼亚语导入 import 'language/is_is.dart'; // 新增塞尔维亚语(拉丁)导入 import 'language/sr_rs.dart'; // 新增冰岛语导入 import 'language/ar_sa.dart'; // 新增阿拉伯语导入 import 'language/fa_IR.dart'; // 新增波斯语导入 class AppTranslations extends Translations { static const fallbackLocale = Locale('en', 'US'); /// 智能选择fallback语言 static Locale getSmartFallbackLocale() { // 尝试获取系统语言信息 Locale? systemLocale = Get.deviceLocale; if (systemLocale == null) { return fallbackLocale; } String languageCode = systemLocale.languageCode.toLowerCase(); // 如果是中文,根据地区和脚本选择合适的fallback if (languageCode == 'zh') { String? countryCode = systemLocale.countryCode?.toUpperCase(); String? scriptCode = systemLocale.scriptCode; // 根据地区代码判断 if (countryCode != null) { switch (countryCode) { case 'HK': case 'MO': return const Locale('zh', 'HK'); // 繁体中文fallback case 'TW': return const Locale('zh', 'TW'); // 繁体中文fallback case 'CN': case 'SG': return const Locale('zh', 'CN'); // 简体中文fallback default: return const Locale('zh', 'CN'); // 简体中文fallback } } // 根据脚本代码判断 if (scriptCode == 'Hant') { return const Locale('zh', 'TW'); // 繁体中文fallback } else if (scriptCode == 'Hans') { return const Locale('zh', 'CN'); // 简体中文fallback } } // 对于其他语言,如果支持则使用英语,否则使用默认的中文 if (languageCode == 'en') { return const Locale('en', 'US'); } // 默认使用简体中文 return fallbackLocale; } static final supportedLocales = [ const Locale('zh', 'CN'), // 简体中文 const Locale('zh', 'HK'), // 香港繁体中文 const Locale('zh', 'TW'), // 繁体中文 const Locale('en', 'US'), // 英语 const Locale('es', 'ES'), // 添加西班牙语 const Locale('pt', 'PT'), // 添加葡萄牙语支持 const Locale('ja', 'JP'), // 添加日语支持 const Locale('ko', 'KR'), // 添加韩语支持 const Locale('fr', 'FR'), // 添加法语支持 const Locale('de', 'DE'), // 添加德语支持 const Locale('ru', 'RU'), // 添加俄语支持 const Locale('vi', 'VN'), // 添加越南语支持 const Locale('it', 'IT'), // 添加意大利语支持 const Locale('hi', 'IN'), // 添加印度语支持 const Locale('id', 'ID'), // 添加印尼语支持 const Locale('th', 'TH'), // 添加泰语支持 const Locale('ms', 'MY'), // 添加马来语支持 const Locale('tr', 'TR'), // 添加土耳其语支持 const Locale('pl', 'PL'), // 添加波兰语支持 const Locale('tl', 'PH'), // 添加菲律宾语支持 const Locale('nl', 'NL'), // 荷兰语 const Locale('sv', 'SE'), // 瑞典语 const Locale('da', 'DK'), // 丹麦语 const Locale('fi', 'FI'), // 芬兰语 const Locale('cs', 'CZ'), // 捷克语 const Locale('hu', 'HU'), // 匈牙利语 const Locale('nb', 'NO'), // 挪威语 const Locale('ro', 'RO'), // 罗马尼亚语 const Locale('uk', 'UA'), // 乌克兰语 const Locale('el', 'GR'), // 希腊语 const Locale('bg', 'BG'), // 保加利亚语 const Locale('hr', 'HR'), // 克罗地亚语 const Locale('sk', 'SK'), // 斯洛伐克语 const Locale('sl', 'SI'), // 斯洛文尼亚语 const Locale('lt', 'LT'), // 立陶宛语 const Locale('lv', 'LV'), // 拉脱维亚语 const Locale('et', 'EE'), // 爱沙尼亚语 const Locale('sr', 'RS'), // 塞尔维亚语 const Locale('is', 'IS'), // 新增冰岛语支持 const Locale('ar', 'SA'), // 新增阿拉伯语支持 const Locale('fa', 'IR'), // 新增波斯语支持 ]; /// 语言代码映射表,用于处理各种标准语言代码格式 static final Map _languageCodeMapping = { // 中文简体的各种表示方式 'zh-CN': const Locale('zh', 'CN'), 'zh-Hans': const Locale('zh', 'CN'), 'zh-Hans-CN': const Locale('zh', 'CN'), 'zh-Hans-SG': const Locale('zh', 'CN'), 'zh_CN': const Locale('zh', 'CN'), 'zh_Hans': const Locale('zh', 'CN'), 'zh_Hans_CN': const Locale('zh', 'CN'), // 中文繁体的各种表示方式 'zh-HK': const Locale('zh', 'HK'), 'zh-TW': const Locale('zh', 'TW'), 'zh-Hant': const Locale('zh', 'TW'), 'zh-Hant-HK': const Locale('zh', 'HK'), 'zh-Hant-TW': const Locale('zh', 'TW'), 'zh-Hant-MO': const Locale('zh', 'HK'), 'zh_HK': const Locale('zh', 'HK'), 'zh_TW': const Locale('zh', 'TW'), 'zh_Hant': const Locale('zh', 'TW'), 'zh_Hant_HK': const Locale('zh', 'HK'), 'zh_Hant_TW': const Locale('zh', 'TW'), // 英语的各种表示方式 'en-US': const Locale('en', 'US'), 'en-GB': const Locale('en', 'US'), 'en_US': const Locale('en', 'US'), 'en_GB': const Locale('en', 'US'), // 波斯语(伊朗)的各种表示方式 'fa-IR': const Locale('fa', 'IR'), 'fa_IR': const Locale('fa', 'IR'), 'fa': const Locale('fa', 'IR'), }; static Locale? deviceLocale() { final GetStorage storage = GetStorage(); String? language = storage.read('language'); // print('lxm---系统语言发生变化: --------------------------'); // print('lxm---Get.deviceLocale: ${Get.deviceLocale}'); // print('lxm---Get.locale: ${Get.locale}'); // print('lxm---语言代码: ${Get.deviceLocale?.languageCode}'); // print('lxm---国家代码: ${Get.deviceLocale?.countryCode}'); // print('lxm---脚本代码: ${Get.deviceLocale?.scriptCode}'); // 如果用户手动设置了语言且不是跟随系统 if (language != null && language != 'system') { List languageList = language.split('_'); return Locale(languageList[0], languageList[1]); } // 获取系统语言并进行智能匹配 Locale? systemLocale = Get.deviceLocale; if (systemLocale == null) { return fallbackLocale; } return getMatchedLocale(systemLocale); } /// 智能匹配系统语言到支持的语言 static Locale getMatchedLocale(Locale systemLocale) { String languageCode = systemLocale.languageCode.toLowerCase(); String? countryCode = systemLocale.countryCode?.toUpperCase(); String? scriptCode = systemLocale.scriptCode; // 构建可能的语言代码组合进行匹配 List possibleCodes = []; // 添加完整的语言代码组合 if (scriptCode != null && countryCode != null) { possibleCodes.addAll([ '$languageCode-$scriptCode-$countryCode', '${languageCode}_${scriptCode}_$countryCode', ]); } if (scriptCode != null) { possibleCodes.addAll([ '$languageCode-$scriptCode', '${languageCode}_$scriptCode', ]); } if (countryCode != null) { possibleCodes.addAll([ '$languageCode-$countryCode', '${languageCode}_$countryCode', ]); } // 添加基础语言代码 possibleCodes.add(languageCode); // 尝试从映射表中找到匹配的语言 for (String code in possibleCodes) { if (_languageCodeMapping.containsKey(code)) { return _languageCodeMapping[code]!; } } // 如果映射表中没有找到,使用原有的匹配逻辑 return _fallbackMatchLocale(systemLocale); } /// 备用匹配逻辑 static Locale _fallbackMatchLocale(Locale systemLocale) { String languageCode = systemLocale.languageCode.toLowerCase(); String? countryCode = systemLocale.countryCode?.toUpperCase(); String? scriptCode = systemLocale.scriptCode; // 处理中文的特殊情况 if (languageCode == 'zh') { // 根据国家/地区代码判断 if (countryCode != null) { switch (countryCode) { case 'CN': case 'SG': return const Locale('zh', 'CN'); // 简体中文 case 'HK': case 'MO': return const Locale('zh', 'HK'); // 繁体中文 case 'TW': return const Locale('zh', 'TW'); // 繁体中文 default: // 默认使用简体中文(大陆用户更多) return const Locale('zh', 'CN'); } } // 再根据脚本代码判断简繁体 if (scriptCode != null) { if (scriptCode == 'Hans') { return const Locale('zh', 'CN'); // 简体中文 } else if (scriptCode == 'Hant') { return const Locale('zh', 'TW'); // 繁体中文 } } // 如果没有国家代码,默认使用简体中文 return const Locale('zh', 'CN'); } // 其他语言的匹配逻辑 for (Locale supportedLocale in supportedLocales) { if (supportedLocale.languageCode == languageCode) { // 如果国家代码也匹配,优先使用 if (countryCode != null && supportedLocale.countryCode == countryCode) { return supportedLocale; } // 否则使用第一个匹配的语言 return supportedLocale; } } // 如果没有找到匹配的语言,使用fallback return fallbackLocale; } @override Map> get keys => { 'en_US': enUS, 'zh_CN': zhCN, 'zh_HK': zhHK, // 添加繁体中文映射 'zh_TW': zhTW, // 添加繁体中文映射 'es_ES': esES, // 添加西班牙语翻译映射 'pt_PT': ptPT, // 添加葡萄牙语映射 'ja_JP': jaJP, // 添加日语映射 'ko_KR': koKR, // 添加韩语映射 'fr_FR': frFR, // 添加法语映射 'de_DE': deDE, // 添加德语映射 'ru_RU': ruRU, // 添加俄语映射 'vi_VN': viVN, // 添加越南语映射 'it_IT': itIT, // 添加意大利语映射 'hi_IN': hiIN, // 添加印度语映射 'id_ID': idID, // 添加印尼语映射 'th_TH': thTH, // 添加泰语映射 'ms_MY': msMY, // 添加马来语映射 'tr_TR': trTR, // 添加土耳其语映射 'pl_PL': plPL, // 添加波兰语映射 'tl_PH': tlPH, // 添加菲律宾语映射 'nl_NL': nlNL, // 荷兰语 'sv_SE': svSE, // 瑞典语 'da_DK': daDK, // 丹麦语 'fi_FI': fiFI, // 芬兰语 'cs_CZ': csCZ, // 捷克语 'hu_HU': huHU, // 匈牙利语 'nb_NO': nbNO, // 挪威语 'ro_RO': roRO, // 罗马尼亚语 'uk_UA': ukUA, // 乌克兰语 'el_GR': elGR, // 希腊语 'bg_BG': bgBG, // 保加利亚语 'hr_HR': hrHR, // 克罗地亚语 'sk_SK': skSK, // 斯洛伐克语 'sl_SI': slSI, // 斯洛文尼亚语 'lt_LT': ltLT, // 立陶宛语 'lv_LV': lvLV, // 拉脱维亚语 'et_EE': etEE, // 爱沙尼亚语 'sr_RS': srRS, // 新增塞尔维亚语(拉丁)映射 'is_IS': isIS, // 新增冰岛语映射 'ar_SA': arSA, // 新增阿拉伯语映射 'fa_IR': faIR, // 新增波斯语映射 }; }