まだStoryboardの多言語対応で消耗してるの?ローカライズの最強ベストプラクティス対応法
storyboardにローカライズのキーを指定できるようにする
1 2 3 4 5 6 7 8 9 10 11 |
<code>extension UILabel { @IBInspectable private var localizedKey: String? { get { fatalError("only set this value") } set { if let newValue = newValue { text = newValue.localized() } } } }</code> |
1 2 3 4 5 |
<code>extension String { func localized() -> String? { return NSLocalizedString(self, comment: "") } }</code> |
ローカライズのキーtypoを防ぐ その1
このままだと、typoとかしたときにローカライズのキーがそのまま表示されてしまうのでローカライズ漏れに気づけるように改良してみました。
1 2 3 4 5 6 7 8 9 10 |
<code>extension String { private static let localizedEmptyKey = "##not exists##" func localized() -> String { let string = NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: String.localizedEmptyKey, comment: "") if string == String.localizedEmptyKey { fatalError("not exists localized key") } return string } }</code> |
ローカライズのキーtypoを防ぐ その2
その1の対応だと、画面を表示したときでないとtypoに気づけません。 そこで、ビルド時にキーのチェックをしてtypoに気づけるようにさらに改良してみました。 Build Phasesに下記スクリプトを追加するだけ!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash for file in `\find . -name \*.storyboard`; do IFS=$'\n' for xmlKey in `\grep 'keyPath="localizedKey"' ${file}`; do localizedKey=`echo $xmlKey | sed -e 's/.* keyPath="localizedKey" value="\([0-9a-zA-Z_-]*\)".*/\1/g'` for localizedStringFile in `\find ${SRCROOT} -name Localizable.strings`; do grep "\"${localizedKey}\" =" $localizedStringFile > /dev/null 2>&1 if [ $? != 0 ]; then echo "not exists key '${localizedKey}' in ${localizedStringFile}" exit 1 fi done done done |