Плюрализованный словарь всегда возвращает значение из нулевого ключа

Я использую новый формат stringsdict для локализации и множественного числа некоторых строк в моем приложении.

Я прочитал это и это для справки, и я надеюсь, что мои локализованные строки из stringsdict будут получены правильно.

Проблема в том, что я всегда вижу значение с «нулевого» ключа и не знаю, что здесь происходит, потому что очень сложно отлаживать операции внутри методов локализации.

Позвольте мне разместить здесь код:

1 - Это мой файл Localizable.stringsdict, также существует файл Localizable.strings в том же проекте.

    <?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>%i minutes</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%i %#@minutes@</string>
            <key>minutes</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>i</string>
                <key>one</key>
                <string>One minute</string>
                <key>two</key>
                <string>Two minutes</string>
                <key>other</key>
                <string>Other minutes</string>
                <key>zero</key>
                <string>Zero minutes</string>
            </dict>
        </dict>
    </dict>
    </plist>

2 - есть простой код для проверки этой строки

NSString *output = [NSString localizedStringWithFormat:NSLocalizedString(@"%i minutes", nil), 5 ];
NSLog(@"Output: %@", output); // And here, always display "Output: 5 Zero minutes" independently the value I put in the formated string, in this case (five) needs to display "Output: 5 Other minutes"

Спасибо за любую помощь.


person Jan Cássio    schedule 09.04.2014    source источник


Ответы (1)


Ошибка в том, что

[NSString localizedStringWithFormat:NSLocalizedString(@"%i minutes", nil), 5 ];

передает только один аргумент (целое число 5) в функцию форматирования строки, но формат расширяется до

 %i %#@minutes@

который ожидает два аргумента. Таким образом, первое %i заменяется на 5, а следующее %#@minutes@ заменяется чем-то неопределенным. Одним из возможных исправлений было бы использование «позиционного параметра»:

 %i %1$#@minutes@

Часть 1$ во втором формате указывает, что она должна быть заполнена из первого аргумента.

В качестве альтернативы переместите первый формат %i в список возможных замен. Тогда файл stringsdict выглядит так:

<plist version="1.0">
<dict>
    <key>%i minutes</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@minutes@</string>
        <key>minutes</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>%i One minute</string>
            <key>two</key>
            <string>%i Two minutes</string>
            <key>other</key>
            <string>%i Other minutes</string>
            <key>zero</key>
            <string>%i Zero minutes</string>
        </dict>
    </dict>
</dict>
</plist>

Но обратите внимание, что для английского языка правила множественного числа поддерживаются только для «ноля» и «один», но не для «два», как объяснено здесь: https://stackoverflow.com/a/21095611/1187415.

person Martin R    schedule 09.04.2014
comment
Спасибо за Ваш ответ. Я думаю, что пропустил эту деталь, и теперь я могу правильно составить свое приложение во множественном числе. Ваше здоровье! - person Jan Cássio; 10.04.2014