xfy/xvcd の言語リソース編集ツールが欲しい (その3)
さらにすこし変更した。
* 管理ファイル-> xfy の resource ファイル変換 の ruby スクリプト
(日本語が &%xxxx; になってしまっていたので修正した)
* 管理ファイル <-xfy の resource ファイル変換 の ruby スクリプト
(逆変換を追加)
管理ファイル-> xfy の resource ファイル変換 ===================================
$ cat res2langs.rb
# usage: $ ruby res2langs res.file
# output to en/*.resource, ja/*.resource
require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'pp'def generate(doc)
res = Hash.new
doc['category'].each {|c|
res[c['name']] = generateByCategory(c)
}
return res
enddef getLangs(cat)
langs = Array.new
cat['item'].each {|item|
item['message'].each {|m|
langs << m['lang']
}
}
langs.uniq!
return langs
enddef generateByCategory(cat)
xmls = Hash.new
langs = getLangs(cat)
langs.each {|lang|
xmls[lang] = generateByLang(cat, lang)
}
return xmls
enddef generateByLang(cat, lang)
str = ""
xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
xm.instruct!
xm.tag!('resource:resources', 'xmlns:resource'=>'http://xmlns.xfy.com/resource') {
cat['item'].each {|item|
item['message'].each {|m|
if m['lang'] == lang
xm.tag!('resource:string-resource', {:name=>item['id']}, m['content'])
end
}
}
}str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
return str
end
#==========================================
doc = XmlSimple.xml_in File.open(ARGV[0])
xmls = generate(doc)xmls.each {|cat,v|
v.each {|lang, x|
Dir::mkdir(lang) if !FileTest.exist?(lang)
File::open("#{lang}/#{cat}.resource", "w") {|f|
f.write x
}
}
}
管理ファイル <-xfy の resource ファイル変換
===================================
$ cat langs2res.rb
# usage: $ ruby langs2res.rb init a.xml -ja ja/*.resource -en en/*.resource
# output marged data to a.xmlrequire 'rubygems'
require 'builder'
require 'xmlsimple'
require 'kconv'
require 'pp'def usage(str)
puts str
puts "usage: ruby lang2res.rb [init|import] res.xml [-ja|-en] foo.xml ... "
puts " ex: ruby lang2res.rb init res.xml -ja ja/*.resource -en/*.resousrce"
abort
enddef readLangResource(cats, lang, f)
doc = XmlSimple.xml_in File.open(f)
cat = File.basename(f, ".resource")catIndex = searchByCat(cats, cat)
cats.push({cat=>Array.new}) if catIndex < 0
catIndex = searchByCat(cats, cat)doc["string-resource"].each {|m|
name = m["name"]
val = m["content"]nameIndex = searchByName(cats[catIndex], name)
cats[catIndex][cat].push({name=>Array.new}) if nameIndex < 0
nameIndex = searchByName(cats[catIndex], name)
cats[catIndex][cat][nameIndex][name].push({:lang=>lang, :message=>val})
}
enddef searchByCat(cats, cat)
cats.each_with_index {|v, index|
return index if v.key?(cat)
}
return -1
enddef searchByName(cat, name)
cat.each_with_index {|v, index|
return index if v==name
}
return -1
enddef doImport(res, cats, ja, en)
ja.each {|j|
readLangResource(cats, 'ja', j)
}en.each {|e|
readLangResource(cats, 'en', e)
}writeRes(res, cats)
enddef writeRes(res, cats)
str = ""
xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
xm.instruct!
xm.instruct!("com.xfy vocabulary-connection", :href=>"resedit.xvcd")
xm.tag!('r:categories', 'xmlns:r'=>'http://xmlns.example.com/developer/tutorial/resedit') {
cats.each {|cat|
cat.each {|label,items|
xm.tag!('r:category', :name=>label) {
items.each {|item|
item.each {|id, array|
xm.tag!('r:item', {:id=>id}) {
array.each {|m|
xm.tag!('r:message', {:lang=>m[:lang]}, m[:message])
}
}
}
}
}
}
}
}
str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
File::open(res, "w") {|f|
f.write str
}
end#==========================================
command = ARGV.shiftoutRes = ARGV.shift
ja = Array.new
en = Array.new
lang = ""while arg = ARGV.shift
case arg
when "-ja"
lang = arg
when "-en"
lang = arg
else
ja << arg if lang == "-ja"
en << arg if lang == "-en"
end
endcase command
when "init"
cats = Array.new
doImport(outRes, cats, ja, en)
when "import"
cats = readResource(outRes) # not yet implemented
doImport(outRes, cats, ja, en)
else
usage("illegal argument #{command}")
end
つぎは、編集用の xvcd ファイルをきちんと作って公開しよう。
できたら、plugin 作成の ant build.xml に 管理ファイル -> リソースファイル
の変換を組み込み、開発時は、管理ファイルの編集をするだけで、言語リソース編集が済むようにしたい。
« google 製のブックカバー | トップページ | ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... »
この記事へのコメントは終了しました。
« google 製のブックカバー | トップページ | ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... »
コメント