美文网首页
基于Springboot实现Java Web项目的国际化

基于Springboot实现Java Web项目的国际化

作者: 断翅绝尘 | 来源:发表于2019-10-09 15:45 被阅读0次

    说明

    本文旨在讲解基于Springboot实现国际化的方法,对于前后端分离的架构并不适用(因为前后端分离一般在前端实现国际化),用于Java后端初学者学习使用。

    环境

    Springboot:2.1.5.RELEASE

    Jdk:1.8.0_211

    pom.xml

    引入web和freemarker的starter包即可:

    <?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 http://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.1.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.yuhuan</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-freemarker</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    application.yml

    主要是配置服务器端口、国际化文件路径、freemarker视图文件路径及后缀配置:

    server:
      port: 8090
    spring:
      messages:
        basename: static/i18n/messages
      freemarker:
        request-context-attribute: req
        suffix: .html
        content-type: text/html
        enabled: true
        cache: false
        template-loader-path: classpath:/templates/
        charset: UTF-8
    

    login.html

    示例页面,用于展示国际化效果:

    <!DOCTYPE html>
    <head>
        <title>demo</title>
    </head>
    <body>
    <form id="loginForm">
        <input id="type" type="hidden" name="type" value="1">
        <table>
            <tr>
                <td>${username}:</td>
                <td><input id="userName" name="userName" title="userName"></td>
            </tr>
            <tr>
                <td>${password}:</td>
                <td><input id="password" type="password" name="password" title="password">              </td>
            </tr>
            <tr>
                <td>
                    <input type="button" value="参数绑定型提交" onclick="login(1)">
                </td>
                <td>
                    <input type="button" value="容易造成SQL注入提交" onclick="login(2)">
                </td>
            </tr>
        </table>
    </form>
    </body>
    </html>
    

    WebMvcConfig

    用于配置国际化默认语言环境及利用拦截器拦截参数“lang”从而达到随时切换语言环境的目的:

    package com.yuhuan.demo.config;
    
    import com.yuhuan.demo.common.GlobalConstants;
    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.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
    import org.springframework.web.servlet.i18n.SessionLocaleResolver;
    
    import java.util.Locale;
    
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
        /**
         * 默认解析器 其中locale表示默认语言
         */
        @Bean
        public LocaleResolver localeResolver() {
            SessionLocaleResolver localeResolver = new SessionLocaleResolver();
            localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
            return localeResolver;
        }
    
        @Bean
        public LocaleChangeInterceptor localeChangeInterceptor() {
            LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
            /**
            * 通过拦截lang参数切换语言环境
            */
            lci.setParamName("lang");
            return lci;
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(localeChangeInterceptor());
        }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); 
        }
    }
    

    UserController

    响应请求,跳转页面:

    package com.yuhuan.demo.controller;
    
    import com.yuhuan.demo.common.ResultData;
    import com.yuhuan.demo.entity.User;
    import com.yuhuan.demo.service.UserService;
    import com.yuhuan.demo.service.I18nService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @RequestMapping("/")
    public class UserController {
    
        private static final Logger LOG = LoggerFactory.getLogger(UserController.class);
    
        @Autowired
        private I18nService i18nService;
    
        @RequestMapping("/index")
        public String login(Model model){
            model.addAttribute("username", i18nService.get("login.username"));
            model.addAttribute("password", i18nService.get("login.password"));
            return "login";
        }
    
    }
    

    国际化描述文件

    \demo\src\main\resources\static目录下创建i18n文件夹,并创建以下几个文件:

    messages.properties

    #default 这个文件可以为空
    

    messages_zh_CN.properties

    中文环境文案:

    login.username=用户名
    login.password=密码
    

    messages_en_US.properties

    欧式英语文案:

    login.username=username
    login.password=password
    

    messages_zh_TW.properties

    繁体中文文案:

    login.username=用戶名
    login.password=密碼
    
    

    效果

    默认效果

    访问:http://localhost:8090/index,效果如下:

    1560941225792.png

    ​ 由于我们在WebConfig中已经设置了默认的语言环境为简体中文,因此默认情况下和访问http://localhost:8090/index?lang=zh_CN下过一致。

    欧式英语

    访问:http://localhost:8090/index?lang=en_US,效果如下:

    1560941416780.png

    可以看到页面相应文案已经自动切换为英语了。

    繁体中文

    访问:http://localhost:8090/index?lang=zh_TW,效果如下:

    1560941529939.png

    总结

    ​ 在Java Web项目中实现国际化的主要步骤如上所述,希望对读者有用!

    相关文章

      网友评论

          本文标题:基于Springboot实现Java Web项目的国际化

          本文链接:https://www.haomeiwen.com/subject/kgjgpctx.html