Ресурсы для I18N на C ++

Я играю с локалью и материалом I18N в С ++ и искал примеры из реального мира. Я прочитал главу Джосуттиса по I18N в его книге (2-е издание для C ++ 11 - будет выпущен в апреле 2012 года), и нашел его полезным, но без реальных примеров, из которых можно было бы извлечь, я понятия не имею, следую ли я лучшим практикам, совершаю ошибки новичков. На какие ресурсы StackOverflow может направить меня как в Интернете, так и в печати для выполнения материала I18N на C ++?

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

Редактировать:

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


person Mark Kegel    schedule 12.10.2008    source источник


Ответы (6)


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

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

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

person Jonathan Leffler    schedule 12.10.2008

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

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

person INS    schedule 12.10.2008

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

Было бы интересно узнать, какую библиотеку C ++ вы используете, поскольку некоторые библиотеки графического интерфейса уже предоставляют поддержку i18n.

person Milan Babuškov    schedule 12.10.2008

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

Однако, что касается того, чего не хватает C ++, мне на ум приходит следующее:

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

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

person OregonGhost    schedule 12.10.2008
comment
Qt на самом деле не C ++, поскольку он использует MOC, компилятор метаобъектов, но все в порядке. Взгляните на Copperspice реальный перенос на C ++ Qt. - person Sandburg; 04.02.2021

Для поддержки UTF-8 ознакомьтесь с библиотекой UTF-8 CPP.

person Nemanja Trifunovic    schedule 12.10.2008

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

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

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

person ewh105    schedule 15.11.2009