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

从数据库读取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之间的先后加载顺序。否则极易出现错误。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭