📙

stringsdict で文字列と整数混じりのローカライズを行う方法

2021/04/29に公開

stringsdict について

ローカライズの際、複数形対応を行う時に利用するファイルである stringsdict ファイルですが、基本的には以下のような形で記述するかと思います。

Plural.stringsdict
<?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>sample_key</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>I have %#@pen@</string>
        <key>pen</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>a pen</string>
            <key>other</key>
            <string>%1$d pens</string>
        </dict>
    </dict>
</dict>
</plist>

上記のような Plural.stringsdict を利用すれば、例えば R.swift だと以下のように扱うことができると思います。

R.string.plural.sample_key(pen: 1) // "I have a pen"
R.string.plural.sample_key(pen: 2) // "I have 2 pens"

stringsdict 内で文字列を扱いたい時はどうする?

仮に先ほど sample_key として定義した I have a pen 的な文章の「I」を任意の文字列にしたいとした場合、以下のように stringsdict ファイルを記述すれば実現することができます(have の形については気にしないことにします)。

Plural.stringsdict
<?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>sample_key</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%1$@ have %2$#@pen@</string>
        <key>pen</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>a pen</string>
            <key>other</key>
            <string>%1$d pens</string>
        </dict>
    </dict>
</dict>
</plist>

これで、例えば R.swift を利用していれば以下のように記述することができます。

R.string.plural.sample_key("You", 1) // You have a pen
R.string.plural.sample_key("Mike", 2) // Mike have 2 pens

複数文字列を利用したい場合は

<string>%1$@ have %2$#@pen@ and %3$@</string>

のようにすれば大丈夫だと思います🙆‍♂️

参照

Discussion