基于Springboot实现Java Web项目的国际化
2019-10-09 本文已影响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
,效果如下:
由于我们在WebConfig中已经设置了默认的语言环境为简体中文,因此默认情况下和访问http://localhost:8090/index?lang=zh_CN
下过一致。
欧式英语
访问:http://localhost:8090/index?lang=en_US
,效果如下:
可以看到页面相应文案已经自动切换为英语了。
繁体中文
访问:http://localhost:8090/index?lang=zh_TW
,效果如下:
总结
在Java Web项目中实现国际化的主要步骤如上所述,希望对读者有用!