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 '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('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', 'TW'), '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'), '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, '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 languageCode = (locale ?? getCurrentLocal()).languageCode .toLowerCase(); 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 'zh': return Strings.zhTWLang.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 languageCode = (locale ?? getCurrentLocal()).languageCode .toLowerCase(); 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 'zh': return '繁體中文'; case 'my': return 'မြန်မာဘာသာ'; case 'tk': return 'Türkmençe'; case 'tl': return 'Filipino'; case 'th': return 'ไทย'; default: return 'Unknown'; } } }