Формат сообщений ICU на iOS

Насколько я понимаю, iOS использует ICU под капотом. Я хотел бы получить доступ к функциям MessageFormat ICU для строк, содержащих числа и множественное число, например,

There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.

Предоставляет ли iOS эту возможность? Если да, то как мне его использовать? Я думал, что смогу написать

[NSString stringWithFormat: "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.", n];

or

[NSString stringWithFormat: "There {0,plural, =0{are no files}=1{is one file}other{are %ld files}}.", n];

Но эти форматы (ICU4J и ICU соответственно) не работают.


person user371320    schedule 28.04.2012    source источник
comment
Где именно я увидел?   -  person user371320    schedule 29.04.2012


Ответы (2)


iOS, как и OS X, включает /usr/lib/libicucore.dylib. Однако ни в одной из операционных систем этот общедоступный API не поддерживается. См. это старое сообщение для объяснения того, как использовать это на OS X, и каковы потенциальные проблемы.

В iOS, я полагаю, есть дополнительная проблема, связанная с тем, что Apple может отклонить ваше приложение за использование неподдерживаемых API.

person LaC    schedule 28.04.2012
comment
Хороший. Семь лет назад они думали об этом. Если я использую неподдерживаемую библиотеку, моя карта приложения будет отклонена. Если я объединю ICU в свое приложение, оно может быть отклонено (stackoverflow.com/questions/2427838/) Как разработчики локализуют множественное число на iOS? - person user371320; 29.04.2012
comment
@ user371320 вопрос, который вы связали, касался ссылки на неподдерживаемую включенную библиотеку, а не ее объединения. Вы можете создать ICU и статически связать его со своим приложением. - person LaC; 29.04.2012
comment
Конечно, но, очевидно, мне нужно изменить код ICU: если вы определили методы в исходном коде с теми же именами, что и упомянутые выше API, мы предлагаем изменить имена ваших методов, чтобы они больше не конфликтовали с частными API Apple, чтобы Избегайте пометки вашего приложения при отправке в будущем. - person user371320; 29.04.2012

Правила форматирования для stringWithFormat не включают форматирование ICU. Для таких вещей вам потребуется вызвать другую функцию. AFAIK iOS не предоставляет API-интерфейсы NSString, совместимые с ICU MessageFormat.

Однако, учитывая, что у вас был доступ к API (либо через общедоступную версию ICU, либо путем объединения пользовательской сборки ICU с вашим приложением), для работы такого форматирования сообщений библиотека ICU должна иметь доступ к файлам ресурсов, которые:

  • Содержат данные выбора для интересующего вас языкового стандарта.
  • Достаточно актуальны, чтобы поддерживать выбранный формат, который вы пытаетесь использовать

Дополнительную информацию см. В документации ICU.

person NuSkooler    schedule 01.05.2012