SpringBoot國際化


國際化的基本原理

在spring程序中,國際化主要是通過ResourceBundleMessageSource這個類來實現的

springBoot通過MessageSourceAutoConfiguration為我們自動配置好了管理國際化資源文件的組件

	@Bean
	public MessageSource messageSource(MessageSourceProperties properties) {
		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		if (StringUtils.hasText(properties.getBasename())) {
			messageSource.setBasenames(StringUtils
					.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
		}
		if (properties.getEncoding() != null) {
			messageSource.setDefaultEncoding(properties.getEncoding().name());
		}
		messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
		Duration cacheDuration = properties.getCacheDuration();
		if (cacheDuration != null) {
			messageSource.setCacheMillis(cacheDuration.toMillis());
		}
		messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
		messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
		return messageSource;
	}

點擊查看MessageSourceProperties

MessageSourceProperties properties

發現basename默認為message

public class MessageSourceProperties {

	private String basename = "messages";

我們需要直接配置語言格式
在resources文件夾中新建一個i18n文件夾
image
login.properties

login.btn=登錄
login.password=密碼
login.remember=記住我
login.tip=請登錄
login.username=用戶名

login_en_US.properties

login.btn=sign in
login.password=password
login.remember=RememberMe
login.tip=Please sign in
login.username=username

login_zh_CN.properties

login.btn=登錄
login.password=密碼
login.remember=記住我
login.tip=請登錄
login.username=用戶名

在application.properties配置文件中配置basename

spring.messages.basename=i18n.login

上面說了國際化支持主要是通過ResourceBundleMessageSource實現的,這里對它做出實例化操作

ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		if (StringUtils.hasText(properties.getBasename())) {
			messageSource.setBasenames(StringUtils
					.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
		}

我們到現在配置好了我們自己編寫的不同語言配置文件,接下來我們要做的是怎么切換成我們需要的語言版本

國際化語言的切換主要是因為有一個區域信息解析器在其作用(會根據locale返回的國家和語言就像:zh_CN,來判定執行哪個配置文件)

@Override
@Bean
@ConditionalOnMissingBean(name = DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME)
public LocaleResolver localeResolver() {
	if (this.webProperties.getLocaleResolver() == WebProperties.LocaleResolver.FIXED) {
	return new FixedLocaleResolver(this.webProperties.getLocale());
}
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
	localeResolver.setDefaultLocale(this.webProperties.getLocale());
	return localeResolver;
	}

如果我們配置了LocaleResolver,那默認的LocalResolver就會失效,否則就使用spring默認的
我們編寫一個localeResolver類去重寫LocaleResolver的方法(注意類的名字一定要為localeResolver,源碼中有定義)
image

那就等於我們自己有自己的LocaleResolver,spring只會執行我們的方法
在配置類中編寫自己的LocaleResolver

package com.Google.config;

import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.stream.Location;
import java.util.Locale;

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String language = request.getParameter("l");
        Locale locale = Locale.getDefault();//如果沒有獲取到就使用默認的
        //如果請求不為空
        if(!StringUtils.isEmpty(language)){
            String[] split = language.split("_");
            //語言,國家
            locale=new Locale(split[0],split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

配置到Spring中,讓Spring托管

package com.Google.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override//默認頁面為首頁
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }

    @Bean//注冊國際化組件
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
}


免責聲明!

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



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