如何在颤振本地化中读取嵌套的 json?

Posted

技术标签:

【中文标题】如何在颤振本地化中读取嵌套的 json?【英文标题】:How to read nested json in flutter localization? 【发布时间】: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 你可以看看我的回答。它可以帮助你 【参考方案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;

【讨论】:

谢谢。在过去的一个小时里,我一直在努力解决类似的问题。

以上是关于如何在颤振本地化中读取嵌套的 json?的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中读取本地json导入?

如何在 Swift 中使用 Alamofire 读取本地 JSON

如何在javascript中读取本地的json格式文本文件

如何从 React.js 读取和写入本地 JSON 文件?

javascript如何读取本地json文件

如何从 JSON 映射嵌套数组?