加载国际化文件的几种姿势
1、
通过util包中的ResourceBundle加载:
首先国际化资源文件放在了classpath下的i18n目录下:
mymessage_en_US.properties:
com.website.operation=u67e5u8be2u64cdu4f5cu65e5u5fd7
com.website.write=u5199u65e5u5fd7
com.website.writeLog=u5199 {0} u65e5u5fd7
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
- 微信公众平台开发接口PHP SDK完整版
- 我的HTML总结之HTML发展史
- BZOJ 4152: [AMPPZ2014]The Captain(最短路)
- js获取div编辑框,textarea,input text的光标位置,兼容FF和IE
- BZOJ 4289: PA2012 Tax(最短路)
- php QR Code二维码生成类
- BZOJ 3714: [PA2014]Kuglarz(最小生成树)
- 我的HTML总结之表单
- php 二维码生成类
- HDU 2516 取石子游戏(斐波那契博弈)
- angularjs MVC、模块化、依赖注入详解
- BZOJ 2940: [Poi2000]条纹(Multi-Nim)
- PHP页面跳转代码
- angularjs 控制器、作用域、广播详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python设计模式-创建型】抽象工厂模式
- 【原创】MySQL数据库开发中的6个“避免”
- mysql 中的innoDB 引擎的B+树索引
- TypeScript手记(二)
- c语言之指针运算
- MySQL online DDL 更改Varchar的字段长度
- 【python-leetcode206-翻转链表】反转链表
- 程序員必須知道的面向对象设计六大原则
- python之面向对象中的多态
- TypeScript手记(三)
- python之单例设计模式
- 【python设计模式-创建型】单例模式
- TypeScript手记(四)
- Java8使用CompletableFuture的部分方法
- TypeScript手记(五)