localization_service.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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 'strings_enum.dart';
  16. class LocalizationService extends Translations {
  17. // prevent creating instance
  18. LocalizationService._();
  19. static LocalizationService? _instance;
  20. static LocalizationService getInstance() {
  21. _instance ??= LocalizationService._();
  22. return _instance!;
  23. }
  24. // 根据系统语言获取默认语言
  25. static Locale getDefaultLanguage() {
  26. // 获取系统语言代码
  27. final String deviceLanguage =
  28. WidgetsBinding.instance.platformDispatcher.locale.languageCode;
  29. // 检查系统语言是否在支持的语言列表中
  30. if (isLanguageSupported(deviceLanguage)) {
  31. return supportedLanguages[deviceLanguage]!;
  32. }
  33. // 如果系统语言不受支持,则返回英语作为默认语言
  34. return supportedLanguages['en']!;
  35. }
  36. // 获取系统国家
  37. static String getSystemCountry() {
  38. return WidgetsBinding.instance.platformDispatcher.locale.countryCode ?? '';
  39. }
  40. // default language
  41. // todo change the default language
  42. static Locale defaultLanguage = getDefaultLanguage();
  43. static final all = [
  44. const Locale('en'), // 英语
  45. const Locale('es'), // 西班牙语
  46. const Locale('ar'), // 阿拉伯语
  47. const Locale('de'), // 德语
  48. const Locale('ja'), // 日语
  49. const Locale('fr'), // 法语
  50. const Locale('ru'), // 俄语
  51. const Locale('ko'), // 韩语
  52. const Locale('fa'), // 波斯语
  53. const Locale('my'), // 缅甸语
  54. ];
  55. // supported languages
  56. static Map<String, Locale> supportedLanguages = {
  57. 'en': const Locale('en', 'US'),
  58. 'es': const Locale('es', 'ES'),
  59. 'ar': const Locale('ar', 'AR'),
  60. 'de': const Locale('de', 'DE'),
  61. 'ja': const Locale('ja', 'JP'),
  62. 'fr': const Locale('fr', 'FR'),
  63. 'ru': const Locale('ru', 'RU'),
  64. 'ko': const Locale('ko', 'KR'),
  65. 'fa': const Locale('fa', 'IR'),
  66. 'my': const Locale('my', 'MM'),
  67. };
  68. // supported languages fonts family (must be in assets & pubspec yaml) or you can use google fonts
  69. static Map<String, TextStyle> supportedLanguagesFontsFamilies = {
  70. // 'en': GoogleFonts.poppins(),
  71. // 'es': GoogleFonts.poppins(),
  72. // 'ar': GoogleFonts.cairo(),
  73. // 'fa': GoogleFonts.vazirmatn(),
  74. // 'my': GoogleFonts.notoSansMyanmar(),
  75. 'en': const TextStyle(fontFamily: 'Inter'),
  76. 'es': const TextStyle(fontFamily: 'FiraSans'),
  77. 'ar': const TextStyle(fontFamily: 'Vazirmatn'),
  78. 'de': const TextStyle(fontFamily: 'FiraSans'),
  79. 'ja': const TextStyle(fontFamily: 'FiraSans'),
  80. 'fr': const TextStyle(fontFamily: 'FiraSans'),
  81. 'ru': const TextStyle(fontFamily: 'FiraSans'),
  82. 'ko': const TextStyle(fontFamily: 'FiraSans'),
  83. 'fa': const TextStyle(fontFamily: 'Vazirmatn'),
  84. 'my': const TextStyle(fontFamily: 'NotoSansMyanmar'),
  85. };
  86. @override
  87. Map<String, Map<String, String>> get keys => {
  88. 'en_US': enUs,
  89. 'es_ES': esEs,
  90. 'ar_AR': arAR,
  91. 'de_DE': deDE,
  92. 'ja_JP': jaJP,
  93. 'fr_FR': frFR,
  94. 'ru_RU': ruRU,
  95. 'ko_KR': koKR,
  96. 'fa_IR': faIR,
  97. 'my_MM': myMM,
  98. };
  99. /// check if the language is supported
  100. static isLanguageSupported(String languageCode) =>
  101. supportedLanguages.keys.contains(languageCode);
  102. /// update app language by code language for example (en,ar..etc)
  103. static updateLanguage(String languageCode) async {
  104. // check if the language is supported
  105. if (!isLanguageSupported(languageCode)) return;
  106. // update current language in shared pref
  107. await IXSP.setCurrentLanguage(languageCode);
  108. if (!Get.testMode) {
  109. Get.updateLocale(supportedLanguages[languageCode]!);
  110. }
  111. }
  112. /// check if the language is english
  113. static bool isItEnglish() =>
  114. IXSP.getCurrentLocal().languageCode.toLowerCase().contains('en');
  115. /// get current locale
  116. static Locale getCurrentLocal() => IXSP.getCurrentLocal();
  117. /// 检测指定的[languageCode]是否从右往左(RTL)布局
  118. static bool isRTL() {
  119. switch (getCurrentLocal().languageCode) {
  120. case 'ar':
  121. case 'fa':
  122. case 'he':
  123. return true;
  124. default:
  125. return false;
  126. }
  127. }
  128. /// 获取本地化配置[locale]中的语言简称
  129. static String getGlobalLanguageTitle({Locale? locale}) {
  130. final languageCode = (locale ?? getCurrentLocal()).languageCode
  131. .toLowerCase();
  132. switch (languageCode) {
  133. case 'en':
  134. return Strings.enLang.tr;
  135. case 'es':
  136. return Strings.esLang.tr;
  137. case 'ar':
  138. return Strings.arLang.tr;
  139. case 'de':
  140. return Strings.deLang.tr;
  141. case 'ja':
  142. return Strings.jaLang.tr;
  143. case 'fr':
  144. return Strings.frLang.tr;
  145. case 'ru':
  146. return Strings.ruLang.tr;
  147. case 'ko':
  148. return Strings.koLang.tr;
  149. case 'fa':
  150. return Strings.faLang.tr;
  151. case 'my':
  152. return Strings.myLang.tr;
  153. default:
  154. return 'Unknown';
  155. }
  156. }
  157. /// 获取本地化配置[locale]中的语言全称
  158. static String getGlobalLanguageName({Locale? locale}) {
  159. final languageCode = (locale ?? getCurrentLocal()).languageCode
  160. .toLowerCase();
  161. switch (languageCode) {
  162. case 'en':
  163. return 'English';
  164. case 'tr':
  165. return 'Türk';
  166. case 'vi':
  167. return 'Tiếng Việt';
  168. case 'uk':
  169. return 'Українська';
  170. case 'es':
  171. return 'Español';
  172. case 'ru':
  173. return 'Русский';
  174. case 'pt':
  175. return 'Português';
  176. case 'pl':
  177. return 'Polski';
  178. case 'ko':
  179. return '한국어';
  180. case 'ja':
  181. return '日本語';
  182. case 'it':
  183. return 'Italiano';
  184. case 'id':
  185. return 'Bahasa Indonesia';
  186. case 'de':
  187. return 'Deutsch';
  188. case 'fr':
  189. return 'Français';
  190. case 'fa':
  191. return 'فارسی';
  192. case 'hi':
  193. return 'हिन्दी';
  194. case 'ar':
  195. return 'عربي';
  196. case 'zh':
  197. return '繁體中文';
  198. case 'my':
  199. return 'မြန်မာဘာသာ';
  200. default:
  201. return 'Unknown';
  202. }
  203. }
  204. }