海外ニュースを翻訳して日本語タイトルでの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)。
2004

mimi RSSリーダーに、以下の和訳RSSを指定し、翻訳されたRSSデータとして読み込む。まあなんとなく雰囲気はわかる感じ・・・

和訳RSS http://×××/××/××/mi/rss.php?url=[翻訳したい英語のRSSフィード]

2003

以下のように、翻訳対象の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’);
};

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です