国际包装和日期格式奇怪的行为

And*_*zza 7 internationalization intl dart

我开始在我的dart项目中使用intl包。开始使用此软件包后,我将使用以下代码:

  DateTime now = new DateTime.now();
  var formatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  String nowFormatted = formatter.format(now);
Run Code Online (Sandbox Code Playgroud)

并且它可以正常工作。使用intl后,我会在日志中获得以下消息:

Uncaught LocaleDataException: Locale data has not been initialized, call initializeDateFormatting(<locale>).
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我应该在此代码段中传递语言环境

小智 14

在 main 中使用这个函数

initializeDateFormatting();
Run Code Online (Sandbox Code Playgroud)

并像这样导入

import 'package:intl/date_symbol_data_local.dart';


rub*_*low 10

验证您的导入:

import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
Run Code Online (Sandbox Code Playgroud)

根据您的语言设置initializeDateFormatting,例如:

initializeDateFormatting('pt_BR', null);
Run Code Online (Sandbox Code Playgroud)


小智 8

如果您遇到此问题,请写initializeDateFormatting('az');上“Material App”。我搜索了1个小时,没有人写清楚。

真的解决了。 在此处输入图片说明


Ale*_*ano 7

国际:^ 0.15.7

我对当前Intl版本有同样的问题,所以我解决了

这些进口:

import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';
Run Code Online (Sandbox Code Playgroud)

和代码:

initializeDateFormatting();
DateTime now = DateTime.now();
var dateString = DateFormat('dd-MM-yyyy').format(now);
final String configFileName = 'lastConfig.$dateString.json';
Run Code Online (Sandbox Code Playgroud)

  • 这个不带参数的 `initializeDateFormatting()` 在最新版本 `intl: ^0.16.1` 中不起作用。有什么解决办法吗? (2认同)
  • @FaizanMubasher,我也有同样的确信。确保您有此导入:“import 'package:intl/date_symbol_data_local.dart';”,因为“initializeDateFormatting”包含多个文件。 (2认同)

小智 7

  • 在您的 pubspec.yaml 中,添加此依赖包:intl:

  • 在最高的 StatefulWidget(在 dart 文件中)中,添加以下导入:

    import 'package:intl/intl.dart';
    import 'package:intl/date_symbol_data_local.dart';
Run Code Online (Sandbox Code Playgroud)
  • 在其 State 中,覆盖 initState add :
      @override
      void initState() {
        super.initState();
        initializeDateFormatting(); //very important
      }
Run Code Online (Sandbox Code Playgroud)
  • 和代码:
     DateTime now = new DateTime.now();
     var formatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
     String nowFormatted = formatter.format(now);
Run Code Online (Sandbox Code Playgroud)


And*_*zza 6

我已经以这种方式解决了这种使用:

DateTime now = new DateTime.now();
var formatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", 'en');
String nowFormatted = formatter.format(now);
Run Code Online (Sandbox Code Playgroud)

但是我可以将其设置为用于配置itnl支持的dart文件:

library translation_helper;

import 'dart:async';
import 'package:intl/date_symbol_data_local.dart';
import '../../resources/messages_all.dart';


void setupLanguage(){
  //var germanDatesFuture = initializeDateFormatting('de_DE', null);
  var enDatesFuture = initializeDateFormatting('en', null);
  var germanMessagesFuture = initializeMessages('de');
  var englishMessagesFuture = initializeMessages('en');
  var italianMessagesFuture = initializeMessages('it');
  var polishMessagesFuture = initializeMessages('pl');
  Future
      .wait([
    enDatesFuture,
    germanMessagesFuture,
    englishMessagesFuture,
    italianMessagesFuture,
    polishMessagesFuture
  ]);
}
Run Code Online (Sandbox Code Playgroud)

在我失踪之前:

 var enDatesFuture = initializeDateFormatting('en', null);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,我使用:

  • 飞镖1.15.0
  • 国际0.12.7

  • 是的,您必须先为特定语言环境初始化格式,然后才能使用它。在某些情况下,数据已被加载,但在其他情况下(最常见的消息是数据会占用大量空间),在使用数据之前,可能需要先加载数据。通常,您不会初始化每个语言环境的所有消息,而只会初始化用户语言环境的消息。 (3认同)

小智 5

我的问题是,即使我没有特别使用“en_US”区域设置,我也会收到错误。但我通过以下方式解决了它:

initializeDateFormatting('en', null);
initializeDateFormatting('en_US,', null);
Run Code Online (Sandbox Code Playgroud)


Igo*_*din 5

无需直接从您的代码中调用initializeDateFormatting。只需调用应用程序本地化委托的load方法。

因此,您可以像这样指定委托:

final localizationsDelegates = <LocalizationsDelegate>[
  AppLocalizationsDelegate(),
  GlobalMaterialLocalizations.delegate,
  GlobalWidgetsLocalizations.delegate,
  CupertinoLocalizationsDelegate()
];

...

  MaterialApp(
    localizationsDelegates: localizationsDelegates,
  )
Run Code Online (Sandbox Code Playgroud)

并使用系统的语言环境预加载它们:

import 'dart:ui' as ui;

...

for (final delegate in localizationsDelegates) {
  await delegate.load(ui.Locale(ui.window.locale.languageCode));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

在你的类中MaterialApp添加此代码

import 'package:intl/date_symbol_data_local.dart';

@override
  void initState() {
    // TODO: implement initState
    super.initState();`enter code here`
    initializeDateFormatting();
  }
Run Code Online (Sandbox Code Playgroud)

  • 这引发了:“不支持的操作:无法修改不可修改的地图”错误...现在遇到了这个问题... (4认同)