我正在try 遵循https://flutter.dev/docs/development/accessibility-and-localization/internationalization#dart-toolshttps://docs.google.com/document/d/10e0saTfAv32OZLRmONy866vnaw0I2jwL8zukykpgWBc/edit#heading=h.upcu5w85cvc2中的国际化文档,但它没有生成任何文件.

基本上,它说要对pub spec.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次,try 了flutter cleanflutter build ios,以及其他我想不到的东西,但没有任何东西在构建那个文件.

有什么 idea 吗?

推荐答案

好的.做了更多的调查,我已经解决了.基本上,Flutter 文档有点过时了.

首先,生成的文件正在生成,但它们在100中.生成器创建一个可自动用于项目的合成包,因此不需要进行任何进一步的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: ... ,
    );
  }
}

这里有两件事:

  1. 导入app_localizations.dart生成的文件(文档确实提到了这一点,但可能没有很好地解释)和……
  2. 改变localizationsDelegatessupportedLocales.您不需要列出文档中提到的所有代理和区域设置,因为生成的本地化文件会自动包含它们.只需切换到AppLocalizations的两个属性.

PS

写完以上内容后,我试图将应用程序的标题国际化:

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      title: AppLocalizations.of(context).applicationTitle,
      home: ... ,
    );
  }

Epic fail——原因是在解析标题时,代理和区域设置尚未设置,所以从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.

Flutter相关问答推荐

手势捕获的异常:类型';Double';不是类型转换中类型';Double';的子类型

如果文档确实存在,则FiRestore将";False";返回到";if-Document-Existes";...还是我说错了?

Flutter BLoC et workmanager:如何创建独特的仓库初始化模式?

IsScrollable为True时如何删除Flutter 选项卡栏左侧填充

我想在Flutter中画一个箭头,但我似乎无法填满空间

在Flutter 中更改扩展瓷砖的高度

有没有方法可以从当前时间轻松计算TimeStamp?

在 flutter 吧蜂巢中拯救主题

火焰Flutter 在多个向量之间插补2

如何使用 Material3 创建带有高度的完美白色提升按钮?

Flutter:在 pubspec.yaml 中找不到assets资源

断言失败:std::move(hal_2_1_verifier).Run(). 初始化,LE音频客户端至少需要Bluetooth音频HAL V2.1

点击后,将按钮的 colored颜色 禁用/更改一段时间

如何在Flutter中动态绘制一条从A点到B点的线?

MediaQuery 在不同手机上不一致

如何使用 riverpod_annotation 创建非自动处置提供程序?

Flutter - 异步文件读取异常处理

出现错误;运算符[]不是为对象类型定义的?功能()'

如何判断 text.contains() 是否包含多个值

参数类型MaterialPageRoute不能分配给参数类型String