Javaweb国际化解决方案

文章介绍了在SpringMVC中实现国际化的过程,包括通过Accept-Language头获取Locale,使用CookieLocaleResolver处理用户偏好,创建资源文件,创建MessageSource实例,以及如何进行字典和操作日志的国际化。同时,提到了缓存策略以提高效率,并展示了自定义日志注解和切面处理的方法。
消息提示国际化
获取Locale

实现国际化的第一步是获取到用户的Locale。在Web应用程序中,HTTP规范规定了浏览器会在请求中携带Accept-Language头,用来指示用户浏览器设定的语言顺序,如:

Accept-Language: zh-CN,zh;q=0.8,en;q=0.2

上述HTTP请求头表示优先选择简体中文,其次选择中文,最后选择英文。q表示权重,解析后我们可获得一个根据优先级排序的语言列表,把它转换为Java的Locale,即获得了用户的Locale。大多数框架通常只返回权重最高的Locale

Spring MVC通过LocaleResolver来自动从HttpServletRequest中获取LocaleLocaleResolver的四种实现:
AcceptHeaderLocaleResolver:默认的区域解析器实现,不可手动配置,通过请求头Accept-Language来获取Locale信息。这里需要注意的是HttpServletRequestAccept-Language头中的语言字符串转为Locale对象时只可使用IETF语言标签(即en-US),而无法使用ISO语言标签(即en_US)。
CookieLocaleResolver:通过客户端的Cookie获取相应的Locale,Cookie为空时再从Accept-Language头中获取。目前最为常用的实现方式。
SessionLocaleResolver:通过Session获取相应的Locale,在目前多为分布式系统架构的情况下使用太过局限,不推荐使用。
FixedLocaleResolver:固定的区域解析器,总是返回一个默认的locale,不指定默认值时为JVM的默认locale,不支持setLocale方法,不能被改变。

在这里我们还是使用最为常用的CookieLocaleResolver来获取Locale

	@Bean
	public LocaleResolver localeResolver() {
   
   
		LocaleResolver localeResolver = new CookieLocaleResolver();
		return localeResolver;
	}

当用户第一次访问网站时,CookieLocaleResolver只能从Accept-Language中获取Locale再设置到Cookie中,下次访问就会直接使用Cookie的设置。CookieLocaleResolver设置的cookie默认有效期为会话结束,我们可以自定义子类来重新设置默认的属性。

public class MyCookieLocaleResolver extends CookieLocaleResolver {
   
   
    //重写构造方法,改变cookie信息
    public MyCookieLocaleResolver(){
   
   
        this.setCookieName("Locale");
        //cookie有效期30天
        this.setCookieMaxAge(30*24*60*60);
    }
}

如果用户想通过请求接口来切换Locale,还可以配置区域变更拦截器LocaleChangeInterceptorLocaleChangeInterceptor会配合当前使用的LocaleResolver,使用其setLocale()方法来设置新的Locale

@Bean
public WebMvcConfigurer i18nInterceptor() {
   
   
	return new WebMvcConfigurer() {
   
   
		@Override
		public void addInterceptors(InterceptorRegistry registry) {
   
   
			LocaleChangeInterceptor i18nInterceptor = new LocaleChangeInterceptor();
			// 设置请求参数名,默认为locale
			i18nInterceptor.setParamName("lang");
			registry.addInterceptor(i18nInterceptor);
		}
	};
}

设置拦截器后即可通过URL?lang=zh_CN方式来切换语言信息,切换后的语言信息会直接存入到Cookie中。

创建资源文件

在resource下新建i18n文件目录,添加多语言配置文件。默认语言,文件名必须使用message.properties,其他语言使用message加Locale名的形式命名。

messages_en_US.properties

user.name=zhangsan

messages_zh_CN.properties

user.name=张三

查找出代码中所有写死的中文消息提示,建立多语言配置

匹配双字节字符(包括汉字在内):[^\x00-\xff]+
创建MessageSource

创建一个Spring提供的MessageSource实例,它自动读取所有的.properties文件。Spring容器可以创建不止一个MessageSource实例,我们可以把自己创建的MessageSource命名为i18nMessageSource,防止和其他实例冲突。

@Bean("i18nMessageSource")
public MessageSource messageSource() {
   
   
	ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
	messageSource.setBasename("classpath:i18n/messages");
	messageSource.setDefaultEncoding("UTF-8");
	return messageSource;
}

提供一个统一的工具类来获取多语言配置信息

@UtilityClass
public class MsgUtils {
   
   

	public String getMessage(String code) {
   
   
		MessageSource messageSource = SpringContextHolder.getBean("i18nMessageSource");
		return messageSource.getMessage(code, null, LocaleContextHolder.getLocale());
	}

	public String getMessage(String code, Object
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值