App要求:
获取的通知消息存在数据库中,
不同语言的用户获取到的是对应语言的通知消息,和前端沟通无果;
希望前端能保留各种通知类型对应语言,我传递通知code值,前端根据code加载不同的消息内容,并拼接参数;
前端表示:搭嘎,口头瓦鲁!!
不愧是懒得计算样式和背景颜色让我在后端增加字体样式,图标样式名称,背景样式名称,字体颜色名称,这些字段在json里的前端;
只能自己来了;
由于只是demo这里就用map替代i18n
的配置文件了,原理是一样的;
public static void main(String[] args) {
HashMap<String, HashMap<String,String>> translation = new HashMap<>();
HashMap<String, String> strMap = new HashMap<>();
strMap.put("cer","通过学习课程$$,获得了$$积分"); // 根据模板名称设置模板,模拟18n的语言文件夹配置
translation.put("zh_CN",strMap); // 根据语言设置模板对,模拟18n的语种配置
String notification = "cer"; // 通知代号
String[] params = {"《屎山代码集锦》","3600"}; // 通知需要填入的参数数组
String msg = translation.get("zh_CN").get(notification); // 匹配语言获得语言的消息map,再根据消息code获取对应的模板
StringBuilder builder = StringBuilderUtils.replace(new StringBuilder(msg), "$$", params);
System.out.println(builder);
}
一个StringBuilder的代码块
/**
* 封装StringBuilder的操作
*/
public class StringBuilderUtils {
// 替换指定字符串
public static StringBuilder replace(StringBuilder builder, String target, String str) {
// 目标不能为""否则会替换第一个字符
if ((target == null || target.length() == 0) || str == null)
return builder;
int first = builder.indexOf(target);
if (first < 0)
return builder;
builder.replace(first, first + target.length(), str);
return builder;
}
// 遍历数组从左到右逐个替换
public static StringBuilder replace(StringBuilder builder, String target, String... str) {
if (str==null||str.length==0)
return builder;
for (String s : str) {
replace(builder,target,s);
}
return builder;
}
}
============================
后续发现一个问题,不同语言的语序是不一样的,所以每个模板的参数位置不是确定的,用数组做参数不合适;
于时使用Map保存参数,key做占位符;value为需要填入的值;如果连value都要翻译,那再加一个配置Map吧;
public static void main(String[] args) {
// 语言字典,,语言:消息字典
HashMap<String, HashMap<String,String>> translation = new HashMap<>();
// 模拟中文模板
HashMap<String, String> cnMap = new HashMap<>();
cnMap.put("cer","通过学习课程《${course}》,获得了${score}积分");// 根据模板名称设置模板,模拟18n的语言文件夹配置
// 模拟英文模板
HashMap<String, String> enMap = new HashMap<>();
enMap.put("cer","Gained ${score} points by studying the course ”${course}“ ");
// 设置模板进对应的语言
translation.put("zh_CN",cnMap); // 设置为中文模板,模拟18n的语种配置
translation.put("en_US",enMap); // 设置为英语模板,模拟18n的语种配置
String notification = "cer"; // 通知代号
// 通知需要填入的参数Map集合
HashMap<String, String> paramMap = new HashMap<>();
paramMap.put("${course}","屎山代码集锦");
paramMap.put("${score}","100");
String msg = translation.get("zh_CN").get(notification); // 匹配语言获得语言的消息map,再根据消息code获取对应的模板
StringBuilder stringBuilder = new StringBuilder(msg);
paramMap.forEach((k,v)->{
StringBuilderUtils.replace(stringBuilder, k, v);
});
System.out.println(stringBuilder.toString());
}
新增StringBuilder工具
// 遍历Map集合使用k作为占位符,替换为value
public static StringBuilder replaceMap(StringBuilder builder, Map<String,String> parameterDictionary){
if (parameterDictionary==null||parameterDictionary.size()==0)
return builder;
parameterDictionary.forEach((k,v)->{
replace(builder, k, v);
});
return builder;
}
简化以后的调用以及执行结果
翻译utils
从cookie获取语言
import Cookies from 'js-cookie'
const languageKey = 'admin-language'
export function getLanguage() {
return Cookies.get(languageKey)
}
export function setLanguage(language) {
return Cookies.set(languageKey, language)
}
字典
import { getLanguage } from '@/utils/language'
export const en = {
'search': 'Search',
'add': 'Add',
'oderId': 'Oder Id',
'userId': 'User Id',
'goodsId': 'Goods Id',
'goodsName': 'Goods Name',
'goodsTypeId': 'Goods Type Id',
'courseName': 'Course Name',
'courseId': 'Course Id'
}
export const cn = {
'search': '搜索',
'add': '添加',
'oderId': '订单Id',
'userId': '用户Id',
'goodsId': '商品Id',
'goodsName': '商品名称',
'goodsTypeId': '商品类型Id',
'courseName': '课程名称',
'courseId': '课程Id'
}
export function translation(key) {
// 如果是英语就使用en字典,如果不是就使用中文字典
let value = getLanguage() === 'en_US' ? en : cn[key]
if (value === null || value === '' || value === undefined) {
// 如果最终值超出预期就返回key
value = key
}
// 返回冲字典中get到的value
return value
}
使用部分
在使用的地方引入,翻译工具
import { translation } from '@/utils/translation'
定义一些变量,可以的话设置一些默认值
使用变量
最后在页面初始化生命周期中调用翻译方法,在方法中遍历butten数组,拿key去取value,需要注意的一点是,这里定义的变量map一定要和字典中对应
// 页面初始化时执行
created() {
this.getList()
this.translationValue()
}
// 页面初始化翻译button列表的方法
methods:{
translationValue() {
for (const buttonKey in this.button) {
this.button[buttonKey] = translation(buttonKey)
}
}
}