您的位置:首页 > 编程语言 > Java开发

Spring国际化--从数据库读取messageSource

2015-10-29 16:51 204 查看

从数据库读取messageSource

一直以来用Spring做国际化,都将国际化信息写在properties文件中。这次在项目中遇到一个需求,需要把properties文件去掉,直接从数据库读取国际化信息。

从数据库读取messageSource可以将properties文件的管理界面化,数据化。

SPRING 国际化

从数据库读取messageSource

方便维护

注意:读取xml配置文件的顺序

Spring配置代码块

<!-- 定义国际化文件和编码 -->
<bean id="propertiesMessageSource"  class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames" value="messages/message"/>
<property name="defaultEncoding" value="utf8" />
</bean>

<!-- 使用session判断用户语言 -->
<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="cn"/>
</bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="locale"/>
</bean>
</mvc:interceptors>

<!-- 数据库国际化资源 自定义的MessageResource -->
<bean id="messageSource" class="com.platform.i18n.MessageResource">
<property name="parentMessageSource" ref="propertiesMessageSource"/>
</bean>


cookie的国际化暂时没有进行配置,通过重写MessageResource后,就可以从数据库读取信息了。目前这样的配置也可以读取properties文件中的国际化信息。

dto代码

/**
* 根据properties定义的对象
* */
package com.platform.i18n.dto;
import java.io.Serializable;
public class Resource implements Serializable
{
//唯一标识
private long resourceId;
//键名
private String name;
//值
private String text;
//对应的语言
private String language;

public long getResourceId()
{
return resourceId;
}
public void setResourceId(long resourceId)
{
this.resourceId = resourceId;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getText()
{
return text;
}
public void setText(String text)
{
this.text = text;
}
public String getLanguage()
{
return language;
}
public void setLanguage(String language)
{
this.language = language;
}
}


自定义的MessageSource代码

package com.platform.i18n;

/**
* messageSource自定义代码
*/

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.support.AbstractMessageSource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;

import com.genertech.web.platform.i18n.dto.Resource;

public class MessageResource extends AbstractMessageSource implements ResourceLoaderAware
{
@SuppressWarnings("unused")
private ResourceLoader resourceLoader;

/**
* Map切分字符
*/
protected final String MAP_SPLIT_CODE = "|";
private final Map<String, String> properties = new HashMap<String, String>();

public MessageResource()
{
reload();
}

public void reload() {
properties.clear();
properties.putAll(loadTexts());
}

/**
*
* 描述:TODO
* 查询数据 虚拟数据,可以从数据库读取信息,此处省略
* @return
*/
private List<Resource> getResource(){
List<Resource> resources = new ArrayList<Resource>();
Resource re = new Resource();
Resource re1 = new Resource();
re.setResourceId(1);
re.setName("common.name");
re.setText("name");
re.setLanguage("en");
resources.add(0, re);
re1.setResourceId(2);
re1.setName("common.name");
re1.setText("\u59D3\u540D");
re1.setLanguage("cn");
resources.add(1, re1);
return resources;
}

/**
*
* 描述:TODO
* 加载数据
* @return
*/
protected Map<String, String> loadTexts() {
Map<String, String> mapResource = new HashMap<String, String>();
List<Resource> resources = this.getResource();
for (Resource item : resources) {
String code = item.getName() + MAP_SPLIT_CODE + item.getLanguage();
mapResource.put(code, item.getText());
}
return mapResource;
}

/**
*
* 描述:TODO
* @param code
* @param locale 本地化语言
* @return
*/
private String getText(String code, Locale locale) {
String localeCode = locale.getLanguage();
String key = code + MAP_SPLIT_CODE + localeCode;
String localeText = properties.get(key);
String resourceText = code;

if(localeText != null) {
resourceText = localeText;
}
else {
localeCode = Locale.ENGLISH.getLanguage();
key = code + MAP_SPLIT_CODE + localeCode;
localeText = properties.get(key);
if(localeText != null) {
resourceText = localeText;
}
else {
try {
if(getParentMessageSource() != null) {
resourceText = getParentMessageSource().getMessage(code, null, locale);
}
} catch (Exception e) {
logger.error("Cannot find message with code: " + code);
}
}
}
return resourceText;
}

@Override
public void setResourceLoader(ResourceLoader resourceLoader)
{
this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader());
}

@Override
protected MessageFormat resolveCode(String code, Locale locale)
{
String msg = getText(code, locale);
MessageFormat result = createMessageFormat(msg, locale);
return result;
}

@Override
protected String resolveCodeWithoutArguments(String code, Locale locale) {
String result = getText(code, locale);
return result;
}
}


jsp页面调用国际化信息代码块

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
properties国际化信息显示:<br/>
<spring:message code="common.emptyrecords"/><br/>
数据库读取的国际化信息显示:<br/>
<spring:message code="common.name"/><br/>

</body>
</html>


温馨提示:每个项目的配置不同,一个项目中可能会有很多个xml配置文件,要注意xml之间的先后加载顺序。否则极易出现错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: