Использование множественных строк без номера

Я немного смущен .stringsdict документация (выделите "Файл списка локализованных свойств").

Учитывая количество файлов, я хочу показать " Сохранить файл" или " Сохранить файлы соответственно". Я думал, что следующее будет работать, но не работает.

В коде:

NSString *string = [NSString localizedStringWithFormat:NSLocalizedString(@"%Save Files", @""), (long)files.count];

В Localizable.stringsdict:

<key>Save Files</key>
<dict>
    <key>NSStringLocalizedFormatKey</key>
    <string>Save %#@files@</string>
    <key>files</key>
    <dict>
        <key>NSStringFormatSpecTypeKey</key>
        <string>NSStringPluralRuleType</string>
        <key>NSStringFormatValueTypeKey</key>
        <string>ld</string>
        <key>one</key>
        <string>File</string>
        <key>other</key>
        <string>Files</string>
    </dict>
</dict>

Всегда показывает Сохранить файлы, независимо от количества.

Что я делаю неправильно?

4 ответа

Проблема в том, что вашему коду не хватает числа сохраненных файлов. Чтобы локализовать множественную строку с использованием файла stringsdict, строка ДОЛЖНА иметь числовые переменные. Так что там, где написано @ "% Save Files", должно быть написано @ "Save%ld File (s)". Это%ld - это число, требуемое Xcode, чтобы понять, какое правило множественного числа использовать во время выполнения.

Затем в вашем файле Localizable.stringsdict ваш plist должен выглядеть так:

<key>Save %ld File(s)</key>
<dict>
  <key>NSStringLocalizedFormatKey</key>
  <string>%#@files@</string>
  <key>files</key>
  <dict>
    <key>NSStringFormatSpecTypeKey</key>
    <string>NSStringPluralRuleType</string>
    <key>NSStringFormatValueTypeKey</key>
    <string>ld</string>
    <key>one</key>
    <string>Save %ld File</string>
    <key>other</key>
    <string>Save %ld Files</string>
  </dict>
</dict>

С такими проблемами действительно можно помочь, используя генератор / учебник Localizable.stringsdict, подобный этому:

Генератор множественных чисел iOS Stringsdict

Также важно, чтобы вы оставили переводчику целые строки для переделки фразы. Вместо "Сохранить%#@files@" дайте им целую строку для работы с "%#@files". Зачем? Поскольку слово "Сохранить" в некоторых языках может потребоваться сопряжение в зависимости от количества файлов или может появиться на другой стороне числа (т.е. 3 файла для сохранения). Никогда не предполагайте, что английская грамматика будет работать, и пусть переводчики переводят полные строки.

Работает, если вы удалите "%" из NSLocalizedString(@"%Save Files", @"")

Для тех, кто посмотрит на это позже в Swift. Да, вы можете использовать множественное число без числа, например:

      let string = String.localizedStringWithFormat(NSLocalizedString("Save Files", comment: ""), files.count)

вывод этой строки будет:

Файл (для одного)

Файлы (подробнее)

Вы пропустили %ld внутри NSLocalizesString:

NSString *string = [NSString localizedStringWithFormat:NSLocalizedString(@"%ld Save Files", nil), (long)files.count];

plist dict должно быть:

<key>%ld Save Files</key>
<dict>
    <key>NSStringLocalizedFormatKey</key>
    <string>%ld Save %#@files@</string>
    <key>files</key>
    <dict>
        <key>NSStringFormatSpecTypeKey</key>
        <string>NSStringPluralRuleType</string>
        <key>NSStringFormatValueTypeKey</key>
        <string>ld</string>
        <key>one</key>
        <string>File</string>
        <key>other</key>
        <string>Files</string>
    </dict>
</dict>
Другие вопросы по тегам