我尝试了各种解决方案来实现本地化,我遇到的最好的是Localizely.com(非附属)制作的用于VS Code或Android Studio/IntelliJ的 Flutter Intl 插件。
有了它,基本上你使用市场/插件库安装插件,然后使用菜单选项为你的项目初始化。这会在 lib/l10n/intl_en.arb 中创建一个默认的英语语言环境(这听起来很吓人,但实际上只是 JSON),并在lib/generated
.
您还必须将以下内容添加到您的依赖项中。
flutter_localizations:
sdk: flutter
然后,您可以将密钥添加到此文件,它们将在您的应用程序中自动可用,方法是导入generated/l10n.dart
包含名为 S 的类。
要使用它,无论您在哪里初始化 MaterialApp,请确保将其传递给 MaterialApp 的 localizationsDelegates 参数(很可能作为带有,和可能S.delegate
的数组的一部分。)您还必须添加到 MaterialApp 的.GlobalMaterialLocalizations.delegate
GlobalWidgetsLocalizations.delegate
GlobalCupertinoLocalizations.delegate
S.delegate.supportedLocales
supportedLocales
要添加更多语言环境,请使用菜单中的选项(至少在 intellij 中)或简单地创建更多 intl_.arb 文件,插件将自动识别并设置相关代码。
假设您有一个 intl_en 文件,其中包含以下内容:
{ "name": "Name" }
然后S.of(context).name
,您将在代码中使用该字符串。
所有这一切在localizely的网站上都有更雄辩的解释。
现在,要在这些 .arb 文件中使用密钥,您只需将其包装在 {...} 中。例如:
{ "choose1OfNumOptions": "Choose 1 of {numoptions} options" }
会导致使用S.of(context).choose1OfNumOptions(numOptions);
. 我不知道该插件是否支持完整的ARB 规范,但它至少支持基础知识。
另外,我没有使用 Localizely,但它似乎是管理翻译和插件自动集成的一种非常有用的方式,尽管我认为它的价格也非常高得吓人——至少对于我的应用程序来说,它恰好有大量的文字。实际上,我只有一个谷歌表,我在其中存储了所有翻译,当需要更新它时,我将其下载为 .tsv 并编写了一个简单的小解析器来写出 .arb 文件。