多言語対応
概要
Next Design の表示言語の切り替えに連動して、エクステンションの表示言語も切り替わるように、多言語対応できます。
なお、エクステンションの多言語対応は任意です。多言語対応が不要な場合、以下の対応は必要ありません。
エクステンションの多言語対応には次の実装が必要です。
- ロケールファイルの作成
- 文字列のグローバライズ
ロケールファイルの作成
表示言語ごとのリソース文字列を定義したファイルを ロケールファイル と呼びます。
マニフェストが存在するフォルダに、次の名前でロケールファイルを追加することで、表示言語ごとにリソース文字列を定義できます。
表示言語 | ファイル名 |
---|---|
日本語 | locale.ja.json |
英語 | locale.en.json |
注記
- ロケールファイルの文字コードには UTF-8 を使用してください。
実装例
locale.ja.json
{
"locale": "ja",
"resourceStrings" : {
"MyExt.Tab.Label": "エクステンション",
"MyExt.ValidationGroup.Label": "モデル検証",
"MyExt.ValidationButton.Label": "検証",
"MyExt.ValidationButton.Description": "全モデルを検証します。",
"MyExt.Error.CanNotBeEmpty.Title": "空にできない",
"MyExt.Error.CanNotBeEmpty.Message": "名前フィールドは空にできません",
"MyExt.Error.CanNotChange.Message2": "{0}は{1}にできません"
}
}
locale.en.json
{
"locale": "en",
"resourceStrings" : {
"MyExt.Tab.Label": "Extension",
"MyExt.ValidationGroup.Label": "Model Validation",
"MyExt.ValidationButton.Label": "Validate",
"MyExt.ValidationButton.Description": "Validate all models.",
"MyExt.Error.CanNotBeEmpty.Title": "Can't be empty.",
"MyExt.Error.CanNotBeEmpty.Message": "Name field can't be empty.",
"MyExt.Error.CanNotChange.Message2": "Can't set {0} to {1}."
}
}
文字列のグローバライズ
多言語対応のために実装コードを追加・変更することを グローバライズ と呼びます。
ロケールファイルから表示箇所に対応するリソース文字列を取得するロジックを実装コードに追加・変更することでグローバライズを実現できます。
マニフェスト
マニフェスト内でのグローバライズには、ロケールファイルで定義したリソース文字列を %リソース文字列の識別子%
のように指定します。
実装例
manifest.json
{
"extensionPoints": {
"ribbon": {
"tabs": [
{
"id": "MyExtensions.Tab",
"label": "%MyExt.Tab.Label%",
"groups": [
{
"id": "MyExtensions.ValidationGroup",
"label": "%MyExt.ValidationGroup.Label%",
"controls": [
{
"type": "Button",
"id": "MyExtensions.ValidationButton",
"label": "%MyExt.ValidationButton.Label%",
"description": "%MyExt.ValidationButton.Description%",
"imageLarge": "resources/icon.png",
"command": "Validate.Run"
}
]
}
]
}
]
}
},
}
ハンドラ
ハンドラ内でのグローバライズには、ロケールファイルで定義したリソース文字列の識別子を引数に設定して次のAPIを使用します。
リソース文字列取得のAPI
public interface IContext
{
// 現在の表示言語のリソース文字列を取得する
string GetResourceString(string key);
string GetResourceString1(string key,object param1);
string GetResourceString2(string key,object param1,object param2);
string GetResourceString3(string key,object param1,object param2,object param3);
}
実装例
単純なリソース文字列
var message = context.GetResourceString("MyExt.Error.CanNotBeEmpty.Message");
model.AddError("Name","Error",null,message);
パラメータ埋め込み型のリソース文字列
var message = context.GetResourceString2("MyExt.Error.CanNotChange.Message2","aaa","bbb");
model.AddError("Name","Error",null,message);
注記
- ロケールファイルに該当するリソース文字列名の識別子が存在しない場合は、リソース文字列の識別子がそのまま表示されます。