本地化与国际化 (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.dartLanguageSource.jsonlanguageSource 属性的两个选项。可根据需要选择。 然后将 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>