Added localizations for Directionality (#11870)
This commit is contained in:
parent
e216004b86
commit
4faa036736
@ -28,9 +28,7 @@ class _WidgetsLocalizationsDelegate extends LocalizationsDelegate<WidgetsLocaliz
|
|||||||
const _WidgetsLocalizationsDelegate();
|
const _WidgetsLocalizationsDelegate();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<WidgetsLocalizations> load(Locale locale) {
|
Future<WidgetsLocalizations> load(Locale locale) => DefaultWidgetsLocalizations.load(locale);
|
||||||
return new SynchronousFuture<WidgetsLocalizations>(const WidgetsLocalizations());
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool shouldReload(_WidgetsLocalizationsDelegate old) => false;
|
bool shouldReload(_WidgetsLocalizationsDelegate old) => false;
|
||||||
|
@ -114,20 +114,13 @@ abstract class LocalizationsDelegate<T> {
|
|||||||
/// In particular, this maps locales to a specific [Directionality] using the
|
/// In particular, this maps locales to a specific [Directionality] using the
|
||||||
/// [textDirection] property.
|
/// [textDirection] property.
|
||||||
///
|
///
|
||||||
/// This class provides a default placeholder implementation that returns
|
/// See also:
|
||||||
/// hard-coded American English values.
|
///
|
||||||
class WidgetsLocalizations {
|
/// * [DefaultWidgetsLocalizations], which implements this interface and
|
||||||
/// Create a placeholder object for the localized resources of the lowest
|
/// supports a variety of locales.
|
||||||
/// levels of the Flutter framework which only provides values for American
|
abstract class WidgetsLocalizations {
|
||||||
/// English.
|
|
||||||
const WidgetsLocalizations();
|
|
||||||
|
|
||||||
/// The locale for which the values of this class's localized resources
|
|
||||||
/// have been translated.
|
|
||||||
Locale get locale => const Locale('en', 'US');
|
|
||||||
|
|
||||||
/// The reading direction for text in this locale.
|
/// The reading direction for text in this locale.
|
||||||
TextDirection get textDirection => TextDirection.ltr;
|
TextDirection get textDirection;
|
||||||
|
|
||||||
/// The `WidgetsLocalizations` from the closest [Localizations] instance
|
/// The `WidgetsLocalizations` from the closest [Localizations] instance
|
||||||
/// that encloses the given context.
|
/// that encloses the given context.
|
||||||
@ -146,6 +139,42 @@ class WidgetsLocalizations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Localized values for widgets.
|
||||||
|
class DefaultWidgetsLocalizations implements WidgetsLocalizations {
|
||||||
|
DefaultWidgetsLocalizations(this.locale) {
|
||||||
|
final String language = locale.languageCode.toLowerCase();
|
||||||
|
_textDirection = _rtlLanguages.contains(language) ? TextDirection.rtl : TextDirection.ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// See http://en.wikipedia.org/wiki/Right-to-left
|
||||||
|
static const List<String> _rtlLanguages = const <String>[
|
||||||
|
'ar', // Arabic
|
||||||
|
'dv', // Dhivehi
|
||||||
|
'fa', // Farsi
|
||||||
|
'he', // Hebrew
|
||||||
|
'ps', // Pashto
|
||||||
|
'sd', // Sindhi
|
||||||
|
'ur', // Urdu
|
||||||
|
];
|
||||||
|
|
||||||
|
/// The locale for which the values of this class's localized resources
|
||||||
|
/// have been translated.
|
||||||
|
final Locale locale;
|
||||||
|
|
||||||
|
@override
|
||||||
|
TextDirection get textDirection => _textDirection;
|
||||||
|
TextDirection _textDirection;
|
||||||
|
|
||||||
|
/// Creates an object that provides localized resource values for the
|
||||||
|
/// lowest levels of the Flutter framework.
|
||||||
|
///
|
||||||
|
/// This method is typically used to create a [LocalizationsDelegate].
|
||||||
|
/// The [WidgetsApp] does so by default.
|
||||||
|
static Future<WidgetsLocalizations> load(Locale locale) {
|
||||||
|
return new SynchronousFuture<WidgetsLocalizations>(new DefaultWidgetsLocalizations(locale));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class _LocalizationsScope extends InheritedWidget {
|
class _LocalizationsScope extends InheritedWidget {
|
||||||
_LocalizationsScope ({
|
_LocalizationsScope ({
|
||||||
Key key,
|
Key key,
|
||||||
|
@ -417,6 +417,26 @@ void main() {
|
|||||||
expect(modifiedDelegate.shouldReloadValues, <bool>[true]);
|
expect(modifiedDelegate.shouldReloadValues, <bool>[true]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('Directionality tracks system locale', (WidgetTester tester) async {
|
||||||
|
BuildContext pageContext;
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
buildFrame(
|
||||||
|
buildContent: (BuildContext context) {
|
||||||
|
pageContext = context;
|
||||||
|
return const Text('Hello World');
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.binding.setLocale('en', 'GB');
|
||||||
|
await tester.pump();
|
||||||
|
expect(Directionality.of(pageContext), TextDirection.ltr);
|
||||||
|
|
||||||
|
await tester.binding.setLocale('ar', 'EG');
|
||||||
|
await tester.pump();
|
||||||
|
expect(Directionality.of(pageContext), TextDirection.rtl);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Same as _WidgetsLocalizationsDelegate in widgets/app.dart
|
// Same as _WidgetsLocalizationsDelegate in widgets/app.dart
|
||||||
@ -424,9 +444,7 @@ class DefaultWidgetsLocalizationsDelegate extends LocalizationsDelegate<WidgetsL
|
|||||||
const DefaultWidgetsLocalizationsDelegate();
|
const DefaultWidgetsLocalizationsDelegate();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<WidgetsLocalizations> load(Locale locale) {
|
Future<WidgetsLocalizations> load(Locale locale) => DefaultWidgetsLocalizations.load(locale);
|
||||||
return new SynchronousFuture<WidgetsLocalizations>(const WidgetsLocalizations());
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool shouldReload(DefaultWidgetsLocalizationsDelegate old) => false;
|
bool shouldReload(DefaultWidgetsLocalizationsDelegate old) => false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user