2019年6月24日月曜日

MELの多言語対応

ツールのGUIでラベルへの文字を付ける場合なんかは、ふつうアルファベットか日本語かの二者択一になってしまいます。
そんなラベルの文字を各言語へスムーズに切り替えられるようにするため uiRes というコマンドが MELにあります。

このコマンドを使うためには、.res.mel というラベル用の文字列を設定するコマンドが書かれたファイルを用意する必要があります。そのファイルの中で使用するコマンドが displayString で、uiResコマンドの引数と displayString の文字列識別子を同じにします。

まずは英語での作成から開始するとして、フォルダにはこんな感じで.melファイルを用意します。


uiResTest.mel には手っ取り早くメインメニューへメニューを追加するスクリプトを書いてみます。



global proc uiResTest()
{
 global string $gMainWindow;
 
 
 if( ""==$gMainWindow || !`window -ex $gMainWindow`) return;
 
 // 旧メニュー削除
 string $testMenu="testMenu_in_mainMenu";
 if(`menu -q -ex $testMenu`) deleteUI $testMenu;/* for debug. */
 
 // メニュー作成
 setParent $gMainWindow;
 menu -p $gMainWindow -l (uiRes("m_uiResTest.kMainMenuLabel")) $testMenu;

}

uiRes はコマンド全体を括弧でくくらないと変な風に表示されてしまうので注意が必要。

そしてuiResTest.res.mel には追加するメニューのラベル文字列を記述。
displayString -replace -value "hogehoge" m_uiResTest.kMainMenuLabel;


英語版のmayaを起動し、コマンドラインで uiResTest を実行すると、メインメニューにこんな風に追加されます。



次に、このラベルを日本語にするため、uiResTest.melと同じ場所に ja_JPのフォルダを作成。

この ja_JP フォルダにuiResTest.res.mel をコピーし、-value を日本語に書き換えます。
displayString -replace -value "ほげほげ" m_uiResTest.kMainMenuLabel;


これを日本語版のmayaで実行。
けれども、
// エラー: Line 0.93: source ステートメントのファイル "C:/Program Files/Autodesk/MayaLT2019/resources/l10n/ja_JP/scripts/uiResTest.res.mel" が見つかりません。 //

と出てしまいました。
どうやら、言語切り替え用のファイルは、ここのパスに無いといけないようです。
が、このフォルダへファイルをコピーするのは気が引けます。なので、何か別の手段で解決したい感じです。

で、ja_JPフォルダの.res.melをsourceコマンドでオーバーライドしてみることにします。
uiResTest.melにこんな行を追加。
global proc uiResTest()
{
 global string $gMainWindow;
 
 
 if( ""==$gMainWindow || !`window -ex $gMainWindow`) return;
 
 // 旧メニュー削除
 string $testMenu="testMenu_in_mainMenu";
 if(`menu -q -ex $testMenu`) deleteUI $testMenu;/* for debug. */
 
 // 言語設定取得
 string $LANG=`about -uil`;
 if("ja_JP"==$LANG) source "ja_JP/uiResTest.res.mel";
 
 // メニュー作成
 setParent $gMainWindow;
 menu -p $gMainWindow -l (uiRes("m_uiResTest.kMainMenuLabel")) $testMenu;
 
}



うまくいったようです。

getenv "MAYA_UI_LANGUAGE";
を使うとヌルが返ってきたりするので、aboutコマンドから uiLanguage を取得するのが安全です。


0 件のコメント:

コメントを投稿