Category Archives: Android

XMLを解析して和訳するRubyスクリプト REXML、Microsoftの翻訳APIを使用

Androidのアプリを日本語化したくなったのでXMLを和訳していたんですが、面倒になったのでスクリプトをサクっと書いて見ました。RubyでXMLを構文解析して読み取り、Microsoftの翻訳APIを利用し自動で機械翻訳して再びXMLで出力しちゃいます。XMLを翻訳して出力プログラムはあまり見かけないのでそれなりに需要があるかなと思い公開してみました。

結構最近は機械翻訳も精度が上がっているようですねw 驚かされました。数百数千行を一個一個手動で訳すよりはある程度自動化したほうが楽ですよね~

※ 機械翻訳は万能ではないのでそれなりに変な訳が出力されます。← 言い切ります
※ リビルドする時にエラーが発生するかもしれませんがその時は手動で直してください。
(多分エディタの自動置換機能とか使えば全然大したことはないと思います)
※ APPIDは下記の参考にさせて頂いたサイト(simultechnology.blog様)を参考にしてください。

#!/usr/bin/ruby -KU
require 'net/http'
require 'rexml/document'
require 'json'

#----------(Settings)----------#
in_file = "strings.xml"
ex_file = "strings_.xml"
$debug = true
$sleep = 3
$appid = "*************************"
#------------------------------#

$rank = 0

def sp
  "  " * $rank
end
def run elem
  if $debug
    print "================================\n"
    print sp + "name : #{elem.name}\n"
    attrs = elem.attributes
    attrs.each{|a,e|
      print sp + "attr : #{a} = #{e}\n"
    }
    print sp + "text : \n--\n#{elem.text}\n--\n"
  end

  if elem.text =~ /\w/ then
    text = URI.escape(elem.text)
    h = Net::HTTP.new("api.microsofttranslator.com")
    response = h.get("/V2/Http.svc/Translate?appid=#{$appid}&from=en&to=ja&text=#{text}")

    if response.message == 'OK'
      doc = REXML::Document.new(response.body)
      elem.text = doc.root.text
    end
  end

  print "#{elem.text}\n"
  sleep $sleep

  if elem.has_elements? then
    elem.each_element{|e|
      $rank += 1
      run e
      $rank -= 1
    }
  end
end

doc = REXML::Document.new(File.new(in_file))
run doc.root
doc.write(File.new(ex_file, "w"))

プログラムを書く上で参考にさせて頂いたサイト
REXML であそぶ http://www.namikilab.tuat.ac.jp/~sasada/prog/rexml.html
simultechnology.blog http://simultechnology.blendmix.jp/blog/archives/1101