【make it easy】efwの多言語対応

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

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

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

# 多言語定義ファイル
多言語定義ファイルはxmlプロパティファイルで、ファイル名は国の略称です。日本語の場合 jp.xml です。このファイルは、WEB-INF/lib/efw/i18nフォルダに格納します。以下は一部の情報です。
```xml
<?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>
<entry key="PreviewDialogTitle">プレビュー</entry>

<!--EfwServerMessages-->
...
<!--ElFinderClientMessages-->
...
<!--RuntimeExceptions-->
...
<!-- test -->
<entry key="here">ここ</entry>
<entry key="language">言語</entry>
<entry key="comment">msgタグはclientタグの後にしないといけないです。</entry>
<entry key="testservermsg">サーバ戻り値をテストします</entry>
</properties>
```
# jspの場合
多言語対応テストのJSPです。すべての文字列をmsgタグで行います。アプリ専用のメッセージは、上記言語ごとのxmlファイルに登録します。
```jsp
<%@ 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に登録します。
```javascript
var helloI18n_submit={};
helloI18n_submit.paramsFormat={};
helloI18n_submit.fire=function(params){
	return new Result()
	.alert("{here} {language} {testservermsg}");
}
```
# テストのエビデンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/e232d371-e1ce-298e-68a9-d67c27a82d35.png)

# jar入手
```xml
<dependency>
    <groupId>io.github.efwgrp</groupId>
    <artifactId>efw</artifactId>
    <version>4.07.024</version>
</dependency>
```
jdk15以上の場合、関連jarが必要です。
```xml
<dependency>
    <groupId>org.openjdk.nashorn</groupId>
    <artifactId>nashorn-core</artifactId>
    <version>15.6</version>
</dependency>
```

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

https://github.com/efwGrp/qittaSamples