很多项目都会需要处理国际化的问题,所以整理了以下三种情况国际化的处理方式(这里列举的是没有前后端分离的情况,如果项vue等框架可以查看相关国际化处理方式)。
第一种:js
目前主流的都是使用jQuery.i18n.properties,jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化。
第一步:下载jQuery.i18n.properties.js,可以在github中下载:jQuery.i18n.properties.js 。
第二步: 创建国际化properties文件,文件地址创建在webapp下。
第三步:在web页面引入你的jQuery.i18n.properties.js文件,path即第二步创建的文件相对路径
第四步:使用$.i18n.prop('i18N.KEY')。完成
第二种:jsp
这种方式是使用springmvc的国际化,其他的如果有更好的处理方式可以探讨和指点下:
第一步:在spring.xml文件中 加上如下配置
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
<!-- 存储区域设置信息 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" >
<property name="defaultLocale" value="en_US"></property>
</bean>
<!-- 国际化资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames" value="/WEB-INF/message/message" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
第二步:也是创建资源文件,资源文件可以放在src resource下,也可以放在web-inf下。
第三步:页面使用 首先需在头部引入<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>,然后 用 <spring:message code="i18n.name" />替换文字就可以了
第三种:JAVA后台处理
后台处理需要使用的是java.uitl.ResourceBundle类来获取资源文件,不多说直接上代码
/**
*
* @className: ResourceBundleUtils
* @classDescription:国际化资源文件获取
* @author shiqiang.li
* @create_date: 2019年6月17日 下午6:35:42
* @update_date:
*/
public class ResourceBundleUtils {
private static Logger logger = LoggerFactory.getLogger(ResourceBundleUtils.class);
/**
* 根据key获取国际化文件对应的value,如果不存在对应的key,返回key值
*
* @param key
* @return
*/
public static String getResourceBundleString(String key, Locale locale) {
String retrunStr = null;
if (StringUtils.isBlank(key)) {
logger.warn("ResourceBundleUtils getResourceBundleDString key is null");
return retrunStr;
}
key = ResourceKeyConstant.REOURCE_HEAD.concat(ResourceKeyConstant.REOURCE_DOT).concat(key);
ResourceBundle resourceBundle = buildResourceBundle(locale);
try {
// 存在对应key就获取返回,没有则返回key
if (resourceBundle.containsKey(key)) {
retrunStr = resourceBundle.getString(key);
}
} catch (Exception e) {
logger.error("ResourceBundleUtils getResourceBundleDString throw e:{}", e);
}
return retrunStr;
}
/**
* 根据key获取国际化文件对应的value,如果不存在对应的key
*
* @param resourceBundle
* @param key
* @return
*/
public static String getResourceBundleString(ResourceBundle resourceBundle, String key) {
String retrunStr = null;
if (StringUtils.isBlank(key)) {
logger.warn("ResourceBundleUtils getResourceBundleDString key is null");
return retrunStr;
}
if (resourceBundle == null) {
logger.warn("ResourceBundle is null");
return retrunStr;
}
key = ResourceKeyConstant.REOURCE_HEAD.concat(ResourceKeyConstant.REOURCE_DOT).concat(key);
try {
// 存在对应key就获取返回,没有则返回key
if (resourceBundle.containsKey(key)) {
retrunStr = resourceBundle.getString(key);
// retrunStr = new String(resourceBundle.getString(key).getBytes("ISO-8859-1"),
// "UTF8");
}
} catch (Exception e) {
logger.error("ResourceBundleUtils getResourceBundleDString throw e:{}", e);
}
return retrunStr;
}
/**
* 构建国际化对象
*
* @return
*/
public static ResourceBundle buildResourceBundle(Locale locale) {
// 根据语言类型,进行国际化处理
ResourceBundle resourceBundle = null;
try {
if (locale != null) {
resourceBundle = ResourceBundle.getBundle(ResourceKeyConstant.REOURCE_FILE_NAME, locale);
} else {
resourceBundle = ResourceBundle.getBundle(ResourceKeyConstant.REOURCE_FILE_NAME,
new Locale("en", "US"));
}
} catch (MissingResourceException m) {
logger.error("get resourceBundle is error-->{}", m.getMessage(), m);
}
return resourceBundle;
}
}
目前这种方式资源文件存在的位置只能是在resource下,目前还不清楚应该怎么处理不放在resource目录下ResourceBundle.getBundle(ResourceKeyConstant.REOURCE_FILE_NAME, locale)方法可以获取到资源文件,其他是没有问题的。
整理到这了,希望对大家有帮助!