2019-10-12 15:58:05
一、纯SDK实现:
1、直接使用SDK提供的API,代码如下:
1 abstract class LangangeBase { 2 Map<String, String> langStr = new HashMap(); 3 } 4 5 class LangangeEn extends LangangeBase { 6 LangangeEn() { 7 langStr['title'] = 'Title'; 8 langStr['desc'] = 'Description'; 9 langStr['content'] = 'Content:Hello World!'; 10 } 11 } 12 13 class LangangeZh extends LangangeBase { 14 LangangeZh() { 15 langStr['title'] = '标题'; 16 langStr['desc'] = '描述'; 17 langStr['content'] = '内容:世界,你好!'; 18 } 19 }
2、Delegate及包装类代码:
1 class Translations { 2 static LangangeBase _langangeBase; 3 4 // 默认使用简体中文 5 static Future<Translations> load(Locale locale) async { 6 print('加载语言 langCode = ${locale.languageCode}'); 7 Translations translations = new Translations(); 8 if (locale.languageCode == 'en') { 9 _langangeBase = new LangangeEn(); 10 } else { 11 _langangeBase = new LangangeZh(); 12 } 13 14 return translations; 15 } 16 17 String text(String key) { 18 return _langangeBase.langStr[key]; 19 } 20 21 static Translations of(BuildContext context) { 22 Translations ret = Localizations.of(context, Translations); 23 print('Translations of result = $ret'); 24 return ret; 25 } 26 } 27 28 class MyLocalizations extends LocalizationsDelegate<Translations> { 29 @override 30 bool isSupported(Locale locale) { 31 print('isSupported ${locale.languageCode}'); 32 // 只支持简体中文、美式英语 33 return /*['zh', 'en'].contains(locale.languageCode)*/true; 34 } 35 36 @override 37 bool shouldReload(LocalizationsDelegate<Translations> old) { 38 return false; 39 } 40 41 @override 42 Future<Translations> load(Locale locale) { 43 return Translations.load(locale); 44 } 45 46 static MyLocalizations delegate = new MyLocalizations(); 47 }
二、使用Intl库
1、创建一个独立的dart字符串类,便于生产arb文件,如下:
1 class LocalStr { 2 /** 3 * 这里的是兜底文案,在没有相对应的本地化资源时使用 4 */ 5 static String get title => 6 Intl.message('Default:天王盖地虎', name: 'title', desc: 'APP标题'); 7 8 static String get desc => 9 Intl.message('Default:智取威虎山', name: 'desc', desc: '标题的描述'); 10 11 static String get content => Intl.message('Default:电影讲述了东北解放军如何消灭盘踞山岭的土匪的故事', 12 name: 'content', desc: 'App的主要内容'); 13 }
2、Delegate及包装类代码:
1 class IntlLocalizations { 2 3 static Future<IntlLocalizations> load(Locale locale) { 4 String name = locale.countryCode.isEmpty ? locale.languageCode : locale.toString(); 5 print('local = ${Intl.canonicalizedLocale(name)}'); 6 return initializeMessages(name).then((b) { 7 Intl.defaultLocale = name; 8 return new IntlLocalizations(); 9 }); 10 } 11 12 String get title1 => LocalStr.title; 13 14 String get desc1 => LocalStr.desc; 15 16 String get content1 => LocalStr.content; 17 18 static IntlLocalizations of(BuildContext context) { 19 return Localizations.of<IntlLocalizations>(context, IntlLocalizations); 20 } 21 } 22 23 class IntlLocalizatoinsDelegate extends LocalizationsDelegate<IntlLocalizations> { 24 @override 25 bool isSupported(Locale locale) { 26 print('lang code = ${locale.languageCode}'); 27 return /*['zh', 'en'].contains(locale.languageCode)*/true; 28 } 29 30 @override 31 Future<IntlLocalizations> load(Locale locale) { 32 return IntlLocalizations.load(locale); 33 } 34 35 @override 36 bool shouldReload(LocalizationsDelegate old) { 37 return false; 38 } 39 40 static IntlLocalizatoinsDelegate delegate = new IntlLocalizatoinsDelegate(); 41 }
3、最终的代码结构图: