localization_service.dart 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. // import 'package:google_fonts/google_fonts.dart';
  4. import '../../app/data/sp/ix_sp.dart';
  5. import 'ar_AR/ar_ar_translation.dart';
  6. import 'en_US/en_us_translation.dart';
  7. import 'es_ES/es_es_translation.dart';
  8. import 'my_MM/my_mm_translation.dart';
  9. import 'fa_IR/fa_ir_translation.dart';
  10. import 'de_DE/de_de_translation.dart';
  11. import 'ja_JP/ja_jp_translation.dart';
  12. import 'fr_FR/fr_fr_translation.dart';
  13. import 'ru_RU/ru_ru_translation.dart';
  14. import 'ko_KR/ko_kr_translation.dart';
  15. import 'zh_TW/zh_tw_translation.dart';
  16. import 'tk_TM/tk_tm_translation.dart';
  17. import 'pt_BR/pt_br_translation.dart';
  18. import 'vi_VN/vi_vn_translation.dart';
  19. import 'id_ID/id_id_translation.dart';
  20. import 'tl_PH/tl_ph_translation.dart';
  21. import 'th_TH/th_th_translation.dart';
  22. import 'hi_IN/hi_in_translation.dart';
  23. import 'tr_TR/tr_tr_translation.dart';
  24. import 'strings_enum.dart';
  25. class LocalizationService extends Translations {
  26. // prevent creating instance
  27. LocalizationService._();
  28. static LocalizationService? _instance;
  29. static LocalizationService getInstance() {
  30. _instance ??= LocalizationService._();
  31. return _instance!;
  32. }
  33. // 根据系统语言获取默认语言
  34. static Locale getDefaultLanguage() {
  35. // 获取系统语言代码
  36. final String deviceLanguage =
  37. WidgetsBinding.instance.platformDispatcher.locale.languageCode;
  38. // 检查系统语言是否在支持的语言列表中
  39. if (isLanguageSupported(deviceLanguage)) {
  40. return supportedLanguages[deviceLanguage]!;
  41. }
  42. // 如果系统语言不受支持,则返回英语作为默认语言
  43. return supportedLanguages['en']!;
  44. }
  45. // 获取系统国家
  46. static String getSystemCountry() {
  47. return WidgetsBinding.instance.platformDispatcher.locale.countryCode ?? '';
  48. }
  49. // default language
  50. // todo change the default language
  51. static Locale defaultLanguage = getDefaultLanguage();
  52. static final all = [
  53. const Locale('en'), // 英语
  54. const Locale('es'), // 西班牙语
  55. const Locale('ar'), // 阿拉伯语
  56. const Locale('de'), // 德语
  57. const Locale('ja'), // 日语
  58. const Locale('fr'), // 法语
  59. const Locale('ru'), // 俄语
  60. const Locale('ko'), // 韩语
  61. const Locale('fa'), // 波斯语
  62. const Locale('my'), // 缅甸语
  63. const Locale('zh', 'TW'), // 繁体中文
  64. const Locale('tk'), // 土库曼语
  65. const Locale('pt', 'BR'), // 葡萄牙语-巴西
  66. const Locale('vi'), // 越南语
  67. const Locale('id'), // 印尼语
  68. const Locale('tl'), // 菲律宾语
  69. const Locale('th'), // 泰语
  70. const Locale('hi'), // 印地语
  71. const Locale('tr'), // 土耳其语
  72. ];
  73. // supported languages
  74. static Map<String, Locale> supportedLanguages = {
  75. 'en': const Locale('en', 'US'),
  76. 'es': const Locale('es', 'ES'),
  77. 'ar': const Locale('ar', 'AR'),
  78. 'de': const Locale('de', 'DE'),
  79. 'ja': const Locale('ja', 'JP'),
  80. 'fr': const Locale('fr', 'FR'),
  81. 'ru': const Locale('ru', 'RU'),
  82. 'ko': const Locale('ko', 'KR'),
  83. 'fa': const Locale('fa', 'IR'),
  84. 'my': const Locale('my', 'MM'),
  85. 'zh': const Locale('zh', 'TW'),
  86. 'tk': const Locale('tk', 'TM'),
  87. 'pt': const Locale('pt', 'BR'),
  88. 'vi': const Locale('vi', 'VN'),
  89. 'id': const Locale('id', 'ID'),
  90. 'tl': const Locale('tl', 'PH'),
  91. 'th': const Locale('th', 'TH'),
  92. 'hi': const Locale('hi', 'IN'),
  93. 'tr': const Locale('tr', 'TR'),
  94. };
  95. // supported languages fonts family (must be in assets & pubspec yaml) or you can use google fonts
  96. static Map<String, TextStyle> supportedLanguagesFontsFamilies = {
  97. // 'en': GoogleFonts.poppins(),
  98. // 'es': GoogleFonts.poppins(),
  99. // 'ar': GoogleFonts.cairo(),
  100. // 'fa': GoogleFonts.vazirmatn(),
  101. // 'my': GoogleFonts.notoSansMyanmar(),
  102. 'en': const TextStyle(fontFamily: 'Inter'),
  103. 'es': const TextStyle(fontFamily: 'FiraSans'),
  104. 'ar': const TextStyle(fontFamily: 'Vazirmatn'),
  105. 'de': const TextStyle(fontFamily: 'FiraSans'),
  106. 'ja': const TextStyle(fontFamily: 'FiraSans'),
  107. 'fr': const TextStyle(fontFamily: 'FiraSans'),
  108. 'ru': const TextStyle(fontFamily: 'FiraSans'),
  109. 'ko': const TextStyle(fontFamily: 'FiraSans'),
  110. 'fa': const TextStyle(fontFamily: 'Vazirmatn'),
  111. 'my': const TextStyle(fontFamily: 'NotoSansMyanmar'),
  112. 'zh': const TextStyle(fontFamily: 'FiraSans'),
  113. 'tk': const TextStyle(fontFamily: 'FiraSans'),
  114. 'pt': const TextStyle(fontFamily: 'FiraSans'),
  115. 'vi': const TextStyle(fontFamily: 'FiraSans'),
  116. 'id': const TextStyle(fontFamily: 'FiraSans'),
  117. 'tl': const TextStyle(fontFamily: 'FiraSans'),
  118. 'th': const TextStyle(fontFamily: 'FiraSans'),
  119. 'hi': const TextStyle(fontFamily: 'FiraSans'),
  120. 'tr': const TextStyle(fontFamily: 'FiraSans'),
  121. };
  122. @override
  123. Map<String, Map<String, String>> get keys => {
  124. 'en_US': enUs,
  125. 'es_ES': esEs,
  126. 'ar_AR': arAR,
  127. 'de_DE': deDE,
  128. 'ja_JP': jaJP,
  129. 'fr_FR': frFR,
  130. 'ru_RU': ruRU,
  131. 'ko_KR': koKR,
  132. 'fa_IR': faIR,
  133. 'my_MM': myMM,
  134. 'zh_TW': zhTW,
  135. 'tk_TM': tkTM,
  136. 'pt_BR': ptBR,
  137. 'vi_VN': viVN,
  138. 'id_ID': idID,
  139. 'tl_PH': tlPH,
  140. 'th_TH': thTH,
  141. 'hi_IN': hiIN,
  142. 'tr_TR': trTR,
  143. };
  144. /// check if the language is supported
  145. static isLanguageSupported(String languageCode) =>
  146. supportedLanguages.keys.contains(languageCode);
  147. /// update app language by code language for example (en,ar..etc)
  148. static updateLanguage(String languageCode) async {
  149. // check if the language is supported
  150. if (!isLanguageSupported(languageCode)) return;
  151. // update current language in shared pref
  152. await IXSP.setCurrentLanguage(languageCode);
  153. if (!Get.testMode) {
  154. Get.updateLocale(supportedLanguages[languageCode]!);
  155. }
  156. }
  157. /// check if the language is english
  158. static bool isItEnglish() =>
  159. IXSP.getCurrentLocal().languageCode.toLowerCase().contains('en');
  160. /// get current locale
  161. static Locale getCurrentLocal() => IXSP.getCurrentLocal();
  162. /// 检测指定的[languageCode]是否从右往左(RTL)布局
  163. static bool isRTL() {
  164. switch (getCurrentLocal().languageCode) {
  165. case 'ar':
  166. case 'fa':
  167. case 'he':
  168. return true;
  169. default:
  170. return false;
  171. }
  172. }
  173. /// 获取本地化配置[locale]中的语言简称
  174. static String getGlobalLanguageTitle({Locale? locale}) {
  175. final languageCode = (locale ?? getCurrentLocal()).languageCode
  176. .toLowerCase();
  177. switch (languageCode) {
  178. case 'en':
  179. return Strings.enLang.tr;
  180. case 'es':
  181. return Strings.esLang.tr;
  182. case 'ar':
  183. return Strings.arLang.tr;
  184. case 'de':
  185. return Strings.deLang.tr;
  186. case 'ja':
  187. return Strings.jaLang.tr;
  188. case 'fr':
  189. return Strings.frLang.tr;
  190. case 'ru':
  191. return Strings.ruLang.tr;
  192. case 'ko':
  193. return Strings.koLang.tr;
  194. case 'fa':
  195. return Strings.faLang.tr;
  196. case 'my':
  197. return Strings.myLang.tr;
  198. case 'zh':
  199. return Strings.zhTWLang.tr;
  200. case 'tk':
  201. return Strings.tkLang.tr;
  202. case 'pt':
  203. return Strings.ptBRLang.tr;
  204. case 'vi':
  205. return Strings.viLang.tr;
  206. case 'id':
  207. return Strings.idLang.tr;
  208. case 'tl':
  209. return Strings.tlLang.tr;
  210. case 'th':
  211. return Strings.thLang.tr;
  212. case 'hi':
  213. return Strings.hiLang.tr;
  214. case 'tr':
  215. return Strings.trLang.tr;
  216. default:
  217. return 'Unknown';
  218. }
  219. }
  220. /// 获取本地化配置[locale]中的语言全称
  221. static String getGlobalLanguageName({Locale? locale}) {
  222. final languageCode = (locale ?? getCurrentLocal()).languageCode
  223. .toLowerCase();
  224. switch (languageCode) {
  225. case 'en':
  226. return 'English';
  227. case 'tr':
  228. return 'Türkçe';
  229. case 'vi':
  230. return 'Tiếng Việt';
  231. case 'uk':
  232. return 'Українська';
  233. case 'es':
  234. return 'Español';
  235. case 'ru':
  236. return 'Русский';
  237. case 'pt':
  238. return 'Português (Brasil)';
  239. case 'pl':
  240. return 'Polski';
  241. case 'ko':
  242. return '한국어';
  243. case 'ja':
  244. return '日本語';
  245. case 'it':
  246. return 'Italiano';
  247. case 'id':
  248. return 'Bahasa Indonesia';
  249. case 'de':
  250. return 'Deutsch';
  251. case 'fr':
  252. return 'Français';
  253. case 'fa':
  254. return 'فارسی';
  255. case 'hi':
  256. return 'हिन्दी';
  257. case 'ar':
  258. return 'عربي';
  259. case 'zh':
  260. return '繁體中文';
  261. case 'my':
  262. return 'မြန်မာဘာသာ';
  263. case 'tk':
  264. return 'Türkmençe';
  265. case 'tl':
  266. return 'Filipino';
  267. case 'th':
  268. return 'ไทย';
  269. default:
  270. return 'Unknown';
  271. }
  272. }
  273. }