美文网首页Java 杂谈
java加载国际化文件的几种姿势

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

作者: 进击云原生 | 来源:发表于2018-08-25 11:29 被阅读0次

1、

通过util包中的ResourceBundle加载:

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

image

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打印日志:

image.png

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


最后,csdn资源,收集了海量学习资料,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以关注以下公众号后回复【2】,获取。


我是小碗汤,我们一起学习,扫码关注,精彩内容第一时间推给你

欢迎扫码关注

相关文章

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

    1、 通过util包中的ResourceBundle加载: 首先国际化资源文件放在了classpath下的i18n...

  • 热修复类加载项目实战

    android 与 java 的类加载器 类别加载文件类加载器分类java.class 文件{{java类加载机制...

  • java基础知识(六)

    Java程序的国际化主要通过如下三个类完成。 ➢ java.util.ResourceBundle:用于加载国家、...

  • java类加载器(用户自定义类加载器实现)

    java类加载器主要分为如下几种: jvm提供的类加载器 根类加载器:底层实现,主要加载java核心类库(如:ja...

  • 聊聊java语言的国际化与格式化

    java语言的国际化思路 在java语言中,国际化的思路是将程序中的标签,提示等信息放到资源文件中,这些资源文件是...

  • 2020-05-09 JAVA类加载器包括几种?

    JAVA类加载器包括几种? 引导类加载器 bootstrap class loader 启动类加载器主要加载的是J...

  • JVM内存区域划分

    Java源代码文件(.java)会被Java编译器编译为字节码文件(.class),然后由JVM中的类加载器加载各...

  • 深入Java核心

    类加载 类加载负责加载编译后的class文件(字节码文件)到JVM当中。 在JRE中,类加载器主要分为以下几种:引...

  • springboot中SPI机制

    一、从java类加载机制说起 java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器...

  • 简单讲讲类的加载机制

    简单讲讲类的加载机制 理论 首先得说类的加载机制。从java文件从到内存里面经历了几个过程。 加载Java文件首先...

网友评论

    本文标题:java加载国际化文件的几种姿势

    本文链接:https://www.haomeiwen.com/subject/hhowiftx.html