From 82f8ded8d2000c2ea4adbd726c307a9bb235271e Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Mon, 29 Jul 2019 16:21:19 -0700 Subject: [PATCH] Add support for the Kannada (kn) locale (#37026) --- .../localization/encode_kn_arb_files.dart | 95 +++++++ .../localization/gen_date_localizations.dart | 12 +- dev/tools/localization/gen_localizations.dart | 20 +- .../localization/localizations_utils.dart | 11 + .../lib/src/l10n/README.md | 13 + .../lib/src/l10n/cupertino_kn.arb | 22 ++ .../generated_cupertino_localizations.dart | 152 ++++++++++++ .../l10n/generated_date_localizations.dart | 233 ++++++++++++++++++ .../generated_material_localizations.dart | 208 ++++++++++++++++ .../lib/src/l10n/material_kn.arb | 54 ++++ 10 files changed, 811 insertions(+), 9 deletions(-) create mode 100644 dev/tools/localization/encode_kn_arb_files.dart create mode 100644 packages/flutter_localizations/lib/src/l10n/cupertino_kn.arb create mode 100644 packages/flutter_localizations/lib/src/l10n/material_kn.arb diff --git a/dev/tools/localization/encode_kn_arb_files.dart b/dev/tools/localization/encode_kn_arb_files.dart new file mode 100644 index 00000000000..d06b9fac165 --- /dev/null +++ b/dev/tools/localization/encode_kn_arb_files.dart @@ -0,0 +1,95 @@ +// 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 loadBundle(File file) { + if (!FileSystemEntity.isFileSync(file.path)) + exitWithError('Unable to find input file: ${file.path}'); + return json.decode(file.readAsStringSync()); +} + +void encodeBundleTranslations(Map 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 encodedBundle, Map 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 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 main(List 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 materialBundle = loadBundle(materialArbFile); + final Map cupertinoBundle = loadBundle(cupertinoArbFile); + + encodeBundleTranslations(materialBundle); + encodeBundleTranslations(cupertinoBundle); + + checkEncodedTranslations(materialBundle, loadBundle(materialArbFile)); + checkEncodedTranslations(cupertinoBundle, loadBundle(cupertinoArbFile)); + + rewriteBundle(materialArbFile, materialBundle); + rewriteBundle(cupertinoArbFile, cupertinoBundle); +} diff --git a/dev/tools/localization/gen_date_localizations.dart b/dev/tools/localization/gen_date_localizations.dart index 7681619a8fb..0a70db4811e 100644 --- a/dev/tools/localization/gen_date_localizations.dart +++ b/dev/tools/localization/gen_date_localizations.dart @@ -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 main(List rawArgs) async { checkCwdIsRepoRoot(_kCommandName); @@ -87,9 +93,11 @@ Future main(List rawArgs) async { /// supported by flutter_localizations.'''); buffer.writeln('const Map dateSymbols = {'); 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'''"; diff --git a/dev/tools/localization/gen_localizations.dart b/dev/tools/localization/gen_localizations.dart index bbc917030b0..a6c0ca8a617 100644 --- a/dev/tools/localization/gen_localizations.dart +++ b/dev/tools/localization/gen_localizations.dart @@ -137,7 +137,7 @@ String generateArbBasedLocalizationSubclasses({ final Map languageResources = localeToResources[languageLocale]; for (String key in allKeys) { final Map 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 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 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 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 _scriptCategoryToEnum = { /// it. /// /// Used by [generateGetter] below. -String generateValue(String value, Map attributes) { +String generateValue(String value, Map 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 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 attributes) { +/// The locale is the locale for which the getter is being generated. +String generateGetter(String key, String value, Map attributes, LocaleInfo locale) { final String type = generateType(attributes); key = generateKey(key, attributes); - value = generateValue(value, attributes); + value = generateValue(value, attributes, locale); return ''' @override diff --git a/dev/tools/localization/localizations_utils.dart b/dev/tools/localization/localizations_utils.dart index fafe4150d83..d0744c8ba29 100644 --- a/dev/tools/localization/localizations_utils.dart +++ b/dev/tools/localization/localizations_utils.dart @@ -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'"; +} diff --git a/packages/flutter_localizations/lib/src/l10n/README.md b/packages/flutter_localizations/lib/src/l10n/README.md index a8819209501..d14811a648b 100644 --- a/packages/flutter_localizations/lib/src/l10n/README.md +++ b/packages/flutter_localizations/lib/src/l10n/README.md @@ -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 diff --git a/packages/flutter_localizations/lib/src/l10n/cupertino_kn.arb b/packages/flutter_localizations/lib/src/l10n/cupertino_kn.arb new file mode 100644 index 00000000000..396ace138b8 --- /dev/null +++ b/packages/flutter_localizations/lib/src/l10n/cupertino_kn.arb @@ -0,0 +1,22 @@ +{ + "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" +} diff --git a/packages/flutter_localizations/lib/src/l10n/generated_cupertino_localizations.dart b/packages/flutter_localizations/lib/src/l10n/generated_cupertino_localizations.dart index 9681b29731c..0374ebea393 100644 --- a/packages/flutter_localizations/lib/src/l10n/generated_cupertino_localizations.dart +++ b/packages/flutter_localizations/lib/src/l10n/generated_cupertino_localizations.dart @@ -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 kCupertinoSupportedLanguages = HashSet.from(const kCupertinoSupportedLanguages = HashSet.from(const dateSymbols = { r'''{1}, {0}''' ], }, + 'kn': { + 'NAME': r'kn', + 'ERAS': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + '\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': [ + r'EEEE, MMMM d, y', + r'MMMM d, y', + r'MMM d, y', + r'd/M/yy' + ], + 'TIMEFORMATS': [ + 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': [6, 6], + 'FIRSTWEEKCUTOFFDAY': 5, + 'DATETIMEFORMATS': [ + r'{1} {0}', + r'{1} {0}', + r'{1} {0}', + r'{1} {0}' + ], + }, 'ko': { 'NAME': r'''ko''', 'ERAS': [r'''BC''', r'''AD'''], @@ -18164,6 +18351,52 @@ const Map> datePatterns = 'zzzz': r'''zzzz''', 'ZZZZ': r'''ZZZZ''', }, + 'kn': { + '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': { 'd': r'''d일''', 'E': r'''ccc''', diff --git a/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart b/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart index e777606b478..e67f0cf8976 100644 --- a/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart +++ b/packages/flutter_localizations/lib/src/l10n/generated_material_localizations.dart @@ -9579,6 +9579,210 @@ class MaterialLocalizationKm extends GlobalMaterialLocalizations { String get viewLicensesButtonLabel => r'មើលអាជ្ញាបណ្ណ'; } +/// The translations for Kannada (`kn`). +class MaterialLocalizationKn extends GlobalMaterialLocalizations { + /// Create an instance of the translation bundle for Kannada. + /// + /// For details on the meaning of the arguments, see [GlobalMaterialLocalizations]. + const MaterialLocalizationKn({ + String localeName = 'kn', + @required intl.DateFormat fullYearFormat, + @required intl.DateFormat mediumDateFormat, + @required intl.DateFormat longDateFormat, + @required intl.DateFormat yearMonthFormat, + @required intl.NumberFormat decimalFormat, + @required intl.NumberFormat twoDigitZeroPaddedFormat, + }) : super( + localeName: localeName, + fullYearFormat: fullYearFormat, + mediumDateFormat: mediumDateFormat, + longDateFormat: longDateFormat, + yearMonthFormat: yearMonthFormat, + decimalFormat: decimalFormat, + twoDigitZeroPaddedFormat: twoDigitZeroPaddedFormat, + ); + + @override + String get aboutListTileTitleRaw => '\u{24}\u{61}\u{70}\u{70}\u{6c}\u{69}\u{63}\u{61}\u{74}\u{69}\u{6f}\u{6e}\u{4e}\u{61}\u{6d}\u{65}\u{20}\u{cac}\u{c97}\u{ccd}\u{c97}\u{cc6}'; + + @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 backButtonTooltip => '\u{cb9}\u{cbf}\u{c82}\u{ca4}\u{cbf}\u{cb0}\u{cc1}\u{c97}\u{cbf}'; + + @override + String get cancelButtonLabel => '\u{cb0}\u{ca6}\u{ccd}\u{ca6}\u{cc1}\u{cae}\u{cbe}\u{ca1}\u{cbf}'; + + @override + String get closeButtonLabel => '\u{cae}\u{cc1}\u{c9a}\u{ccd}\u{c9a}\u{cbf}\u{cb0}\u{cbf}'; + + @override + String get closeButtonTooltip => '\u{cae}\u{cc1}\u{c9a}\u{ccd}\u{c9a}\u{cbf}\u{cb0}\u{cbf}'; + + @override + String get collapsedIconTapHint => '\u{cb5}\u{cbf}\u{cb8}\u{ccd}\u{ca4}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get continueButtonLabel => '\u{cae}\u{cc1}\u{c82}\u{ca6}\u{cc1}\u{cb5}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @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 deleteButtonTooltip => '\u{c85}\u{cb3}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get dialogLabel => '\u{ca1}\u{cc8}\u{cb2}\u{cbe}\u{c97}\u{ccd}'; + + @override + String get drawerLabel => '\u{ca8}\u{ccd}\u{caf}\u{cbe}\u{cb5}\u{cbf}\u{c97}\u{cc7}\u{cb6}\u{ca8}\u{ccd}\u{200c}\u{20}\u{cae}\u{cc6}\u{ca8}\u{cc1}'; + + @override + String get expandedIconTapHint => '\u{c95}\u{cc1}\u{c97}\u{ccd}\u{c97}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get hideAccountsLabel => '\u{c96}\u{cbe}\u{ca4}\u{cc6}\u{c97}\u{cb3}\u{ca8}\u{ccd}\u{ca8}\u{cc1}\u{20}\u{cae}\u{cb0}\u{cc6}\u{cae}\u{cbe}\u{ca1}\u{cbf}'; + + @override + String get licensesPageTitle => '\u{caa}\u{cb0}\u{cb5}\u{cbe}\u{ca8}\u{c97}\u{cbf}\u{c97}\u{cb3}\u{cc1}'; + + @override + String get modalBarrierDismissLabel => '\u{cb5}\u{c9c}\u{cbe}\u{c97}\u{cca}\u{cb3}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get nextMonthTooltip => '\u{cae}\u{cc1}\u{c82}\u{ca6}\u{cbf}\u{ca8}\u{20}\u{ca4}\u{cbf}\u{c82}\u{c97}\u{cb3}\u{cc1}'; + + @override + String get nextPageTooltip => '\u{cae}\u{cc1}\u{c82}\u{ca6}\u{cbf}\u{ca8}\u{20}\u{caa}\u{cc1}\u{c9f}'; + + @override + String get okButtonLabel => '\u{cb8}\u{cb0}\u{cbf}'; + + @override + String get openAppDrawerTooltip => '\u{ca8}\u{ccd}\u{caf}\u{cbe}\u{cb5}\u{cbf}\u{c97}\u{cc7}\u{cb6}\u{ca8}\u{ccd}\u{200c}\u{20}\u{cae}\u{cc6}\u{ca8}\u{cc1}\u{20}\u{ca4}\u{cc6}\u{cb0}\u{cc6}\u{caf}\u{cbf}\u{cb0}\u{cbf}'; + + @override + String get pageRowsInfoTitleRaw => '\u{24}\u{72}\u{6f}\u{77}\u{43}\u{6f}\u{75}\u{6e}\u{74}\u{20}\u{cb0}\u{cb2}\u{ccd}\u{cb2}\u{cbf}\u{20}\u{24}\u{66}\u{69}\u{72}\u{73}\u{74}\u{52}\u{6f}\u{77}\u{2013}\u{24}\u{6c}\u{61}\u{73}\u{74}\u{52}\u{6f}\u{77}'; + + @override + String get pageRowsInfoTitleApproximateRaw => '\u{24}\u{72}\u{6f}\u{77}\u{43}\u{6f}\u{75}\u{6e}\u{74}\u{20}\u{cb0}\u{cb2}\u{ccd}\u{cb2}\u{cbf}\u{20}\u{24}\u{66}\u{69}\u{72}\u{73}\u{74}\u{52}\u{6f}\u{77}\u{2013}\u{24}\u{6c}\u{61}\u{73}\u{74}\u{52}\u{6f}\u{77}'; + + @override + String get pasteButtonLabel => '\u{c85}\u{c82}\u{c9f}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get popupMenuLabel => '\u{caa}\u{cbe}\u{caa}\u{ccd}\u{c85}\u{caa}\u{ccd}\u{20}\u{cae}\u{cc6}\u{ca8}\u{cc1}'; + + @override + String get postMeridiemAbbreviation => '\u{cb8}\u{c82}\u{c9c}\u{cc6}'; + + @override + String get previousMonthTooltip => '\u{cb9}\u{cbf}\u{c82}\u{ca6}\u{cbf}\u{ca8}\u{20}\u{ca4}\u{cbf}\u{c82}\u{c97}\u{cb3}\u{cc1}'; + + @override + String get previousPageTooltip => '\u{cb9}\u{cbf}\u{c82}\u{ca6}\u{cbf}\u{ca8}\u{20}\u{caa}\u{cc1}\u{c9f}'; + + @override + String get refreshIndicatorSemanticLabel => '\u{cb0}\u{cbf}\u{cab}\u{ccd}\u{cb0}\u{cc6}\u{cb6}\u{ccd}\u{20}\u{cae}\u{cbe}\u{ca1}\u{cbf}'; + + @override + String get remainingTextFieldCharacterCountFew => null; + + @override + String get remainingTextFieldCharacterCountMany => null; + + @override + String get remainingTextFieldCharacterCountOne => '\u{31}\u{20}\u{c85}\u{c95}\u{ccd}\u{cb7}\u{cb0}\u{20}\u{c89}\u{cb3}\u{cbf}\u{ca6}\u{cbf}\u{ca6}\u{cc6}'; + + @override + String get remainingTextFieldCharacterCountOther => '\u{24}\u{72}\u{65}\u{6d}\u{61}\u{69}\u{6e}\u{69}\u{6e}\u{67}\u{43}\u{6f}\u{75}\u{6e}\u{74}\u{20}\u{c85}\u{c95}\u{ccd}\u{cb7}\u{cb0}\u{c97}\u{cb3}\u{cc1}\u{20}\u{c89}\u{cb3}\u{cbf}\u{ca6}\u{cbf}\u{cb5}\u{cc6}'; + + @override + String get remainingTextFieldCharacterCountTwo => null; + + @override + String get remainingTextFieldCharacterCountZero => null; + + @override + String get reorderItemDown => '\u{c95}\u{cc6}\u{cb3}\u{c97}\u{cc6}\u{20}\u{cb8}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get reorderItemLeft => '\u{c8e}\u{ca1}\u{c95}\u{ccd}\u{c95}\u{cc6}\u{20}\u{cb8}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get reorderItemRight => '\u{cac}\u{cb2}\u{c95}\u{ccd}\u{c95}\u{cc6}\u{20}\u{cb8}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get reorderItemToEnd => '\u{c95}\u{cca}\u{ca8}\u{cc6}\u{c97}\u{cc6}\u{20}\u{cb8}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get reorderItemToStart => '\u{caa}\u{ccd}\u{cb0}\u{cbe}\u{cb0}\u{c82}\u{cad}\u{c95}\u{ccd}\u{c95}\u{cc6}\u{20}\u{cb8}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get reorderItemUp => '\u{cae}\u{cc7}\u{cb2}\u{cc6}\u{20}\u{cb8}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get rowsPerPageTitle => '\u{caa}\u{ccd}\u{cb0}\u{ca4}\u{cbf}\u{20}\u{caa}\u{cc1}\u{c9f}\u{c95}\u{ccd}\u{c95}\u{cc6}\u{20}\u{cb8}\u{cbe}\u{cb2}\u{cc1}\u{c97}\u{cb3}\u{cc1}\u{3a}'; + + @override + ScriptCategory get scriptCategory => ScriptCategory.tall; + + @override + String get searchFieldLabel => '\u{cb9}\u{cc1}\u{ca1}\u{cc1}\u{c95}\u{cbf}'; + + @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 selectedRowCountTitleFew => null; + + @override + String get selectedRowCountTitleMany => null; + + @override + String get selectedRowCountTitleOne => '\u{31}\u{20}\u{c90}\u{c9f}\u{c82}\u{20}\u{c86}\u{caf}\u{ccd}\u{c95}\u{cc6}\u{20}\u{cae}\u{cbe}\u{ca1}\u{cb2}\u{cbe}\u{c97}\u{cbf}\u{ca6}\u{cc6}'; + + @override + String get selectedRowCountTitleOther => '\u{24}\u{73}\u{65}\u{6c}\u{65}\u{63}\u{74}\u{65}\u{64}\u{52}\u{6f}\u{77}\u{43}\u{6f}\u{75}\u{6e}\u{74}\u{20}\u{c90}\u{c9f}\u{c82}\u{c97}\u{cb3}\u{ca8}\u{ccd}\u{ca8}\u{cc1}\u{20}\u{c86}\u{caf}\u{ccd}\u{c95}\u{cc6}\u{20}\u{cae}\u{cbe}\u{ca1}\u{cb2}\u{cbe}\u{c97}\u{cbf}\u{ca6}\u{cc6}'; + + @override + String get selectedRowCountTitleTwo => null; + + @override + String get selectedRowCountTitleZero => null; + + @override + String get showAccountsLabel => '\u{c96}\u{cbe}\u{ca4}\u{cc6}\u{c97}\u{cb3}\u{ca8}\u{ccd}\u{ca8}\u{cc1}\u{20}\u{ca4}\u{ccb}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get showMenuTooltip => '\u{cae}\u{cc6}\u{ca8}\u{cc1}\u{20}\u{ca4}\u{ccb}\u{cb0}\u{cbf}\u{cb8}\u{cbf}'; + + @override + String get signedInLabel => '\u{cb8}\u{cc8}\u{ca8}\u{ccd}\u{20}\u{c87}\u{ca8}\u{ccd}\u{20}\u{cae}\u{cbe}\u{ca1}\u{cb2}\u{cbe}\u{c97}\u{cbf}\u{ca6}\u{cc6}'; + + @override + String get tabLabelRaw => '\u{24}\u{74}\u{61}\u{62}\u{43}\u{6f}\u{75}\u{6e}\u{74}\u{20}\u{cb0}\u{cb2}\u{ccd}\u{cb2}\u{cbf}\u{ca8}\u{20}\u{24}\u{74}\u{61}\u{62}\u{49}\u{6e}\u{64}\u{65}\u{78}\u{20}\u{c9f}\u{ccd}\u{caf}\u{cbe}\u{cac}\u{ccd}'; + + @override + TimeOfDayFormat get timeOfDayFormatRaw => TimeOfDayFormat.H_colon_mm; + + @override + String get timePickerHourModeAnnouncement => '\u{c97}\u{c82}\u{c9f}\u{cc6}\u{c97}\u{cb3}\u{ca8}\u{ccd}\u{ca8}\u{cc1}\u{20}\u{c86}\u{caf}\u{ccd}\u{c95}\u{cc6}\u{cae}\u{cbe}\u{ca1}\u{cbf}'; + + @override + String get timePickerMinuteModeAnnouncement => '\u{ca8}\u{cbf}\u{cae}\u{cbf}\u{cb7}\u{c97}\u{cb3}\u{ca8}\u{ccd}\u{ca8}\u{cc1}\u{20}\u{c86}\u{caf}\u{ccd}\u{c95}\u{cc6}\u{cae}\u{cbe}\u{ca1}\u{cbf}'; + + @override + String get viewLicensesButtonLabel => '\u{caa}\u{cb0}\u{cb5}\u{cbe}\u{ca8}\u{c97}\u{cbf}\u{c97}\u{cb3}\u{ca8}\u{ccd}\u{ca8}\u{cc1}\u{20}\u{cb5}\u{cbf}\u{cd5}\u{c95}\u{ccd}\u{cb7}\u{cbf}\u{cb8}\u{cbf}'; +} + /// The translations for Korean (`ko`). class MaterialLocalizationKo extends GlobalMaterialLocalizations { /// Create an instance of the translation bundle for Korean. @@ -18100,6 +18304,7 @@ final Set kMaterialSupportedLanguages = HashSet.from(const kMaterialSupportedLanguages = HashSet.from(const