// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:intl/date_symbols.dart' as intl; import 'package:intl/date_symbol_data_custom.dart' as date_symbol_data_custom; import '../l10n/generated_date_localizations.dart' as date_localizations; /// Tracks if date i18n data has been loaded. bool _dateIntlDataInitialized = false; /// Loads i18n data for dates if it hasn't be loaded yet. /// /// Only the first invocation of this function has the effect of loading the /// data. Subsequent invocations have no effect. void loadDateIntlDataIfNotLoaded() { if (!_dateIntlDataInitialized) { // TODO(garyq): Add support for scriptCodes. Do not strip scriptCode from string. // Keep track of initialzed locales, or will fail on attempted double init. // This can only happen if a locale with a stripped scriptCode has already // been initialzed. This should be removed when scriptCode stripping is removed. final Set<String> initializedLocales = <String>{}; date_localizations.dateSymbols .cast<String, Map<String, dynamic>>() .forEach((String locale, Map<String, dynamic> data) { // Strip scriptCode from the locale, as we do not distinguish between scripts // for dates. final List<String> codes = locale.split('_'); String countryCode; if (codes.length == 2) { countryCode = codes[1].length < 4 ? codes[1] : null; } else if (codes.length == 3) { countryCode = codes[1].length < codes[2].length ? codes[1] : codes[2]; } locale = codes[0] + (countryCode != null ? '_' + countryCode : ''); if (initializedLocales.contains(locale)) return; initializedLocales.add(locale); // Perform initialization. assert(date_localizations.datePatterns.containsKey(locale)); final intl.DateSymbols symbols = intl.DateSymbols.deserializeFromMap(data); date_symbol_data_custom.initializeDateFormattingCustom( locale: locale, symbols: symbols, patterns: date_localizations.datePatterns[locale], ); }); _dateIntlDataInitialized = true; } }