java setlocale 国际化_spring国际化locale的代码原理以及拓展配置

原理

两种不同的LocaleResolve

LocaleResolver

public interface LocaleResolver {

//解析Lcoale

Locale resolveLocale(HttpServletRequest request);

//设置Locale

void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response,

@Nullable Locale locale);

LocaleContextResolver多了解析时区的功能

/**

* Extension of {@link LocaleResolver}, adding support for a rich locale context

* (potentially including locale and time zone information).

*/

public interface LocaleContextResolver extends LocaleResolver {

LocaleContext resolveLocaleContext(HttpServletRequest request);

void setLocaleContext(HttpServletRequest request,

@Nullable HttpServletResponse response,

@Nullable LocaleContext localeContext);

LocaleContext

public interface LocaleContext {

@Nullable

Locale getLocale();

}

在DispatchServlet配置新的LocaleContext

//每次请求都会解析配置新的LocaleContext

@Override

protected LocaleContext buildLocaleContext(final HttpServletRequest request) {

LocaleResolver lr = this.localeResolver;

//根据locale不同等级进行调用

if (lr instanceof LocaleContextResolver) {

return ((LocaleContextResolver) lr).resolveLocaleContext(request);

}

else {

//lumbda表达式返回一个类(重写了LcoaleContext的getLocale方法)

return () -> (lr != null ? lr.resolveLocale(request) : request.getLocale());

}

}

通过rend方法,使用response渲染

protected void render(ModelAndView mv, HttpServletRequest request,

HttpServletResponse response) throws Exception {

// Determine locale for request and apply it to the response.

Locale locale =

(this.localeResolver != null ?

this.localeResolver.resolveLocale(request) : request.getLocale());

response.setLocale(locale);//在response方法写出Locale

实现

/**

*自定义的LocaleReslover和Controller(可以根据URL设置Locale并且放在Session当中)

*/

public class ParamLocaleResolver implements LocaleResolver {

//Session域的键的名称

public static final String LOCALE_SESSION_ATTRIBUTE_NAME

= ParamLocaleResolver.class.getName() + ".LOCALE";

private String localeAttributeName = LOCALE_SESSION_ATTRIBUTE_NAME;

@Override

public Locale resolveLocale(HttpServletRequest request) {

//每次从Session当中获取,不需要重新创建。

Locale locale

= ((Locale) WebUtils.getSessionAttribute(request, localeAttributeName));

if (locale == null) {

//第一次将浏览器默认的locale写入Session

locale = request.getLocale();

WebUtils.setSessionAttribute(request, localeAttributeName, locale);

}

return locale;

}

@Override

public void setLocale(HttpServletRequest request,

HttpServletResponse response, Locale locale) {

if (locale != null) {

//重新写入Session当中

WebUtils.setSessionAttribute(request, localeAttributeName, locale);

}

}

}

@Controller

public class LocaleController {

@RequestMapping("/setLocal")

public String setLocale(HttpServletRequest request,

@Autowired ParamLocaleResolver resolver) {

//根据参数获取Locale

String param = request.getParameter("locale");

if (!StringUtils.isEmpty(param)) {

String[] split = param.split("_");

Locale locale = new Locale(split[0], split[1]);

//locale解析成功设置新的locale

resolver.setLocale(request, null, locale);

}

return "login";

}

}

配置

(

5d03fedf336c74557094c1e1d9ab4310.png

applications.properties

# 默认放在类路径下的 message.properties

#eg:classpath:/message/login.properties basename写为message.login (会将‘.’解析为 ‘/’)

spring.messages.basename=message

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值