記錄一種簡單的方式實現(xiàn)字符串的國際化。
這里沒有用到Intl
包斑举,而是將所需的字符串存放在一個map中搅轿。
步驟:
-
MaterialApp
中添加本地化代理和語言類型 - 創(chuàng)建文字資源文件
- 新建一個類繼承
LocalizationsDelegate
,和文字資源文件聯(lián)系起來 - 使用代理獲取想要的文字資源
新建項目international_demo
富玷,得到一個帶按鈕示例工程璧坟。改造一下MaterialApp
。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
localizationsDelegates: [// 添加區(qū)域
// 準備在這里添加我們自己創(chuàng)建的代理
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [ // 添加區(qū)域
const Locale('en', 'US'), // English
const Locale('he', 'IL'), // Hebrew
// 可以繼續(xù)添加我們想要支持的語言類型
],
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
創(chuàng)建資源文件
新建localization_src.dart
赎懦,將字符串存入一個map中雀鹃。
import 'package:flutter/material.dart';
class DemoLocalizations {
DemoLocalizations(this.locale);
final Locale locale;
static DemoLocalizations of(BuildContext context) {
return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
}
static Map<String, Map<String, String>> _localizedValues = {
'en': {
'title': 'Hello World',
},
'es': {
'title': 'Hola Mundo',
},
'zh': {
'title': '你好呀',
},
};
String get title {
return _localizedValues[locale.languageCode]['title'];
}
}
這里僅以title
為例,有英語励两、西班牙語和中文三種黎茎。
創(chuàng)建代理
新建一個類繼承LocalizationsDelegate
,復寫3個方法当悔。
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:international_demo/localization_src.dart';
class DemoLocalizationsDelegate
extends LocalizationsDelegate<DemoLocalizations> {
const DemoLocalizationsDelegate();
@override
bool isSupported(Locale locale) =>
['en', 'es', 'zh'].contains(locale.languageCode);
@override
Future<DemoLocalizations> load(Locale locale) {
return SynchronousFuture<DemoLocalizations>(DemoLocalizations(locale));
}
@override
bool shouldReload(DemoLocalizationsDelegate old) => false;
}
復寫的load方法中傅瞻,使用了SynchronousFuture
。
使用代理
回到main.dart
盲憎。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
localizationsDelegates: [
DemoLocalizationsDelegate(),// 這是我們新建的代理
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('he', 'IL'), // Hebrew
const Locale('zh', ''), // 新添中文嗅骄,后面的countryCode暫時不指定
],
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
在_MyHomePageState
中調用DemoLocalizations
。
DemoLocalizations localizations = DemoLocalizations.of(context);
print(localizations); // 打印出 I/flutter (25535): Instance of 'DemoLocalizations'
觀察logcat饼疙,可知我們獲得了DemoLocalizations的實例溺森。
獲取title
DemoLocalizations.of(context).title
如果需要更多的字符串,需要我們手動在資源文件的map中添加宏多。
這里僅以title為例儿惫。
文件
參考: