// Copyright 2014 The Flutter 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'; /// Localized values for widgets. /// /// Currently this class just maps [locale] to [textDirection]. All locales /// are [TextDirection.ltr] except for locales with the following /// [Locale.languageCode] values, which are [TextDirection.rtl]: /// /// * ar - Arabic /// * fa - Farsi /// * he - Hebrew /// * ps - Pashto /// * sd - Sindhi /// * ur - Urdu class GlobalWidgetsLocalizations implements WidgetsLocalizations { /// Construct an object that defines the localized values for the widgets /// library for the given `locale`. /// /// [LocalizationsDelegate] implementations typically call the static [load] /// function, rather than constructing this class directly. GlobalWidgetsLocalizations(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 = <String>[ 'ar', // Arabic 'fa', // Farsi 'he', // Hebrew 'ps', // Pashto '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 SynchronousFuture<WidgetsLocalizations>(GlobalWidgetsLocalizations(locale)); } /// A [LocalizationsDelegate] that uses [GlobalWidgetsLocalizations.load] /// to create an instance of this class. /// /// [WidgetsApp] automatically adds this value to [WidgetApp.localizationsDelegates]. static const LocalizationsDelegate<WidgetsLocalizations> delegate = _WidgetsLocalizationsDelegate(); } class _WidgetsLocalizationsDelegate extends LocalizationsDelegate<WidgetsLocalizations> { const _WidgetsLocalizationsDelegate(); @override bool isSupported(Locale locale) => true; @override Future<WidgetsLocalizations> load(Locale locale) => GlobalWidgetsLocalizations.load(locale); @override bool shouldReload(_WidgetsLocalizationsDelegate old) => false; @override String toString() => 'GlobalWidgetsLocalizations.delegate(all locales)'; }