init method

Future<void> init({
  1. LocaleType localeType = LocaleType.asDefined,
  2. required String languageCode,
  3. String assetsDirectory = 'lang/',
})

Initialize NyLocalization with the specified configuration.

Implementation

Future<void> init({
  LocaleType localeType = LocaleType.asDefined,
  required String languageCode,
  String assetsDirectory = 'lang/',
}) async {
  if (!assetsDirectory.endsWith('/')) {
    assetsDirectory = '$assetsDirectory/';
  }
  _assetsDir = assetsDirectory;
  _localeType = localeType;

  _locale = Locale(languageCode);

  if (_localeType == LocaleType.device) {
    final Locale deviceLocale = PlatformDispatcher.instance.locale;
    _locale = Locale(deviceLocale.languageCode);
  }

  // Get the current language from the language switcher if available.
  // Skip in test mode to avoid storage hangs.
  if (!Nylo.isTestMode) {
    final Map<String, dynamic>? savedLanguage =
        await LanguageSwitcher.currentLanguage();
    final String? savedCode = savedLanguage?.keys.firstOrNull;
    if (savedCode != null && _isLocaleCode(savedCode)) {
      _locale = Locale(savedCode);
    } else if (savedLanguage != null) {
      // The stored value isn't a language (e.g. a storage envelope), so
      // drop it rather than loading a locale like "_v".
      NyLogger.error(
        'Ignoring saved language, it is not a locale code',
        context: {'saved_language': savedLanguage},
      );
      await LanguageSwitcher.clearLanguage();
    }
  }

  _fallbackLanguageCode = languageCode;

  // The active and fallback files are independent; load them concurrently.
  final bool needsFallback = _locale!.languageCode != languageCode;
  final List<Map<String, dynamic>> results = await Future.wait([
    _loadLanguageFile(
      _locale!.languageCode,
      fallbackLanguageCode: languageCode,
    ),
    if (needsFallback) _loadLanguageFile(languageCode),
  ]);
  _values = results[0];
  _fallbackValues = needsFallback ? results[1] : null;
}