String Catalogで、%を使うやつまとめ【順番制御、数値表示のフォーマット、複数形】
環境
Xcode 15.2 でプロジェクト作成
整数
完成形は
Type1 is Integer 1
これになるためのコードは
let a = 1
let text1 = String(localized: "Type1 \(a)")
print(text1)
xcstrings(左がkey)は
小数
完成形は
Type2 is float 2.000000
これになるためのコードは
let b = 2.0
let text2 = String(localized: "Type2 \(b)")
print(text2)
xcstrings(左がkey)は
複数のもの(順番制御も可能)
完成形は
Type3 is ordered 4 3
順番が4 3ですが、xcstringsファイルの方で制御して反対にします。
これになるためのコードは
let c = 3
let d = 4
let text3 = String(localized: "Type3 \(c) \(d)")
print(text3)
xcstrings(左がkey)は
引数の1つ目は $1
と書きそうな気がしますが、 1$
と書くようです。
表示フォーマットを指定
完成形は
Type4 is formatted 005 6.00
005は頭に0を付けて3桁、6.00は小数点以下は2桁を指定します。
これになるためのコードは
let e = 5
let f = 6.0
let text4 = String(localized: "Type4 \(e) \(f)")
print(text4)
xcstrings(左がkey)は
ちなみに
順番を変えて表示形式も指定するなら %2$.2lf
%1$03lld
のようにすると出来ます。
考察
複数形(この記事では扱っていない)も含めるとややこしいですが、次のように考えるとイメージ出来る(合っているかは知らない)。
-
String
にはString(format: "%2$.2lf %1$03lld", e, f)
という、表示形式と順番をコントロールして文字列を生成出来るものがある。裏でこれを使う。 - 開発者が書いた
String(localized: "Type4 \(e) \(f)")
はType4 %lld %lf
のような基本キーに対応し、開発者はxcstrings上でそのキーの情報を書く。開発者がxcstrings上で複数形の対応をしたらキー(とその内容)も増える。 - 実行時、
String(localized: "Type4 \(e) \(f)")
のところで、基本キーとe
とf
の値が制御部に渡される。 - 複数系への対応も考慮し(つまり
e
やf
の値を見て)、本キーが決定する - 本キーを使ってxcstringsから取り出した文字列
Type4 is formatted %2$.2lf %1$03lld
とe
f
の値をString(format: "Type4 is formatted %2$.2lf %1$03lld", e, f)
に渡す。 - 完成
xcstringsファイルは、従来型のstringsファイルに変換されるそうなので(実行時にはstringsファイルなっている?)それも考慮して考えました。繰り返しになりますが、実際の仕組みを説明しているのではなく、こう考えるとつじつまが合うというのを紹介しているだけです。
追記:複数形もやってみた
複数形は項目を選択して右クリックして複数形 Vary By Plural
を選ぶ。そこまでは難しくない。ところが、英語と日本語で語順が違うので変数部分 @arg1
を手動で入れたい。その方法は、1つ目の変数なら
%#@arg1@
パーセント シャープ アットマーク arg1 アットマーク
です。たぶん @arg1
@arg2
の入れ方に悩むことが多いかと思います。
追記:小ネタ
String(localized: "Type1 \(a)")
はaがネタとして渡されます。
NSLocalizedString("Type1 \(a)", comment: "")
は Type1 (a)
というキーが生成されるようです。
String(localized: "")
が使えるのはiOS15からです。
String Catalogsのその他の記事です。
Discussion