說明
本文旨在講解基于Springboot實現(xiàn)國際化的方法,對于前后端分離的架構(gòu)并不適用(因為前后端分離一般在前端實現(xiàn)國際化),用于Java后端初學(xué)者學(xué)習(xí)使用陕见。
環(huán)境
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
主要是配置服務(wù)器端口、國際化文件路徑、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="參數(shù)綁定型提交" onclick="login(1)">
</td>
<td>
<input type="button" value="容易造成SQL注入提交" onclick="login(2)">
</td>
</tr>
</table>
</form>
</body>
</html>
WebMvcConfig
用于配置國際化默認語言環(huán)境及利用攔截器攔截參數(shù)“l(fā)ang”從而達到隨時切換語言環(huán)境的目的:
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 {
/**
* 默認解析器 其中l(wèi)ocale表示默認語言
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return localeResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
/**
* 通過攔截lang參數(shù)切換語言環(huán)境
*/
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
響應(yīng)請求,跳轉(zhuǎn)頁面:
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
目錄下創(chuàng)建i18n
文件夾柔纵,并創(chuàng)建以下幾個文件:
messages.properties
#default 這個文件可以為空
messages_zh_CN.properties
中文環(huán)境文案:
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中已經(jīng)設(shè)置了默認的語言環(huán)境為簡體中文,因此默認情況下和訪問http://localhost:8090/index?lang=zh_CN
下過一致搁料。
歐式英語
訪問:http://localhost:8090/index?lang=en_US
或详,效果如下:
可以看到頁面相應(yīng)文案已經(jīng)自動切換為英語了。
繁體中文
訪問:http://localhost:8090/index?lang=zh_TW
郭计,效果如下:
總結(jié)
? 在Java Web項目中實現(xiàn)國際化的主要步驟如上所述霸琴,希望對讀者有用!