7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

i18nというキーワードの意味はご存知ですか?自分は長い間、18か国のことさしているのだと思っていました。実は、internationalizationの略称で、i + ランダム18英字 + n ということです。

efwはフレームワークですから、内部のメッセージ数は460でそれほど多くないです。中国語、日本語、英語(自分のパスポートの出発地・渡航先の記録順)、3種類の言語ファイルはデフォルトとして提供します。韓国に行ったことがありますが、言葉がわからないので翻訳できませんでした。残念。

今回のサンプルは、多言語関連のものを試します。

多言語定義ファイル

多言語定義ファイルはxmlプロパティファイルで、ファイル名は国の略称です。日本語の場合 jp.xml です。このファイルは、WEB-INF/lib/efw/i18nフォルダに格納します。以下は一部の情報です。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<!--EfwClientMessages-->
<entry key="OtherErrorException">予想外エラーが発生しました。</entry>
<entry key="CommunicationErrorException">通信エラーが発生しました。リトライしますか?</entry>
<entry key="EventIsBusyException">該当機能は混雑しています。しばらくお待ちください。</entry>
<entry key="RuntimeErrorException">実行時エラーが発生しました。\n\neventId={eventId}\nmessage={message}</entry>
<entry key="ParamsFormatErrorException">イベントのパラメータ定義は正しくありません。\n\neventId={eventId}</entry>
<entry key="ResultValuesErrorException">表示用のデータは正しくありません。\n\neventId={eventId}</entry>
<entry key="ResultActionsErrorException">動作用のデータは正しくありません。\n\neventId={eventId}</entry>
<entry key="AlertDialogTitle">情報</entry>
<entry key="AlertDialogOK">OK</entry>
<entry key="WaitDialogTitle">取り込み中</entry>

<!--EfwServerMessages-->
<entry key="NumberType">数字</entry>
<entry key="DateType">日付</entry>
<entry key="StringType">文字</entry>
<entry key="SessionTimeoutException">セッションタイムアウトになりました。再ログインしてください。</entry>
<entry key="NumberIsReuqiredMessage">{display-name}を数字で正しく入力してください。</entry>
<entry key="DateIsReuqiredMessage">{display-name}を日付で正しく入力してください。</entry>
<entry key="IsRequiredMessage">{display-name}を入力してください。</entry>
<entry key="MaxLengthOverMessage">{display-name}を{max-length}文字以内で入力してください。</entry>
<entry key="MinOrMaxOverMessage">{display-name}を{min}以上{max}以内の{data-type}で入力してください。</entry>
<entry key="MinOverMessage">{display-name}を{min}以上の{data-type}で入力してください。</entry>
<entry key="MaxOverMessage">{display-name}を{max}以内の{data-type}で入力してください。</entry>
<entry key="NotAcceptMessage">{display-name}に正しいファイルを選択してください。</entry>
<entry key="EventIsNotExistsMessage">ファイル無しまたはJavaScript語法違反のため、該当イベントをロードできません。</entry>
<entry key="ElFinderSessionTimeoutMessage">セッションタイムアウトのため、該当elFinderは操作できません。</entry>
<entry key="ElFinderIsProtectedMessage">保護モードに設定されたため、該当elFinder操作は実行できません。</entry>
<entry key="ElFinderHackingRiskMessage">リスクを検知されたため、該当elFinder操作は実行できません。</entry>
<entry key="ElFinderHomeNotExistsMessage">home属性の設定値は存在しているフォルダではありません。</entry>

<!--ElFinderClientMessages-->
...

<!--RuntimeExceptions-->
<entry key="NewKeywordWasForgottenException">Newキーワードは忘れられました。</entry>
<!-- test -->
<entry key="here">ここ</entry>
<entry key="language">言語</entry>
<entry key="comment">msgタグはclientタグの後にしないといけないです。</entry>
<entry key="testservermsg">サーバ戻り値をテストします</entry>
</properties>

jspの場合

多言語対応テストのJSPです。すべての文字列をmsgタグで行います。アプリ専用のメッセージは、上記言語ごとのxmlファイルに登録します。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="efw" uri="efw" %>
<!DOCTYPE HTML>
<HTML>
<HEAD>
	<%
		//ほかの画面はセッション情報から、言語コードを受け取るから大丈夫です。
		//ログイン画面だけですが、言語を選択する場合jspの更新が必要です。
		String lang=request.getParameter("lang");
		if (lang==null||"".equals(lang))lang="en";
	%>
	<efw:Client lang="<%=lang%>"/>
	<!-- タイトルは本来ならば上のほうですが、clientの次にしないと言語が特定できないため、場所を移動する -->
	<title><efw:msg key="here"/></title>
	<script>
		//ログイン画面の場合、選択した言語をselectタグに再表示する方法です。
		$(function(){
			$("#selLang").val("<%=lang%>");
		});
		function changeI18n(self){
			window.location="helloI18n.jsp?lang="+self.value;
		}
	</script>
</HEAD>
<BODY>
	<efw:msg key="language"/>
	<select id="selLang" onchange="changeI18n(this)">
		<option value=""></option>
		<option value="cn">cn</option>
		<option value="jp">jp</option>
		<option value="en">en</option>
	</select><br>
	<efw:msg key="comment"/><br>
	<button onclick="Efw('helloI18n_submit')"><efw:msg key="testservermsg"/></button><br>
</BODY>
</HTML>

jsイベントの場合

サーバからクライアントに送る各種メッセージを、「{msg code}」で行います。そのメッセージコードは、言語毎のxmlに登録します。

var helloI18n_submit={};
helloI18n_submit.paramsFormat={};
helloI18n_submit.fire=function(params){
	return new Result()
	.alert("{here} {language} {testservermsg}");
}

テストのエビデンス

image.png

jar入手

<dependency>
    <groupId>io.github.efwgrp</groupId>
    <artifactId>efw</artifactId>
    <version>4.07.000</version>
</dependency>

jdk15以上の場合、関連jarが必要です。

<dependency>
    <groupId>org.openjdk.nashorn</groupId>
    <artifactId>nashorn-core</artifactId>
    <version>15.4</version>
</dependency>

今回のサンプルは以下のリンクからダウンロードできます。

7
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?