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
最近のコメント