海外ニュースを翻訳して日本語タイトルでのRSS一覧とする方法を考えた。簡単そうで、意外にめんどくさい(参照すべき資料が皆無)。google翻訳APIが有料化したので、Microsoft Translator を使う(クラスライブラリ PHP Wrapper for Microsoft translate で認証まわりは処理)。RSSの取得は、lastRSSを使う。
あと、
Microsoft Translator | Windows Azure Marketplace http://p.tl/Ee-7
で最初にAPIキーを取得する必要がある(Bing Primary Account Key)。
mimi RSSリーダーに、以下の和訳RSSを指定し、翻訳されたRSSデータとして読み込む。まあなんとなく雰囲気はわかる感じ・・・
和訳RSS http://×××/××/××/mi/rss.php?url=[翻訳したい英語のRSSフィード]
以下のように、翻訳対象のURLを指定し、直接XMLデータとして出力させる。
<?php echo '<?xml version="1.0" encoding="utf-8"?>';?> <?php // include lastRSS library include 'RSS/lastRSS.php'; // include translate library require_once('translate/config.inc.php'); require_once('translate/class/MicrosoftTranslator.class.php'); $a=$_GET[url]; //$a='http://www.abc.net.au/radionational/feed/2894062/rss.xml'; //http://hfoodp.com/1/rsslast/test.php?a=http://news.livedoor.com/topics/rss.xml // create lastRSS object $rss = new lastRSS; // setup transparent cache $rss->cache_dir = 'RSS/tmp'; $rss->cache_time = 3600; // one hour // load some RSS file if ($rs = $rss->get($a)) { /* //デバック echo "<pre>"; print_r($rs); echo "</pre>"; */ //ブログタイトル・リンク //echo "<title>".$rs[title]."</title>"; //echo "<link>".$rs[link]."</link>"; ?> <rss version="2.0"> <channel> <title><?php echo $rs[title]; ?></title> <description><?php echo $rs[description]; ?></description> <link><?php echo $rs[link]; ?></link> <lastBuildDate><?php echo date(DATE_RFC822); ?></lastBuildDate> <?php //表示 foreach ($rs[items] as $hoge) { echo "<item>"; //echo "<title>".$hoge[title]."</title>"; /*--------------翻訳--------------------*/ //インスタント $translator = new MicrosoftTranslator(ACCOUNT_KEY); //処理 $text_to_translate = $hoge[title]; $from = 'en'; $to = 'ja'; $translator->translate($from, $to, $text_to_translate); $json = $translator->response->jsonResponse; $obj = json_decode($json); $title = $obj->translation; $pattern = "/">(.*?)<//"; if(@preg_match($pattern,$title,$match)){ //@でエラー回避 $match[0] = str_replace("">", "", $match[0] ); $match[0] = str_replace("</", "", $match[0] ); $title = $match[0]; } echo "<title>".$title."</title>"; /*--------------翻訳--------------------*/ echo "<link>".$hoge[link]."</link>"; echo "<description>".$hoge[description]."</description>"; echo "<pubDate>".$hoge[pubDate]."</pubDate>"; echo "</item>n"; } } else { die ('Error: RSS file not found...'); } ?> </channel></rss>
(追記) 実際に稼働させてみると、翻訳処理が些か重たい。アクセスの都度翻訳処理するのも、MSの契約上月間20万語の制限もあり(それ以上は有償となる)、以下の通り1時間生存時間のキャッシュ処理を付け加える。
<?php //GETするURL $a=$_GET[url]; //保存ファイル名 $FFN = str_replace("://", "", $a ); $FFN = str_replace("/", "", $FFN ); //生成したXMLの更新時間 $get_unix = filemtime("XML/".$FFN); $NOW = time(); if(($NOW - $get_unix) < 60*60){ //60分未満 echo file_get_contents("XML/".$FFN);//直近に生成されたものをそのまま表示 }else{ //60分以上だったら /*******************************************/ //生成処理 /*******************************************/ //$XXX $XXX = '<?xml version="1.0" encoding="utf-8"?>'; // RSS取得と翻訳、再出力処理 //保存 $fp = fopen("XML/".$FFN, "w"); fwrite($fp, $XXX); fclose($fp); //出力 echo $XXX; /*******************************************/ //生成処理(ここまで) /*******************************************/ } ?>
window.onload = function() {
dp.SyntaxHighlighter.ClipboardSwf = ‘http://tmh.main.jp/lib/js/dp.SyntaxHighlighter/Scripts/clipboard.swf’;
dp.SyntaxHighlighter.HighlightAll(‘code’);
};