2020 年 6 月 3 日

IT Skills 波林

Polin WEI – 資訊工作者的技術手札

Spring Boot 多語系設置(國際化)

1 min read
Ice Tea

Spring Boot 多語系設置(國際化 Internationalization )

 

 

Spring Boot 支援多語系(國際化)的網頁顯示,這在國際化的軟體或公司是必需具備的,要達成這個功能只需要簡單的幾個步驟即可以達到。在 Spring Boot 在 Eclipse 的安裝與設定 最後中,有建議安裝 ResourceBundle Editor 的插件,在此也會用到,不妨先安裝於 Eclipse 中。

  • LocaleResolver

為了讓應用程式能夠確定當前正在使用的語言環境,需要在 class: WebMvcConfig 中添加一個 @Bean(name = "localeResolver") ,記得要設定 name = "localeResolver",不然會出現HTTP Status 500 – Internal Server Error 的錯誤訊息。

/**
 * 多語系設定   
 * @return
 */   
@Bean(name = "localeResolver")
public LocaleResolver getLocaleResolver()  {
 CookieLocaleResolver cookieLocaleResolver= new CookieLocaleResolver();           
 cookieLocaleResolver.setCookieHttpOnly(true);
 cookieLocaleResolver.setDefaultLocale(Locale.US);
 cookieLocaleResolver.setCookieName("appsLocaleCookie");
 cookieLocaleResolver.setCookieMaxAge(60*60); 
 return cookieLocaleResolver;
}

這裡是使用 CookieLocaleResolver ,所以會在用戶端的電腦建立一個 Cookie 的檔案來存放 appsLocaleCookie 的值,若不想要這麼作,那可以用 SessionLocaleResolver ,如下:

@Bean(name = "localeResolver")
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.US);
    return slr;
}

 

  • 建立 LocaleChangeInterceptor

接下來,需要添加一個攔截器的 bean,該 bean 將根據 Cookie 或 Session 中的 locale 的值切換到新的語系,注意:在 org.springframework.web.servlet.i18n.LocaleChangeInterceptor 預設 paramName 值是 “locale”,也可以變更別的參數名,例如下列程式碼中的 lci.setParamName("lang");

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName("lang");
    return lci;
}

若不想變更,那就如下,直接回傳即可。

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
 return new LocaleChangeInterceptor();
}

 

  • 啟用 LocaleChangeInterceptor

為了讓這個bean 的攔截器被 Spring Boot 啟用,需要被添加到攔截器註冊表中。

/**
 * 加入 Interceptor 多語系設定 語系切換偵測
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(localeChangeInterceptor());
}

 

  • 建立多語系檔案:messages.properties

在 src/main/resources 中,建立 messages.properties, messages_zh_TW.properties, messages_en_US.properties 三個檔,這裡以 menu.systemManage 作示範。

spring-boot-multi-lang

 

  • 在網頁上建立切換語系連結

因為是在 Freemarker 的模版引擎,所以要在第1,2行先將 spring.ftl 引入,就可以使用 ${springMacroRequestContext.getRequestUri()}?locale=zh_TW 來針對當前的頁面作語系切換了。

<#import "/spring.ftl" as spring/>
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />

  <li class="nav-item dropdown">
 <a id="dropdownSubMenu1" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="nav-link dropdown-toggle">語系</a>
 <ul aria-labelledby="dropdownSubMenu1" class="dropdown-menu border-0 shadow">          
   <li class="nav-item"><!-- start language list -->
  <a  class="nav-link" href='${springMacroRequestContext.getRequestUri()}?locale=zh_TW'><i class="flag-icon flag-icon-tw text-aqua"></i> Chinese </a>
   </li>
   <li class="nav-item">
  <a  class="nav-link" href="${springMacroRequestContext.getRequestUri()}?locale=en_US"><i class="flag-icon flag-icon-us text-aqua"></i> 英文  </a>
   </li>
   <!-- end language list -->
 </ul>
  </li>

 

這樣就可以正常作業了。

 

參考:

https://www.baeldung.com/spring-boot-internationalization

https://ethendev.github.io/2017/10/15/SpringBoot-internationalization/

 

Copyright © All rights reserved. | Newsphere by AF themes.