Swiftファイルからローカライズに必要なLocalizable.stringsを作るシェルスクリプト

2016年8月23日(更新: 2016年9月19日)

iOSアプリの他言語化には、他言語対応したい部分の文字列をマクロ NSLocalizedString(key, comment) で書く必要があります。

今回は.swiftファイルに含まれる NSLocalizedString を検索して、ローカライズに必要な Localizable.strings を自動的に作成して他言語対応を簡単にするシェルスクリプトの作り方を紹介します。

Localizable.stringsの自動生成スクリプト

動作確認環境

  • Mac OS X El Capitan 10.11.5
  • GNU bash, version 3.2.57

スクリプトの動作について

今回解説するスクリプトは NSLocalizedString(key, comment) を探し出して “key”=”comment”; の形式に整形するものです。つまり、

NSLocalizedString("英語", comment: "コメント")

これを

"英語"="コメント";

に変換して Localizable.strings として保存します。

したがって、このスクリプトを使って日本語化する場合は、comment: の部分に日本語を入れる必要があることに注意してください。

また、括弧を検索範囲の区切りとして使用しているため、NSLocalizedString の引数の中でカッコを使っていないことも条件となります。

スクリプトのコード

#!/bin/sh

#.swiftからLocalizable.stringsを生成するシェルスクリプト

FILENAME="Localizable.strings"
TEMPFILE="temp"

# NSLocalizedStringの部分を抜き出す
grep -o -e NSLocalizedString\.*\) *.swift > ${TEMPFILE}

# 余計な部分を削除して必要な記号を追加する
# BSDのsedの場合は -i の後に空文字を指定しないと上書きにならない
sed -i "" -e "s/.*NSLocalizedString(//g" ${TEMPFILE}
sed -i "" -e "s/).*/;/g" ${TEMPFILE}
sed -i "" -e "s/, *comment: */=/g" ${TEMPFILE}

# 重複行を削除
cat ${TEMPFILE} | sort | uniq > ${FILENAME}

# 一時ファイルの削除
rm -f ${TEMPFILE}

スクリプトの動作例

例えば以下のようなソースコードがあるとします。これはボタンのタイトル部分にローカライズを施したものです。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 検索ボタン
        let searchButton = UIButton()
        searchButton.backgroundColor = UIColor.redColor()
        searchButton.setTitle(NSLocalizedString("Search", comment: "検索"), forState: .Normal)
        self.view.addSubview(searchButton)
        
        // 実行ボタン
        let runButton = UIButton()
        runButton.backgroundColor = UIColor.redColor()
        runButton.setTitle(NSLocalizedString("Run", comment: "実行"), forState: .Normal)
        self.view.addSubview(runButton)
        
        // 削除ボタン
        let deleteButton = UIButton()
        deleteButton.backgroundColor = UIColor.redColor()
        deleteButton.setTitle(NSLocalizedString("Delete", comment: "削除"), forState: .Normal)
        self.view.addSubview(deleteButton)
    }
}

このswiftファイルが保存されているディレクトリでこのスクリプトを実行します。すると、同じディレクトリに以下のような内容を持った Localizable.strings が生成されます。

"Delete"="削除";
"Run"="実行";
"Search"="検索";

あとはXcode上でローカライズの手続きを行えば、文字列の他言語化は完了です。

コメントを残す

メールアドレスが公開されることはありません。