Flutter国际化插件dynamic_i18n的使用
Flutter国际化插件dynamic_i18n的使用
在您的应用中动态加载翻译文本。
开始使用
在 Dart 的 main()
函数中初始化 I18n:
void main() {
// 初始化 I18n
I18n.init(
url: 'https://www.example.com',
locale: 'hi',
locales: ['en', 'hi', 'pa'],
);
runApp(MyApp());
}
现在你可以在代码的任何地方使用 I18n.builder
:
Column(
children: [
// 示例 1: 使用 Text
I18n.text('Who am I ?'), // 文本 'मैं कौन हूँ ?'
// 示例 2: 使用 builder
// 首先根据给定的语言环境构建
// 在获取翻译后重新构建
I18n.builder('Who am I ?', (translatedText) {
return Text(translatedText);
}),
// 示例 3: 使用 childBuilder
I18n.childBuilder(
'Who am I ?',
(translatedText, child) {
return Column(
children: [
Text(translatedText),
child, // 在第一次和第二次构建时保持相同
],
);
},
Container(), // 将在重新构建时重用
),
],
);
服务器配置
将您的服务器设置为响应以下请求方式:
请求方法:GET
请求 URL:https://www.example.com/hi.json
响应
Content-Type: application/json
[
{"en": "How are you ?", "hi": "आप कैसे हो ?"},
{"en": "Who am I ?", "hi": "मैं कौन हूँ ?"}
]
对于单个翻译请求,库将以以下格式发送 POST 请求到您在 I18n.init
中提供的 URL。例如,它将是:
请求方法:POST
请求 URL:https://www.example.com/hi
{
"en": sourceText,
"target": targetLocale,
}
响应
Content-Type: application/json
{"en": "How are you ?", "hi": "आप कैसे हो ?"}
完整示例代码
import 'package:flutter/material.dart';
import 'package:dynamic_i18n/dynamic_i18n.dart';
// 状态fulWidget 示例 1
// 如果存在翻译则返回,否则在获取翻译后调用setState
class SomeStatefulWidget extends StatefulWidget {
const SomeStatefulWidget({Key? key}) : super(key: key);
[@override](/user/override)
_SomeStatefulWidgetState createState() => _SomeStatefulWidgetState();
}
class _SomeStatefulWidgetState extends State<SomeStatefulWidget> {
late I18n locale;
[@override](/user/override)
void initState() {
locale = I18n(this);
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Text(locale.get('Hello world')); // 显示翻译后的文本
}
}
// 状态fulWidget 示例 2
// 通过扩展 I18nState 可以减少样板代码
class AnotherStatefulWidget extends StatefulWidget {
const AnotherStatefulWidget({Key? key}) : super(key: key);
[@override](/user/override)
_AnotherStatefulWidgetState createState() => _AnotherStatefulWidgetState();
}
class _AnotherStatefulWidgetState extends I18nState<AnotherStatefulWidget> {
[@override](/user/override)
Widget build(BuildContext context) {
return Text(i18n('Hello world')); // 显示翻译后的文本
}
}
// 无状态小部件示例
class SomeStatelessWidget extends StatelessWidget {
const SomeStatelessWidget({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Column(
children: [
// 示例 1: 使用 Text
I18n.text('Who am I ?'), // 文本 'मैं कौन हूँ ?'
// 示例 2: 使用 builder
// 首先根据给定的语言环境构建
// 在获取翻译后重新构建
I18n.builder('Who am I ?', (translatedText) {
return Text(translatedText);
}),
// 示例 3: 使用 childBuilder
I18n.childBuilder(
'Who am I ?',
(translatedText, child) {
return Column(
children: [
Text(translatedText),
child, // 在第一次和第二次构建时保持相同
],
);
},
Container(), // 将在重新构建时重用
),
],
);
}
}
更多关于Flutter国际化插件dynamic_i18n的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter国际化插件dynamic_i18n的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
dynamic_i18n
是一个用于在 Flutter 应用中实现国际化的插件。它允许你动态地加载和切换应用的语言,而不需要重启应用。以下是如何使用 dynamic_i18n
插件的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 dynamic_i18n
插件的依赖:
dependencies:
flutter:
sdk: flutter
dynamic_i18n: ^0.3.0 # 请确保使用最新版本
然后运行 flutter pub get
以获取依赖。
2. 创建语言文件
在 assets
文件夹下创建语言文件。例如,你可以创建以下两个文件:
assets/lang/en.json
assets/lang/es.json
en.json
内容示例:
{
"greeting": "Hello",
"farewell": "Goodbye"
}
es.json
内容示例:
{
"greeting": "Hola",
"farewell": "Adiós"
}
3. 配置 pubspec.yaml
在 pubspec.yaml
文件中添加对语言文件的引用:
flutter:
assets:
- assets/lang/en.json
- assets/lang/es.json
4. 初始化 dynamic_i18n
在你的 main.dart
文件中初始化 dynamic_i18n
:
import 'package:flutter/material.dart';
import 'package:dynamic_i18n/dynamic_i18n.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await I18n.init(
supportedLocales: [
const Locale('en', 'US'),
const Locale('es', 'ES'),
],
defaultLocale: const Locale('en', 'US'),
assetLoader: const JsonAssetLoader(path: 'assets/lang/'),
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: I18n.localizationsDelegates,
supportedLocales: I18n.supportedLocales,
localeResolutionCallback: I18n.localeResolutionCallback,
locale: I18n.locale,
home: MyHomePage(),
);
}
}
5. 使用国际化字符串
在你的应用中使用 I18n.of(context)
来获取国际化字符串:
import 'package:flutter/material.dart';
import 'package:dynamic_i18n/dynamic_i18n.dart';
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(I18n.of(context).translate('greeting')),
),
body: Center(
child: Text(I18n.of(context).translate('farewell')),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
I18n.setLocale(context, const Locale('es', 'ES'));
},
child: Icon(Icons.language),
),
);
}
}