Существует еще более мощное решение этой проблемы. Взгляните на библиотеку Tr8n с TranslationExchange.com
https://github.com/tr8n/tr8n_objc_clientsdk
Библиотека использует TML TranslationExchange (Language Markup Language), что делает процесс интернационализации очень простым. Во-первых, вам даже больше не нужно иметь дело с XML-файлами Strings, на самом деле ... - Tr8n SDK будет создавать и управлять вашими String-файлами для вас на лету - вы никогда не будете смотреть на них снова.
Ваш конкретный пример будет просто:
Tr8nLocalizedStringWithTokens(@"{count || object}", @{@"count": objectList.count})
Библиотека Tr8n автоматически подберет для вас нужную форму множественного числа на любом языке. Хах? Да, это волшебно. Полная форма приведенного выше примера токена на самом деле:
{count:number || one: object, other: objects}
Это означает, что токен "count" имеет числовой тип, который отображается на английское множественное число с использованием ключевых слов "one" и "other" .... Но Tr8n достаточно умен, чтобы не вводить все это. Он также достаточно умен, чтобы сопоставить последовательность параметров с соответствующими значениями правила. И, конечно, он знает, что «количество» связано с числовыми правилами через соглашение об именах. Так что это просто становится:
{count || object}
Кстати, так как вы упомянули русский язык, русский перевод для вышеупомянутого будет просто:
"{count || object}" = "{count || объект, объекта, объектов}"
Этот пример был слишком простым, давайте посмотрим на более интересный:
Tr8nLocalizedStringWithTokens(
@"{user} uploaded {count || photo} to {user | his, her} photo album.",
@{@"user": user, @"count": 5}
)
Прежде всего, удачи в переводе этого предложения с использованием стандартной библиотеки iOS i18n (или любой другой библиотеки в этом отношении) ... это шутка - но на самом деле нет способа сделать это, используя что-либо, кроме Tr8n.
TML, переведенный на русский язык, будет просто:
@"{user || загрузил, загрузила} {count || фотографию, фотографии, фотографий} в свой фотоальбом."
Здесь мы имеем дело с гендерными правилами так же, как мы работаем с числовыми правилами. Но вместо «один», «несколько», «другой» мы имеем «мужской», «женский», «неизвестный» - ну, у каждого языка могут быть разные гендерные и числовые правила. Tr8n справится с этим, так что вам не придется.
Хорошо, давайте перейдем на следующий уровень. Вы решили, что у вас должно быть количество фотографий, выделенных жирным шрифтом. Кусок торта.
Tr8nLocalizedAttributedStringWithTokens(
@"{user} uploaded [bold: {count || photo}] to {user | his, her} photo album.",
@{
@"user": user,
@"count": 5,
@"bold": @{@"font":@{@"name": @"system", @"size": @12, @"type": @"bold"}}
}
)
[жирный шрифт: ...] - жетон украшения. Вы заметили, что мы переключили макрос на версию AttributedString? Этот макрос фактически создает NSAttributedString, используя собственный механизм оформления iOS. Можете ли вы догадаться, что перевод на русский будет?
@"{user || загрузил, загрузила} [bold: {count || фотографию, фотографии, фотографий}] в свой фотоальбом."
Кстати, вы можете заранее определить все свои жетоны украшения в другом месте, так что вам не придется каждый раз определять их.
Давайте сделаем еще один последний пример ... Скажем, у вас есть новостная лента в следующей форме:
Tr8nLocalizedAttributedStringWithTokens(
@"{actor} sent {target} [bold: {count || gift}].",
@{
@"actor": user1,
@"target": user2,
@"count": 5
}
)
На английском это не выглядит интересно. Но это на русском или любых других языках, которые поддерживают языковые падежи. Имя {target}, если оно написано на русском языке, на самом деле должно использовать регистр русского языка.
http://en.wikipedia.org/wiki/Dative_case
Если вы не говорите по-русски, вам, вероятно, не нужно знать об этом. Но ваши русские переводчики должны. Давайте посмотрим на русский перевод тогда:
@"{actor || подарил, подарила} {target::dat} [bold: {count || подарок, подарка, подарков}].",
Tr8n достаточно умен, чтобы использовать мощный движок языковых правил и применять регистр языка Dative к русским именам, передаваемым через токен {target} ...
Это был длинный ответ на простой числовой вопрос. Спасибо, что прочитали это так далеко. Надеюсь, поможет.
Отказ от ответственности: я являюсь создателем платформы Tr8n и языка TML. Если у вас есть какие-либо вопросы, пожалуйста, позвоните мне, и я хотел бы помочь вам со всеми вашими вопросами перевода.