Index > 日本語XML文書を英語に翻訳する(GoogleのTranslate API を使用)
Thu, August 27, 2009

日本語XML文書を英語に翻訳する(GoogleのTranslate API を使用)

Google Translate API を使うといろいろな言語に品質はともかく簡単に翻訳することができます。

今回は、 前回のエントリXML文書から テキストノード text() を抜き出す方法 とGoogle TranslateAPIを使って、日本語XML文書を英語に翻訳してみます。

XMLを使った多言語展開のドキュメント制作においては、 元になる言語のマニュアルが完成すれば、あとは基本的にXML文書さえ翻訳すれば 多言語のマニュアルはほぼ完成します...と言いたいところですが、 実際は多言語に展開するにあたって、その展開先言語に固有の問題があり、 それに対処しなければなりません。

たとえば、日本語から英語に翻訳する場合、 文字量が変わる(増える)ことによるレイアウト調整や改ページ位置の調整などの ページネーション処理が必要になります。

したがって、実際の翻訳前に機械的に翻訳した英語データを使ってレイアウト調整を 行うことは意味があります。

Google Translate API にアクセスして日本語を英語に翻訳

Google Translate API はとてもシンプルです。説明ページにある通りですが、 Jythonに置き換えると以下のコードになります。

import java
import com.google.api.translate as trans

def translate( text ):
    if java.lang.String(text).trim()=='':
        return text
    try:
        trans.Translate.setHttpReferrer("http://code.google.com/p/google-api-translate-java/")
        return trans.Translate.execute(text, trans.Language.JAPANESE, trans.Language.ENGLISH)
    except :
        return text

全体をまとめる

Google Translate APIによる翻訳と、 前回のエントリXML文書から テキストノード text() を抜き出す方法 とを組み合わせて 以下の手順で、日本語XML文書を英語XML文書に変換します。

  1. XML文書からJDOMを使ってテキストノードを取得
  2. 日本語から英語に翻訳
  3. 翻訳文字列を元の場所にセット

まとめると以下のようになります。

import java
import org.jdom as jdom
import com.google.api.translate as trans


def translate( text ):
    if java.lang.String(text).trim()=='':
        return text

    try:
        trans.Translate.setHttpReferrer("http://code.google.com/p/google-api-translate-java/")
        return trans.Translate.execute(text, trans.Language.JAPANESE, trans.Language.ENGLISH)
    except :
        return text


class TextNodeFilter(jdom.filter.Filter):

    def matches(self,obj) :
        if java.lang.String( str(obj.getClass()) ).indexOf('org.jdom.Text')!=-1 :
            return True
        else :
            return False


TEXT_NODE_FILTER=TextNodeFilter()


def parse( ele ):
    list=ele.getContent(TEXT_NODE_FILTER)
    for textObj in list :
        textObj.text = translate( textObj.text )


    for e in ele.children :
        parse( e )


fin  = java.io.File('sample_ja.xml')
fout = java.io.File('sample_en.xml')

doc=jdom.input.SAXBuilder().build(fin)
parse( doc.rootElement )

w=java.io.OutputStreamWriter(java.io.FileOutputStream(fout),'UTF-8')
myformat=jdom.output.Format.getPrettyFormat()
myformat.setEncoding('UTF-8')
xout=jdom.output.XMLOutputter(myformat)
xout.output(doc,w)
w.close()

テスト

実際にサンプルXML文書を使ってテストしてみます。

日本語XML文書

<?xml version="1.0" encoding="UTF-8" ?>
<book>
    <chapter>
        <title>不思議の国のアリス</title>
        <sect1>
            <title>うさぎの穴をまっさかさま</title>
            <para>アリスは川辺でおねえさんのよこにすわって、なんにもすることがないのでとても退屈(たいくつ)しはじめていました。</para>
        </sect1>
    </chapter>
</book>

英語XML文書(翻訳後)

<?xml version="1.0" encoding="UTF-8"?>
<book>
  <chapter>
    <title>Alice's Adventures in Wonderland</title>
    <sect1>
      <title>Ramstam the rabbit hole</title>
      <para>Alice's older sister was sitting sideways in the river, so do not be boring Iwazuni (Tsuta Iku) was beginning to.</para>
    </sect1>
  </chapter>
</book>
 Twitter
follow me on Twitter
 Categories