12 月 23

[php][CakePHP]日英・英日翻訳コンポーネント

Category: php
このエントリをはてなブックマークに追加[php][CakePHP]日英・英日翻訳コンポーネントのはてなブックマーク被リンク数このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

ようやくCakePHPの勉強を開始しました。『CakePHPガイドブック』と『PHPフレームワーク完全マスター』で勉強しています。

以前[php][WebAPI]EJ, JE translation APIは翻訳WebAPIとして使えるで紹介したEJ, JE translation APIを用いてなんか変なもの作っています。CakePHPの作法がよくわからないのですが、コントローラの中に書くのは良くなさそうなので、適当に本を見てコンポーネントにしてみました。phpのバージョンやライブラリの依存については[php][WebAPI]EJ, JE translation APIは翻訳WebAPIとして使えるを参照してください。

PHP:
  1. require_once 'HTTP/Client.php';
  2. /**
  3.  * EJ, JE translation APIを用いて翻訳を行うコンポーネント
  4.  *
  5.  * @author uechoco
  6.  * @see    http://muumoo.jp/news/2007/05/09/0translationapi.html
  7.  */
  8.  
  9. class TranslateComponent extends Object
  10. {
  11.     /**
  12.      * 固定ID定数
  13.      */
  14.     const ID_EJ = 'ZM5oVmX92xGrFWiRJhOy0Q';
  15.     const ID_JE = 'ohZnaGr92xG36xIFyzUFzw';
  16.  
  17.     /**
  18.      * コントローラを保持
  19.      */
  20.     var $controller = null;
  21.  
  22.  
  23.  
  24.     /**
  25.      * HTTP_Clientの初期化パラメータ
  26.      *
  27.      * @access private
  28.      */
  29.     var $http_client_default_param = array(
  30.         'timeout' => 10,
  31.         'allowRedirects' => true,
  32.         'maxRedirects' => 3
  33.     );
  34.     var $http_client_default_header = array(
  35.         'Accept-Language' => 'ja-JP,ja;q=0.9,en;q=0.8'
  36.         );
  37.  
  38.     /**
  39.      * POSTする先のURI
  40.      *
  41.      * @access private
  42.      */
  43.     var $uri = 'http://pipes.yahoo.com/pipes/pipe.run';
  44.  
  45.  
  46.     /**
  47.      * POSTするパラメータ(固定部分)
  48.      *
  49.      * @access private
  50.      */
  51.     var $param = array(
  52.     '_run' => 1,
  53.     '_render' => 'json', // or rss
  54.     );
  55.  
  56.     function
  57.     __construct()
  58.     {
  59.         parent::__construct();
  60.     }
  61.  
  62.     function
  63.     startup(&$controller)
  64.     {
  65.         $this->controller =& $controller;
  66.     }
  67.  
  68.  
  69.     /**
  70.      * 英日翻訳
  71.      */
  72.     function translate_ej(&$word)
  73.     {
  74.         return $this->_translate(TranslateComponent::ID_EJ, $word);
  75.     }
  76.  
  77.  
  78.     /**
  79.      * 日英翻訳
  80.      */
  81.     function translate_je(&$word)
  82.     {
  83.         return $this->_translate(TranslateComponent::ID_JE, $word);
  84.     }
  85.  
  86.  
  87.     /**
  88.      * 翻訳本体
  89.      */
  90.     function _translate($_id, &$word)
  91.     {
  92.         $text = urlencode($word);
  93.         $p = am($this->param, array('_id'=>$_id, 'text'=>$text));
  94.  
  95.         // レスポンスの発行
  96.         $client =& new HTTP_Client($this->http_client_default_param, $this->http_client_default_header);
  97.         $client->post($this->uri, $p);
  98.         $response = $client->currentResponse();
  99.  
  100.         // JSON形式をPHPで操作可狽ネ形式にデコード
  101.         $ret = json_decode($response['body']);    //>= php 5.2.0
  102.         $tuple = $ret->value->items[0];
  103.  
  104.         // 翻訳結果
  105.         return urldecode($tuple->description);
  106.     }
  107. }

2 Comments so far

  1. yando 12 月 25th, 2007 09 : 17 : 07

    面白いですね。
    Cakeの機能を使うなら同一条件の問合せを繰り返さないようにキャッシュを作ってもいいかもしれません。
    Objectのcacheメソッドを使う感じとか。

    WEBサービスの機能をコンポーネントにするのは面白いですね。

  2. うえちょこ 12 月 25th, 2007 15 : 29 : 32

    >キャッシュを作ってもいいかもしれません
    便利なcacheメソッドがあるのですね。学んでみます。

    >WEBサービスの機能をコンポーネントにするのは面白いですね。
    コンポーネントをどういうときに用いるのかまだ良くわからなくて^^;;再利用ができそうなクラスとして目に止まったのがコンポーネントという機能だったので。WEBサービスをコンポーネント化する習慣がCakePHPにはないってことなんでしょうか?あるいはもっとクールな実装方法があるのでしょうか?

Leave a comment