Spring Boot 国际化(i18n)

  • 国际化

    国际化是一个过程,可以使您的应用程序适应不同的语言和地区,而无需在源代码上进行工程更改。换句话说,国际化是本地化的准备。在本章中,我们将详细学习如何在Spring Boot中实现国际化。
  • 依赖关系

    我们需要Spring Boot Starter Web和Spring Boot Starter Thymeleaf依赖性来在Spring Boot中开发Web应用程序。
    Maven - 配置依赖
    
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
    Gradle - 配置依赖
    
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    
  • LocaleResolver

    我们需要确定您的应用程序的默认语言环境。我们需要在我们的Spring Boot应用程序中添加LocaleResolver bean。
    
    @Bean
    public LocaleResolver localeResolver() {
       SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
       sessionLocaleResolver.setDefaultLocale(Locale.US);
       return sessionLocaleResolver;
    }
    
  • LocaleChangeInterceptor

    LocaleChangeInterceptor用于根据添加到请求中的language参数的值来更改新的Locale。
    
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
       LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
       localeChangeInterceptor.setParamName("language");
       return localeChangeInterceptor;
    }
    
    为了实现此效果,我们需要将LocaleChangeInterceptor添加到应用程序的注册表拦截器中。配置类应继承WebMvcConfigurerAdapter类,并重写addInterceptors()方法。
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(localeChangeInterceptor());
    }
    
  • 消息来源

    默认情况下,Spring Boot应用程序从类路径下的src/main/resources文件夹中获取消息源。默认语言环境消息文件名应为message.properties,每个语言环境的文件应命名为messages_XX.properties。“XX”代表语言环境代码。 所有消息属性都应用作键值对。如果在语言环境中找不到任何属性,则应用程序将使用messages.properties文件中的默认属性。
    默认的messages.properties将如下所示
    
    welcome.text=Hi Welcome to Everyone
    
    法语的messages_fr.properties将如下所示-
    
    welcome.text=Salut Bienvenue à tous
    
    注意 - 消息源文件应另存为“UTF-8”文件格式。
  • HTML文件

    在HTML文件中,使用语法#{key}显示来自属性文件的消息。
    
    <h1 th:text = "#{welcome.text}"></h1>
    
  • 完整代码

    完整的代码如下
    Maven – pom.xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.0.BUILD-SNAPSHOT</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.jc2182</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </pluginRepository>
            <pluginRepository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    
    </project>
    
    Gradle – build.gradle
    
    plugins {
        id 'org.springframework.boot' version '2.3.0.BUILD-SNAPSHOT'
        id 'io.spring.dependency-management' version '1.0.9.RELEASE'
        id 'java'
    }
    
    group = 'com.jc2182'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    repositories {
        mavenCentral()
        maven { url 'https://repo.spring.io/milestone' }
        maven { url 'https://repo.spring.io/snapshot' }
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
    }
    
    test {
        useJUnitPlatform()
    }
    
    下面给出了主要的Spring Boot DemoApplication类文件-
    
    package com.jc2182.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }
    
    控制器类文件如下-
    
    package com.jc2182.demo.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class ViewController {
       @RequestMapping("/locale")
       public String locale() {
          return "locale";
       }
    }
    
    支持国际化的配置类-
    
    package com.jc2182.demo;
    
    import java.util.Locale;
    
    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.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
    import org.springframework.web.servlet.i18n.SessionLocaleResolver;
    
    @Configuration
    public class Internationalization extends WebMvcConfigurerAdapter {
       @Bean
       public LocaleResolver localeResolver() {
          SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
          sessionLocaleResolver.setDefaultLocale(Locale.US);
          return sessionLocaleResolver;
       }
       @Bean
       public LocaleChangeInterceptor localeChangeInterceptor() {
          LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
          localeChangeInterceptor.setParamName("language");
          return localeChangeInterceptor;
       }
       @Override
       public void addInterceptors(InterceptorRegistry registry) {
          registry.addInterceptor(localeChangeInterceptor());
       }
    }
    
    消息源– messages.properties如下所示-
    
    welcome.text = Hi Welcome to Everyone
    
    消息源– message_fr.properties如下所示-
    
    welcome.text = Salut Bienvenue à tous
    
    HTML文件locale.html应该放置在类路径的模板目录下,如下所示:
    
    <!DOCTYPE html>
    <html>
       <head>
          <meta charset = "ISO-8859-1"/>
          <title>Internationalization</title>
       </head>
       <body>
          <h1 th:text = "#{welcome.text}"></h1>
       </body>
    </html>
    
    您可以创建一个可执行的JAR文件,并使用以下Maven或Gradle命令运行Spring Boot应用程序-
    对于Maven,请使用以下命令
    
    mvn clean install
    
    在“BUILD SUCCESS”之后,您可以在target目录下找到JAR文件。
    对于Gradle,请使用以下命令-
    
    gradle clean build
    
    在“BUILD SUCCESSFUL”之后,您可以在build/libs目录下找到JAR文件。
    现在,使用如下所示的命令运行JAR文件:
    
    java –jar <JARFILE>
    
    您会发现该应用程序已在Tomcat端口8080上启动。
    现在在您的Web浏览器中访问URL http://localhost:8080/locale,您可以看到以下输出-
    i18n
    URL - http://localhost:8080/locale?language=fr 将为您提供输出,如下所示:
    i18n