🌐

String Catalogで、%を使うやつまとめ【順番制御、数値表示のフォーマット、複数形】

2024/01/31に公開

環境

Xcode 15.2 でプロジェクト作成

整数

完成形は

Type1 is Integer 1

これになるためのコードとxcstrings(左がkey)は

let a = 1
let text1 = String(localized: "Type1 \(a)")
print(text1)

小数

完成形は

Type2 is float 2.000000

これになるためのコードとxcstrings(左がkey)は

let b = 2.0
let text2 = String(localized: "Type2 \(b)")
print(text2)

複数のもの(順番制御も可能)

完成形は

Type3 is ordered 4 3

順番が4 3ですが、xcstringsファイルの方で制御して反対にします。

これになるためのコードとxcstrings(左がkey)は

let c = 3
let d = 4
let text3 = String(localized: "Type3 \(c) \(d)")
print(text3)

引数の1つ目は $1 と書きそうな気がしますが、 1$ と書くようです。

表示フォーマットを指定

完成形は

Type4 is formatted 005 6.00

005は頭に0を付けて3桁、6.00は小数点以下は2桁を指定します。

これになるためのコードとxcstrings(左がkey)は

let e = 5
let f = 6.0
let text4 = String(localized: "Type4 \(e) \(f)")
print(text4)

ちなみに

順番を変えて表示形式も指定するなら %2$.2lf %1$03lld のようにすると出来ます。

考察

複数形(この記事では扱っていない)も含めるとややこしいですが、次のように考えるとイメージ出来る(合っているかは知らない)。

  1. String には String(format: "%2$.2lf %1$03lld", e, f) という、表示形式と順番をコントロールして文字列を生成出来るものがある。裏でこれを使う。
  2. 開発者が書いた String(localized: "Type4 \(e) \(f)")Type4 %lld %lf のような基本キーに対応し、開発者はxcstrings上でそのキーの情報を書く。開発者がxcstrings上で複数形の対応をしたらキー(とその内容)も増える。
  3. 実行時、 String(localized: "Type4 \(e) \(f)") のところで、基本キーと ef の値が制御部に渡される。
  4. 複数系への対応も考慮し(つまり ef の値を見て)、本キーが決定する
  5. 本キーを使ってxcstringsから取り出した文字列 Type4 is formatted %2$.2lf %1$03llde f の値を String(format: "Type4 is formatted %2$.2lf %1$03lld", e, f) に渡す。
  6. 完成

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のその他の記事です。

https://zenn.dev/samekard_dev/articles/436b1adb3f7890

Discussion