014 国际化

Posted 最爱五仁月饼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了014 国际化相关的知识,希望对你有一定的参考价值。

一. 概述

  在ApplicaitonContext之中,我们 介绍过ApplicationContext实现了MessageSource接口,也就是说我们使用的IOC容器也是具有国际化的功能.

    我们看一下IOC创建的流程代码.

    postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.
                initMessageSource();

                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // Check for listener beans and register them.
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.
                finishRefresh();

我们看到了在IOC容器创建的过程中有一步就是初始化国际信息.

我们进入看一下:

protected void initMessageSource() {
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
            this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
            // Make MessageSource aware of parent MessageSource.
            if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
                HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
                if (hms.getParentMessageSource() == null) {
                    // Only set parent context as parent MessageSource if no parent MessageSource
                    // registered already.
                    hms.setParentMessageSource(getInternalParentMessageSource());
                }
            }
            if (logger.isDebugEnabled()) {
                logger.debug("Using MessageSource [" + this.messageSource + "]");
            }
        }
        else {
            // Use empty MessageSource to be able to accept getMessage calls.
            DelegatingMessageSource dms = new DelegatingMessageSource();
            dms.setParentMessageSource(getInternalParentMessageSource());
            this.messageSource = dms;
            beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
            if (logger.isDebugEnabled()) {
                logger.debug("Unable to locate MessageSource with name ‘" + MESSAGE_SOURCE_BEAN_NAME +
                        "‘: using default [" + this.messageSource + "]");
            }
        }
    }

上面的代码描述了如果IOC容器之中有一个名字为messageSource的Bean,类型为MessageSource,就使用它作为国际化文件的方式.

如果不存在,就使用一个委托的代理对象完成.

  这也就是说,我们可以在IOC容器之中定义一个MessageSource的子类,实现国际化.


 

二 .MessageSosource接口

public interface MessageSource {

    String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
   
    String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
   
    String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;

}

接口之中定义了通过键获取值的方式,同时可以提供参数完成占位符的替换功能.

  现在我们需要寻找一个MessageSource的实现类.一般情况下我们喜欢使用ResourceBundleMessageSource这个实现类.


 

三.演示一下国际化

首先我们配置一个国际化文件:在classpath之下定义一个i18n_zh_CN.properties.

trek.name={0}haoren

配置ResourceBundleMessageSource的实现类.

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>i18n</value>
            </list>
        </property>
    </bean>

测试代码:  

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        System.out.println(context.getMessage("trek.name", new Object[] {"trek"}, Locale.getDefault()));

 

  

以上是关于014 国际化的主要内容,如果未能解决你的问题,请参考以下文章

014 Mui

ngx-translate实现国际化:this.translate.use()this.translate.get()this.translate.instant()onLangChange(代码片段

spring 国际化 js怎么设置

014 进程权限

免费下载全套最新014Less视频教程+教学资料+学习课件+源代码+软件开发工具

免费下载全套最新014SpringData视频教程+教学资料+学习课件+源代码+软件开发工具