この前紹介した「Flexアプリケーションにバージョンコントロールを実装するライブラリとサンプルソース」のバージョンコントロールと同じ、アプリケーションのマルチ言語対応も重要の一つとなりました。

大きいなソフトWindows OSでも世界中メインな言語バージョンを対応していました。Adobe PhotoShopとか、Flex Builderとか、Flashなども英語版、日本語版、中国版などいろいろ言語を対応していました。ほかの言語バージョンの対応、もちろんゼロから再開発必要ではなくて、言語と関係する部分のリソースだけを多言語となると実現できます。

リソースの多言語化の実現もいろいろやり方があります。言語リソースをデータベースに保存するとか、ファイルに保存するとか、WindowsだったらDLL化となるとか…

以下はサンプルソースでステプbyステプでFlexアプリケーションにマルチ言語対応を説明いたします。

この例中には、言語のリソースをデータベースに保存とします。

1)、まず、テーブル構造は下記のようです。

keyword english japanese
HELLOWORLD Hello World ハロー・ワールド

2)、次は、PHPでDBのデータを取得する。ソースは以下のようです。

  1. <?php
  2. /**
  3. * Class contains methods for creating multilanguage applications. *
  4. */
  5. class MultiLanguage
  6. {   
  7.     function MultiLanguage()
  8.     {
  9.             pg_connect("host=localhost port=5432 dbname=database_name user=username     password=password");
  10.     }
  11.     /**
  12.      * Returns all data of table wordlist
  13.      *
  14.      * @return array
  15.      */
  16.     public function getWordlist()
  17.     {
  18.         $query = pg_query("SELECT * FROM wordlist");
  19.         return $this->pg_fetch_all_fields($query);
  20.     }
  21.     /**
  22.      * Returns query result as array.
  23.      *
  24.      * @param string $query
  25.      * @return array
  26.      */
  27.     private function pg_fetch_all_fields($query)
  28.     {
  29.         $i=0;
  30.         while ($tmp[$i] = pg_fetch_array($query))
  31.         {   
  32.             if($tmp[$i] != false)
  33.             {
  34.                 $all[$i] = $tmp[$i] ;
  35.                 $i++;
  36.             }
  37.         }
  38.         return $all;
  39.     }
  40. }
  41. ?>

3)、ActionScriptでマルチ言語対応ライブラリソース

  1. package zgFlex
  2.  {
  3.      [Bindable]
  4.      public class MultiLanguage
  5.      {       
  6.          public var wordlist:Array;
  7.          public var lang:uint = 1;    //Default lnguage   
  8.          public var word:Object = new Object();
  9.  
  10.          public function MultiLanguage(_wordlist:Array)
  11.          {
  12.              this.wordlist = _wordlist;
  13.              this.assocArray();
  14.          }       
  15.          /**
  16.           * Converts array to assoc array placing first field of array in our case keyword as assoc field
  17.           * */
  18.          public function assocArray():void
  19.          {
  20.              var depth:uint = wordlist[0].length;
  21.              var assoc:String;       
  22.              for(var i:uint = 0; i < wordlist.length; i++ ){                   
  23.                  var row:Array = new Array;
  24.                  assoc     = wordlist[i][0].toString();               
  25.                  for(var j:uint = 0; j < depth; j++)
  26.                      row.push(wordlist[i][j].toString());               
  27.                  word[assoc] = [row];   
  28.              }       
  29.          }
  30.      }
  31.  }

4)、最後は画面に表示するソース

Download: main.mxml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"  creationComplete="onInit();">
  3. <mx:RemoteObject id="remoteMultiLanguage" source="MultiLanguage" destination="amfphp" showBusyCursor="true">
  4.     <mx:method name="getWordlist" result="fetchWordlist(event)" fault="fault(event)"/>
  5. </mx:RemoteObject>
  6.  
  7.     <mx:Script>
  8.         <![CDATA[
  9.             import zgFlex.MultiLanguage;
  10.             import mx.utils.ArrayUtil;
  11.             import mx.controls.Alert;
  12.             import mx.rpc.events.ResultEvent;
  13.             import mx.rpc.events.FaultEvent;               
  14.             [Bindable]
  15.             public var wordlist:MultiLanguage;   
  16.            
  17.             public function onInit():void
  18.             {
  19.                 remoteMultiLanguage.getWordlist();
  20.             }
  21.             public function fetchWordlist(evt:ResultEvent):void{
  22.                 wordlist = new MultiLanguage(ArrayUtil.toArray(evt.result));
  23.             }
  24.             public function fault(evt:FaultEvent):void{
  25.                 Alert.show(evt.fault.toString(),"Error!");
  26.             }
  27.         ]]>
  28.     </mx:Script>
  29.     <mx:Tile>       
  30.         <mx:LinkButton styleName="languageLink" label="hr" click="wordlist.lang = 1"/>
  31.         <mx:LinkButton styleName="languageLink" label="en" click="wordlist.lang = 2"/>
  32.     </mx:Tile>
  33.     <mx:Label text="{wordlist.word.HELLOWORLD[0][wordlist.lang]}" fontSize="20" />
  34. </mx:Application>

必要な言語リソース、例えば、中国語とか追加すると、プログラムのソースの修正はいらなくて、テーブルに1列を追加すれば実現できます。

メインコンテンツEND ■
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted on Monday, 24th November 2008 by admin

Tags: , , ,
Posted in Flex | Comments (0) | 537 views

Related Posts

Leave a Reply