多言語対応のAndroidアプリを作成するとき、string.xmlを各言語毎にメンテするのって面倒ですよね。というわけで、最近本を読んでるGroovyを使って、Excelシートから各言語用のstring.xmlを作成するスクリプトを作ってみました。
下準備
Groovyのインストールと設定
- インストール
- 環境変数の設定
- JAVA_HOME
- GROOVY_HOME
- PATH
POIのダウンロードと配置
Excelを読み込むのにPOIを使用しているので、ダウンロードして特定のディレクトリに格納しておきます。
Grape使ったら勝手にごにょごにょしてくれるのかもしれませんが、まだ勉強中なので…
- ダウンロード
- 解凍した「poi-3.7-20101029.jar」をホームディレクトリ配下の.groovy/libに格納
string.xml用Excelファイル
以下のようなExcelファイルを作成します。
書き方はこんな感じ
- 形式:Excel97-2003形式
- ファイル名:何でもいい
- シート:1シート目
- 各セルの内容
- A1:"name"固定
- B1〜n1:出力先のディレクトリ
- A2〜An:
のXXX部分 - 「NOTE:」を書くとコメントを出力
- B2〜nn:言語別の文字列
スクリプト
で、作ったスクリプトがこんな感じ。
本物のGroovyst(っていうのか?)が書くともっとシンプルになるんでしょうけどね。
CreateString.groovy
import org.apache.poi.hssf.usermodel.* import org.apache.poi.poifs.filesystem.* //引数のチェック def cli = new CliBuilder(usage:"groovy CreateString.groovy -f filename") cli.with { f longOpt:"file", required:true, args:1, "読み込みファイル名" } def options = cli.parse(args) if (!options) return; //メインの処理 header = '<?xml version="1.0" encoding="utf-8"?>\n<resources>\n' footer = '</resources>\n' //引数のExcelファイルから1シート目をゲット poifs = new POIFSFileSystem(new BufferedInputStream(new FileInputStream(options.f))) sheet = new HSSFWorkbook(poifs).getSheetAt(0) //一行目を横に走査 sheet.getRow(0).eachWithIndex { cell, i -> String contents="" if (cell.toString() != "name") { //ID以外の項目があれば、縦に走査して文字string.xml作成 sheet.each { row -> String name = row.getCell(0).toString() if (name !="name" && !name.startsWith("NOTE:")){ contents += ' <string name="' + row.getCell(0) + '">' + row.getCell(i) + '</string>\n' }else if(name.startsWith("NOTE:")){ contents += '<!-- ' + name.replace("NOTE:", "") + ' -->\n' } } contents = header + contents + footer new File(cell.toString()).mkdirs() new File(cell.toString() + "\\strings.xml").withWriter("UTF-8") { writer-> writer << contents } } }
使い方
groovy CreateString.groovy -f hoge.xls
ExcelのB1〜n1セルに書き込んだ場所にstring.xmlが作成されます。
res\values-ja\string.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hoge">ほげ</string> <string name="fuga">ふが</string> <!-- 曜日 --> <string name="sun">(日)</string> <string name="mon">(月)</string> <string name="tue">(火)</string> <string name="wed">(水)</string> <string name="thu">(木)</string> <string name="fri">(金)</string> <string name="sat">(土)</string> </resources>
課題:どう使うのがいいか
今の知識ではeclipseの外部ツールとして登録しておいて、Excelファイルを修正したら手動で実行するくらいしかできそうにないですね。
Excelファイルが修正されたら勝手にコマンドが動いて…というようなことがeclipseでできればお手軽なんですけどね。