酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

GoogleドキュメントのスプレットシートからiOSとAndroidの文字列リソースを作ってみた!

Googleドキュメントのスプレットシートから、iOSのLocalizable.stringsとAndroidのstrings.xml を作成するツール「csv2strings」を作成しました。

csvからiOSとAndroidの文字列リソースを作成するという 一億番煎じ二番煎じのツールです。

色リソースは clg を使って生成している

過去に開発していたアプリは、少し特殊で年に2回だけアップデートしていました。アプリの構成自体はほぼほぼ同じなのですが、アップデートのたびにテーマが異なっており色リソースをまるっと変える必要がありました。

JSONファイルをデータソースとして、 griffin-stewieさんが開発した「clg」を使って、iOS/Android向けの色リソースを生成していました。当初はAndroid向け色リソースファイル(colors.xml)の生成に失敗していたので、何度かPull Requestを送ってマージしていただきました。*1

長年に渡る経験から色リソースの変更に関してはノウハウがあったのですが、文字列リソースについては特に変更する必要がなかったのもあってノウハウがありませんでした。

Google Docsをデータソースにして文字列リソースを生成する

現在開発しているアプリでは、翻訳データを社外のひとが作成することになりました。

日本語だけであれば、翻訳済みのエクセルファイルからポチポチコピペして Localizable.strings を作成してから 「Convert iOS strings to Android XML」を使ってstrings.xml を生成すればいいやと考えていました。

突然、英語・韓国語・中国語(繁体/簡体)の対応がきまり、これはポチポチコピペするのは不可能だなと悟りました。5言語 x 2プラットフォーム を対応するのは骨が折れそうです。時間もかなり無駄になりますし、手作業でやるとコピペミスが怖いです。

英語であればある程度のコピペミスを見ればわかりますが、韓国語となるとコピペに召しているのかどうかすら判断が難しくなります。中国語に関しても同じことが言えますが漢字を見ればそこそこわかってしまうのです。

今後「文言ファイルをちょっと変更しました」「え、どこ変えた?」とやりとりすることも想定できるので、Google Docsをみんなで共有し、それをデータソースにしてiOS/Android共有のローカライズファイルを作成することにしました。

この時に参考にしたのはクラメソ社のブログで紹介されている下記の方法です。

スプレットシート側にスクリプトを書きたくない、生成した文言を手作業でコピペしないといけない、とのことで今回の要件にはマッチしませんでした。

バッチ1本で文字列リソースを展開する

このブログの配布・配信ポケモン一覧は、Google Docsのスプレットシートに必要なデータを書いて、バッチを実行して はてなブログを更新する方法を取っています。同じ要領で文字列リソースを生成できるようにしたいと考えました。

「csv2strings」ではあんまり難しいことはしていません。csvを食って idをベースにして Localizable.stringsとstrings.xmlを出力するだけです。

f:id:ch3cooh393:20190721151231p:plain

バッチ1回叩けば、Google Docsに書かれた最新の文言がアプリに反映されるようにしました。

# Google Docsからcsvをダウンロードする
curl -L "https://docs.google.com/spreadsheets/{GUID}&output=csv" -o "${ENV_RESOURCES_DIR}strings/string.csv"
sleep 5

# csvから文字列リソースを生成
./bin/csv2strings "${ENV_RESOURCES_DIR}strings/string.csv" "${ENV_RESOURCES_DIR}strings/"

# アプリへ展開
cp $ENV_RESOURCES_DIR/strings/ios/ja/Localizable.strings $PROJECT_DIR/ios/ptcgnote/Resource/ja.lproj/Localizable.strings

金曜日に作成して、週末に「ptcgnote」の更新作業で使ってみました。いくつか問題が発覚して修正しましたが、概ねこのまま使うことができそうです。clgのようにCSNCommanderを使ってコマンドオプションを取るようにしたいですね。

*1:Swift 5対応もしないと……