我在实现 DateFormat 的国际化时遇到问题。
我使用以下代码来格式化日期:
var time = DateTime.fromMillisecondsSinceEpoch(item['time'] * 1000);
${DateFormat('EEEE, MMMM d').format(time)}
返回Friday, February 6
将我的设备更改为另一种语言,继续返回Friday, February 6
。
应用程序中其他字符串(手动翻译的字符串(的国际化正在按预期工作。
下面是初始化localizationsDelegates
的代码。
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
MyApp();
@override
MyAppStateful createState() => MyAppStateful();
}
class MyAppStateful extends State<MyApp> {
MyAppStateful();
@override
Widget build(BuildContext context) {
return new MaterialApp(
localizationsDelegates: [
// ... app-specific localization delegate[s] here
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
AppLocalizations.delegate,
],
supportedLocales: supportedLocales,
localeResolutionCallback: (locale, supportedLocales) {
for (var i in supportedLocales) {
if (i.languageCode == locale.languageCode) {
return i;
}
}
return supportedLocales.first;
},
home: isX ? Y() : Z(),
);
}
}
我的问题是双重的:
1( 如何获得当前日期的翻译日期格式?
2( 是否可以本地化日期格式格式?而不是强迫它:DateFormat('EEEE, MMMM d').format(time)}
让它灵活地适应区域设置?
例如:在美国是Weekday, Month Day
,但在法国是Weekday Day Month
。
实际上,我不知道第二折,但对于第一折,你可以像这样使用 smth:
var time = DateTime.fromMillisecondsSinceEpoch(item['time'] * 1000);
${DateFormat('EEEE, MMMM d', Localizations.localeOf(context).toString()).format(time)}
解决点 #2 的关键是使用 DateFormat 的集成模式:
DateFormat.yMMMMd(Localizations.localeOf(context).toString()).format(time)
将正确的格式 wrt 返回到用户的区域设置。
只需在每次区域设置更改时侦听的方法中添加此行
Intl.defaultLocale = languageCode;
从包装:https://pub.dev/packages/intl