新增多语言转换 mqtt支持websocket

This commit is contained in:
2025-05-29 11:48:46 +08:00
parent cff5448fe0
commit 069ca209d0
7 changed files with 182 additions and 35 deletions

View File

@@ -0,0 +1,68 @@
import 'dart:convert';
import 'dart:io';
class Language {
static final String defalutLocale = "zh_CN";
static final Map<String, Map<String, String>> _translations = {};
static void setLanguage(String locale,
{String? path, Map<String, String>? language}) {
//载入json文件
if (path != null) {
try {
//暂时只支持本地文件
var file = File(path);
file.readAsString().then((data) {
_translations[locale] = _flattenJson(jsonDecode(data));
});
} catch (e) {
print(e);
}
return;
}
if (language != null) {
//构建翻译kv
_translations[locale] = _flattenJson(language);
}
}
// 扁平化嵌套 JSON 数据
static Map<String, String> _flattenJson(Map<String, dynamic> json,
[String prefix = '']) {
final Map<String, String> flatMap = {};
json.forEach((key, value) {
final newKey = prefix.isEmpty ? key : '$prefix.$key';
if (value is Map<String, dynamic>) {
flatMap.addAll(_flattenJson(value, newKey));
} else {
flatMap[newKey] = value.toString();
}
});
return flatMap;
}
static void resetLanguage({String? locale}) {
if (locale == null) {
//清空全部语言文件
_translations.clear();
} else {
//清空指定语言文件
_translations.remove(locale);
}
}
static String getTranslation(String key,
{String? languageCode, Map<String, String>? params}) {
var locale = languageCode ?? defalutLocale;
String text = _translations[locale]?[key] ?? key;
// 替换动态参数(如 @name
params?.forEach((key, value) {
text = text.replaceAll('@$key', value);
});
return text;
}
}

View File

@@ -0,0 +1,8 @@
import '../Language.dart';
extension StringTransform on String {
String tr({Map<String, String>? params, String? languageCode}) {
return Language.getTranslation(this,
params: params, languageCode: languageCode);
}
}