Есть ли простой способ преобразовать числа 1, 2, 3, ... в «1-й», «2-й», «3-й», ... и таким образом, чтобы я мог дать функции язык и иметь он вернет мне правильную форму для языка, на который я ориентируюсь? Либо стандартный C ++ (stl или boost OK), MFC или ATL, win32 api, либо небольшая, одноцелевая и бесплатная библиотека, которую я могу скачать откуда-нибудь. Спасибо.
Как преобразовать кардинальные числа в порядковые
Ответы (5)
Я сомневаюсь, что это вообще возможно, поскольку во многих языках эта форма будет зависеть от контекста, например, от пола или падежа существительного, которое он описывает, а для разных языков потребуется разная контекстная информация, чтобы определить правильную форму.
РЕДАКТИРОВАТЬ: например. на польском это «5-ta klasa» (5-й класс) vs. «5-ty miesiąc» (5-й месяц) vs. «w 5-tym miesiącu» (в 5-м месяце).
Я потратил довольно много времени на изучение этого вопроса, потому что это слишком большой проект, чтобы я мог его исправить. Похоже, что библиотека ICU - единственная, которая предоставляет эту функциональность в некоторой степени исчерпывающим образом (http://www.icu-project.org/apiref/icu4c/classRuleBasedNumberFormat.html). Однако я не слишком заинтересован в создании такой огромной библиотеки. Я продолжу поиски и все еще открыт для предложений.
Вы искали репозиторий CLDR на сайте Unicode? Я не знаю, есть ли у них такие вещи, но, поскольку это, вероятно, самый полный репозиторий локальных данных, на него, вероятно, стоит взглянуть. http://www.unicode.org/cldr/
Поскольку вы используете C ++, я предполагаю, что вы можете использовать GNU gettext (есть также порт для Windows) для всех переводов или, по крайней мере, понять, как они это решили. Вот соответствующая страница руководства во множественном числе, которая объясняет проблему (которую вы уже нашли, но более подробно) и ее решение:
http://www.gnu.org/software/automake/manual/gettext/Plural-forms.html < / а>
Вот фрагмент кода CodeProject, который выполняет эту работу. Сам не пробовал.