當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot实现国际化
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot实现国际化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在嗶哩嗶哩一位up主視頻中學到的!
國際化
原理
通過Properties文件配置,配置完后通過Thymeleaf中的#{} 來取代原來的靜態資源。例如:
語言環境解析器接口
package org.springframework.web.servlet;import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.lang.Nullable;public interface LocaleResolver {//解析語言環境Locale resolveLocale(HttpServletRequest var1);void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3); }在SpringMvc自動配置類中語言環境解析器代碼如下
public class WebMvcAutoConfiguration {//**語言環境解析器**public LocaleResolver localeResolver() {if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {return new FixedLocaleResolver(this.mvcProperties.getLocale());} else { // AcceptHeaderLocaleResolver 默認的**語言環境解析器**AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();localeResolver.setDefaultLocale(this.mvcProperties.getLocale());return localeResolver;}} }默認使用的語言環境解析器
package org.springframework.web.servlet.i18n;import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.servlet.LocaleResolver;public class AcceptHeaderLocaleResolver implements LocaleResolver {private final List<Locale> supportedLocales = new ArrayList(4);@Nullableprivate Locale defaultLocale;public AcceptHeaderLocaleResolver() {}public void setSupportedLocales(List<Locale> locales) {this.supportedLocales.clear();this.supportedLocales.addAll(locales);}public List<Locale> getSupportedLocales() {return this.supportedLocales;}public void setDefaultLocale(@Nullable Locale defaultLocale) {this.defaultLocale = defaultLocale;}@Nullablepublic Locale getDefaultLocale() {return this.defaultLocale;}//!!!public Locale resolveLocale(HttpServletRequest request) {Locale defaultLocale = this.getDefaultLocale();if (defaultLocale != null && request.getHeader("Accept-Language") == null) {return defaultLocale;} else {Locale requestLocale = request.getLocale();List<Locale> supportedLocales = this.getSupportedLocales();if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);if (supportedLocale != null) {return supportedLocale;} else {return defaultLocale != null ? defaultLocale : requestLocale;}} else {return requestLocale;}}}@Nullableprivate Locale findSupportedLocale(HttpServletRequest request, List<Locale> supportedLocales) {Enumeration<Locale> requestLocales = request.getLocales();Locale languageMatch = null;Locale locale;label38:do {while(requestLocales.hasMoreElements()) {locale = (Locale)requestLocales.nextElement();if (supportedLocales.contains(locale)) {continue label38;}if (languageMatch == null) {Iterator var6 = supportedLocales.iterator();while(var6.hasNext()) {Locale candidate = (Locale)var6.next();if (!StringUtils.hasLength(candidate.getCountry()) && candidate.getLanguage().equals(locale.getLanguage())) {languageMatch = candidate;break;}}}}return languageMatch;} while(languageMatch != null && !languageMatch.getLanguage().equals(locale.getLanguage()));return locale;}//!!!public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {throw new UnsupportedOperationException("Cannot change HTTP accept header - use a different locale resolution strategy");} }自定義語言環境解析器
我們自定義語言環境解析器,然后在引入到WebMvc配置類中,來替代原有的語言環境解析器。
我們只需要實現LocaleResolver接口即可
/*** 自定義 語言環境解析器*/ public class MyLocaleResolver implements LocaleResolver {//解析請求@Overridepublic Locale resolveLocale(HttpServletRequest httpServletRequest) {//獲取請求中的語言參數Locale locale = null;final String language = httpServletRequest.getParameter("Language"); //例如 zh_CN en_USSystem.out.println("------->"+language);if(!StringUtils.isEmpty(language)){ // return target == null || target.length() == 0;final String[] s = language.split("_");// s[0]:國家 s[1]:地區locale = new Locale(s[0],s[1]);return locale;}locale = Locale.getDefault(); // 如果沒有請求參數就是默認的return locale;}@Overridepublic void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {} }將自定義的語言環境解析器,加入SpringMvc自動配置類中
在自動配置類中需要將自定義的MyLocaleResolver類取代WebMvcAutoConfiguration中對應的方法
/*** 定義一個WebMvcConfigurer 的實現類,可以重寫SpringMvc的配置* 在這個類中 定義的組件,然后將它交給springboot,springboot就會自動裝配*/ @Configuration public class MyMvcConfig implements WebMvcConfigurer {//自定義國際化組件 重寫了 WebMvcAutoConfiguration 類中的 localeResolver 方法 @Beanpublic LocaleResolver localeResolver(){return new MyLocaleResolver();}}效果圖展示
總結
以上是生活随笔為你收集整理的SpringBoot实现国际化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 存储png文件_vue图片上传
- 下一篇: IDEA中Spring Boot项目报错