Строковый параметр в множественном 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 ответа:
Основываясь на экспериментах, которые я провел, вам нужно изменить порядок ваших аргументов. Похоже,что только первое может быть использовано в качестве управляющего значения для Правила подстановки.
Этот Словарь
<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"
).