本地化 (i18n)

Finch 支持两种语言字符串管理方式:JSON 文件和 Dart 定义的字符串。两种方式都支持变量替换和复数形式。

选项 1:JSON 文件(默认)

结构

将语言文件放在 languagePath 中(默认:lib/languages/):

lib/languages/
  en.json
  zh.json
  fa.json

JSON 文件示例

{
  "welcome": "欢迎使用 Finch",
  "greeting": "你好,{name}!",
  "items_count": "{count} 项 | {count} 项"
}

配置

FinchConfigs(
  languageSource: LanguageSource.json,
  languagePath: pathTo('./lib/languages'),
)

选项 2:Dart 字符串

直接在 Dart 中定义所有语言字符串:

// lib/languages/lang.dart
Map<String, Map<String, dynamic>> languageDart = {
  'en': {
    'welcome': 'Welcome to Finch',
    'greeting': 'Hello, {name}!',
  },
  'zh': {
    'welcome': '欢迎使用 Finch',
    'greeting': '你好,{name}!',
  },
};
FinchConfigs(
  languageSource: LanguageSource.dart,
  dartLanguages: languageDart,
)

.tr 扩展

在 Dart 代码中,对字符串使用 .tr 扩展:

var msg = 'welcome'.tr(rq);
var greeting = 'greeting'.tr(rq, params: {'name': user.name});

writeArr

对数组字符串使用 writeArr

var features = 'features'.writeArr(rq);  // List<String>

在模板中使用 $t 翻译

<h1>{{ $t('welcome') }}</h1>
<p>{{ $t('greeting', {'name': user.name}) }}</p>

切换语言

Finch 自动从 URL 路径检测语言(/zh/users/en/users)。手动设置:

rq.setLanguage('zh');

或通过查询参数(如果已配置):

/page?lang=zh

TString

TString 支持内联多语言字符串:

TString(en: 'Hello', fa: 'سلام', nl: 'Hallo')
  .get(rq.currentLanguage)