SpringBoot - Internacionalización

  A veces, nuestro sitio web implicará cambiar entre chino e inglés o incluso varios idiomas. En este momento, ¡necesitamos aprender a internacionalizarnos!

1 Preparaciones

¡Primero establezca el problema de codificación de las propiedades de manera uniforme en IDEA!

imagen

  Escriba un archivo de configuración de internacionalización y extraiga los mensajes de la página internacionalizada que la página necesita mostrar. ¡Podemos ir a la página de inicio de sesión para ver qué contenido necesitamos para escribir la configuración internacionalizada!

2 Escritura del archivo de configuración

2.1 Creamos un nuevo directorio i18n en el archivo de recursos de recursos para almacenar el archivo de configuración de internacionalización

2.2 Cree un archivo login.properties y un login_zh_CN.properties; encontré que IDEA reconoció automáticamente que necesitamos internacionalizarnos; ¡la carpeta ha cambiado!

imagen

2.3 Podemos crear un nuevo archivo en él;

imagen

Aparece la siguiente página: Agreguemos otra en inglés;

imagen

¡Esto es mucho más rápido!

imagen

2.4 A continuación, escribamos la configuración, podemos ver que hay otra vista debajo de la idea;

imagen

  En esta vista, podemos agregar atributos directamente haciendo clic en el signo +, creamos un nuevo login.tip, y podemos ver que hay tres cuadros de archivo en el lado que se pueden ingresar

imagen

¡Agreguemos el contenido de la página de inicio!

imagen

¡Luego agregue otro contenido de la página a su vez!

imagen

Luego vaya a ver nuestro archivo de configuración;

inicio de sesión.propiedades: predeterminado

login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名

Inglés:

login.btn=Sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=Username

Chino:

login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名

Bien, ¡los pasos del archivo de configuración están listos!

3 Exploración del archivo de configuración surtiendo efecto

  ¡Echemos un vistazo a la configuración automática de internacionalización de SpringBoot! Aquí hay otra clase involucrada: MessageSourceAutoConfiguration

  Hay un método en él, y aquí se encuentra que SpringBoot ha configurado automáticamente el componente ResourceBundleMessageSource que administra nuestros archivos de recursos internacionalizados;

// 获取 properties 传递过来的值进行判断
@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;
}

  Nuestra situación real está ubicada en el directorio i18n, por lo que debemos configurar la ruta de estos mensajes;

spring.messages.basename=i18n.login

4 Configurar los valores de internacionalización de la página

  Vaya a la página para obtener el valor internacionalizado, consulte la documentación de Thymeleaf y encuentre que la operación del valor del mensaje es: #{…}. Vamos a la página para probar:

¡IDEA también tiene consejos, que son muy inteligentes!

imagen

¡Podemos ir a iniciar el proyecto, visitarlo y encontrar que ha sido reconocido automáticamente como chino!

imagen

¡Pero queremos algo mejor! ¡Puede cambiar automáticamente entre chino e inglés según el botón!

5 Configurar análisis de internacionalización

  Hay un Locale internacionalizado (objeto de información regional) en Spring; ¡hay un resolver llamado LocaleResolver (obtener objeto de información local)!

  ¡Vamos a nuestro archivo de configuración automática webmvc y busquémoslo! Consulte la configuración predeterminada de SpringBoot:

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
    
    
    // 容器中没有就自己配,有的话就用用户配置的
    if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
    
    
        return new FixedLocaleResolver(this.mvcProperties.getLocale());
    }
    // 接收头国际化分解
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
    return localeResolver;
}

Hay un método en AcceptHeaderLocaleResolver en esta clase

public Locale resolveLocale(HttpServletRequest request) {
    
    
    Locale defaultLocale = this.getDefaultLocale();
    // 默认的就是根据请求头带来的区域信息获取Locale进行国际化
    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;
        }
    }
}

  Entonces, si ahora queremos hacer clic en el enlace para que nuestros recursos internacionales surtan efecto, ¡necesitamos hacer que nuestro propio Locale surta efecto!

  ¡Vamos a escribir nuestro propio LocaleResolver que puede llevar información local en el enlace!

Modifique el enlace de salto de la página frontal:

<!-- 这里传入参数不需要使用 ?使用 (key=value)-->
<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>

¡Vamos a escribir una clase de componente que lo maneje!

package com.kuang.component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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 httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    
    
    }
}

  Para que nuestra información de regionalización surta efecto, ¡necesitamos configurar este componente nuevamente! Agregue frijoles bajo nuestro propio MvcConofig;

@Bean
public LocaleResolver localeResolver(){
    
    
    return new MyLocaleResolver();
}

Supongo que te gusta

Origin blog.csdn.net/qq_41355222/article/details/123965955
Recomendado
Clasificación