DataSpiderSDKと多言語化対応

## DataSpiderの多言語対応
DataSpiderの本体は、日本語と英語に対応しています。
DataSpiderのログイン時のダイアログにて、言語に日本もしくは英語を指定し切り替えることができます。
### ログイン画面
![ha_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/f9657546-25e2-487f-b1fd-fca02485b867.png)
### 日本語版のデザイナ画面
![ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/e1981346-4ea6-f813-2520-620368c56d8b.png)
### 英語版のデザイナ画面
![en.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/8a722ad8-3436-07ff-931d-9f9bb5eb44dc.png)
## アダプタ開発と多言語化
Java言語での多言語化は、一般的なお作法が存在します。
java.util.ResourceBundleを使用することに多言語化に対応することができる当記事がWeb上で多くみられます。
## 今回行うこと
今回は、java.util.ResourceBundleの仕組みを使って、DataSpiderSDKによるオリジナルのアダプタを開発する際に、GUIおよびログ出力を多言語化（国際化）に対応してみます。
## 前提条件
こちらの記事にある内容にて、DataSpider本体およびSDK開発環境が整っていること。
## 多言語化対応のための実装について
只今Bitcoin連携のためのアドレス生成アダプタを製造しているということもあり、以下の点について多言語化を対応してみたいと思います。
* アダプタプロパティ画面
* ツールパレットに表示されるアイコン名
* デバッグログメッセージ
## 使用するパッケージとファイル構成
ここでは、多言語化対応に必要となる部分を抜粋して説明します。
必要となるパッケージおよびファイルを用意して多言語化対応します。
メッセージを管理するプロパティファイルは、ResourceBundleのルールに沿って用意します。
### パッケージ
別途用意するライブラリはありません。
* java.util.ResourceBundle
* com.appresso.ds.common.fw.i18n.MessageUtil
その他、エラーハンドリングやDataSpiderに対応するため必要なパッケージをimportします。
### ファイル構成
多言語化にあたり、以下のクラス、およびプロパティファイルを追加します。
#### ファイル群
* MultiLangMessage.java
多言語化対応のためのメインとなるクラス
* multilangmessages_en.properties
英語の文字列を管理するpropertieファイル
* multilangmessages_ja.properties
日本語の文字列を管理するpropertieファイル
* multilangmessages.properties
文字列を管理するpropertieファイル
#### ファイル構成詳細
アダプタのソースコードと同階層にファイルを上記配置します。
![tree1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/7b55dd2f-67bd-f072-8aea-18de0049b5cb.jpeg)

## ファイルの内容と実装詳細
### ファイルの内容
#### MultiLangMessage.java
```java
package com.jpn.linux.dp.modules.adapter.BitcoinGenerateAddress;

import java.util.MissingResourceException;
import java.util.ResourceBundle;

import com.appresso.ds.common.fw.i18n.MessageUtil;
import com.appresso.ds.common.locale.ThreadLocaleManager;

public class MultiLangMessage {

    // クラス名MultiLangMessage、multilangmessagesとファイル名の先頭の文字列を合せる
	private static String prefixName = ".multilangmessages";

	public static String getString(String key) {
		try {
			return getMultiLangMessageText().getString(key);
		} catch (MissingResourceException var2) {
			return '!' + key + '!';
		}
	}

	public static String getString(String key, Object... args) {
		return MessageUtil.getString(getMultiLangMessageText(), key, args);
	}

	private static ResourceBundle getMultiLangMessageText() {
		return ResourceBundle.getBundle(
			MultiLangMessage.class.getPackage().getName() + prefixName,
			ThreadLocaleManager.get());
	}

}
```
#### multilangmessages_en.properties
```java
read.operation.label=BTC Generate Address
group.type.label=Required settings
group.type.label.legacy=Legacy
group.type.label.p2sh=P2SH
constraint.type.label=Address type
constraint.type.desc=delect address BTC type
log.generate.address=Generated [{0}] of BTC address.
```

#### multilangmessages_ja.properties
```java
read.operation.label=BTCアドレス生成
group.type.label=必須設定
group.type.label.legacy=レガシ
group.type.label.p2sh=P2SH
constraint.type.label=生成アドレスタイプ
constraint.type.desc=BTCのアドレスタイプを選択します
log.generate.address=[{0}] アドレスを生成しました。
```
:::note warn
注意
全角文字列（日本語など）を含む内容をpropertiesファイルに記載する場合は、プロパティエディタを使用すること。
上記内容は、視認性を確保するため、プロパティエディタにより全角文字として解釈後を表示している。
通常のエディタで開くと以下の16進の羅列になっている。read.operation.label=BTC\u30a2\u30c9\u30ec\u30b9\u751f\u6210
group.type.label=\u5fc5\u9808\u8a2d\u5b9a
group.type.label.legacy=\u30ec\u30ac\u30b7
:::

#### multilangmessages.properties
```java
read.operation.label=BTC Generate Address
group.type.label=Required settings
group.type.label.legacy=Legacy
group.type.label.p2sh=P2SH
constraint.type.label=Address type
constraint.type.desc=delect address BTC type
log.generate.address=Generated [{0}] of BTC address.
```
### プロパティファイル内の文字列の参照方法
Javaコード内で文字列を取得する実装例
```java
	@Override
	public OperationMetaData getOperationMetaData(OperationContext context) throws Exception {
		OperationMetaData meta = new OperationMetaData(this, context);

		// ツールパレットの表示される名前 多言語化をしない場合は、コードに直書きする
		// meta.setLabel("BTCアドレス生成");
        // 多言語化する際は以下のゲッターを使用して実装する
        // MultiLangMessage：上記で用意したクラスおよびそのゲッターを呼び出す
		meta.setLabel(MultiLangMessage.getString("read.operation.label"));

		// デフォルトのアイコン名称
		meta.setBaseName("generate");

		return meta;
	}
```
## まとめ
DataSpiderSDKを用いた独自のアダプタ開発においても多言語化できることがわかりました。
ただし、今回の検証では、ラジオボタンのテキスト文字については、同メソッドにより多言語化対応ができませんでした。
別途さらに検証が必要（おそらく実装の問題）と思われるので、別途確認を進めたいと思います。
### 日本語版と英語版の画面イメージ
* 日本語版
![ja_画面全体.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/cf1d3053-414b-2344-8d76-4af2119bcdd1.jpeg)
* 英語版
![en_画面全体.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/8bc44719-ab3d-f2d0-6d35-d11029e970ff.jpeg)


### 多言語化対応ができなかった実装例
public interface Constants の中で、固定値としてStringオブジェクトに格納する場合は、多言語化できませんでした。
Javaの実装上の制限と思われる。実装する場所、タイミングを変更すると正常に実装できると思われるがまだ確認ができていません。
![radio.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/c66eb8e0-74a8-d632-0e31-371f18ebcbdd.jpeg)
赤枠部分：「Legacy」と「レガシ」で切り替わる想定でした。
![en_画面全体_failer.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/8fb34848-aea1-ef1c-9585-265be06dc960.jpeg)

## 次回は
[外部ライブラリの利用](https://qiita.com/dataspider-fan/items/0300957106de81d9fb48)について紹介します。