Строковый параметр в множественном NSLocalizedString


Я хочу перевести строку %@ 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];

Независимо от того, что я передаю в качестве второго аргумента, перевод всегда будет с шаблоном "другой". Я сузил его до ошибки NSStringLocalizedFormatKey, когда я использую ключ, подобный %@ %#@hours@, он работает.

Я хочу, чтобы строковый параметр был частью впрочем, локализация. Есть ли способ сделать это?

2 4

2 ответа:

Основываясь на экспериментах, которые я провел, вам нужно изменить порядок ваших аргументов. Похоже,что только первое может быть использовано в качестве управляющего значения для Правила подстановки.

Этот Словарь

<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 Release Notes" (хотя ссылка предназначена для iOS), например, подразумевает, что вы должны иметь возможность включить второй аргумент:

Мы разрешаем рекурсивное форматирование, применяя все список аргументов для каждого заменяемого спецификатора формата.

@"%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, приведенный сразу после этого, не соответствует этому словарю.)

Возможно, я что-то неправильно понял (или там может быть ошибка), но я не смог точно понять, что происходит. На данный момент я оставлю это как "изменение порядка аргументов решит вашу проблему".

По состоянию на macOS SDK 10.12/Xcode 8.3 это все еще проблема, NSStringLocalizedFormatKey игнорирует номер аргумента и использует первый аргумент для определения множественности для d_in_d_files_are_selected. НО. Вложенные нумерованные ссылки в форматах правил множественного числа действительно работают, поэтому, например, "one" = "There is one file, and %2$#@it_is_selected@"; правильно использует второй аргумент для выбора правила множественного числа. Это означает, что если вы создадите прокси-сервер формата с одним правилом other, Вы можете добиться желаемого поведения без перестановки строки формата:

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

Обратите внимание, что для чтобы это сработало, вы должны быть явными с номерами аргументов в конечной строке формата ("%1$@ there are up to %2$i sun hours").