From fa149eea9b36ccd28d4985fd771ac18e7e8cd6b8 Mon Sep 17 00:00:00 2001 From: xster Date: Fri, 15 Mar 2019 12:10:35 -0700 Subject: [PATCH] Cupertino localization step 1: add an English arb file (#29200) --- dev/tools/gen_localizations.dart | 4 +- dev/tools/localizations_utils.dart | 7 +- .../lib/src/cupertino/localizations.dart | 23 ++++++ .../lib/src/l10n/cupertino_en.arb | 77 +++++++++++++++++++ 4 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 packages/flutter_localizations/lib/src/l10n/cupertino_en.arb diff --git a/dev/tools/gen_localizations.dart b/dev/tools/gen_localizations.dart index 87459dceee3..8b3007b6bc7 100644 --- a/dev/tools/gen_localizations.dart +++ b/dev/tools/gen_localizations.dart @@ -570,7 +570,7 @@ void processBundle(File file, { @required String localeString }) { // Only pre-assume scriptCode if there is a country or script code to assume off of. // When we assume scriptCode based on languageCode-only, we want this initial pass // to use the un-assumed version as a base class. - LocaleInfo locale = LocaleInfo.fromString(localeString, assume: localeString.split('_').length > 1); + LocaleInfo locale = LocaleInfo.fromString(localeString, deriveScriptCode: localeString.split('_').length > 1); // Allow overwrite if the existing data is assumed. if (assumedLocales.contains(locale)) { localeToResources[locale] = {}; @@ -582,7 +582,7 @@ void processBundle(File file, { @required String localeString }) { } populateResources(locale); // Add an assumed locale to default to when there is no info on scriptOnly locales. - locale = LocaleInfo.fromString(localeString, assume: true); + locale = LocaleInfo.fromString(localeString, deriveScriptCode: true); if (locale.scriptCode != null) { final LocaleInfo scriptLocale = LocaleInfo.fromString(locale.languageCode + '_' + locale.scriptCode); if (!localeToResources.containsKey(scriptLocale)) { diff --git a/dev/tools/localizations_utils.dart b/dev/tools/localizations_utils.dart index 512bf612ca7..d92fad906a7 100644 --- a/dev/tools/localizations_utils.dart +++ b/dev/tools/localizations_utils.dart @@ -24,7 +24,10 @@ class LocaleInfo implements Comparable { /// and country is 2-3 characters and all uppercase. /// /// 'language_COUNTRY' or 'language_script' are also valid. Missing fields will be null. - factory LocaleInfo.fromString(String locale, {bool assume = false}) { + /// + /// When `deriveScriptCode` is true, if [scriptCode] was unspecified, it will + /// be derived from the [languageCode] and [countryCode] if possible. + factory LocaleInfo.fromString(String locale, { bool deriveScriptCode = false }) { final List codes = locale.split('_'); // [language, script, country] assert(codes.isNotEmpty && codes.length < 4); final String languageCode = codes[0]; @@ -49,7 +52,7 @@ class LocaleInfo implements Comparable { /// The basis of the assumptions here are based off of known usage of scripts /// across various countries. For example, we know Taiwan uses traditional (Hant) /// script, so it is safe to apply (Hant) to Taiwanese languages. - if (assume && scriptCode == null) { + if (deriveScriptCode && scriptCode == null) { switch (languageCode) { case 'zh': { if (countryCode == null) { diff --git a/packages/flutter/lib/src/cupertino/localizations.dart b/packages/flutter/lib/src/cupertino/localizations.dart index 8ac0484bd20..42e412ed41c 100644 --- a/packages/flutter/lib/src/cupertino/localizations.dart +++ b/packages/flutter/lib/src/cupertino/localizations.dart @@ -65,6 +65,7 @@ abstract class CupertinoLocalizations { /// /// - US English: 2018 /// - Korean: 2018년 + // The global version uses date symbols data from the intl package. String datePickerYear(int yearIndex); /// Month that is shown in [CupertinoDatePicker] spinner corresponding to @@ -74,6 +75,7 @@ abstract class CupertinoLocalizations { /// /// - US English: January /// - Korean: 1월 + // The global version uses date symbols data from the intl package. String datePickerMonth(int monthIndex); /// Day of month that is shown in [CupertinoDatePicker] spinner corresponding @@ -83,6 +85,7 @@ abstract class CupertinoLocalizations { /// /// - US English: 1 /// - Korean: 1일 + // The global version uses date symbols data from the intl package. String datePickerDayOfMonth(int dayIndex); /// The medium-width date format that is shown in [CupertinoDatePicker] @@ -92,6 +95,7 @@ abstract class CupertinoLocalizations { /// /// - US English: Wed Sep 27 /// - Russian: ср сент. 27 + // The global version is based on intl package's DateFormat.MMMEd. String datePickerMediumDate(DateTime date); /// Hour that is shown in [CupertinoDatePicker] spinner corresponding @@ -101,9 +105,11 @@ abstract class CupertinoLocalizations { /// /// - US English: 1 /// - Arabic: ٠١ + // The global version uses date symbols data from the intl package. String datePickerHour(int hour); /// Semantics label for the given hour value in [CupertinoDatePicker]. + // The global version uses the translated string from the arb file. String datePickerHourSemanticsLabel(int hour); /// Minute that is shown in [CupertinoDatePicker] spinner corresponding @@ -113,24 +119,31 @@ abstract class CupertinoLocalizations { /// /// - US English: 01 /// - Arabic: ٠١ + // The global version uses date symbols data from the intl package. String datePickerMinute(int minute); /// Semantics label for the given minute value in [CupertinoDatePicker]. + // The global version uses the translated string from the arb file. String datePickerMinuteSemanticsLabel(int minute); /// The order of the date elements that will be shown in [CupertinoDatePicker]. + // The global version uses the translated string from the arb file. DatePickerDateOrder get datePickerDateOrder; /// The order of the time elements that will be shown in [CupertinoDatePicker]. + // The global version uses the translated string from the arb file. DatePickerDateTimeOrder get datePickerDateTimeOrder; /// The abbreviation for ante meridiem (before noon) shown in the time picker. + // The global version uses the translated string from the arb file. String get anteMeridiemAbbreviation; /// The abbreviation for post meridiem (after noon) shown in the time picker. + // The global version uses the translated string from the arb file. String get postMeridiemAbbreviation; /// The term used by the system to announce dialog alerts. + // The global version uses the translated string from the arb file. String get alertDialogLabel; /// Hour that is shown in [CupertinoTimerPicker] corresponding to @@ -140,6 +153,7 @@ abstract class CupertinoLocalizations { /// /// - US English: 1 /// - Arabic: ١ + // The global version uses date symbols data from the intl package. String timerPickerHour(int hour); /// Minute that is shown in [CupertinoTimerPicker] corresponding to @@ -149,6 +163,7 @@ abstract class CupertinoLocalizations { /// /// - US English: 1 /// - Arabic: ١ + // The global version uses date symbols data from the intl package. String timerPickerMinute(int minute); /// Second that is shown in [CupertinoTimerPicker] corresponding to @@ -158,33 +173,41 @@ abstract class CupertinoLocalizations { /// /// - US English: 1 /// - Arabic: ١ + // The global version uses date symbols data from the intl package. String timerPickerSecond(int second); /// Label that appears next to the hour picker in /// [CupertinoTimerPicker] when selected hour value is `hour`. /// This function will deal with pluralization based on the `hour` parameter. + // The global version uses the translated string from the arb file. String timerPickerHourLabel(int hour); /// Label that appears next to the minute picker in /// [CupertinoTimerPicker] when selected minute value is `minute`. /// This function will deal with pluralization based on the `minute` parameter. + // The global version uses the translated string from the arb file. String timerPickerMinuteLabel(int minute); /// Label that appears next to the minute picker in /// [CupertinoTimerPicker] when selected minute value is `second`. /// This function will deal with pluralization based on the `second` parameter. + // The global version uses the translated string from the arb file. String timerPickerSecondLabel(int second); /// The term used for cutting + // The global version uses the translated string from the arb file. String get cutButtonLabel; /// The term used for copying + // The global version uses the translated string from the arb file. String get copyButtonLabel; /// The term used for pasting + // The global version uses the translated string from the arb file. String get pasteButtonLabel; /// The term used for selecting everything + // The global version uses the translated string from the arb file. String get selectAllButtonLabel; /// The `CupertinoLocalizations` from the closest [Localizations] instance diff --git a/packages/flutter_localizations/lib/src/l10n/cupertino_en.arb b/packages/flutter_localizations/lib/src/l10n/cupertino_en.arb new file mode 100644 index 00000000000..3bd85ed6aa7 --- /dev/null +++ b/packages/flutter_localizations/lib/src/l10n/cupertino_en.arb @@ -0,0 +1,77 @@ +{ + "datePickerHourSemanticsLabelOther": "$hour o'clock", + "@datePickerHourSemanticsLabel": { + "description": "Accessibility announcement for the selected hour on a time picker such as '5 o'clock' or '5点'", + "plural": "hour" + }, + + "datePickerMinuteSemanticsOne": "1 minute", + "datePickerMinuteSemanticsOther": "$minute minutes", + "@datePickerMinuteSemanticsLabel": { + "description": "Accessibility announcement for the selected minute on a time picker such as '15 minutes' or '15分'", + "plural": "minute" + }, + + "datePickerDateOrder": "mdy", + "@datePickerDateOrder": { + "description": "The standard order for the locale to arrange day, month and year in a date. Options are dmy, mdy, ymd and ydm.", + }, + + "datePickerDateTimeOrder": "date_time_dayPeriod", + "@datePickerDateTimeOrder": { + "description": "The standard order for the locale to date, time and am/pm in a datetime. Options are date_time_dayPeriod, date_dayPeriod_time, time_dayPeriod_date and dayPeriod_time_date where 'dayPeriod' is am/pm.", + }, + + "anteMeridiemAbbreviation": "AM", + "@anteMeridiemAbbreviation": { + "description": "The abbreviation for ante meridiem (before noon) shown in the time picker.", + }, + + "postMeridiemAbbreviation": "PM", + "@postMeridiemAbbreviation": { + "description": "The abbreviation for post meridiem (after noon) shown in the time picker.", + }, + + "alertDialogLabel": "Alert", + "@alertDialogLabel": { + "description": "The accessibility audio announcement made when an iOS style alert dialog is opened." + }, + + "timerPickerHourLabelOne": "hour", + "timerPickerHourLabelOther": "hours", + "@timerPickerHourLabel": { + "description": "The label adjacent to an hour integer number in a countdown timer.", + "plural": "hour" + }, + + "timerPickerMinuteLabelOther": "min", + "@timerPickerMinuteLabel": { + "description": "The label adjacent to a minute integer number in a countdown timer.", + "plural": "minute" + }, + + "timerPickerSecondLabelOther": "sec", + "@timerPickerSecondLabel": { + "description": "The label adjacent to a second integer number in a countdown timer.", + "plural": "second" + }, + + "cutButtonLabel": "Cut", + "@cutButtonLabel": { + "description": "The label for cut buttons and menu items." + }, + + "copyButtonLabel": "Copy", + "@copyButtonLabel": { + "description": "The label for copy buttons and menu items." + }, + + "pasteButtonLabel": "Paste", + "@pasteButtonLabel": { + "description": "The label for paste buttons and menu items." + }, + + "selectAllButtonLabel": "Select All", + "@selectAllButtonLabel": { + "description": "The label for select-all buttons and menu items." + },