LoginSignup
2

SwiftUI Textで複数形に対応する

Posted at

環境

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 と変換されているものになるので、不要であればこのステップは飛ばしてください。

スクリーンショット 2023-05-11 16.46.08.png

stringdictに該当のキーで値を設定

あとはstringdictに先ほどのキー %lld points を追加します。以下の例では、数値が0の場合は No points、ポイントが1の場合は 1 point、それ以外の場合は pointsの複数形で表示されます。

スクリーンショット 2023-05-11 17.12.07.png

<?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に対応した言語で確認する必要があります。

Simulator Screen Recording - iPhone 14 Pro - 2023-05-11 at 17.10.07.gif

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2