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;
}
简化以后的调用以及执行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)