本地化与翻译
以人类的方式进行 Flutter 本地化,帮助您本地化您的应用程序。
教程
视频
方法
| 方法 | 工作 |
|---|---|
init() |
在 runApp() 之前初始化内容 |
translate('word') |
单词翻译 |
translate('word',{"key":"value"}) |
带替换参数的单词翻译 |
| <!-- | googleTranslate('word', from: 'en', to: 'ar') |
setNewLanguage(context,newLanguage:'en',restart: true, remember: true,) |
更改语言 |
isDirectionRTL() |
检查方向是否为 RTL |
currentLanguage |
当前语言代码 |
locale |
Active Locale |
locals() |
本地化列表 |
delegates |
本地化委托 |
安装
- 将
.json翻译文件添加为资源
- 例如:
'assets/langs/ar.json'|'assets/langs/en.json' - 结构应如下所示
{
"appTitle" : "تطبيق",
"textArea" : "Thisi is just a test text"
}
- 在 pubspec.yaml 中将它们定义为资源
flutter:
assets:
- assets/langs/en.json
- assets/langs/ar.json
初始化
- 在 main.dart 中添加导入
- 使
main()成为async并执行以下操作 - 确保 flutter 激活了
WidgetsFlutterBinding.ensureInitialized() - 定义语言列表
LIST_OF_LANGS - 定义资源目录
LANGS_DIR - 初始化
await translator.init(); - 在
runApp()中,将入口类包裹在LocalizedApp()中 - 注意:** 确保将其子项定义在不同的地方,而不是在里面 **
import 'package:flutter/material.dart';
import 'package:localize_and_translate/localize_and_translate.dart';
main() async {
// if your flutter > 1.7.8 : ensure flutter activated
WidgetsFlutterBinding.ensureInitialized();
LIST_OF_LANGS = ['ar', 'en']; // define languages
LANGS_DIR = 'assets/langs/'; // define directory
await translator.init(); // intialize
runApp(
LocalizedApp(
child: MyApp(),
),
);
}
LocalizedApp()子项示例 ->MaterialApp()
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
localizationsDelegates: translator.delegates, // Android + iOS Delegates
locale: translator.locale, // Active locale
supportedLocales: translator.locals(), // Locals list
);
}
}
用法
- 使用
translate("appTitle") - 使用
googleTranslate("test", from: 'en', to: 'ar') - 使用 `setNewLanguage(context, newLanguage: 'ar', remember: true, restart: true);`
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
String testText =
translator.currentLanguage == 'ar' ? 'جار الترجمة' : 'Translating..';
@override
void initState() {
super.initState();
Future.delayed(Duration.zero, () async {
testText = await translator.googleTranslate(
testText,
from: 'en',
to: translator.currentLanguage,
);
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: Drawer(),
appBar: AppBar(
title: Text(translator.translate('appTitle')),
// centerTitle: true,
),
body: Container(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
SizedBox(height: 50),
Text(
translator.translate('textArea'),
textAlign: TextAlign.center,
style: TextStyle(fontSize: 35),
),
Text(
testText,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 35),
),
OutlineButton(
onPressed: () {
translator.setNewLanguage(
context,
newLanguage: translator.currentLanguage == 'ar' ? 'en' : 'ar',
remember: true,
restart: true,
);
},
child: Text(translator.translate('buttonTitle')),
),
],
),
),
);
}
}