springboot の国際化も spring mvc に基づいています。
Springboot の国際メッセージのサポート - つまり、ブラウザーで選択された言語に従って、プロジェクトに関するいくつかのプロンプト情報が言語の選択に応じて表示されます。
国有化の自動構成を要約すると、
機能の実現は次のとおりです。
たとえば、ログイン ページでブラウザの言語を中国語に選択すると、ログイン ページ上のすべてのプロンプト メッセージが中国語になります。
ブラウザの言語が英語の場合、ログイン ページのプロンプト メッセージはすべて英語になります。
これらのプロンプトはプロパティ構成ファイルに書き込まれます。
★ 国際化の自動設定
Spring Boot は、国際化自動構成用の MessageSourceProperties クラスを提供します。このクラスは、国際化に関連する構成プロパティの読み取りを担当します。
Spring Boot の自動構成は、指定されたベース名を持つデフォルトの国際化リソース ファイル (言語や国に依存しない国際化リソース) が存在する場合にのみ有効になります。たとえば、 spring.messages.basename=mess を設定します。
つまり、
appMess_zh_CN.properties (簡体字中国語リソース ファイル)
および
appMess_en_US.properties (アメリカ英語リソース ファイル)、
国際化の自動構成は有効になりません。
デフォルトの appMess.properties ファイルが提供された場合にのみ有効になります。
コードのデモ:
デフォルトを有効にするには必要があります。
★ 国際化へのステップ
(1) 国際リソース ファイルの書き込み:basename_言語コード_国コード.properties
(2) 構成プロパティを使用して、国際化されたリソース ファイルをロードします。
Spring Boot は、簡単な構成で国際化されたリソース ファイルを読み込むことができます。
# 加载国际化资源文件
spring.messages.basename=login_mess
# 设置使用国际化消息的key作为默认消息
spring.messages.use-code-as-default-message=true
# 设置读取国际化消息的字符集是UTF-8
spring.messages.encoding=UTF-8
(3) キーに応じて国際化メッセージを出力する
2 つの状況に分けられます。
▲ 在Java组件(如控制器等)中,直接使用容器内的MessageSource Bean(Spring Boot自动配置)
的getMessage()方法获取国际化消息。
▲ 在页面模板中,使用标签或表达式输出国际化消息。比如在Thymeleaf模板中,
直接使用#{key}即可输出指定key对应的国际化消息。
【对比】,要输出表达式的值,使用${}。
【注意】:如果使用devtools来打包Spring Boot项目,最好将*.properties文件设为UTF-8字符集。
コードデモ
要件: 設定ファイルの中国語版と英語版を作成します。これにより、ブラウザーが中国語または英語を選択したときに、それに応じて切り替えることができます。
今は何も設定されていないので、元の状況を見てみましょう。
プロジェクトを作成し、インデックス ログイン ページを追加するだけで、他には何も必要ありません。
次に、通常の言語を確認します。これはデフォルトの中国語でもあります。ということで、このように表示されます。
<h4 th:text="#{login_title}">首页</h4>
不理解为什么当 login_title 没值的时候,不是显示 “首页” 两个字
ページ出力国際化情報のコード:
1. ログイン ページを追加します。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>国际化</title>
<!-- 引入css样式,用 link 元素 , stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
<!-- 引入 Bootstrap 的 Web Jar 中的 CSS 样式 -->
<link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
<!-- jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery -->
<!-- 引入 jQuery 的 Web Jar 中的 js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
<!-- 引入 Bootstrap 的 Web Jar 中的 js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
<!-- 引入 popper 的 Web Jar 中的 Js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>
</head>
<body>
<div class="container">
<h4 th:text="#{login_title}">首页</h4>
<div class="text-danger" th:if="${tip != null}" th:text="${tip}"></div>
<form method="post" th:action="@{/login}">
<div class="form-group row">
<label for="username" class="col-sm-3 col-form-label"
th:text="#{name_label}">用户名</label>
<div class="col-sm-9">
<input type="text" id="username" name="username"
class="form-control" th:placeholder="#{'name_hint'}">
</div>
</div>
<div class="form-group row">
<label for="pass" class="col-sm-3 col-form-label"
th:text="#{password_label}">密码</label>
<div class="col-sm-9">
<input type="password" id="pass" name="pass"
class="form-control" th:placeholder="#{'password_hint'}">
</div>
</div>
<div class="form-group row">
<div class="col-sm-6 text-right">
<button type="submit" class="btn btn-primary"
th:text="#{login_btn}">登录</button>
</div>
<div class="col-sm-6">
<button type="reset" class="btn btn-danger"
th:text="#{reset_btn}">重设</button>
</div>
</div>
</form>
</div>
</body>
</html>
2.
国際リソース ファイルを作成します: Basename_言語コード_国コード.properties
3. 構成プロパティを使用して、国際化されたリソース ファイルをロードします。
Spring Boot は、簡単な構成で国際化されたリソース ファイルを読み込むことができます。
これらをロードするように設定するには
#加载国际化资源文件
spring.messages.basename=appMess
#设置使用国际化消息的key作为默认消息
spring.messages.use-code-as-default-message=true
#设置读取国际化消息的字符集是 UTF-8
spring.messages.encoding=UTF-8
#设置消息的缓存时间--单位是秒
spring.messages.cache-duration=7200
これらの属性は、構成クラスで対応する値をすでに取得できることがわかります。
テスト:
ブラウザーで言語を切り替えると、これらのページには対応するテキストが表示されます。これはカスタマイズされたテキストです。
国際化情報を出力するコントローラーのコードは次のとおりです。
ログインのユーザー名とパスワードを取得して、ログインの成功または失敗のメッセージを返すコントローラーとドメインを記述します。
返されるメッセージは国際化されたメッセージです。私が実現したいのは、ブラウザのデフォルト言語を英語に変更すると、コードの表示とメッセージも英語になることです。
ログインの成功と失敗に対する国際的なプロンプト メッセージを構成および追加する
フロントエンド値の # 記号と $ 記号。
完全なコード:
アプリケーションのプロパティ
#加载国际化资源文件
spring.messages.basename=appMess
#设置使用国际化消息的key作为默认消息
spring.messages.use-code-as-default-message=true
#设置读取国际化消息的字符集是 UTF-8
spring.messages.encoding=UTF-8
#设置消息的缓存时间--单位是秒
spring.messages.cache-duration=7200
appMess.properties
この設定には何も書き込む必要はありません。これはデフォルトですが、国際メッセージング機能を有効にするには設定が必要です。
appMess_zh_CN.properties
login_title=登录页面
name_label=用户名
name_hint=请输入用户名
password_label=密码
password_hint=请输入密码
login_btn=登录
reset_btn=重设
#{
0} 占位符
welcome={
0}, 欢迎登录学习
failure=用户名和密码不匹配
appMess_en_US.properties
login_title=Login Page
name_label=User Name
name_hint=Please input User Name
password_label=Password
password_hint=Please input Password
login_btn=Login
reset_btn=Reset
#{
0} 占位符
welcome={
0}, Welcome to study
failure=sorry,password and username not matched
インデックス.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>国际化</title>
<!-- 引入css样式,用 link 元素 , stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
<!-- 引入 Bootstrap 的 Web Jar 中的 CSS 样式 -->
<link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
<!-- jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery -->
<!-- 引入 jQuery 的 Web Jar 中的 js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
<!-- 引入 Bootstrap 的 Web Jar 中的 js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
<!-- 引入 popper 的 Web Jar 中的 Js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>
</head>
<body>
<div class="container">
<h4 th:text="#{login_title}">首页</h4>
<div class="text-danger" th:if="${tip != null}" th:text="${tip}"></div>
<form method="post" th:action="@{/login}">
<div class="form-group row">
<label for="username" class="col-sm-3 col-form-label"
th:text="#{name_label}">用户名</label>
<div class="col-sm-9">
<input type="text" id="username" name="username"
class="form-control" th:placeholder="#{'name_hint'}">
</div>
</div>
<div class="form-group row">
<label for="password" class="col-sm-3 col-form-label"
th:text="#{password_label}">密码</label>
<div class="col-sm-9">
<input type="password" id="password" name="password"
class="form-control" th:placeholder="#{'password_hint'}">
</div>
</div>
<div class="form-group row">
<div class="col-sm-6 text-right">
<button type="submit" class="btn btn-primary"
th:text="#{login_btn}">登录</button>
</div>
<div class="col-sm-6">
<button type="reset" class="btn btn-danger"
th:text="#{reset_btn}">重设</button>
</div>
</div>
</form>
</div>
</body>
</html>
成功.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录成功</title>
<!-- 引入css样式,用 link 元素 , stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
<!-- 引入 Bootstrap 的 Web Jar 中的 CSS 样式 -->
<link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">
<!-- jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery -->
<!-- 引入 jQuery 的 Web Jar 中的 js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>
<!-- 引入 Bootstrap 的 Web Jar 中的 js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>
<!-- 引入 popper 的 Web Jar 中的 Js 脚本 -->
<script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>
</head>
<body>
<div class="container">
<h4 th:text="${tip}">tip</h4>
</div>
</body>
</html>
ログインコントローラー
package cn.ljh.i18n.controller;
import cn.ljh.i18n.domain.User;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.Locale;
@Controller
public class LoginController
{
//依赖注入容器中自动配置 MessageSource Bean , 用于访问国际化信息
private MessageSource messageSource;
//构造器注入的方式
public LoginController(MessageSource messageSource)
{
this.messageSource = messageSource;
}
@PostMapping("/login")
public String proLogin(User user , Model model , Locale locale)
{
if (user.getUsername().equals("ljh") && user.getPassword().equals("123456"))
{
//要添加国际化的提示信息
//参数1:key 参数2:占位符 参数3:要确定国家地区和语言,用locale这个参数,springboot会自动揣摩
model.addAttribute("tip",
messageSource.getMessage("welcome" , new String[]{
user.getUsername()} , locale));
return "success";
}
//参数2:不需要占位符,直接给个 null 就行
model.addAttribute("tip",
messageSource.getMessage("failure" , null , locale));
return "index";
}
}
ユーザー
@Data
public class User
{
private Integer id;
private String username;
private String password;
}