ソフトウェア国際化ツールWorld Wide Navi(ワールドワイドナビ)の国際化プログラミング参考情報から、Flashの国際化の抜粋です。
Flashのリソース管理の方法は、大きくわけて、mx.resources.ResourceManagerを使ったproeprtiesファイルの方法と、fl.lang.Localeを使ったXLIFFの方法の2つがあります。
また、MXMLの場合は、ResourceManagerを使って直接ラベルをリソース化することができます。
各方法の詳細は、以下のAdobeの開発ガイドをご参照ください。
1.
2.
*fl.lang.LocaleのXLIFF読み込みは非同期であるため、文字列の読み込みはコールバック関数で行う必要があります。
この仕様はコード中の文字列の切り替えなどに適さないため、wwnaviの文字列の外部化では、ResourceManagerを使った処理を使用しています。
*ResourceManagerに関係するクラスやメソッドの多くが現在非推称となっています。以下のコードは現在サポートされていません。
var r:SystemManager = new SystemManager(); var t:Locale = (r.topLevelSystemManager) ? Locale.getCurrent(r.topLevelSystemManager) : Locale.getCurrent(r);
参考)wwnaviによるリソース切り替えのサンプルコード
フラッシュを読み込むHTMLからユーザーロケールを取得して、それに合ったリソースを表示する処理です。
====== WwnaviRs.as (リソースの読み込みクラス) ====== //$NLS-WWNAVI 2011-06-13T20:24:27 0900 package { import flash.system.Capabilities; import flash.external.ExternalInterface; import mx.resources.ResourceManager; /** * This class is automatically generated by wwnavi. */ [ResourceBundle("wwnaviRs")] public class WwnaviRs { private static var isInit:Boolean = false; private static var loc:String = null; public static function init():void { // Get user system language code (without country codes in most cases). loc = Capabilities.language; loc = loc.replace("-", "_"); var cn:String = ""; // For using this code, the additional compile option, // "-locale=YOUR_LOCALE(e.g. en_US) -source-path=YOUR_RESOURCE_PATH(e.g. locale) /{locale}" is required. // If you add other locales, you have to add them to the option above. switch (loc) { case "en": cn = "US"; break; case "ja": cn = "JP"; break; case "ko": cn = "KR"; break; case "zh": // do nothing. (loc has "_CN or _TW") break; // add your locale country codes. //case... // break; default: } if (loc.indexOf("_") == -1) { loc = loc "_" cn; } // Or get user browser language by your external JavaScript. // loc = getBrowserLang(); // In some cases, this code doesn"t work. ResourceManager.getInstance(). localeChain = [loc]; isInit = true; } ロケールをHTMLの 引数として受け取ります。 public static function initByFlashVars(flashVars:Object):void { loc = flashVars["locale"]; isInit = true; } public static function getString(id:String):String { if (!isInit) init(); // ResourceManager.getInstance() .localeChain = [loc] // でロケールが切り替わらない場合が あるので安全策として以下の方法にしています。 var str:String = ResourceManager.getInstance(). getString("wwnaviRs", id, null, loc); if (str == null) str = ResourceManager.getInstance(). getString("wwnaviRs", id); return str; } /*public function getBrowserLang():String { var s:String; if (ExternalInterface.available) { var wrapperFunction:String = "YOUR_JAVASCRIPT_FUNCTION"; s = ExternalInterface.call(wrapperFunction); } else { s = "Wrapper not available"; } return s; }*/ } } ====== test.html (Flashの読み込み) ====== <html> <object width="100%" height="100%" > <!-- Edit locale to the suitable one. --> <param name="FlashVars" value="locale=ja_JP" /> <!-- Edit locale to the suitable one. --> <embed width="100%" height="100%" src="Main.swf" FlashVars ="locale=ja_JP" /> </object> </html> ====== Main.as (HTMLからのロケール取得) ====== Main関数などのエントリーポイントに記述します。 public function Main():void { WwnaviRs.initByFlashVars( this.root.loaderInfo.parameters); ====== Main.as (文字列の読み込み処理) ====== ... tx1.text = WwnaviRs.getString("Main.1"); // tx1.text = "This is text 1."; ... ====== リソースファイルの場所 ====== ../locale/en_US/wwnaviRs.properties ja_JP/wwnaviRs.properties ... ../src/Main.as WwnaviRs.as ====== リソースファイルの中身 ====== Main.3=This is text 3. Main.2=This is text 2. Main.1=This is text 1. ... Main.3=これはテキスト3です。 Main.2=これはテキスト2です。 Main.1=これはテキスト1です。 ====== コンパイルオプション ====== -locale=en_US,ja_JP -source-path=locale/{locale}
最近のコメント