Интернационализация Flutter: как получить доступ к вложенным данным в json - PullRequest
1 голос
/ 29 марта 2020

Я хочу знать, как получить доступ к вложенным данным в json.

AppLocalizations.of(context).translate('Information.about');

en.json

{  
  "Information" : {
      "about": "About"
  }

}

Я пытался как выше, но не могу получить доступ к вложенные данные.

А вот и метод перевода.

  class AppLocalizations {
      final Locale locale;

  AppLocalizations(this.locale);

  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  // Static member to get access to the delegate from 'main.dart' file
  static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();

  Map<String, String> _localizedValues;

  Future<bool> load() async {
    // Load a language JSON file from the 'i18n' folder
    String value = await rootBundle.loadString('i18n/${locale.languageCode}.json');
    Map<String, dynamic> jsonMap = jsonDecode(value);
    _localizedValues = jsonMap.map((key, value) {
      return MapEntry(key, value.toString());
    });
    return true;
  }

  String translate(String key) {
    // Returns a localized text
    return _localizedValues[key];
  }
}

1 Ответ

1 голос
/ 29 марта 2020

Попробуйте:

Первый метод:

AppLocalizations.of(context).translate(“about”);

И измените свою функцию перевода на это:

  String translate(String key) {
// Returns a localized text
  return _localizedValues[“Information”][key];
 }

Или вы можете сделайте это:

Второй метод:

AppLocalizations.of(context).translate(”Information”,“about”);

И измените свою функцию перевода следующим образом:

 String translate(String parentkey, String nestedKey) {
// Returns a localized text
  return _localizedValues[parentKey][nestedKey];
 }

This может помочь.

Кроме того, Эта хорошая статья, чтобы научиться разбирать сложные json файлы

ОБНОВЛЕННЫЙ ОТВЕТ:

Попробовав код, я понял проблему.

Проблема в том, что _localizedValues ​​["Information"] будет строкой, а не картой, потому что мы преобразовали значение в value.toString (), и поэтому вы не можете использовать второй ключ, поскольку возвращаемый объект не является Карта, но это строка.

Итак, _localizedValues ​​["Информация"] равно "{about: About}".

Чтобы решить проблему, используйте следующий код:

  Map<String, dynamic> _localizedValues; //your values are not String anymore and we use dynamic instead
Future<bool> load() async {
    // Load a language JSON file from the 'i18n' folder
    String value = await rootBundle.loadString('i18n/${locale.languageCode}.json');
    Map<String, dynamic> jsonMap = jsonDecode(value);
    _localizedValues = jsonMap.map((key, value) {
      return MapEntry(key, value); //not value.toString() so the value will be a map
    });
    return true;
  }
String translate(String parentkey, String nestedKey) {
    // Returns a localized text
      return _localizedValues[parentKey][nestedKey];
     }

И тогда вы должны получить "О" из кода ниже:

AppLocalizations.of(context).translate('Information','about');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...