add cupertino localizations (#20756)
add cupertino localizations abstract class and the default cupertino localizations in US English.
This commit is contained in:
parent
bd0b666ad3
commit
8e70d54e81
@ -15,6 +15,7 @@ export 'src/cupertino/button.dart';
|
||||
export 'src/cupertino/colors.dart';
|
||||
export 'src/cupertino/dialog.dart';
|
||||
export 'src/cupertino/icons.dart';
|
||||
export 'src/cupertino/localizations.dart';
|
||||
export 'src/cupertino/nav_bar.dart';
|
||||
export 'src/cupertino/page_scaffold.dart';
|
||||
export 'src/cupertino/picker.dart';
|
||||
|
266
packages/flutter/lib/src/cupertino/localizations.dart
Normal file
266
packages/flutter/lib/src/cupertino/localizations.dart
Normal file
@ -0,0 +1,266 @@
|
||||
// Copyright 2017 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.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
|
||||
/// Defines the localized resource values used by the Cupertino widgets.
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [DefaultCupertinoLocalizations], the default, English-only, implementation
|
||||
/// of this interface.
|
||||
// TODO(xster): Supply non-english strings.
|
||||
abstract class CupertinoLocalizations {
|
||||
/// Year that is shown in [CupertinoDatePicker] spinner corresponding to the
|
||||
/// given year index.
|
||||
///
|
||||
/// Examples: datePickerYear(1) in:
|
||||
///
|
||||
/// - US English: 2018
|
||||
/// - Korean: 2018년
|
||||
String datePickerYear(int yearIndex);
|
||||
|
||||
/// Month that is shown in [CupertinoDatePicker] spinner corresponding to
|
||||
/// the given month index.
|
||||
///
|
||||
/// Examples: datePickerMonth(1) in:
|
||||
///
|
||||
/// - US English: January
|
||||
/// - Korean: 1월
|
||||
String datePickerMonth(int monthIndex);
|
||||
|
||||
/// Day of month that is shown in [CupertinoDatePicker] spinner corresponding
|
||||
/// to the given day index.
|
||||
///
|
||||
/// Examples: datePickerDayOfMonth(1) in:
|
||||
///
|
||||
/// - US English: 1
|
||||
/// - Korean: 1일
|
||||
String datePickerDayOfMonth(int dayIndex);
|
||||
|
||||
/// The medium-width date format that is shown in [CupertinoDatePicker]
|
||||
/// spinner. Abbreviates month and days of week.
|
||||
///
|
||||
/// Examples:
|
||||
///
|
||||
/// - US English: Wed Sep 27
|
||||
/// - Russian: ср сент. 27
|
||||
String datePickerMediumDate(DateTime date);
|
||||
|
||||
/// Hour that is shown in [CupertinoDatePicker] spinner corresponding
|
||||
/// to the given hour value.
|
||||
///
|
||||
/// Examples: datePickerHour(1) in:
|
||||
///
|
||||
/// - US English: 01
|
||||
/// - Arabic: ٠١
|
||||
String datePickerHour(int hour);
|
||||
|
||||
/// Minute that is shown in [CupertinoDatePicker] spinner corresponding
|
||||
/// to the given minute value.
|
||||
///
|
||||
/// Examples: datePickerMinute(1) in:
|
||||
///
|
||||
/// - US English: 01
|
||||
/// - Arabic: ٠١
|
||||
String datePickerMinute(int minute);
|
||||
|
||||
/// The order of the date elements that will be shown in [CupertinoDatePicker].
|
||||
/// Can be any permutation of 'DMY' ('D': day, 'M': month, 'Y': year).
|
||||
String get datePickerDateOrder;
|
||||
|
||||
/// The abbreviation for ante meridiem (before noon) shown in the time picker.
|
||||
String get anteMeridiemAbbreviation;
|
||||
|
||||
/// The abbreviation for post meridiem (after noon) shown in the time picker.
|
||||
String get postMeridiemAbbreviation;
|
||||
|
||||
/// Hour that is shown in [CupertinoCountdownTimerPicker] corresponding to
|
||||
/// the given hour value.
|
||||
///
|
||||
/// Examples: timerPickerHour(1) in:
|
||||
///
|
||||
/// - US English: 1
|
||||
/// - Arabic: ١
|
||||
String timerPickerHour(int hour);
|
||||
|
||||
/// Minute that is shown in [CupertinoCountdownTimerPicker] corresponding to
|
||||
/// the given minute value.
|
||||
///
|
||||
/// Examples: timerPickerMinute(1) in:
|
||||
///
|
||||
/// - US English: 1
|
||||
/// - Arabic: ١
|
||||
String timerPickerMinute(int minute);
|
||||
|
||||
/// Second that is shown in [CupertinoCountdownTimerPicker] corresponding to
|
||||
/// the given second value.
|
||||
///
|
||||
/// Examples: timerPickerSecond(1) in:
|
||||
///
|
||||
/// - US English: 1
|
||||
/// - Arabic: ١
|
||||
String timerPickerSecond(int second);
|
||||
|
||||
/// Label that appears next to the hour picker in
|
||||
/// [CupertinoCountdownTimerPicker] when selected hour value is `hour`.
|
||||
/// This function will deal with pluralization based on the `hour` parameter.
|
||||
String timerPickerHourLabel(int hour);
|
||||
|
||||
/// Label that appears next to the minute picker in
|
||||
/// [CupertinoCountdownTimerPicker] when selected minute value is `minute`.
|
||||
/// This function will deal with pluralization based on the `minute` parameter.
|
||||
String timerPickerMinuteLabel(int minute);
|
||||
|
||||
/// Label that appears next to the minute picker in
|
||||
/// [CupertinoCountdownTimerPicker] when selected minute value is `second`.
|
||||
/// This function will deal with pluralization based on the `second` parameter.
|
||||
String timerPickerSecondLabel(int second);
|
||||
|
||||
/// The `CupertinoLocalizations` from the closest [Localizations] instance
|
||||
/// that encloses the given context.
|
||||
///
|
||||
/// This method is just a convenient shorthand for:
|
||||
/// `Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations)`.
|
||||
///
|
||||
/// References to the localized resources defined by this class are typically
|
||||
/// written in terms of this method. For example:
|
||||
///
|
||||
/// ```dart
|
||||
/// CupertinoLocalizations.of(context).anteMeridiemAbbreviation;
|
||||
/// ```
|
||||
static CupertinoLocalizations of(BuildContext context) {
|
||||
return Localizations.of<CupertinoLocalizations>(context, CupertinoLocalizations);
|
||||
}
|
||||
}
|
||||
|
||||
class _CupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
|
||||
const _CupertinoLocalizationsDelegate();
|
||||
|
||||
@override
|
||||
bool isSupported(Locale locale) => locale.languageCode == 'en';
|
||||
|
||||
@override
|
||||
Future<CupertinoLocalizations> load(Locale locale) => DefaultCupertinoLocalizations.load(locale);
|
||||
|
||||
@override
|
||||
bool shouldReload(_CupertinoLocalizationsDelegate old) => false;
|
||||
}
|
||||
|
||||
/// US English strings for the cupertino widgets.
|
||||
class DefaultCupertinoLocalizations implements CupertinoLocalizations {
|
||||
/// Constructs an object that defines the cupertino widgets' localized strings
|
||||
/// for US English (only).
|
||||
///
|
||||
/// [LocalizationsDelegate] implementations typically call the static [load]
|
||||
/// function, rather than constructing this class directly.
|
||||
const DefaultCupertinoLocalizations();
|
||||
|
||||
static const List<String> _shortWeekdays = <String>[
|
||||
'Mon',
|
||||
'Tue',
|
||||
'Wed',
|
||||
'Thu',
|
||||
'Fri',
|
||||
'Sat',
|
||||
'Sun',
|
||||
];
|
||||
|
||||
static const List<String> _shortMonths = <String>[
|
||||
'Jan',
|
||||
'Feb',
|
||||
'Mar',
|
||||
'Apr',
|
||||
'May',
|
||||
'Jun',
|
||||
'Jul',
|
||||
'Aug',
|
||||
'Sep',
|
||||
'Oct',
|
||||
'Nov',
|
||||
'Dec',
|
||||
];
|
||||
|
||||
static const List<String> _months = <String>[
|
||||
'January',
|
||||
'February',
|
||||
'March',
|
||||
'April',
|
||||
'May',
|
||||
'June',
|
||||
'July',
|
||||
'August',
|
||||
'September',
|
||||
'October',
|
||||
'November',
|
||||
'December',
|
||||
];
|
||||
|
||||
@override
|
||||
String datePickerYear(int yearIndex) => yearIndex.toString();
|
||||
|
||||
@override
|
||||
String datePickerMonth(int monthIndex) => _months[monthIndex - 1];
|
||||
|
||||
@override
|
||||
String datePickerDayOfMonth(int dayIndex) => dayIndex.toString();
|
||||
|
||||
@override
|
||||
String datePickerHour(int hour) => hour.toString().padLeft(2, '0');
|
||||
|
||||
@override
|
||||
String datePickerMinute(int minute) => minute.toString().padLeft(2, '0');
|
||||
|
||||
@override
|
||||
String datePickerMediumDate(DateTime date) {
|
||||
return '${_shortWeekdays[date.weekday - DateTime.monday]} '
|
||||
'${_shortMonths[date.month - DateTime.january]} '
|
||||
'${date.day}';
|
||||
}
|
||||
|
||||
@override
|
||||
String get datePickerDateOrder => 'MDY';
|
||||
|
||||
@override
|
||||
String get anteMeridiemAbbreviation => 'AM';
|
||||
|
||||
@override
|
||||
String get postMeridiemAbbreviation => 'PM';
|
||||
|
||||
@override
|
||||
String timerPickerHour(int hour) => hour.toString();
|
||||
|
||||
@override
|
||||
String timerPickerMinute(int minute) => minute.toString();
|
||||
|
||||
@override
|
||||
String timerPickerSecond(int second) => second.toString();
|
||||
|
||||
@override
|
||||
String timerPickerHourLabel(int hour) => hour == 1 ? 'hour' : 'hours';
|
||||
|
||||
@override
|
||||
String timerPickerMinuteLabel(int minute) => 'min';
|
||||
|
||||
@override
|
||||
String timerPickerSecondLabel(int second) => 'sec';
|
||||
|
||||
/// Creates an object that provides US English resource values for the
|
||||
/// cupertino library widgets.
|
||||
///
|
||||
/// The [locale] parameter is ignored.
|
||||
///
|
||||
/// This method is typically used to create a [LocalizationsDelegate].
|
||||
static Future<CupertinoLocalizations> load(Locale locale) {
|
||||
return new SynchronousFuture<CupertinoLocalizations>(const DefaultCupertinoLocalizations());
|
||||
}
|
||||
|
||||
/// A [LocalizationsDelegate] that uses [DefaultCupertinoLocalizations.load]
|
||||
/// to create an instance of this class.
|
||||
static const LocalizationsDelegate<CupertinoLocalizations> delegate = _CupertinoLocalizationsDelegate();
|
||||
}
|
30
packages/flutter/test/cupertino/localizations_test.dart
Normal file
30
packages/flutter/test/cupertino/localizations_test.dart
Normal file
@ -0,0 +1,30 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('English translations exist for all CupertinoLocalization properties', (WidgetTester tester) async {
|
||||
const CupertinoLocalizations localizations = DefaultCupertinoLocalizations();
|
||||
|
||||
expect(localizations.datePickerYear(2018), isNotNull);
|
||||
expect(localizations.datePickerMonth(1), isNotNull);
|
||||
expect(localizations.datePickerDayOfMonth(1), isNotNull);
|
||||
expect(localizations.datePickerHour(0), isNotNull);
|
||||
expect(localizations.datePickerMinute(0), isNotNull);
|
||||
expect(localizations.datePickerMediumDate(DateTime.now()), isNotNull);
|
||||
expect(localizations.datePickerDateOrder, isNotNull);
|
||||
|
||||
expect(localizations.anteMeridiemAbbreviation, isNotNull);
|
||||
expect(localizations.postMeridiemAbbreviation, isNotNull);
|
||||
|
||||
expect(localizations.timerPickerHour(0), isNotNull);
|
||||
expect(localizations.timerPickerMinute(0), isNotNull);
|
||||
expect(localizations.timerPickerSecond(0), isNotNull);
|
||||
expect(localizations.timerPickerHourLabel(0), isNotNull);
|
||||
expect(localizations.timerPickerMinuteLabel(0), isNotNull);
|
||||
expect(localizations.timerPickerSecondLabel(0), isNotNull);
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user