本地化与国际化 (i18n) 指南
欢迎使用 Finch 本地化与国际化 (i18n) 指南!本指南将带您了解如何为 Finch 应用进行本地化和国际化。无论您是资深开发者还是新手,Finch 都为服务端 Web 应用开发提供了强大的工具。
Finch 的 i18n
Finch 提供了内置的 i18n 系统,用于本地化和国际化您的应用。该系统允许您定义多种语言,并将应用文本翻译为这些语言。
如何在 Finch 中使用 i18n?
在 Finch 中本地化有两种方式:可以使用 Json 文件,也可以在 languages.dart 文件中定义语言。
1. 使用 Json 文件
在 Finch 中,您可以使用 JSON 文件定义语言。默认情况下,Finch 会在 lib/languages 目录下查找语言文件。每种支持的语言都可以创建一个新的 JSON 文件。例如,中文可以创建 zh.json 文件。
在 Finch 中使用 i18n 非常简单。只需在 en.json 或其他语言文件中定义您的语言。例如在 zh.json 文件中定义语言:
{
"dir": "ltr",
"example.params": "我的名字是 {name},我 {age} 岁",
"example.path": "来自 example.path 的本地化测试路径",
"example.tstring": "i18n 的 TString 对象测试",
"logo": "Finch",
"logo.title": "Finch"
}
2. 使用 languages.dart 文件
您也可以在 languages.dart 文件中定义语言。例如:
var languages = <String, Map<String, String>>{
'zh': {
'dir': 'ltr',
'example.params': '我的名字是 {name},我 {age} 岁',
'example.path': '来自 example.path 的本地化测试路径',
},
'en': {
'dir': 'ltr',
'example.params': 'My name is {name}, I am {age} years old',
'example.path': 'Test path from example.path for localization',
},
};
定义好语言后,需要配置 Finch 以使用 dart 文件作为 i18n 源。可以在 FinchConfigs 对象中设置 dartLanguages 属性。例如:
FinchConfigs configs = FinchConfigs(
// 仅用于 json 文件
languagePath: pathTo(env['LANGUAGE_PATH'] ?? "./lib/languages"),
// 设置语言源为 dart 或 json
languageSource: LanguageSource.dart,
// 在 languages.dart 文件中定义的语言映射
dartLanguages: languages,
);
LanguageSource.dart 和 LanguageSource.json 是 languageSource 属性的两个选项。可根据需要选择。
然后将 configs 对象传递给 FinchApp 构造函数:
FinchApp app = FinchApp(configs: configs);
模板中的 i18n
在模板中可以通过 {{ $t('logo.title') }} 语法使用 i18n。例如要翻译 logo.title 键:
<h1>{{ $t('logo.title') }}</h1>
控制器中的 i18n
在控制器中使用 i18n 也很简单。可以使用 "string".tr 方法进行翻译。例如:
rq.renderString(text: 'logo.title'.tr);
i18n 中的参数
可以在 i18n 文本中使用参数。例如要翻译 example.params 键:
rq.renderString(text: 'example.params'.tr.write({'name': 'Alexandre', 'age': 30}));
在模板中可以这样用:
<p>{{ $t('example.params', {'name': 'Alexandre', 'age': 30}) }}</p>
i18n 中的数组参数
可以在 i18n 文本中使用数组参数。例如要翻译 example.params 键:
rq.renderString(text: 'example.params'.tr.writeArr(['Alexandre', 30]));
在模板中可以这样用:
{
"example.params": "我的名字是 {0},我 {1} 岁",
}
<p>{{ $t('example.params', ['Alexandre', 30]) }}</p>