You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
349 lines
13 KiB
349 lines
13 KiB
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<String, Locale> _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<String> 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<String, Map<String, String>> 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, // 新增波斯语映射
|
|
};
|
|
}
|
|
|