使用MessageSource 实现国际化 [i18n]

1. ApplicationContext 接口扩展了MessageSource 接口,因而提供了消息的处理能力即 i18n 或国际化

2. 看看接口中的方法定义:

  2.1  String getMessage(String code, Object[] args, String defaultMessage, Locale locale); 用来从MessageSource中获取消息,当没有获取时使用 默认的消息参数 defaultMessage ; Object[] args 表示要设置的参数的值,new Object[] { 参数1,参数2,....} 

2.2 String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;  此方法没有默认消息,当没有获取时会抛出异常 NoSuchMessageException 

2.3 String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;  此方法的属性都封装在 MessageSourceResolvable 中,本方法可以指定 MessageSoruceResolvable 的实现

3. 工作原理:

 3.1 当ApplicationContext加载时,他会自动在context 中加载 定义为MessageSource 的bean ,而且此bean 必须命名为 messageSource 

3.2 如果加载找到了会将方法的调用交给 此bean 来处理,没找到则ApplicationContext 会在 其父类中查找同名的bean,如果找到将会委托给此bean,没找到任何消息bean,则会实例化一个空的 StaticMessageSource来接受此方法的调用。

3.3  spring 提供了 ResourceBundleMessageSource 和 StaticMessageSource 可以实现消息的处理,一般我们使用 ResourceBundleMessageSource 比较多

4. 实例如下:

   4.1  在 application-context.xml 中 

<bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <!-- core -->
                <value>i18n/base/error</value>
                <!-- basic-api -->
                <value>i18n/auth/error</value>
                <value>i18n/message/error</value>
                <!-- elite-api -->
                <value>i18n/position/error</value>
                <value>i18n/user/error</value>
                <!-- elite-app-web-c -->
                <value>i18n/message</value>
            </list>
        </property>
    </bean>

   4.2  在 message.properties  中有: 

hh=猎头
hr=HR
secrecy.name=某某
deliver.1.title=【简历投递】 
deliver.2.title=【简历查看】 
deliver.3.title=【简历通过】 
deliver.4.title=【简历拒绝】 

deliver.1.content={0} 收到了 {1} 的简历投递
deliver.2.content={0} 查看了 {1} 的简历
deliver.3.content={0} 通过了 {1} 的简历,线下会联系
deliver.4.content={0} 觉得 {1} 不适合该职位

4.3  在java 代码中 使用 

MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");

   或者

@Autowired
    private MessageSource messageSource;  

 String message = messageSource.getMessage("hh", null, null);
String secrecyName = messageSource.getMessage("secrecy.name", null, null);

 for(int i=0;i<4;i++){
         String content = messageSource.getMessage("deliver." + i + ".content",
                    new Object[] { message, secrecyName }, Locale.SIMPLIFIED_CHINESE);
     String title = messageSource.getMessage("deliver." + i+ ".title", null, null);

}

System.out.println(“”message :“”+message );

System.out.println(“”secrecyName:“”+secrecyName );

System.out.println(“”content:“”+content );

System.out.println(“title”+title);

 

就可以获取 : message:猎头

      secrecyName: 某某

content: 猎头 收到了 某某  的 简历投递

title:deliver.1.title=【简历投递】 

。。。。

最后创建一个工具类 MessageUtil:

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;

/**
 * @author  
 */
public class MessageUtil {

    public static String message(String code, MessageSource messageSource) {
        return message(code, messageSource, (Object[]) null);
    }

    public static String message(String code, MessageSource messageSource, Object... params) {
        return message(code, messageSource, Locale.CHINA, params);
    }

    public static String message(String code, MessageSource messageSource, Locale locale, Object... params) {
        return message(code, messageSource, "", locale, params);
    }
    
    public static String message(String code, MessageSource messageSource, String defaultMessage, Locale locale, Object... params){
        if (messageSource == null) {
            return code;
        }
        try {
            return messageSource.getMessage(code, params, defaultMessage, locale);
        } catch (NoSuchMessageException e) {
            return code;
        }
    }
}

 

 

 

转载于:https://my.oschina.net/newdeng/blog/844426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值