Unverified Commit 82f8ded8 authored by Hans Muller's avatar Hans Muller Committed by GitHub

Add support for the Kannada (kn) locale (#37026)

parent c9a5f943
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This program replaces the material_kn.arb and cupertino_kn.arb
// files in flutter_localizations/packages/lib/src/l10n with versions
// where the contents of the localized strings have been replaced by JSON
// escapes. This is done because some of those strings contain characters
// that can crash Emacs on Linux. There is more information
// here: https://github.com/flutter/flutter/issues/36704 and in the README
// in flutter_localizations/packages/lib/src/l10n.
//
// This app needs to be run by hand when material_kn.arb or cupertino_kn.arb
// have been updated.
//
// ## Usage
//
// Run this program from the root of the git repository.
//
// ```
// dart dev/tools/localization/encode_kn_arb_files.dart
// ```
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'localizations_utils.dart';
Map<String, dynamic> loadBundle(File file) {
if (!FileSystemEntity.isFileSync(file.path))
exitWithError('Unable to find input file: ${file.path}');
return json.decode(file.readAsStringSync());
}
void encodeBundleTranslations(Map<String, dynamic> bundle) {
for (String key in bundle.keys) {
// The ARB file resource "attributes" for foo are called @foo. Don't need
// to encode them.
if (key.startsWith('@'))
continue;
final String translation = bundle[key];
// Rewrite the string as a series of unicode characters in JSON format.
// Like "\u0012\u0123\u1234".
bundle[key] = translation.runes.map((int code) {
final String codeString = '00${code.toRadixString(16)}';
return '\\u${codeString.substring(codeString.length - 4)}';
}).join();
}
}
void checkEncodedTranslations(Map<String, dynamic> encodedBundle, Map<String, dynamic> bundle) {
bool errorFound = false;
const JsonDecoder decoder = JsonDecoder();
for (String key in bundle.keys) {
if (decoder.convert('"${encodedBundle[key]}"') != bundle[key]) {
stderr.writeln(' encodedTranslation for $key does not match original value "${bundle[key]}"');
errorFound = true;
}
}
if (errorFound)
exitWithError('JSON unicode translation encoding failed');
}
void rewriteBundle(File file, Map<String, dynamic> bundle) {
final StringBuffer contents = StringBuffer();
contents.writeln('{');
for (String key in bundle.keys) {
contents.writeln(' "$key": "${bundle[key]}"${key == bundle.keys.last ? '' : ','}');
}
contents.writeln('}');
file.writeAsStringSync(contents.toString());
}
Future<void> main(List<String> rawArgs) async {
checkCwdIsRepoRoot('encode_kn_arb_files');
final String l10nPath = path.join('packages', 'flutter_localizations', 'lib', 'src', 'l10n');
final File materialArbFile = File(path.join(l10nPath, 'material_kn.arb'));
final File cupertinoArbFile = File(path.join(l10nPath, 'cupertino_kn.arb'));
final Map<String, dynamic> materialBundle = loadBundle(materialArbFile);
final Map<String, dynamic> cupertinoBundle = loadBundle(cupertinoArbFile);
encodeBundleTranslations(materialBundle);
encodeBundleTranslations(cupertinoBundle);
checkEncodedTranslations(materialBundle, loadBundle(materialArbFile));
checkEncodedTranslations(cupertinoBundle, loadBundle(cupertinoArbFile));
rewriteBundle(materialArbFile, materialBundle);
rewriteBundle(cupertinoArbFile, cupertinoBundle);
}
......@@ -36,6 +36,12 @@ import 'localizations_utils.dart';
const String _kCommandName = 'gen_date_localizations.dart';
// Used to let _jsonToMap know what locale it's date symbols converting for.
// Date symbols for the Kannada locale ('kn') are handled specially because
// some of the strings contain characters that can crash Emacs on Linux.
// See packages/flutter_localizations/lib/src/l10n/README for more information.
String currentLocale;
Future<void> main(List<String> rawArgs) async {
checkCwdIsRepoRoot(_kCommandName);
......@@ -87,9 +93,11 @@ Future<void> main(List<String> rawArgs) async {
/// supported by flutter_localizations.''');
buffer.writeln('const Map<String, dynamic> dateSymbols = <String, dynamic> {');
symbolFiles.forEach((String locale, File data) {
currentLocale = locale;
if (_supportedLocales().contains(locale))
buffer.writeln(_jsonToMapEntry(locale, json.decode(data.readAsStringSync())));
});
currentLocale = null;
buffer.writeln('};');
// Code that uses datePatterns expects it to contain values of type
......@@ -132,7 +140,9 @@ String _jsonToMap(dynamic json) {
return '$json';
if (json is String) {
if (json.contains("'"))
if (currentLocale == 'kn')
return generateEncodedString(json);
else if (json.contains("'"))
return 'r"""$json"""';
else
return "r'''$json'''";
......
......@@ -137,7 +137,7 @@ String generateArbBasedLocalizationSubclasses({
final Map<String, String> languageResources = localeToResources[languageLocale];
for (String key in allKeys) {
final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
output.writeln(generateGetter(key, languageResources[key], attributes));
output.writeln(generateGetter(key, languageResources[key], attributes, languageLocale));
}
output.writeln('}');
int countryCodeCount = 0;
......@@ -159,7 +159,7 @@ String generateArbBasedLocalizationSubclasses({
if (languageResources[key] == scriptResources[key])
continue;
final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
output.writeln(generateGetter(key, scriptResources[key], attributes));
output.writeln(generateGetter(key, scriptResources[key], attributes, languageLocale));
}
output.writeln('}');
......@@ -184,7 +184,7 @@ String generateArbBasedLocalizationSubclasses({
if (scriptResources.containsKey(key) ? scriptResources[key] == localeResources[key] : languageResources[key] == localeResources[key])
continue;
final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
output.writeln(generateGetter(key, localeResources[key], attributes));
output.writeln(generateGetter(key, localeResources[key], attributes, languageLocale));
}
output.writeln('}');
}
......@@ -208,7 +208,7 @@ String generateArbBasedLocalizationSubclasses({
if (languageResources[key] == localeResources[key])
continue;
final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
output.writeln(generateGetter(key, localeResources[key], attributes));
output.writeln(generateGetter(key, localeResources[key], attributes, languageLocale));
}
output.writeln('}');
}
......@@ -438,7 +438,7 @@ const Map<String, String> _scriptCategoryToEnum = <String, String>{
/// it.
///
/// Used by [generateGetter] below.
String generateValue(String value, Map<String, dynamic> attributes) {
String generateValue(String value, Map<String, dynamic> attributes, LocaleInfo locale) {
if (value == null)
return null;
// cupertino_en.arb doesn't use x-flutter-type.
......@@ -464,15 +464,19 @@ String generateValue(String value, Map<String, dynamic> attributes) {
return _scriptCategoryToEnum[value];
}
}
return generateString(value);
// Localization strings for the Kannada locale ('kn') are encoded because
// some of the localized strings contain characters that can crash Emacs on Linux.
// See packages/flutter_localizations/lib/src/l10n/README for more information.
return locale.languageCode == 'kn' ? generateEncodedString(value) : generateString(value);
}
/// Combines [generateType], [generateKey], and [generateValue] to return
/// the source of getters for the GlobalMaterialLocalizations subclass.
String generateGetter(String key, String value, Map<String, dynamic> attributes) {
/// The locale is the locale for which the getter is being generated.
String generateGetter(String key, String value, Map<String, dynamic> attributes, LocaleInfo locale) {
final String type = generateType(attributes);
key = generateKey(key, attributes);
value = generateValue(value, attributes);
value = generateValue(value, attributes, locale);
return '''
@override
......
......@@ -401,3 +401,14 @@ String generateString(String s) {
output.write("'");
return output.toString();
}
/// Only used to generate localization strings for the Kannada locale ('kn') because
/// some of the localized strings contain characters that can crash Emacs on Linux.
/// See packages/flutter_localizations/lib/src/l10n/README for more information.
String generateEncodedString(String s) {
if (s.runes.every((int code) => code <= 0xFF))
return generateString(s);
final String unicodeEscapes = s.runes.map((int code) => '\\u{${code.toRadixString(16)}}').join();
return "'$unicodeEscapes'";
}
......@@ -186,6 +186,19 @@ dart dev/tools/localizations/gen_localizations.dart --overwrite
```
### Special handling for the Kannada (kn) translations
Originally, the cupertino_kn.arb and material_kn.arb files contained unicode
characters that can cause current versions of Emacs on Linux to crash. There is
more information here: https://github.com/flutter/flutter/issues/36704.
Rather than risking developers' editor sessions, the strings in these arb files
(and the code generated for them) have been encoded using the appropriate
escapes for JSON and Dart. The JSON format arb files were rewritten with
dev/tools/localization/encode_kn_arb_files.dart. The localizations code
generator uses generateEncodedString() from dev/tools/localization/localizations_utils.
### Translations Status, Reporting Errors
The translations (the `.arb` files) in this directory are based on the
......
{
"datePickerHourSemanticsLabelOne": "\u0024\u0068\u006f\u0075\u0072\u0020\u0c97\u0c82\u0c9f\u0cc6",
"datePickerHourSemanticsLabelOther": "\u0024\u0068\u006f\u0075\u0072\u0020\u0c97\u0c82\u0c9f\u0cc6",
"datePickerMinuteSemanticsLabelOne": "\u0031\u0020\u0ca8\u0cbf\u0cae\u0cbf\u0cb7",
"datePickerMinuteSemanticsLabelOther": "\u0024\u006d\u0069\u006e\u0075\u0074\u0065\u0020\u0ca8\u0cbf\u0cae\u0cbf\u0cb7\u0c97\u0cb3\u0cc1",
"datePickerDateOrder": "\u0064\u006d\u0079",
"datePickerDateTimeOrder": "\u0064\u0061\u0074\u0065\u005f\u0074\u0069\u006d\u0065\u005f\u0064\u0061\u0079\u0050\u0065\u0072\u0069\u006f\u0064",
"anteMeridiemAbbreviation": "\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6",
"postMeridiemAbbreviation": "\u0cb8\u0c82\u0c9c\u0cc6",
"todayLabel": "\u0c87\u0c82\u0ca6\u0cc1",
"alertDialogLabel": "\u0c8e\u0c9a\u0ccd\u0c9a\u0cb0\u0cbf\u0c95\u0cc6",
"timerPickerHourLabelOne": "\u0c97\u0c82\u0c9f\u0cc6",
"timerPickerHourLabelOther": "\u0c97\u0c82\u0c9f\u0cc6\u0c97\u0cb3\u0cc1",
"timerPickerMinuteLabelOne": "\u0ca8\u0cbf\u0cae\u0cbf\u002e",
"timerPickerMinuteLabelOther": "\u0ca8\u0cbf\u0cae\u0cbf\u002e",
"timerPickerSecondLabelOne": "\u0cb8\u0cc6\u002e",
"timerPickerSecondLabelOther": "\u0cb8\u0cc6\u002e",
"cutButtonLabel": "\u0c95\u0ca4\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
"copyButtonLabel": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf",
"pasteButtonLabel": "\u0c85\u0c82\u0c9f\u0cbf\u0cb8\u0cbf",
"selectAllButtonLabel": "\u0c8e\u0cb2\u0ccd\u0cb2\u0cb5\u0ca8\u0ccd\u0ca8\u0cc2\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf"
}
......@@ -6707,6 +6707,154 @@ class CupertinoLocalizationKm extends GlobalCupertinoLocalizations {
String get todayLabel => r'ថ្ងៃនេះ';
}
/// The translations for Kannada (`kn`).
class CupertinoLocalizationKn extends GlobalCupertinoLocalizations {
/// Create an instance of the translation bundle for Kannada.
///
/// For details on the meaning of the arguments, see [GlobalCupertinoLocalizations].
const CupertinoLocalizationKn({
String localeName = 'kn',
@required intl.DateFormat fullYearFormat,
@required intl.DateFormat dayFormat,
@required intl.DateFormat mediumDateFormat,
@required intl.DateFormat singleDigitHourFormat,
@required intl.DateFormat singleDigitMinuteFormat,
@required intl.DateFormat doubleDigitMinuteFormat,
@required intl.DateFormat singleDigitSecondFormat,
@required intl.NumberFormat decimalFormat,
}) : super(
localeName: localeName,
fullYearFormat: fullYearFormat,
dayFormat: dayFormat,
mediumDateFormat: mediumDateFormat,
singleDigitHourFormat: singleDigitHourFormat,
singleDigitMinuteFormat: singleDigitMinuteFormat,
doubleDigitMinuteFormat: doubleDigitMinuteFormat,
singleDigitSecondFormat: singleDigitSecondFormat,
decimalFormat: decimalFormat,
);
@override
String get alertDialogLabel => '\u{c8e}\u{c9a}\u{ccd}\u{c9a}\u{cb0}\u{cbf}\u{c95}\u{cc6}';
@override
String get anteMeridiemAbbreviation => '\u{cac}\u{cc6}\u{cb3}\u{cbf}\u{c97}\u{ccd}\u{c97}\u{cc6}';
@override
String get copyButtonLabel => '\u{ca8}\u{c95}\u{cb2}\u{cbf}\u{cb8}\u{cbf}';
@override
String get cutButtonLabel => '\u{c95}\u{ca4}\u{ccd}\u{ca4}\u{cb0}\u{cbf}\u{cb8}\u{cbf}';
@override
String get datePickerDateOrderString => r'dmy';
@override
String get datePickerDateTimeOrderString => r'date_time_dayPeriod';
@override
String get datePickerHourSemanticsLabelFew => null;
@override
String get datePickerHourSemanticsLabelMany => null;
@override
String get datePickerHourSemanticsLabelOne => '\u{24}\u{68}\u{6f}\u{75}\u{72}\u{20}\u{c97}\u{c82}\u{c9f}\u{cc6}';
@override
String get datePickerHourSemanticsLabelOther => '\u{24}\u{68}\u{6f}\u{75}\u{72}\u{20}\u{c97}\u{c82}\u{c9f}\u{cc6}';
@override
String get datePickerHourSemanticsLabelTwo => null;
@override
String get datePickerHourSemanticsLabelZero => null;
@override
String get datePickerMinuteSemanticsLabelFew => null;
@override
String get datePickerMinuteSemanticsLabelMany => null;
@override
String get datePickerMinuteSemanticsLabelOne => '\u{31}\u{20}\u{ca8}\u{cbf}\u{cae}\u{cbf}\u{cb7}';
@override
String get datePickerMinuteSemanticsLabelOther => '\u{24}\u{6d}\u{69}\u{6e}\u{75}\u{74}\u{65}\u{20}\u{ca8}\u{cbf}\u{cae}\u{cbf}\u{cb7}\u{c97}\u{cb3}\u{cc1}';
@override
String get datePickerMinuteSemanticsLabelTwo => null;
@override
String get datePickerMinuteSemanticsLabelZero => null;
@override
String get pasteButtonLabel => '\u{c85}\u{c82}\u{c9f}\u{cbf}\u{cb8}\u{cbf}';
@override
String get postMeridiemAbbreviation => '\u{cb8}\u{c82}\u{c9c}\u{cc6}';
@override
String get selectAllButtonLabel => '\u{c8e}\u{cb2}\u{ccd}\u{cb2}\u{cb5}\u{ca8}\u{ccd}\u{ca8}\u{cc2}\u{20}\u{c86}\u{caf}\u{ccd}\u{c95}\u{cc6}\u{cae}\u{cbe}\u{ca1}\u{cbf}';
@override
String get timerPickerHourLabelFew => null;
@override
String get timerPickerHourLabelMany => null;
@override
String get timerPickerHourLabelOne => '\u{c97}\u{c82}\u{c9f}\u{cc6}';
@override
String get timerPickerHourLabelOther => '\u{c97}\u{c82}\u{c9f}\u{cc6}\u{c97}\u{cb3}\u{cc1}';
@override
String get timerPickerHourLabelTwo => null;
@override
String get timerPickerHourLabelZero => null;
@override
String get timerPickerMinuteLabelFew => null;
@override
String get timerPickerMinuteLabelMany => null;
@override
String get timerPickerMinuteLabelOne => '\u{ca8}\u{cbf}\u{cae}\u{cbf}\u{2e}';
@override
String get timerPickerMinuteLabelOther => '\u{ca8}\u{cbf}\u{cae}\u{cbf}\u{2e}';
@override
String get timerPickerMinuteLabelTwo => null;
@override
String get timerPickerMinuteLabelZero => null;
@override
String get timerPickerSecondLabelFew => null;
@override
String get timerPickerSecondLabelMany => null;
@override
String get timerPickerSecondLabelOne => '\u{cb8}\u{cc6}\u{2e}';
@override
String get timerPickerSecondLabelOther => '\u{cb8}\u{cc6}\u{2e}';
@override
String get timerPickerSecondLabelTwo => null;
@override
String get timerPickerSecondLabelZero => null;
@override
String get todayLabel => '\u{c87}\u{c82}\u{ca6}\u{cc1}';
}
/// The translations for Korean (`ko`).
class CupertinoLocalizationKo extends GlobalCupertinoLocalizations {
/// Create an instance of the translation bundle for Korean.
......@@ -12696,6 +12844,7 @@ final Set<String> kCupertinoSupportedLanguages = HashSet<String>.from(const <Str
'ka', // Georgian
'kk', // Kazakh
'km', // Khmer Central Khmer
'kn', // Kannada
'ko', // Korean
'ky', // Kirghiz Kyrgyz
'lo', // Lao
......@@ -12783,6 +12932,7 @@ final Set<String> kCupertinoSupportedLanguages = HashSet<String>.from(const <Str
/// * `ka` - Georgian
/// * `kk` - Kazakh
/// * `km` - Khmer Central Khmer
/// * `kn` - Kannada
/// * `ko` - Korean
/// * `ky` - Kirghiz Kyrgyz
/// * `lo` - Lao
......@@ -12976,6 +13126,8 @@ GlobalCupertinoLocalizations getCupertinoTranslation(
return CupertinoLocalizationKk(fullYearFormat: fullYearFormat, dayFormat: dayFormat, mediumDateFormat: mediumDateFormat, singleDigitHourFormat: singleDigitHourFormat, singleDigitMinuteFormat: singleDigitMinuteFormat, doubleDigitMinuteFormat: doubleDigitMinuteFormat, singleDigitSecondFormat: singleDigitSecondFormat, decimalFormat: decimalFormat);
case 'km':
return CupertinoLocalizationKm(fullYearFormat: fullYearFormat, dayFormat: dayFormat, mediumDateFormat: mediumDateFormat, singleDigitHourFormat: singleDigitHourFormat, singleDigitMinuteFormat: singleDigitMinuteFormat, doubleDigitMinuteFormat: doubleDigitMinuteFormat, singleDigitSecondFormat: singleDigitSecondFormat, decimalFormat: decimalFormat);
case 'kn':
return CupertinoLocalizationKn(fullYearFormat: fullYearFormat, dayFormat: dayFormat, mediumDateFormat: mediumDateFormat, singleDigitHourFormat: singleDigitHourFormat, singleDigitMinuteFormat: singleDigitMinuteFormat, doubleDigitMinuteFormat: doubleDigitMinuteFormat, singleDigitSecondFormat: singleDigitSecondFormat, decimalFormat: decimalFormat);
case 'ko':
return CupertinoLocalizationKo(fullYearFormat: fullYearFormat, dayFormat: dayFormat, mediumDateFormat: mediumDateFormat, singleDigitHourFormat: singleDigitHourFormat, singleDigitMinuteFormat: singleDigitMinuteFormat, doubleDigitMinuteFormat: doubleDigitMinuteFormat, singleDigitSecondFormat: singleDigitSecondFormat, decimalFormat: decimalFormat);
case 'ky':
......
......@@ -8396,6 +8396,193 @@ const Map<String, dynamic> dateSymbols = <String, dynamic>{
r'''{1}, {0}'''
],
},
'kn': <String, dynamic>{
'NAME': r'kn',
'ERAS': <dynamic>[
'\u{c95}\u{ccd}\u{cb0}\u{cbf}\u{2e}\u{caa}\u{cc2}',
'\u{c95}\u{ccd}\u{cb0}\u{cbf}\u{2e}\u{cb6}'
],
'ERANAMES': <dynamic>[
'\u{c95}\u{ccd}\u{cb0}\u{cbf}\u{cb8}\u{ccd}\u{ca4}\u{20}\u{caa}\u{cc2}\u{cb0}\u{ccd}\u{cb5}',
'\u{c95}\u{ccd}\u{cb0}\u{cbf}\u{cb8}\u{ccd}\u{ca4}\u{20}\u{cb6}\u{c95}'
],
'NARROWMONTHS': <dynamic>[
'\u{c9c}',
'\u{cab}\u{cc6}',
'\u{cae}\u{cbe}',
'\u{c8f}',
'\u{cae}\u{cc7}',
'\u{c9c}\u{cc2}',
'\u{c9c}\u{cc1}',
'\u{c86}',
'\u{cb8}\u{cc6}',
'\u{c85}',
'\u{ca8}',
'\u{ca1}\u{cbf}'
],
'STANDALONENARROWMONTHS': <dynamic>[
'\u{c9c}',
'\u{cab}\u{cc6}',
'\u{cae}\u{cbe}',
'\u{c8f}',
'\u{cae}\u{cc7}',
'\u{c9c}\u{cc2}',
'\u{c9c}\u{cc1}',
'\u{c86}',
'\u{cb8}\u{cc6}',
'\u{c85}',
'\u{ca8}',
'\u{ca1}\u{cbf}'
],
'MONTHS': <dynamic>[
'\u{c9c}\u{ca8}\u{cb5}\u{cb0}\u{cbf}',
'\u{cab}\u{cc6}\u{cac}\u{ccd}\u{cb0}\u{cb5}\u{cb0}\u{cbf}',
'\u{cae}\u{cbe}\u{cb0}\u{ccd}\u{c9a}\u{ccd}',
'\u{c8f}\u{caa}\u{ccd}\u{cb0}\u{cbf}\u{cb2}\u{ccd}',
'\u{cae}\u{cc7}',
'\u{c9c}\u{cc2}\u{ca8}\u{ccd}',
'\u{c9c}\u{cc1}\u{cb2}\u{cc8}',
'\u{c86}\u{c97}\u{cb8}\u{ccd}\u{c9f}\u{ccd}',
'\u{cb8}\u{cc6}\u{caa}\u{ccd}\u{c9f}\u{cc6}\u{c82}\u{cac}\u{cb0}\u{ccd}',
'\u{c85}\u{c95}\u{ccd}\u{c9f}\u{ccb}\u{cac}\u{cb0}\u{ccd}',
'\u{ca8}\u{cb5}\u{cc6}\u{c82}\u{cac}\u{cb0}\u{ccd}',
'\u{ca1}\u{cbf}\u{cb8}\u{cc6}\u{c82}\u{cac}\u{cb0}\u{ccd}'
],
'STANDALONEMONTHS': <dynamic>[
'\u{c9c}\u{ca8}\u{cb5}\u{cb0}\u{cbf}',
'\u{cab}\u{cc6}\u{cac}\u{ccd}\u{cb0}\u{cb5}\u{cb0}\u{cbf}',
'\u{cae}\u{cbe}\u{cb0}\u{ccd}\u{c9a}\u{ccd}',
'\u{c8f}\u{caa}\u{ccd}\u{cb0}\u{cbf}\u{cb2}\u{ccd}',
'\u{cae}\u{cc7}',
'\u{c9c}\u{cc2}\u{ca8}\u{ccd}',
'\u{c9c}\u{cc1}\u{cb2}\u{cc8}',
'\u{c86}\u{c97}\u{cb8}\u{ccd}\u{c9f}\u{ccd}',
'\u{cb8}\u{cc6}\u{caa}\u{ccd}\u{c9f}\u{cc6}\u{c82}\u{cac}\u{cb0}\u{ccd}',
'\u{c85}\u{c95}\u{ccd}\u{c9f}\u{ccb}\u{cac}\u{cb0}\u{ccd}',
'\u{ca8}\u{cb5}\u{cc6}\u{c82}\u{cac}\u{cb0}\u{ccd}',
'\u{ca1}\u{cbf}\u{cb8}\u{cc6}\u{c82}\u{cac}\u{cb0}\u{ccd}'
],
'SHORTMONTHS': <dynamic>[
'\u{c9c}\u{ca8}\u{cb5}\u{cb0}\u{cbf}',
'\u{cab}\u{cc6}\u{cac}\u{ccd}\u{cb0}\u{cb5}\u{cb0}\u{cbf}',
'\u{cae}\u{cbe}\u{cb0}\u{ccd}\u{c9a}\u{ccd}',
'\u{c8f}\u{caa}\u{ccd}\u{cb0}\u{cbf}',
'\u{cae}\u{cc7}',
'\u{c9c}\u{cc2}\u{ca8}\u{ccd}',
'\u{c9c}\u{cc1}\u{cb2}\u{cc8}',
'\u{c86}\u{c97}',
'\u{cb8}\u{cc6}\u{caa}\u{ccd}\u{c9f}\u{cc6}\u{c82}',
'\u{c85}\u{c95}\u{ccd}\u{c9f}\u{ccb}',
'\u{ca8}\u{cb5}\u{cc6}\u{c82}',
'\u{ca1}\u{cbf}\u{cb8}\u{cc6}\u{c82}'
],
'STANDALONESHORTMONTHS': <dynamic>[
'\u{c9c}\u{ca8}',
'\u{cab}\u{cc6}\u{cac}\u{ccd}\u{cb0}',
'\u{cae}\u{cbe}\u{cb0}\u{ccd}\u{c9a}\u{ccd}',
'\u{c8f}\u{caa}\u{ccd}\u{cb0}\u{cbf}',
'\u{cae}\u{cc7}',
'\u{c9c}\u{cc2}\u{ca8}\u{ccd}',
'\u{c9c}\u{cc1}\u{cb2}\u{cc8}',
'\u{c86}\u{c97}',
'\u{cb8}\u{cc6}\u{caa}\u{ccd}\u{c9f}\u{cc6}\u{c82}',
'\u{c85}\u{c95}\u{ccd}\u{c9f}\u{ccb}',
'\u{ca8}\u{cb5}\u{cc6}\u{c82}',
'\u{ca1}\u{cbf}\u{cb8}\u{cc6}\u{c82}'
],
'WEEKDAYS': <dynamic>[
'\u{cad}\u{cbe}\u{ca8}\u{cc1}\u{cb5}\u{cbe}\u{cb0}',
'\u{cb8}\u{ccb}\u{cae}\u{cb5}\u{cbe}\u{cb0}',
'\u{cae}\u{c82}\u{c97}\u{cb3}\u{cb5}\u{cbe}\u{cb0}',
'\u{cac}\u{cc1}\u{ca7}\u{cb5}\u{cbe}\u{cb0}',
'\u{c97}\u{cc1}\u{cb0}\u{cc1}\u{cb5}\u{cbe}\u{cb0}',
'\u{cb6}\u{cc1}\u{c95}\u{ccd}\u{cb0}\u{cb5}\u{cbe}\u{cb0}',
'\u{cb6}\u{ca8}\u{cbf}\u{cb5}\u{cbe}\u{cb0}'
],
'STANDALONEWEEKDAYS': <dynamic>[
'\u{cad}\u{cbe}\u{ca8}\u{cc1}\u{cb5}\u{cbe}\u{cb0}',
'\u{cb8}\u{ccb}\u{cae}\u{cb5}\u{cbe}\u{cb0}',
'\u{cae}\u{c82}\u{c97}\u{cb3}\u{cb5}\u{cbe}\u{cb0}',
'\u{cac}\u{cc1}\u{ca7}\u{cb5}\u{cbe}\u{cb0}',
'\u{c97}\u{cc1}\u{cb0}\u{cc1}\u{cb5}\u{cbe}\u{cb0}',
'\u{cb6}\u{cc1}\u{c95}\u{ccd}\u{cb0}\u{cb5}\u{cbe}\u{cb0}',
'\u{cb6}\u{ca8}\u{cbf}\u{cb5}\u{cbe}\u{cb0}'
],
'SHORTWEEKDAYS': <dynamic>[
'\u{cad}\u{cbe}\u{ca8}\u{cc1}',
'\u{cb8}\u{ccb}\u{cae}',
'\u{cae}\u{c82}\u{c97}\u{cb3}',
'\u{cac}\u{cc1}\u{ca7}',
'\u{c97}\u{cc1}\u{cb0}\u{cc1}',
'\u{cb6}\u{cc1}\u{c95}\u{ccd}\u{cb0}',
'\u{cb6}\u{ca8}\u{cbf}'
],
'STANDALONESHORTWEEKDAYS': <dynamic>[
'\u{cad}\u{cbe}\u{ca8}\u{cc1}',
'\u{cb8}\u{ccb}\u{cae}',
'\u{cae}\u{c82}\u{c97}\u{cb3}',
'\u{cac}\u{cc1}\u{ca7}',
'\u{c97}\u{cc1}\u{cb0}\u{cc1}',
'\u{cb6}\u{cc1}\u{c95}\u{ccd}\u{cb0}',
'\u{cb6}\u{ca8}\u{cbf}'
],
'NARROWWEEKDAYS': <dynamic>[
'\u{cad}\u{cbe}',
'\u{cb8}\u{ccb}',
'\u{cae}\u{c82}',
'\u{cac}\u{cc1}',
'\u{c97}\u{cc1}',
'\u{cb6}\u{cc1}',
'\u{cb6}'
],
'STANDALONENARROWWEEKDAYS': <dynamic>[
'\u{cad}\u{cbe}',
'\u{cb8}\u{ccb}',
'\u{cae}\u{c82}',
'\u{cac}\u{cc1}',
'\u{c97}\u{cc1}',
'\u{cb6}\u{cc1}',
'\u{cb6}'
],
'SHORTQUARTERS': <dynamic>[
'\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{20}\u{31}',
'\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{20}\u{32}',
'\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{20}\u{33}',
'\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{20}\u{34}'
],
'QUARTERS': <dynamic>[
'\u{31}\u{ca8}\u{cc7}\u{20}\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{cae}\u{cbe}\u{cb8}\u{cbf}\u{c95}',
'\u{32}\u{ca8}\u{cc7}\u{20}\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{cae}\u{cbe}\u{cb8}\u{cbf}\u{c95}',
'\u{33}\u{ca8}\u{cc7}\u{20}\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{cae}\u{cbe}\u{cb8}\u{cbf}\u{c95}',
'\u{34}\u{ca8}\u{cc7}\u{20}\u{ca4}\u{ccd}\u{cb0}\u{cc8}\u{cae}\u{cbe}\u{cb8}\u{cbf}\u{c95}'
],
'AMPMS': <dynamic>[
'\u{caa}\u{cc2}\u{cb0}\u{ccd}\u{cb5}\u{cbe}\u{cb9}\u{ccd}\u{ca8}',
'\u{c85}\u{caa}\u{cb0}\u{cbe}\u{cb9}\u{ccd}\u{ca8}'
],
'DATEFORMATS': <dynamic>[
r'EEEE, MMMM d, y',
r'MMMM d, y',
r'MMM d, y',
r'd/M/yy'
],
'TIMEFORMATS': <dynamic>[
r'hh:mm:ss a zzzz',
r'hh:mm:ss a z',
r'hh:mm:ss a',
r'hh:mm a'
],
'AVAILABLEFORMATS': null,
'FIRSTDAYOFWEEK': 6,
'WEEKENDRANGE': <dynamic>[6, 6],
'FIRSTWEEKCUTOFFDAY': 5,
'DATETIMEFORMATS': <dynamic>[
r'{1} {0}',
r'{1} {0}',
r'{1} {0}',
r'{1} {0}'
],
},
'ko': <String, dynamic>{
'NAME': r'''ko''',
'ERAS': <dynamic>[r'''BC''', r'''AD'''],
......@@ -18164,6 +18351,52 @@ const Map<String, Map<String, String>> datePatterns =
'zzzz': r'''zzzz''',
'ZZZZ': r'''ZZZZ''',
},
'kn': <String, String>{
'd': r'''d''',
'E': r'''ccc''',
'EEEE': r'''cccc''',
'LLL': r'''LLL''',
'LLLL': r'''LLLL''',
'M': r'''L''',
'Md': r'''d/M''',
'MEd': r'''d/M, EEE''',
'MMM': r'''LLL''',
'MMMd': r'''MMM d''',
'MMMEd': r'''EEE, d MMM''',
'MMMM': r'''LLLL''',
'MMMMd': r'''d MMMM''',
'MMMMEEEEd': r'''EEEE, d MMMM''',
'QQQ': r'''QQQ''',
'QQQQ': r'''QQQQ''',
'y': r'''y''',
'yM': r'''M/y''',
'yMd': r'''d/M/y''',
'yMEd': r'''EEE, M/d/y''',
'yMMM': r'''MMM y''',
'yMMMd': r'''MMM d,y''',
'yMMMEd': r'''EEE, MMM d, y''',
'yMMMM': r'''MMMM y''',
'yMMMMd': r'''MMMM d, y''',
'yMMMMEEEEd': r'''EEEE, MMMM d, y''',
'yQQQ': r'''QQQ y''',
'yQQQQ': r'''QQQQ y''',
'H': r'''HH''',
'Hm': r'''HH:mm''',
'Hms': r'''HH:mm:ss''',
'j': r'''h a''',
'jm': r'''h:mm a''',
'jms': r'''h:mm:ss a''',
'jmv': r'''h:mm a v''',
'jmz': r'''h:mm a z''',
'jz': r'''h a z''',
'm': r'''m''',
'ms': r'''mm:ss''',
's': r'''s''',
'v': r'''v''',
'z': r'''z''',
'zzzz': r'''zzzz''',
'ZZZZ': r'''ZZZZ''',
},
'ko': <String, String>{
'd': r'''d일''',
'E': r'''ccc''',
......
{
"scriptCategory": "\u0074\u0061\u006c\u006c",
"timeOfDayFormat": "\u0048\u003a\u006d\u006d",
"openAppDrawerTooltip": "\u0ca8\u0ccd\u0caf\u0cbe\u0cb5\u0cbf\u0c97\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0020\u0cae\u0cc6\u0ca8\u0cc1\u0020\u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf",
"backButtonTooltip": "\u0cb9\u0cbf\u0c82\u0ca4\u0cbf\u0cb0\u0cc1\u0c97\u0cbf",
"closeButtonTooltip": "\u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf\u0cb0\u0cbf",
"deleteButtonTooltip": "\u0c85\u0cb3\u0cbf\u0cb8\u0cbf",
"nextMonthTooltip": "\u0cae\u0cc1\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",
"previousMonthTooltip": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",
"nextPageTooltip": "\u0cae\u0cc1\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0caa\u0cc1\u0c9f",
"previousPageTooltip": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0caa\u0cc1\u0c9f",
"showMenuTooltip": "\u0cae\u0cc6\u0ca8\u0cc1\u0020\u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf",
"aboutListTileTitle": "\u0024\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u004e\u0061\u006d\u0065\u0020\u0cac\u0c97\u0ccd\u0c97\u0cc6",
"licensesPageTitle": "\u0caa\u0cb0\u0cb5\u0cbe\u0ca8\u0c97\u0cbf\u0c97\u0cb3\u0cc1",
"pageRowsInfoTitle": "\u0024\u0072\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0020\u0024\u0066\u0069\u0072\u0073\u0074\u0052\u006f\u0077\u2013\u0024\u006c\u0061\u0073\u0074\u0052\u006f\u0077",
"pageRowsInfoTitleApproximate": "\u0024\u0072\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0020\u0024\u0066\u0069\u0072\u0073\u0074\u0052\u006f\u0077\u2013\u0024\u006c\u0061\u0073\u0074\u0052\u006f\u0077",
"rowsPerPageTitle": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0020\u0caa\u0cc1\u0c9f\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cbe\u0cb2\u0cc1\u0c97\u0cb3\u0cc1\u003a",
"tabLabel": "\u0024\u0074\u0061\u0062\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0ca8\u0020\u0024\u0074\u0061\u0062\u0049\u006e\u0064\u0065\u0078\u0020\u0c9f\u0ccd\u0caf\u0cbe\u0cac\u0ccd",
"selectedRowCountTitleOne": "\u0031\u0020\u0c90\u0c9f\u0c82\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"selectedRowCountTitleOther": "\u0024\u0073\u0065\u006c\u0065\u0063\u0074\u0065\u0064\u0052\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0c90\u0c9f\u0c82\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"cancelButtonLabel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf",
"closeButtonLabel": "\u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf\u0cb0\u0cbf",
"continueButtonLabel": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf",
"copyButtonLabel": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf",
"cutButtonLabel": "\u0c95\u0ca4\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
"okButtonLabel": "\u0cb8\u0cb0\u0cbf",
"pasteButtonLabel": "\u0c85\u0c82\u0c9f\u0cbf\u0cb8\u0cbf",
"selectAllButtonLabel": "\u0c8e\u0cb2\u0ccd\u0cb2\u0cb5\u0ca8\u0ccd\u0ca8\u0cc2\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"viewLicensesButtonLabel": "\u0caa\u0cb0\u0cb5\u0cbe\u0ca8\u0c97\u0cbf\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0cb5\u0cbf\u0cd5\u0c95\u0ccd\u0cb7\u0cbf\u0cb8\u0cbf",
"anteMeridiemAbbreviation": "\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6",
"postMeridiemAbbreviation": "\u0cb8\u0c82\u0c9c\u0cc6",
"timePickerHourModeAnnouncement": "\u0c97\u0c82\u0c9f\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"timePickerMinuteModeAnnouncement": "\u0ca8\u0cbf\u0cae\u0cbf\u0cb7\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"modalBarrierDismissLabel": "\u0cb5\u0c9c\u0cbe\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cbf",
"signedInLabel": "\u0cb8\u0cc8\u0ca8\u0ccd\u0020\u0c87\u0ca8\u0ccd\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"hideAccountsLabel": "\u0c96\u0cbe\u0ca4\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0cae\u0cb0\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"showAccountsLabel": "\u0c96\u0cbe\u0ca4\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf",
"drawerLabel": "\u0ca8\u0ccd\u0caf\u0cbe\u0cb5\u0cbf\u0c97\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0020\u0cae\u0cc6\u0ca8\u0cc1",
"popupMenuLabel": "\u0caa\u0cbe\u0caa\u0ccd\u0c85\u0caa\u0ccd\u0020\u0cae\u0cc6\u0ca8\u0cc1",
"dialogLabel": "\u0ca1\u0cc8\u0cb2\u0cbe\u0c97\u0ccd",
"alertDialogLabel": "\u0c8e\u0c9a\u0ccd\u0c9a\u0cb0\u0cbf\u0c95\u0cc6",
"searchFieldLabel": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf",
"reorderItemToStart": "\u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemToEnd": "\u0c95\u0cca\u0ca8\u0cc6\u0c97\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemUp": "\u0cae\u0cc7\u0cb2\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemDown": "\u0c95\u0cc6\u0cb3\u0c97\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemLeft": "\u0c8e\u0ca1\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemRight": "\u0cac\u0cb2\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"expandedIconTapHint": "\u0c95\u0cc1\u0c97\u0ccd\u0c97\u0cbf\u0cb8\u0cbf",
"collapsedIconTapHint": "\u0cb5\u0cbf\u0cb8\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
"remainingTextFieldCharacterCountOne": "\u0031\u0020\u0c85\u0c95\u0ccd\u0cb7\u0cb0\u0020\u0c89\u0cb3\u0cbf\u0ca6\u0cbf\u0ca6\u0cc6",
"remainingTextFieldCharacterCountOther": "\u0024\u0072\u0065\u006d\u0061\u0069\u006e\u0069\u006e\u0067\u0043\u006f\u0075\u006e\u0074\u0020\u0c85\u0c95\u0ccd\u0cb7\u0cb0\u0c97\u0cb3\u0cc1\u0020\u0c89\u0cb3\u0cbf\u0ca6\u0cbf\u0cb5\u0cc6",
"refreshIndicatorSemanticLabel": "\u0cb0\u0cbf\u0cab\u0ccd\u0cb0\u0cc6\u0cb6\u0ccd\u0020\u0cae\u0cbe\u0ca1\u0cbf"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment