読者です 読者をやめる 読者になる 読者になる

なか日記

一度きりの人生、楽しく生きよう。

Groovyを使って多言語対応時のstring.xmlの生成を行う

多言語対応のAndroidアプリを作成するとき、string.xmlを各言語毎にメンテするのって面倒ですよね。というわけで、最近本を読んでるGroovyを使って、Excelシートから各言語用のstring.xmlを作成するスクリプトを作ってみました。

下準備

Groovyのインストールと設定
  • インストール
  • 環境変数の設定
    • JAVA_HOME
    • GROOVY_HOME
    • PATH
POIのダウンロードと配置

Excelを読み込むのにPOIを使用しているので、ダウンロードして特定のディレクトリに格納しておきます。
Grape使ったら勝手にごにょごにょしてくれるのかもしれませんが、まだ勉強中なので…

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でできればお手軽なんですけどね。