10

%@ there are up to %i sun hours文字列を適切な複数形で翻訳したい。

%@日、%i太陽時間が含まれています。

これは私のLocalizable.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>%@ there are up to %i sun hours</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%#@hours@</string>
            <key>hours</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>i</string>
                <key>zero</key>
                <string>%@ there are no sun hours</string>
                <key>one</key>
                <string>There is one sun hour %@ </string>
                <key>other</key>
                <string>%@ there are up to %i sun hours</string>
            </dict>
        </dict>
    </dict>
</plist>

これが私がそれを呼ぶ方法です:

[NSString stringWithFormat:NSLocalizedString(@"%@ there are up to %i sun hours", nil), dayString, sunHours];

2 番目の引数として何NSIntegerを渡しても、翻訳は常に「他の」テンプレートで行われます。NSStringLocalizedFormatKeyキーが機能しているように使用すると、間違っていることに絞り込みました%@ %#@hours@

ただし、文字列パラメーターをローカライズの一部にしたいです。これを行う方法はありますか?

4

3 に答える 3

8

私が行った実験に基づいて、引数の順序を変更する必要があります。置換規則の制御値として使用できるのは最初の 1 つだけのようです。

この辞書

<key>%i hours %@</key>
<dict>
    <key>NSStringLocalizedFormatKey</key>
    <string>%#@hours@</string>
    <key>hours</key>
    <dict>
        <key>NSStringFormatSpecTypeKey</key>
        <string>NSStringPluralRuleType</string>
        <key>NSStringFormatValueTypeKey</key>
        <string>i</string>
        <key>zero</key>
        <string>%2$@ there are no sun hours</string>
        <key>one</key>
        <string>There is one sun hour %2$@ </string>
        <key>other</key>
        <string>%2$@ there are up to %1$d sun hours</string>
    </dict>
</dict>

と組み合わせ

[NSString stringWithFormat:NSLocalizedString(@"%i hours %@", nil), sunHours, dayString];

私にとって期待される結果を生み出します。値が適切に配置されるように、置換文字列に引数インデックスを追加したことに注意してください。

ドキュメントは、この機能の説明において野心的すぎるようです。たとえば、「OS X 10.9 リリース ノート」というタイトルのドキュメントに示されている例(リンクは iOS 用ですが) は、2 番目の引数をオンにできる必要があることを意味します。

置換された各書式指定子に引数リスト全体を適用することで、再帰的な書式設定を許可しています。

@"%d in %d files are selected" = @"%2$#@d_in_d_files_are_selected@"

構成ディクショナリには次を含めることができます

"d_in_d_files_are_selected" = {

    "NSStringFormatSpecTypeKey" = "NSStringPluralRuleType"; // plural type
    "NSStringFormatValueTypeKey" = "d"; // int argument

    "zero" = "There is no file";
    "one" = "There is a file, and %1$#@it_is_selected@";
    "other" = "%1$d in %2$d files are selected"; 
};

しかし、ガイドラインに従って辞書を作成しても、記載されている結果は得られません。(そして、直後に与えられたサンプル XML は、この辞書と一致しないことに注意してください。)

私が読み間違えているものがあるかもしれません (またはバグがあるかもしれません) が、何が起こっているのかを正確に推測することはできませんでした. 今のところ、これは「引数の順序を変更すると問題が解決する」として残しておきます。

于 2015-09-01T05:59:27.987 に答える