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";
    }
}

配置

(

applications.properties

# 默認放在類路徑下的 message.properties
#eg:classpath:/message/login.properties basename寫為message.login (會將‘.’解析為 ‘/’)
spring.messages.basename=message


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM