R.swift は知らないです
使用例
Localizable.strings
"test 1" = "test 1";
"テスト 2" = "test 2";
"format_test1" = "format test 1 %@";
"フォーマットテスト3%@" = "format test 3 %@";
Hoge.swift
func do() {
print("test_1".localized) // ログ:test 1
print("テスト 2".localized) // ログ:test 2
print("テスト 3".localized) // ログ:テスト 3
print("format_test1".localized("unko")) // ログ:format test 1 unko
print("format_test2".localized("unko")) // ログ:format_test2
print("フォーマットテスト3%@".localized("unko")) // ログ:format test 3 unko
print("フォーマットテスト4%@".localized("unko")) // ログ:フォーマットテスト4unko
print("format_test1".localized()) // ログ:format test 1 (null)
print("format_test2".localized()) // ログ:format_test2
print("フォーマットテスト3%@".localized()) // ログ:format test 3 (null)
print("フォーマットテスト4%@".localized()) // ログ:フォーマットテスト4(null)
}
コード
extension
extension String {
var localized: String {
return NSLocalizedString(self, comment: "")
}
func localized(_ args: CVarArg...) -> String {
return NSString(format: NSLocalizedString(self, comment: ""), arguments: getVaList(args)) as String
}
}
備考
- args になにも入れないと、
args.count == 0
となって、(null) って表示されるけど、その辺は好きに - args じゃなく
getVaList(args)
としてるのは、
args の型が[CVarArg]
となってるせいで、それをそのまま入れると配列としての表示になっちゃうから変換しないとダメ - getVaList(args) の型は
CVaListPointer
だけど、これをうまくなんかやってくれるのはNSString(format: String, arguments: CVaListPointer)
しかなかった - ロガーつくってみたとか書いてるページで CVaListPointer に言及してるページ見つけられなかったけど、なんでや
参考
getVaList とかあるんだ、って知ったページ
Swiftで引数リスト(CVaListPointer)の渡し方 - The Pragmatic Ball boy
http://yanamura.hatenablog.com/entry/2015/02/11/222814