一个关于多语言,动态配置通知消息的测试代码,StringBuilder替换指定字符串

一个关于多语言,动态配置通知消息的测试代码,StringBuilder替换指定字符串,第1张

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;
    }

简化以后的调用以及执行结果

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/924027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存