基于Springboot實現(xiàn)Java Web項目的國際化

說明

本文旨在講解基于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缔杉,效果如下:

1560941225792.png

? 由于我們在WebConfig中已經(jīng)設(shè)置了默認的語言環(huán)境為簡體中文,因此默認情況下和訪問http://localhost:8090/index?lang=zh_CN下過一致搁料。

歐式英語

訪問:http://localhost:8090/index?lang=en_US或详,效果如下:

1560941416780.png

可以看到頁面相應(yīng)文案已經(jīng)自動切換為英語了。

繁體中文

訪問:http://localhost:8090/index?lang=zh_TW郭计,效果如下:

1560941529939.png

總結(jié)

? 在Java Web項目中實現(xiàn)國際化的主要步驟如上所述霸琴,希望對讀者有用!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昭伸,一起剝皮案震驚了整個濱河市梧乘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庐杨,老刑警劉巖选调,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灵份,居然都是意外死亡仁堪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門填渠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弦聂,“玉大人,你說我怎么就攤上這事揭蜒『峄耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵屉更,是天一觀的道長徙融。 經(jīng)常有香客問我,道長瑰谜,這世上最難降的妖魔是什么欺冀? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任树绩,我火速辦了婚禮,結(jié)果婚禮上隐轩,老公的妹妹穿的比我還像新娘涩咖。我一直安慰自己蘸炸,他們只是感情好邻邮,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布济榨。 她就那樣靜靜地躺著,像睡著了一般悴灵。 火紅的嫁衣襯著肌膚如雪扛芽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天积瞒,我揣著相機與錄音川尖,去河邊找鬼。 笑死茫孔,一個胖子當(dāng)著我的面吹牛叮喳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缰贝,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼馍悟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剩晴?” 一聲冷哼從身側(cè)響起赋朦,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎李破,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壹将,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡嗤攻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诽俯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妇菱。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暴区,靈堂內(nèi)的尸體忽然破棺而出闯团,到底是詐尸還是另有隱情,我是刑警寧澤仙粱,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布房交,位于F島的核電站,受9級特大地震影響伐割,放射性物質(zhì)發(fā)生泄漏候味。R本人自食惡果不足惜刃唤,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望白群。 院中可真熱鬧尚胞,春花似錦、人聲如沸帜慢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粱玲。三九已至躬柬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間密幔,已是汗流浹背楔脯。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胯甩,地道東北人昧廷。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像偎箫,于是被迫代替她去往敵國和親木柬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容