[make it easy] Multilingual Support

Do you know the meaning of the keyword i18n? I thought I had lived in 18 countries over the years. Actually, it is an abbreviation for internationalization, which is i + 18 random letters + n.

Since efw is a framework, the number of internal messages is 460, which is not that many. Three language files are provided as default: Chinese, Japanese, and English (in the order of departure and destination records in your passport). I've been to Korea, but I can't translate it because I don't understand the language, unfortunately.

In this sample, we will try something related to multiple languages.

# Multilingual Definition File
The multilingual definition file is an xml property file, and the file name is the abbreviation of the country. For Japanese, it is jp.xml. Store this file in the WEB-INF/lib/efw/i18n folder. Below is some information.
```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>

<!--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>
```
# For Jsp
This is a JSP for multilingual testing. All strings are done with msg tags. Messages specific to the app are registered in xml files for each language listed above.
```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>
```
# For Js Events
Use "{msg code}" for each message sent from the server to the client. The message code is registered in the xml for each language.
```javascript
var helloI18n_submit={};
helloI18n_submit.paramsFormat={};
helloI18n_submit.fire=function(params){
	return new Result()
	.alert("{here} {language} {testservermsg}");
}
```
# Test Evidence
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/e232d371-e1ce-298e-68a9-d67c27a82d35.png)

# Get Jar
```xml
<dependency>
    <groupId>io.github.efwgrp</groupId>
    <artifactId>efw</artifactId>
    <version>4.07.029</version>
</dependency>
```
For jdk15 or higher, related jars are required.
```xml
<dependency>
    <groupId>org.openjdk.nashorn</groupId>
    <artifactId>nashorn-core</artifactId>
    <version>15.6</version>
</dependency>
```

This sample can be downloaded from the link below.

https://github.com/efwGrp/qittaSamples