トッカンソフトウェア

国際化メッセージ

Jsp、Servletではブラウザ(クライアント)の設定情報より言語を判断し、言語毎のメッセージやラベルを出力することができます。
Javaプログラムとは別にメッセージ用のファイルを言語毎に用意し、Serveltがブラウザの設定言語を判断し、適切な言語のメッセージを出力します。


TestR.java
				
package servlet.test;

import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ResourceTest")
public class TestR extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Locale locale = request.getLocale();

		ResourceBundle bundle1 = ResourceBundle.getBundle("servlet.test.msg", locale);

		String t1 = bundle1.getString("test1");
		String t2 = bundle1.getString("test2");

		request.setCharacterEncoding("UTF8");
		response.setContentType("text/html; charset=UTF8");
		response.getWriter().append(t1).append(":").append(t2);
	}
}


			
msg.properties
				
test1=TEST1
test2=TEST2


			
msg_ja.properties
				
test1=てすと


			
msg_en.properties
				
test1=testEN


			
Eclipseのフォルダ構成 (メッセージファイルは以下の場所か、クラスパスが通っている場所に置いて下さい。)


実行イメージ

メッセージ取得処理について

以下の順で処理を行います。
  1. HttpServletRequestのgetLocale()メソッドよりロケールを取得
  2. ResourceBundleのgetBundle()メソッドよりメッセージファイルを取得
  3. ResourceBundleオブジェクトのgetString()メソッドで該当のメッセージを取得

ResourceBundleのgetBundle()の第一引数ではメッセージファイルを指定するのですが、Javaのクラスと同じように

パッケージ(ファイルの場所。メッセージファイル内にパッケージ宣言は必要ありません) + 拡張子抜きのメッセージファイル名

を指定します。今回はJava(class)ファイルと同じ場所に置いたので、パッケージのパスと同じです。

メッセージファイルについて

メッセージファイルの拡張子は.propertiesとします。拡張子の前にアンダーバー + 言語情報をつけます。

メッセージファイル名 + _ + 言語情報 + 拡張子(.properties)
例:msg_ja.properties

言語情報は以下になります。
言語 付加する文字列
日本語 ja msg_ja.properties
英語 en msg_en.properties
中国語 zh msg_zh.properties


メッセージファイル内は キー=文字列 のように記述します
				
Javaの指定コード=表示する文字列


			

Google Chromeで動作確認

Google Chromeの設定を変更して動作確認してみます。

まず設定画面を開きます。



「詳細を表示...」より詳細情報を表示して「言語と入力の設定...」ボタンを押します。


日本語が一番上にあったらドラッグして一番下に移動させ、完了ボタンを押します。


再表示をすると別のロケール(英語)でメッセージが表示されます。

Jspでメッセージ取得

JspでResourceBundleを使用する場合も、Servletと同じように使用できます。
				
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	java.util.Locale locale = request.getLocale();
	java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("servlet.test.msg", locale);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
	<%=bundle.getString("test1")%>
</body>
</html>


			

プロジェクトフォルダ外のファイルをキャッシュ時間を指定して読み込む

デフォルトではResourceBundleではプロパティファイルを一度読み込んだらキャッシュされプロパティファイルを再読込されることがないのですが、指定時間で再読込させるようにできます。

また通常はプロパティファイルをプロジェクトフォルダ内に置きますが、プロジェクトフォルダ外のファイルを読み込む方式でやってみます。
				
package servlet.test;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ResourceTest")
public class TestR extends HttpServlet {
	private static final long serialVersionUID = 1L;

	static ResourceBundle.Control control = null;
	static URLClassLoader urlLoader = null;

	private ResourceBundle getResourceBundle(Locale locale) throws MalformedURLException {
		if (control == null) {

			control = new ResourceBundle.Control() {
				@Override
				public long getTimeToLive(String baseName, Locale locale) {

					// キャッシュを保持する期間(ミリ秒単位)。60 * 60 * 1000で1時間
					return 60 * 60 * 1000;
				}
			};

			// プロパティファイルが置いてあるフォルダを指定。
			File dir = new File("C:\\work\\hp");
			urlLoader = new URLClassLoader(new URL[] { dir.toURI().toURL() });

		}

		// プロパティファイル名を指定。拡張子(.properties)は省略。
		return ResourceBundle.getBundle("msg", locale, urlLoader, control);
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Locale locale = request.getLocale();

		ResourceBundle bundle1 = getResourceBundle(locale);

		String t1 = bundle1.getString("test1");
		String t2 = bundle1.getString("test2");

		request.setCharacterEncoding("UTF8");
		response.setContentType("text/html; charset=UTF8");
		response.getWriter().append(t1).append(":").append(t2);
	}
}

			
プロパティファイルは C:\work\hp\msg.properties を読み込み、1時間後にアクセスしたときにプロパティファイルを再読込します。

ページのトップへ戻る