Как узнать, какие локали вообще поддерживаются? Если это какой-то стандартизованный набор названий, то где его взять? Если нет, то можно ли проитерировать текущий поддерживаемый набор? Или может быть есть правило формирования названия локали?
std::locale -- это ведь какая-то обёртка поверх locale.h? Там всё элементарно: например, en_US.UTF-8 -- language-code_country-codel.encoding, то есть американская локаль на базе английского языка использующая UTF-8 как основную кодировку. В теории всё правда чуть сложнее, но во всех подробностях это можно выяснить в той же википедии: http://en.wikipedia.org/wiki/Locale Если теория не интересна, можно всё то же изучить с практической стороны: взять какой-нибудь линупс/бздю и приделать к нему локаль ru_RU.utf8 -- кстати очень полезно приделывать такую локаль ради всяких идиотских xchm Хотя, по-моему, это не должно интересовать в нормальной ситуации. Это дело всяких там stdio.h разбираться что к чему, и в каком формате выводить double. Ну или дело злых админов прикручивать к системе все локали, которые ей могут потребоваться. Но никак не дело рядовых прикладных программистов. Рядовой программист должен лишь не забывать в начале программы сказать: Код (Text): setlocale (LC_ALL, ""); bindtextdomain ("имя программы", "/usr/share/locale");
r90 Обертка... std::locale - это класс Стандартной библиотеки C++, а не обертка. Это си. Меня интересует C++. Википедия и все остальное это конечно интересно, но до этого я мог и сам догадаться. Вопросы в первом посте предже всего относятся к функциональности, предоставляемой стандартом, а не о всяких косвенных путях.
Так и читай стандарт, r90 правильно тебе ответил: explicit locale(const char* std_name); 6 Effects: Constructs a locale using standard C locale names, e.g. "POSIX". The resulting locale implements semantics defined to be associated with that name. 7 Throws: runtime_error if the argument is not valid, or is null. 8 Remarks: The set of valid string argument values is "C", "", and any implementation-defined values. mplementation-defined см. msdn Language and Country/Region Strings
J0E Не нашел ничего правильного. В общем-то ответ на мой вопрос это "any implementation-defined values". Все остальное - не интересно.
Судя по функциональности заявленной в стандарте -- это именно обёртка. Ну или может я чего-то непонимаю. Давай считать что это full rewrite from scratch. Хотя C++ реализации setlocale я не нашёл. Плохо искал? Хм. locale.h -- это так сказать первоисточник, всех этих локалей. Зри в корень, как вещал некий Прутков. setlocale -- это косвенный путь? Я ж говорю тебе, это единственный труъ путь. Даже C++'овый rewrite locale.h -- это rewrite в истинном стиле C++, функциональности столько же, а документации в десять раз больше. Это не труъ. По-моему глупо писать class, там где вся функциональность укладывается в одну функцию? Но хотя, идеология C++ мне всегда была недоступна, наверное в этом есть огромный скрытый смысл, доступный лишь посвящённым. Возвращаясь к теме. Я выскажу свои предположения, ты не против? Как ты понял, я бегло пробежался по стандарту std::locale, у меня есть определённый опыт настраивания локалей во всяких *nix-системах. Опыт включает в себя и извращённые методы настройки, не предусмотренные средствами системы. Есть также опыт работы с gettext. И кроме того я заглянул в man locale, где, действительно, напротив опции -a написано: Код (Text): -a Write information about all available public locales. The available locales shall include POSIX, representing the POSIX locale. The manner in which the implementation deter‐ mines what other locales are available is implementation-defined. Всё это, почему то, склоняет меня к мысли, что в std::locale нет и быть не может способа выяснить список установленных локалей, и правильную мысль ты уже успел уловить: "implementation-defined".