| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- 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<String, Locale> 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<String, TextStyle> 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<String, Map<String, String>> 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';
- }
- }
- }
|