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}");
}
テストのエビデンス
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>
今回のサンプルは以下のリンクからダウンロードできます。