我知道这个问题已经很老了,但我发现它是因为我遇到了同样的问题并正在寻找解决方案。我无法在互联网上找到一个,所以我试图自己解决它,当我做到这一点时,我想在这里展示我的解决方案。这个解决方案可能不是最好的,因为我对 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;
}