この前紹介した「Flexアプリケーションにバージョンコントロールを実装するライブラリとサンプルソース」のバージョンコントロールと同じ、アプリケーションのマルチ言語対応も重要の一つとなりました。
大きいなソフトWindows OSでも世界中メインな言語バージョンを対応していました。Adobe PhotoShopとか、Flex Builderとか、Flashなども英語版、日本語版、中国版などいろいろ言語を対応していました。ほかの言語バージョンの対応、もちろんゼロから再開発必要ではなくて、言語と関係する部分のリソースだけを多言語となると実現できます。
リソースの多言語化の実現もいろいろやり方があります。言語リソースをデータベースに保存するとか、ファイルに保存するとか、WindowsだったらDLL化となるとか…
以下はサンプルソースでステプbyステプでFlexアプリケーションにマルチ言語対応を説明いたします。
この例中には、言語のリソースをデータベースに保存とします。
1)、まず、テーブル構造は下記のようです。
| keyword | english | japanese |
| HELLOWORLD | Hello World | ハロー・ワールド |
2)、次は、PHPでDBのデータを取得する。ソースは以下のようです。
Download: MultiLanguage.php
- <?php
- /**
- * Class contains methods for creating multilanguage applications. *
- */
- class MultiLanguage
- {
- function MultiLanguage()
- {
- pg_connect("host=localhost port=5432 dbname=database_name user=username password=password");
- }
- /**
- * Returns all data of table wordlist
- *
- * @return array
- */
- public function getWordlist()
- {
- $query = pg_query("SELECT * FROM wordlist");
- return $this->pg_fetch_all_fields($query);
- }
- /**
- * Returns query result as array.
- *
- * @param string $query
- * @return array
- */
- private function pg_fetch_all_fields($query)
- {
- $i=0;
- while ($tmp[$i] = pg_fetch_array($query))
- {
- if($tmp[$i] != false)
- {
- $all[$i] = $tmp[$i] ;
- $i++;
- }
- }
- return $all;
- }
- }
- ?>
3)、ActionScriptでマルチ言語対応ライブラリソース
Download: MultiLanguage.as
- package zgFlex
- {
- [Bindable]
- public class MultiLanguage
- {
- public var wordlist:Array;
- public var lang:uint = 1; //Default lnguage
- public var word:Object = new Object();
- public function MultiLanguage(_wordlist:Array)
- {
- this.wordlist = _wordlist;
- this.assocArray();
- }
- /**
- * Converts array to assoc array placing first field of array in our case keyword as assoc field
- * */
- public function assocArray():void
- {
- var depth:uint = wordlist[0].length;
- var assoc:String;
- for(var i:uint = 0; i < wordlist.length; i++ ){
- var row:Array = new Array;
- assoc = wordlist[i][0].toString();
- for(var j:uint = 0; j < depth; j++)
- row.push(wordlist[i][j].toString());
- word[assoc] = [row];
- }
- }
- }
- }
4)、最後は画面に表示するソース
Download: main.mxml
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="onInit();">
- <mx:RemoteObject id="remoteMultiLanguage" source="MultiLanguage" destination="amfphp" showBusyCursor="true">
- <mx:method name="getWordlist" result="fetchWordlist(event)" fault="fault(event)"/>
- </mx:RemoteObject>
- <mx:Script>
- <![CDATA[
- import zgFlex.MultiLanguage;
- import mx.utils.ArrayUtil;
- import mx.controls.Alert;
- import mx.rpc.events.ResultEvent;
- import mx.rpc.events.FaultEvent;
- [Bindable]
- public var wordlist:MultiLanguage;
- public function onInit():void
- {
- remoteMultiLanguage.getWordlist();
- }
- public function fetchWordlist(evt:ResultEvent):void{
- wordlist = new MultiLanguage(ArrayUtil.toArray(evt.result));
- }
- public function fault(evt:FaultEvent):void{
- Alert.show(evt.fault.toString(),"Error!");
- }
- ]]>
- </mx:Script>
- <mx:Tile>
- <mx:LinkButton styleName="languageLink" label="hr" click="wordlist.lang = 1"/>
- <mx:LinkButton styleName="languageLink" label="en" click="wordlist.lang = 2"/>
- </mx:Tile>
- <mx:Label text="{wordlist.word.HELLOWORLD[0][wordlist.lang]}" fontSize="20" />
- </mx:Application>
必要な言語リソース、例えば、中国語とか追加すると、プログラムのソースの修正はいらなくて、テーブルに1列を追加すれば実現できます。
メインコンテンツEND ■
Posted on Monday, 24th November 2008 by admin
Tags: Flex, サンプル, ソース, マルチ言語
Posted in Flex | Comments (0) | 2,124 views
