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

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, // 新增波斯语映射
};
}