如何在颤振本地化中读取嵌套的 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<String, dynamic>
类型,因为键始终是字符串,但值可以是字符串或另一个映射。作为下一步,我们需要从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?的主要内容,如果未能解决你的问题,请参考以下文章