Googleドキュメントのスプレッドシートから、iOSアプリ向けの Localizable.strings
と Androidアプリ向けの strings.xml
を作成するツール「csv2strings」を作成しました。
csvファイルからiOSとAndroidの文字列リソースを作成するという二番煎じのツールです。既存のものは期待するフォーマットでの運用ができないため自作しました。自作といっても csvをパースして適当なフォーマットに落とし込むだけのものです。
色リソースは 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
を生成すればいいやと考えていました。
突然、英語・韓国語・中国語(繁体/簡体)の対応がきまり、ノってきたのかドイツ語・イタリア語・フランス語とどんどん対応言語が増えることになりました。これはポチポチ手でコピペするのは不可能だなと悟りました。複数の言語 x 2プラットフォーム を対応するのは骨が折れそうです。時間もかなり無駄になりますし、手作業でやるとコピペミスが怖いです。
英語であればある程度のコピペミスを見ればわかりますが、韓国語となるとちゃんと対応した言葉にコピペしているのかどうかすら判断が難しくなります。中国語に関しても同じことが言えますが漢字を見ればそこそこわかってしまうのです。
今後「文言ファイルをちょっと変更しました」「え、どこ変えた?」とやりとりすることも想定できるので、Google Docsをみんなで共有し、それをデータソースにしてiOS/Android共有のローカライズファイルを作成することにしました。
この時に参考にしたのはクラメソ社のブログで紹介されている下記の方法です。
スプレットシート側にスクリプトを書きたくない、生成した文言を手作業でコピペしないといけない、とのことで今回の要件にはマッチしませんでした。
バッチ1本で文字列リソースを展開する
このブログの配布・配信ポケモン一覧は、Google Docsのスプレットシートに必要なデータを書いて、バッチを実行して はてなブログを更新する方法を取っています。同じ要領で文字列リソースを生成できるようにしたいと考えました。
「csv2strings」ではあんまり難しいことはしていません。csvを食って idをベースにして Localizable.strings
と strings.xml
を出力するだけです。
バッチ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対応もしないと……