Ресурсы для I18N в С++

Я играю с языками и вещами I18N на С++ и искал примеры из реального мира. Я прочитал главу Josuttis о I18N в своем book (2nd Edition для С++ 11, который будет выпущен в апреле 2012 года) и нашел это полезным, но без реальных примеров, чтобы рисовать, я понятия не имею, следую ли я лучшим практикам, совершая ошибки начинающего. Какие ресурсы может StackOverflow указать мне как в Интернете, так и в печати для работы с I18N на С++?

Кроме того, какие библиотеки доступны для С++, что упрощает i18n? Что не в стандартной библиотеке, которая должна быть? На первый взгляд кажется, что поддержка UTF8 не существует в стандартной библиотеке.

Edit:

После некоторого большего чтения, кажется, что C и С++ являются Unicode "агностиками". Также представляется, что для обработки данных, закодированных в Unicode/UTF8/16/32, необходимо использовать стороннюю библиотеку. Суть этого в том, что сама стандартная библиотека думает только об ISO 8859 и связанных страницах персонажа, которые изменяются в зависимости от того, для чего вы настроены. Это означает, что я, вероятно, хочу использовать библиотеку ICU для строк, а не использовать std::string или даже std::wstring.

Ответы

Ответ 1

Вы указали на GNU gettext, который позволяет вам заменять литеральные строки локализованными версиями во время выполнения - один аспект локализации (что происходит после того, как вы сделали интернационализацию, когда кто-то действительно использует ваш интернационализированный код в определенной локали). Вы также указали на Boost (в частности Boost.Locale); что обычно является хорошим ответом на все, что связано с С++.

Еще одно место, которое вы можете посмотреть, - это проект ICU (Международные компоненты для Unicode). И как источник данных вы можете посмотреть CLDR (Common Locale Data Repository) в качестве источника информации о разных локалях; на веб-сайте Unicode также есть много информации о других аспектах разных культур, поскольку он имеет дело со многими языками.

И в качестве окончательного ресурса на данный момент, достаточно специализированного, существует база данных о времени Олсона, которая обновляется несколько раз каждый год, чтобы отслеживать, как разные страны меняют свои правила, когда менять зимнее и летнее (летнее и стандартное) время.

Ответ 2

Взгляните на wxWidgets примеры интернационализации. Он имеет не-gnu реализацию механизма перевода, используемого в gettext (упоминалось ранее). Вы можете использовать его даже в коммерческом приложении, потому что лицензия wxWidgets позволяет это сделать.

Если вы просто смотрите на метод интернационализации приложения, то gettext является отправной точкой.

Ответ 3

Взгляните на GNU gettext

Было бы интересно узнать, какую библиотеку С++ вы используете, поскольку некоторые библиотеки GUI уже предоставляют поддержку i18n.

Ответ 4

Я второй GNU gettext. Однако, если вы используете Qt (и вероятность того, что вы хотите сделать GUI с С++), Qt поставляется со своей собственной версией gettext и прекрасным инструментом перевода (Qt Linguist), который упрощает работу и может также использоваться из приложений без GUI без накладных расходов. У нас есть это даже на службе.

Однако, что касается недостатка С++, только то, что приходит мне на ум:

  • Полная поддержка мест в отношении номеров, дат или валюты. И помните, что локали отличаются не только десятичным разделителем, включая упорядочение, что приводит меня ко второй точке:
  • Сам С++ не имеет функции формата, поддерживающей упорядоченные аргументы (потому что на другом языке порядок слов может отличаться от вашего языка). Для этого вы можете использовать boost:: format. Qt, конечно же, поддерживает его.

Также посмотрите, что вам нужно сделать для себя, даже если эти вещи поддерживаются. Например,.NET поставляется с полным списком локалей, которые готовы к использованию.

Ответ 6

Для выполнения этой задачи вам не нужны библиотеки. См. Руководство MS для спутниковых DLL здесь.

Если вы укажете использование Unicode в настройках проекта и используете функции Unicode String (вместо char), стандартного использования Satellite DLL для хранения данных, специфичных для локали (диалоговые окна, строки и т.д.) будет достаточно.

Windows сама позаботится о поиске правильного ресурса, пока DLL правильно названа. Суффиксы, необходимые для спутниковых DLL, здесь.