import 'package:flutter/material.dart'; import 'package:get/get.dart'; // import 'package:google_fonts/google_fonts.dart'; import '../../app/data/sp/ix_sp.dart'; import 'ar_AR/ar_ar_translation.dart'; import 'en_US/en_us_translation.dart'; import 'es_ES/es_es_translation.dart'; import 'my_MM/my_mm_translation.dart'; import 'fa_IR/fa_ir_translation.dart'; import 'de_DE/de_de_translation.dart'; import 'ja_JP/ja_jp_translation.dart'; import 'fr_FR/fr_fr_translation.dart'; import 'ru_RU/ru_ru_translation.dart'; import 'ko_KR/ko_kr_translation.dart'; import 'zh_TW/zh_tw_translation.dart'; import 'zh_CN/zh_cn_translation.dart'; import 'tk_TM/tk_tm_translation.dart'; import 'pt_BR/pt_br_translation.dart'; import 'vi_VN/vi_vn_translation.dart'; import 'id_ID/id_id_translation.dart'; import 'tl_PH/tl_ph_translation.dart'; import 'th_TH/th_th_translation.dart'; import 'hi_IN/hi_in_translation.dart'; import 'tr_TR/tr_tr_translation.dart'; import 'strings_enum.dart'; class LocalizationService extends Translations { // prevent creating instance LocalizationService._(); static LocalizationService? _instance; static LocalizationService getInstance() { _instance ??= LocalizationService._(); return _instance!; } // 根据系统语言获取默认语言 static Locale getDefaultLanguage() { // 获取系统语言代码 final String deviceLanguage = WidgetsBinding.instance.platformDispatcher.locale.languageCode; // 检查系统语言是否在支持的语言列表中 if (isLanguageSupported(deviceLanguage)) { return supportedLanguages[deviceLanguage]!; } // 如果系统语言不受支持,则返回英语作为默认语言 return supportedLanguages['en']!; } // 获取系统国家 static String getSystemCountry() { return WidgetsBinding.instance.platformDispatcher.locale.countryCode ?? ''; } // default language // todo change the default language static Locale defaultLanguage = getDefaultLanguage(); static final all = [ const Locale('en'), // 英语 // const Locale('es'), // 西班牙语 // const Locale('ar'), // 阿拉伯语 // const Locale('de'), // 德语 // const Locale('ja'), // 日语 // const Locale('fr'), // 法语 // const Locale('ru'), // 俄语 // const Locale('ko'), // 韩语 // const Locale('fa'), // 波斯语 // const Locale('my'), // 缅甸语 // const Locale('zh', 'TW'), // 繁体中文 // const Locale('zh', 'CN'), // 简体中文 // const Locale('tk'), // 土库曼语 // const Locale('pt', 'BR'), // 葡萄牙语-巴西 // const Locale('vi'), // 越南语 // const Locale('id'), // 印尼语 // const Locale('tl'), // 菲律宾语 // const Locale('th'), // 泰语 // const Locale('hi'), // 印地语 // const Locale('tr'), // 土耳其语 ]; // supported languages static Map supportedLanguages = { 'en': const Locale('en', 'US'), // 'es': const Locale('es', 'ES'), // 'ar': const Locale('ar', 'AR'), // 'de': const Locale('de', 'DE'), // 'ja': const Locale('ja', 'JP'), // 'fr': const Locale('fr', 'FR'), // 'ru': const Locale('ru', 'RU'), // 'ko': const Locale('ko', 'KR'), // 'fa': const Locale('fa', 'IR'), // 'my': const Locale('my', 'MM'), 'zh': const Locale('zh', 'CN'), // 默认简体中文(系统语言检测用) // 'zh_TW': const Locale('zh', 'TW'), // 繁体中文 'zh_CN': const Locale('zh', 'CN'), // 简体中文(语言选择器用) // 'tk': const Locale('tk', 'TM'), // 'pt': const Locale('pt', 'BR'), // 'vi': const Locale('vi', 'VN'), // 'id': const Locale('id', 'ID'), // 'tl': const Locale('tl', 'PH'), // 'th': const Locale('th', 'TH'), // 'hi': const Locale('hi', 'IN'), // 'tr': const Locale('tr', 'TR'), }; // supported languages fonts family (must be in assets & pubspec yaml) or you can use google fonts static Map supportedLanguagesFontsFamilies = { // 'en': GoogleFonts.poppins(), // 'es': GoogleFonts.poppins(), // 'ar': GoogleFonts.cairo(), // 'fa': GoogleFonts.vazirmatn(), // 'my': GoogleFonts.notoSansMyanmar(), 'en': const TextStyle(fontFamily: 'Inter'), // 'es': const TextStyle(fontFamily: 'FiraSans'), // 'ar': const TextStyle(fontFamily: 'Vazirmatn'), // 'de': const TextStyle(fontFamily: 'FiraSans'), // 'ja': const TextStyle(fontFamily: 'FiraSans'), // 'fr': const TextStyle(fontFamily: 'FiraSans'), // 'ru': const TextStyle(fontFamily: 'FiraSans'), // 'ko': const TextStyle(fontFamily: 'FiraSans'), // 'fa': const TextStyle(fontFamily: 'Vazirmatn'), // 'my': const TextStyle(fontFamily: 'NotoSansMyanmar'), 'zh': const TextStyle(fontFamily: 'FiraSans'), // 'zh_TW': const TextStyle(fontFamily: 'FiraSans'), 'zh_CN': const TextStyle(fontFamily: 'FiraSans'), // 'tk': const TextStyle(fontFamily: 'FiraSans'), // 'pt': const TextStyle(fontFamily: 'FiraSans'), // 'vi': const TextStyle(fontFamily: 'FiraSans'), // 'id': const TextStyle(fontFamily: 'FiraSans'), // 'tl': const TextStyle(fontFamily: 'FiraSans'), // 'th': const TextStyle(fontFamily: 'FiraSans'), // 'hi': const TextStyle(fontFamily: 'FiraSans'), // 'tr': const TextStyle(fontFamily: 'FiraSans'), }; @override Map> get keys => { 'en_US': enUs, // 'es_ES': esEs, // 'ar_AR': arAR, // 'de_DE': deDE, // 'ja_JP': jaJP, // 'fr_FR': frFR, // 'ru_RU': ruRU, // 'ko_KR': koKR, // 'fa_IR': faIR, // 'my_MM': myMM, // 'zh_TW': zhTW, 'zh_CN': zhCN, // 'tk_TM': tkTM, // 'pt_BR': ptBR, // 'vi_VN': viVN, // 'id_ID': idID, // 'tl_PH': tlPH, // 'th_TH': thTH, // 'hi_IN': hiIN, // 'tr_TR': trTR, }; /// check if the language is supported static isLanguageSupported(String languageCode) => supportedLanguages.keys.contains(languageCode); /// update app language by code language for example (en,ar..etc) static updateLanguage(String languageCode) async { // check if the language is supported if (!isLanguageSupported(languageCode)) return; // update current language in shared pref await IXSP.setCurrentLanguage(languageCode); if (!Get.testMode) { Get.updateLocale(supportedLanguages[languageCode]!); } } /// check if the language is english static bool isItEnglish() => IXSP.getCurrentLocal().languageCode.toLowerCase().contains('en'); /// get current locale static Locale getCurrentLocal() => IXSP.getCurrentLocal(); /// 检测指定的[languageCode]是否从右往左(RTL)布局 static bool isRTL() { switch (getCurrentLocal().languageCode) { case 'ar': case 'fa': case 'he': return true; default: return false; } } /// 获取本地化配置[locale]中的语言简称 static String getGlobalLanguageTitle({Locale? locale}) { final currentLocale = locale ?? getCurrentLocal(); final languageCode = currentLocale.languageCode.toLowerCase(); final countryCode = currentLocale.countryCode?.toUpperCase() ?? ''; // 中文需要区分简体和繁体 if (languageCode == 'zh') { return countryCode == 'TW' ? Strings.zhTWLang.tr : Strings.zhCNLang.tr; } switch (languageCode) { case 'en': return Strings.enLang.tr; case 'es': return Strings.esLang.tr; case 'ar': return Strings.arLang.tr; case 'de': return Strings.deLang.tr; case 'ja': return Strings.jaLang.tr; case 'fr': return Strings.frLang.tr; case 'ru': return Strings.ruLang.tr; case 'ko': return Strings.koLang.tr; case 'fa': return Strings.faLang.tr; case 'my': return Strings.myLang.tr; case 'tk': return Strings.tkLang.tr; case 'pt': return Strings.ptBRLang.tr; case 'vi': return Strings.viLang.tr; case 'id': return Strings.idLang.tr; case 'tl': return Strings.tlLang.tr; case 'th': return Strings.thLang.tr; case 'hi': return Strings.hiLang.tr; case 'tr': return Strings.trLang.tr; default: return 'Unknown'; } } /// 获取本地化配置[locale]中的语言全称 static String getGlobalLanguageName({Locale? locale}) { final currentLocale = locale ?? getCurrentLocal(); final languageCode = currentLocale.languageCode.toLowerCase(); final countryCode = currentLocale.countryCode?.toUpperCase() ?? ''; // 中文需要区分简体和繁体 if (languageCode == 'zh') { return countryCode == 'TW' ? '繁體中文' : '简体中文'; } switch (languageCode) { case 'en': return 'English'; case 'tr': return 'Türkçe'; case 'vi': return 'Tiếng Việt'; case 'uk': return 'Українська'; case 'es': return 'Español'; case 'ru': return 'Русский'; case 'pt': return 'Português (Brasil)'; case 'pl': return 'Polski'; case 'ko': return '한국어'; case 'ja': return '日本語'; case 'it': return 'Italiano'; case 'id': return 'Bahasa Indonesia'; case 'de': return 'Deutsch'; case 'fr': return 'Français'; case 'fa': return 'فارسی'; case 'hi': return 'हिन्दी'; case 'ar': return 'عربي'; case 'my': return 'မြန်မာဘာသာ'; case 'tk': return 'Türkmençe'; case 'tl': return 'Filipino'; case 'th': return 'ไทย'; default: return 'Unknown'; } } }