我尝试了各种实现本地化的解决方案,我遇到的最好的是 VS Code 或 Android Studio/IntelliJ 的 Flutter Intl 插件,由 Localizely.com(非附属)制作。
有了它,基本上您可以使用市场/插件库安装插件,然后使用菜单选项为您的项目初始化。这会在 lib/l10n/intl_en.arb 中创建一个默认的英语语言环境(这听起来很吓人,但实际上只是 JSON),并在 lib/generated 中设置了所有国际化的脚手架。
您还必须将以下内容添加到您的依赖项中。
flutter_localizations:
sdk: flutter
然后,您可以向该文件添加密钥,它们将自动在您的应用中可用,方法是导入包含名为 S 的类的 generated/l10n.dart。
要使用它,无论您在哪里初始化 MaterialApp,请确保将 S.delegate 传递给 MaterialApp 的 localizationsDelegates 参数(最有可能作为带有 GlobalMaterialLocalizations.delegate、GlobalWidgetsLocalizations.delegate 和可能 @ 的数组的一部分) 987654332@。)您还必须将S.delegate.supportedLocales 添加到MaterialApp 的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 specification,但它至少支持基本功能。
另外,我没有使用 Localizely,但它似乎是管理翻译和插件自动集成的一种非常有用的方法,尽管我认为它的价格也非常高得吓人 - 至少对于我的应用程序来说,这种情况发生了拥有大量文字。实际上,我只有一个谷歌表,用于存储我的所有翻译,当需要更新它时,我将其下载为 .tsv 并编写了一个简单的小解析器来写入 .arb 文件。