Как загрузить все локали dart DateFormat во флаттере?

В приложении Flutter intl загружает только 15 языков. Однако Dart DateFormat поддерживает гораздо больше. Мне не нужен перевод, но нужен правильный DateFormat, Как загрузить все DateFormat локаль?

6 ответов

В ваш самый высокий StatefulWidget добавьте эти импорта

import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';

в своем состоянии переопределите initState и добавьте

  @override
  void initState() {
    super.initState();
    initializeDateFormatting();
  }

Например

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Intl Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Intl Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  DateFormat dateFormat;
  DateFormat timeFormat;

  @override
  void initState() {
    super.initState();
    initializeDateFormatting();
    dateFormat = new DateFormat.yMMMMd('cs');
    timeFormat = new DateFormat.Hms('cs');
  }

  void _refresh() {
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    var dateTime = new DateTime.now();
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(dateFormat.format(dateTime)),
            new Text(timeFormat.format(dateTime)),
          ],
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _refresh,
        tooltip: 'Refresh',
        child: new Icon(Icons.refresh),
      ),
    );
  }
}

Dart в основном использует двухбуквенные коды ISO 631, с вариантами стран, если применимо. Например: ja, en_US, en_GB, zh_HK, zh_CN, Иногда он использует трехбуквенный код. Чтобы найти полный список, просто найдите DateSymbols в файле date_symbol_data_local.dart

Язык CS отображает это

Список всех доступных локалей во Flutter можно взять из свойства верхнего уровня availableLocalesForDateFormatting

просто добавьте код языка, подобный этому (в моем случае «ar» для арабского языка)

        DateFormat('MMMM', 'ar')  .format(DateTime.now());

Я решил установить Intl.sytemLocale перед использованием любого DateFormat:

      Intl.systemLocale = await findSystemLocale();

Мне не пришлось звонить initializeDateFormatting() и я использую intl: ^0.17.0.

Импортируйте это

import 'package:intl/intl.dart';  //for date format
import 'package:intl/date_symbol_data_local.dart';  //for date locale

И используйте текущий languageCode при инициализации DateFormat

String languageCode = Localizations.localeOf(context).languageCode;
String dateTime = DateFormat( "dd.MM.yy HH:mm", languageCode).format(this.date);

Цитата комментария kapace :

Вы должны использовать языковой тег, чтобы быть уверенным, что учитываете код страны локали. Как в Канаде, где язык такой же en в качестве en-US, но они форматируют даты немного иначе, используя en-CA локаль.

Например:

      var tag = Localizations.maybeLocaleOf(context)?.toLanguageTag();

var date1 = DateFormat.yMMMd(tag).format(DateTime.now()); // Dec 31, 2000
var date2 = DateFormat('MM/dd, hh:mm a', tag).format(DateTime.now()); // 12/31, 11:00 PM
Другие вопросы по тегам