专栏首页我的小碗汤加载国际化文件的几种姿势

加载国际化文件的几种姿势

1、

通过util包中的ResourceBundle加载:

首先国际化资源文件放在了classpath下的i18n目录下:

mymessage_en_US.properties:

com.website.operation=\u67e5\u8be2\u64cd\u4f5c\u65e5\u5fd7
com.website.write=\u5199\u65e5\u5fd7
com.website.writeLog=\u5199 {0} \u65e5\u5fd7

mymessage_en_US.properties:

com.website.operation=queryOperationLog
com.website.write=recordLog
com.website.writeLog=record {0} Log

利用ResourceBundle加载国际化文件,这里列出四个方法,分别是利用默认Locale、zh_CN、en_US以及带占位符的处理方式。这里需要注意的是BaseName为classpath下的目录+/+国际化文件名前缀,即i18n/mymessage

package com.website.controller.utils;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * @program: website
 * @description: 获取国际化配置文件
 * @author: smallsoup
 * @create: 2018-07-27 22:32
 **/

public class ResourceUtils {

    public static String getEnglishValueByKey(String key){

        Locale locale = new Locale("en", "US");
        //使用指定的英文Locale
        ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage", locale);
        return mySource.getString(key);
    }

    public static String getChineseValueByKey(String key){

        Locale locale = new Locale("zh", "CN");
        //使用指定的中文Locale
        ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage", locale);
        return mySource.getString(key);
    }

    public static String getDeafultValueByKey(String key){

        //使用默认的Locale
        ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage");
        return mySource.getString(key);
    }

    public static String getValueAndPlaceholder(String key){

        //使用默认的Locale
        ResourceBundle mySource = ResourceBundle.getBundle("i18n/mymessage");

        String beforeValue = mySource.getString(key);

        //填充国家化文件中的占位符
        String afterValue = MessageFormat.format(beforeValue, "安全");
        return afterValue;
    }

}

在controller里面调用ResourceUtils里的方法:

   @RequestMapping(value = "/projectadd")
    public String projectAdd(){

        LOGGER.warn("projectAdd getChineseValueByKey is {}", ResourceUtils.getChineseValueByKey("com.website.operation"));
        LOGGER.warn("projectAdd getDeafultValueByKey is {}", ResourceUtils.getDeafultValueByKey("com.website.operation"));
        LOGGER.warn("projectAdd getEnglishValueByKey is {}", ResourceUtils.getEnglishValueByKey("com.website.operation"));
        LOGGER.warn("projectAdd getValueAndPlaceholder is {}", ResourceUtils.getValueAndPlaceholder("com.website.writeLog"));
        return "project/projectadd";
    }

启动tomcat打印日志:

2、

利用spring的ResourceBundleMessageSource

ResourceBundleMessageSource是基于JDK ResourceBundle的MessageSource接口实现类。它会将访问过的ResourceBundle缓存起来,以便于下次直接从缓存中获取进行使用。

和上面不同的是ResourceUtils的实现,实现如下:

package com.website.controller.utils;


import org.springframework.context.support.ResourceBundleMessageSource;

import java.util.Locale;

/**
 * @program: website
 * @description: 获取国际化配置文件
 * @author: smallsoup
 * @create: 2018-07-27 22:32
 **/

public class ResourceUtils {

    private static ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

    static {
        //指定国家化资源文件路径
        messageSource.setBasename("i18n/mymessage");
        //指定将用来加载对应资源文件时使用的编码,默认为空,表示将使用默认的编码进行获取。
        messageSource.setDefaultEncoding("UTF-8");
    }

    public static String getChineseValueByKey(String key){

        return messageSource.getMessage(key, null, Locale.CHINA);
    }

    public static String getDeafultValueByKey(String key){

        return messageSource.getMessage(key, null, null);
    }

    public static String getEnglishValueByKey(String key){

        return messageSource.getMessage(key, null, Locale.US);
    }

    public static String getValueAndPlaceholder(String key){

        return messageSource.getMessage(key, new Object[]{"安全"}, null);
    }

}

3、

利用spring的ReloadableResourceBundleMessageSource

ReloadableResourceBundleMessageSource也是MessageSource的一种实现,其用法配置等和ResourceBundleMessageSource基本一致。所不同的是ReloadableResourceBundleMessageSource内部是使用PropertiesPersister来加载对应的文件,这包括properties文件和xml文件,然后使用java.util.Properties来保存对应的数据。

package com.website.controller.utils;

import org.springframework.context.support.ReloadableResourceBundleMessageSource;

import java.util.Locale;

/**
 * @program: website
 * @description: 获取国际化配置文件
 * @author: smallsoup
 * @create: 2018-07-27 22:32
 **/

public class ResourceUtils {

    private static ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

    static {
        //指定国家化资源文件路径
        messageSource.setBasename("i18n/mymessage");
        //指定将用来加载对应资源文件时使用的编码,默认为空,表示将使用默认的编码进行获取。
        messageSource.setDefaultEncoding("UTF-8");

        //是否允许并发刷新
        messageSource.setConcurrentRefresh(true);

        //ReloadableResourceBundleMessageSource也是支持缓存对应的资源文件的,默认的缓存时间为永久,即获取了一次资源文件后就将其缓存起来,以后再也不重新去获取该文件。这个可以通过setCacheSeconds()方法来指定对应的缓存时间,单位为秒
        messageSource.setCacheSeconds(1200);
    }

    public static String getChineseValueByKey(String key){

        return messageSource.getMessage(key, null, Locale.CHINA);
    }

    public static String getDeafultValueByKey(String key){

        return messageSource.getMessage(key, null, null);
    }

    public static String getEnglishValueByKey(String key){

        return messageSource.getMessage(key, null, Locale.US);
    }

    public static String getValueAndPlaceholder(String key){

        return messageSource.getMessage(key, new Object[]{"安全"}, null);
    }

}

这三种方式最后结果是一样的。

参考:

国际化MessageSource

http://elim.iteye.com/blog/2392583

本文分享自微信公众号 - 我的小碗汤(mysmallsoup),作者:小碗汤

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何利用curl命令访问Kubernetes API server

    kubectl 通过访问 Kubernetes API 来执行命令。我们也可以通过对应的TLS key, 使用curl 或是 golang client做同样的...

    我的小碗汤
  • 采坑指南——域名解析问题排查过程

    前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。

    我的小碗汤
  • https原理以及golang基本实现

    大致上分为两类,基于key的加密算法与不基于key的加密算法。现在的算法基本都是基于key的,key就以一串随机数数,更换了key之后,算法还可以继续使用。

    我的小碗汤
  • SpringBoot整合Redis

    Spring Data Redis 为我们提供 RedisTemplate 和 StringRedisTemplate 两个模板进行数据操作,它们主要 的访问方...

    崔笑颜
  • SpringBoot集成Redis集群就这么Easy

    这次写一下springboot与redis的结合,这里使用的是redis集群模式(主从),主从环境的搭建,请参考redis集群搭建

    JAVA葵花宝典
  • Guava Cache 用法介绍

    Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效。Guava官网介绍,下面的这几种情况可以考虑使用Guava...

    zhisheng
  • 利用python 迁移单个redis的

    py3study
  • 重学 Java 设计模式:实战抽象工厂模式「替换Redis双集群升级,代理类抽象场景」

    大部分做开发的小伙伴初心都希望把代码写好,除了把编程当作工作以外他们还是具备工匠精神的从业者。但很多时候又很难让你把初心坚持下去,就像;接了个烂手的项目、产品功...

    小傅哥
  • 重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」

    大部分做开发的小伙伴初心都希望把代码写好,除了把编程当作工作以外他们还是具备工匠精神的从业者。但很多时候又很难让你把初心坚持下去,就像;接了个烂手的项目、产品功...

    小傅哥
  • 重学 Java 设计模式:实战抽象工厂模式

    大部分做开发的小伙伴初心都希望把代码写好,除了把编程当作工作以外他们还是具备工匠精神的从业者。但很多时候又很难让你把初心坚持下去,就像;接了个烂手的项目、产品功...

    小傅哥

扫码关注云+社区

领取腾讯云代金券