使用数据库完成多语言管理

package net.watermelon.demo.vo;

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;


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("zh");
		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(e);
				}
			}
		}
		return resourceText;
	}

	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;
	}
}

 配置一个自定义的MessageResource 就可以

Bean 定义里面加如下代码

@Bean
	public   ResourceBundleMessageSource propertiesMessageSource(){
		ResourceBundleMessageSource  rs = new  ResourceBundleMessageSource();
		
		rs.setBasenames("messages");
		
		return rs;
	}	

@Bean
	public MessageSource messageSource(){
		MessageResource mrs = new MessageResource();
		mrs.setParentMessageSource(propertiesMessageSource());
		return mrs;
	}

  这里 setParentMessageSource 可以一样读取 properties 配置文件中的多语言处理,增加了数据库的多语言处理,管理和开发起来都比较方便。

猜你喜欢

转载自guanxi.iteye.com/blog/2306278