Advertisement
Guest User

CustomTransationLoader for multiple langeages

a guest
Jun 25th, 2020
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 3.30 KB | None | 0 0
  1. import 'dart:convert';
  2.  
  3. import 'package:flutter/services.dart';
  4. import 'package:flutter/services.dart' show rootBundle;
  5. import 'package:flutter/widgets.dart';
  6. import 'package:flutter_i18n/loaders/decoders/base_decode_strategy.dart';
  7. import 'package:flutter_i18n/loaders/decoders/json_decode_strategy.dart';
  8. import 'package:flutter_i18n/loaders/decoders/xml_decode_strategy.dart';
  9. import 'package:flutter_i18n/loaders/decoders/yaml_decode_strategy.dart';
  10. import 'package:flutter_i18n/loaders/file_content.dart';
  11. import 'package:flutter_i18n/loaders/translation_loader.dart';
  12. import 'package:flutter_i18n/utils/message_printer.dart';
  13.  
  14. class CustomTranslationLoader extends TranslationLoader
  15.     implements IFileContent {
  16.   final String fallbackFile;
  17.   final List<String> basePaths;
  18.   final bool useCountryCode;
  19.   final Locale forcedLocale;
  20.   AssetBundle assetBundle;
  21.   List<BaseDecodeStrategy> decodeStrategies;
  22.  
  23.   Locale _locale;
  24.  
  25.   @override
  26.   Locale get locale => _locale ?? forcedLocale;
  27.  
  28.   @override
  29.   set locale(Locale locale) => _locale = locale;
  30.  
  31.   Map<dynamic, dynamic> _decodedMap = Map();
  32.  
  33.   CustomTranslationLoader(
  34.       {this.fallbackFile = "en",
  35.       this.basePaths = const ["assets/flutter_i18n"],
  36.       this.useCountryCode = false,
  37.       this.forcedLocale,
  38.       decodeStrategies}) {
  39.     assetBundle = rootBundle;
  40.     this.decodeStrategies = decodeStrategies ??
  41.         [JsonDecodeStrategy(), YamlDecodeStrategy(), XmlDecodeStrategy()];
  42.   }
  43.  
  44.   Future<Map> load() async {
  45.     try {
  46.       await _loadCurrentTranslation();
  47.     } catch (e) {
  48.       MessagePrinter.debug('Error loading translation $e');
  49.       await _loadFallback();
  50.     }
  51.     return _decodedMap;
  52.   }
  53.  
  54.   @override
  55.   Future<String> loadString(final String fileName, final String extension) {
  56.     return Future.wait(basePaths
  57.             .map((e) => assetBundle.loadString('$e/$fileName.$extension')))
  58.         .then((value) {
  59.       var res = Map<String, dynamic>();
  60.       value.forEach((element) {
  61.         res.addAll(jsonDecode(element));
  62.       });
  63.       return jsonEncode(res);
  64.     });
  65.   }
  66.  
  67.   Future _loadCurrentTranslation() async {
  68.     this.locale = locale ?? await findCurrentLocale();
  69.     MessagePrinter.info("The current locale is ${this.locale}");
  70.     _decodedMap = await loadFile(composeFileName());
  71.   }
  72.  
  73.   Future _loadFallback() async {
  74.     try {
  75.       _decodedMap = await loadFile(fallbackFile);
  76.     } catch (e) {
  77.       MessagePrinter.debug('Error loading translation fallback $e');
  78.     }
  79.   }
  80.  
  81.   @protected
  82.   Future<Map> loadFile(final String fileName) async {
  83.     final List<Future<Map>> strategiesFutures = _executeStrategies(fileName);
  84.     final Stream<Map> strategiesStream = Stream.fromFutures(strategiesFutures);
  85.     return strategiesStream.firstWhere((map) => map != null);
  86.   }
  87.  
  88.   List<Future<Map>> _executeStrategies(final String fileName) {
  89.     return decodeStrategies
  90.         .map((decodeStrategy) => decodeStrategy.decode(fileName, this))
  91.         .toList();
  92.   }
  93.  
  94.   @protected
  95.   String composeFileName() {
  96.     return "${locale.languageCode}${composeCountryCode()}";
  97.   }
  98.  
  99.   @protected
  100.   String composeCountryCode() {
  101.     String countryCode = "";
  102.     if (useCountryCode && locale.countryCode != null) {
  103.       countryCode = "_${locale.countryCode}";
  104.     }
  105.     return countryCode;
  106.   }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement