为什么Flutter不生成国际化文件?
我正在尝试遵循https://flutter.dev/docs/development/accessibility-and-localization/internationalization#dart-tools和https://docs.google.com/document/d/10e0saTfAv32OZLRmONy866vnaw0I2jwL8zukykpgWBc/ 中的国际化文档编辑#heading=h.upcu5w85cvc2但它没有生成任何文件。
基本上它说将这些 mod 制作到 pubspec.yaml文件中:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: ^0.17.0-nullsafety.2
flutter:
generate: true
然后创建一个<project-root>/l10n.yaml包含以下内容的文件:
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
最后app_en.arb用这样的东西创建:
{
"@@locale": "en",
"helloWorld": "Hello World!",
"@helloWorld": {
"description": "The conventional newborn programmer greeting"
}
}
从那里导游说 flutter_gen/gen_l10n/app_localizations.dart将自动生成文件。
除了什么都没有发生。我在 Android Studio 工作并做了一个pub get,并尝试了一个flutter clean和flutter build ios以及我想不到的其他所有内容,但没有构建该文件。
有任何想法吗?
回答
除了@drekka 的回答,
你需要跑
flutter gen-l10n
如果它不是自动生成的。
- 谢谢!它没有很好的文档记录,因为在我的情况下翻译是自动生成的,但我想生成它们而不必运行应用程序。
回答
好的。做了更多的挖掘,我已经解决了。基本上 Flutter 文档有点过时了。
首先,生成的文件正在生成,但它们在<project_dir>.dart_tools/flutter_gen/genl10n. 生成器创建一个可自动供项目使用的合成包,因此无需进一步pubspec.yaml更改。
其次,你main.dart必须看起来像这样:
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
title: 'My app',
home: ... ,
);
}
}
这里有两件事:
- 导入
app_localizations.dart生成的文件(文档确实提到了但可能没有很好地解释)和...... - 更改
localizationsDelegates和supportedLocales。您不需要列出文档中提到的所有委托和语言环境,因为生成的本地化文件会自动包含它们。只需切换到 的两个属性AppLocalizations。
聚苯乙烯
写完上述内容后,我尝试将应用程序的标题国际化:
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
title: AppLocalizations.of(context).applicationTitle,
home: ... ,
);
}
史诗般的失败 - 原因是在解析标题时,尚未设置代表和语言环境,因此返回的AppLocalizations.of(context)是null. 相反,您需要更改为onGeneratedTitle这样的:
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
onGenerateTitle: (context) => AppLocalizations.of(context).applicationTitle,
home: ... ,
);
}
```.
`onGeneratedTitle` is called after the widget is setup which means localisation is available.