【问题标题】:How to read nested json in flutter localization?如何在颤振本地化中读取嵌套的 json?
【发布时间】:2019-12-10 21:59:41
【问题描述】:

我是 Flutter 新手。

我在我的颤振项目中应用了本地化并且一切正常,直到我编辑我的 json 语言文件以具有嵌套对象。

如何正确调用嵌套的json对象?

我尝试使用点来调用它,但它抛出错误'必须提供非空字符串...'

AppLocalizations.of(context).translate('Intro.Header')

这是我的json

{
  "Intro": {
    "Header": "Introduction",
    "Content": "This is...."
  },
  "Test": "This is test",
}

如果我直接调用“测试”没有问题。

AppLocalizations.of(context).translate('Test')

如何阅读标题和内容?

【问题讨论】:

  • 试试这个:AppLocalizations.of(context).translate["Intro"]["Header"]
  • 它不工作。错误状态'未为类定义运算符'[]'....'。它将错误指向“简介”
  • 我想知道怎么做。有什么解决办法吗?
  • @Ooto 你可以看看我的回答。它可以帮助你

标签: json flutter localization


【解决方案1】:

我知道这个问题已经很老了,但我发现它是因为我遇到了同样的问题并正在寻找解决方案。我无法在互联网上找到一个,所以我试图自己解决它,当我做到这一点时,我想在这里展示我的解决方案。这个解决方案可能不是最好的,因为我对 Dart/Flutter 还很陌生,但至少它有效。

由于问题的所有者没有提供他的设置,我将把这个Video 的状态作为给定的。

[...] 
Map<String, String> _localizeStrings;
[...]
_localizeStrings = jsonMap.map((key, value) {
  return MapEntry(key, value.toString());
});
[...]
String translate(String key) {
  return _localizeStrings[key];
}
[...]

这是给定的状态,完全是为扁平的 json 结构设置的。为了能够使用嵌套结构,我们的 Map _localizeStrings 应该是 Map&lt;String, dynamic&gt; 类型,因为键始终是字符串,但值可以是字符串或另一个映射。作为下一步,我们需要从value 中删除.toString()。作为最后一步,我们将实现一个函数,该函数将给定键拆分为“。”并且会一键一键地爬下地图。它得到的最后一个值我们将返回.toString(),因为这应该是我们想要的字符串。

所以这是我的解决方案:

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class AppLocalizations {
  final Locale locale;
  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  AppLocalizations(this.locale);

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

  Map<String, dynamic> _localizeStrings;

  Future<bool> load() async {
    String jsonString =
        await rootBundle.loadString('lang/${locale.languageCode}.json');
    Map<String, dynamic> jsonMap = json.decode(jsonString);

    _localizeStrings = jsonMap.map((key, value) {
      return MapEntry(key, value);
    });

    return true;
  }

  String translate(String key) {
    var nestedMap = _getNestedValue(key);    
    return nestedMap.toString();
  }

  dynamic _getNestedValue(String keyPath) {
    Map keyMap = keyPath.split('.').asMap();
    var nestedMap;
    keyMap.forEach((index, key) {
      if (index == 0) {
        nestedMap = _localizeStrings[key];
      } else
        nestedMap = nestedMap[key];
    });
    return nestedMap;
  }
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) {
    return ['en', 'de'].contains(locale.languageCode);
  }

  @override
  Future<AppLocalizations> load(Locale locale) async {
    AppLocalizations localizations = new AppLocalizations(locale);
    await localizations.load();
    return localizations;
  }

  @override
  bool shouldReload(LocalizationsDelegate<AppLocalizations> old) => false;
}

【讨论】:

  • 谢谢。在过去的一个小时里,我一直在努力解决类似的问题。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2021-05-02
  • 2020-05-30
  • 2021-12-25
  • 2021-07-03
  • 2021-06-27
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多