1. 程式人生 > >spring國際化: 從數據庫中讀取國際化資源

spring國際化: 從數據庫中讀取國際化資源

.get english 語言 creat 文本 讀取 implement 獲取 ram

public class MessageResource extends AbstractMessageSource implements ResourceLoaderAware, InitializingBean {
	@SuppressWarnings("unused")
	private ResourceLoader resourceLoader = null;
	
	@Autowired
	private Sys_resourcesService sys_resourcesService = null;
	
	private final String MAP_SPLIT_CODE = "|";
	
    private final Map<String, String> properties = new HashMap<String, String>();

    public MessageResource(){
    	
    }

    @Override
	public void afterPropertiesSet() throws Exception {
        System.out.println("中國大陸:語言:" + Locale.SIMPLIFIED_CHINESE.getLanguage() +", 國家");
        System.out.println("臺灣:語言:" + Locale.TAIWAN.getLanguage());
    	properties.clear();
        properties.putAll(loadTexts());
	}

    /**
     * 讀取資源信息
     * @return
     */
    private List<Resource> getResource(){
        return sys_resourcesService.findAll();
    }

    /**
     * 加載數據
     * @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.getRskey() + MAP_SPLIT_CODE + item.getLanguage();
            mapResource.put(code, item.getText());
        }
        System.out.println("國際化資源加載完畢.共"+resources.size()+"條.");
        return mapResource;
    }

    /**
     * 獲取文本
     * @param code   
     * @param locale 本地化語言
     * @return
     */
    private String getText(String code, Locale locale){
        String localeCode = locale.getLanguage();
        if(localeCode != null && localeCode.toUpperCase().equals(R.lan.ZH)){
        	if(locale.getCountry().toUpperCase().equals(R.lan.CN)){
        		localeCode = R.lan.CN.toLowerCase();
        	}else{
        		localeCode = R.lan.TW.toLowerCase();
        	}
        }
        String key = code + MAP_SPLIT_CODE + localeCode;
        String localeText = properties.get(key);
        String resourceText = code;

        if(localeText != null && !"".equals(localeText)) {
            resourceText = localeText;
        }else{
            localeCode = Locale.ENGLISH.getLanguage();
            key = code + MAP_SPLIT_CODE + localeCode;
            localeText = properties.get(key);
            if(localeText != null && !"".equals(localeText)) {
                resourceText = localeText;
            }else{
                try{
                    if(getParentMessageSource() != null) {
                        resourceText = getParentMessageSource().getMessage(code, null, locale);
                    }
                }catch(Exception e) {
                    logger.error("找不到對應的消息, 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;
    }
}

  

spring國際化: 從數據庫中讀取國際化資源