環境
Xcode 14.2
iOS 16.2
概要
SwiftUIでTextとstringdictファイルを使って、複数形対応を行います。
複数形対応
得点などを示す英語pointを例としてみます。
1点を表す場合、one pointとなりますが、複数の得点がある場合はthree pointsなどpointの部分が複数形に変化します。また得点が0の場合もno pointsなどと表現すると思います。
そのような、値によって変化するテキストに対してstringdictでの対応を行います。
設定方法に関しては 公式ドキュメント を参照してください。
SwiftUIによる複数形対応
実際にSwiftUIに複数形対応を行なっていきます。
複数形で表示したいTextを用意
まずは、得点を表現するTextを用意します。
以下は得点を表示するTextと、得点を操作するStepperで構成しています。
Textの中身は変数を含んだ文字列にします。実際に使う場合はユニークな文字列がいいです。
struct ContentView: View {
@State private var point = 0
var body: some View {
VStack {
Text("\(point) points")
Stepper(value: $point, in: 0...100) {
Text("Counter")
}
}
}
}
複数形対応対象のキー名を取得 (省略可能)
ツールバーのProduct→Export Localizations...でxclocファイルが出力されますので、そこから該当のキーを確認してコピーします。
コピーすることでキーを確実にstringdictファイルに入力するのが目的ですが、キーは数値部分が %lld と変換されているものになるので、不要であればこのステップは飛ばしてください。
stringdictに該当のキーで値を設定
あとはstringdictに先ほどのキー %lld points を追加します。以下の例では、数値が0の場合は No points、ポイントが1の場合は 1 point、それ以外の場合は pointsの複数形で表示されます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>%lld points</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>lld</string>
<key>zero</key>
<string>No points</string>
<key>one</key>
<string>%lld point</string>
<key>other</key>
<string>%lld points</string>
</dict>
</dict>
</dict>
</plist>
動作
以下はシミュレータでの動作の様子です。
ちなみに、stringdictはLanguage Plural Rulesに準拠しているようなので、動作確認するにはシミュレータの言語をEnglishなどのoneに対応した言語で確認する必要があります。