Еще раз о локалях

Тема в разделе "LANGS.C", создана пользователем _DEN_, 21 сен 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Как узнать, какие локали вообще поддерживаются?

    Если это какой-то стандартизованный набор названий, то где его взять? Если нет, то можно ли проитерировать текущий поддерживаемый набор? Или может быть есть правило формирования названия локали?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _DEN_
    Имеется в виду EnumSystemLanguageGroups/EnumLanguageGroupLocales что ли?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Имеется ввиду строка, от которой конструируется std::locale.
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    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):
    1. setlocale (LC_ALL, "");
    2. bindtextdomain ("имя программы", "/usr/share/locale");
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    r90

    Обертка... std::locale - это класс Стандартной библиотеки C++, а не обертка.

    Это си. Меня интересует C++.

    Википедия и все остальное это конечно интересно, но до этого я мог и сам догадаться. Вопросы в первом посте предже всего относятся к функциональности, предоставляемой стандартом, а не о всяких косвенных путях.
     
  6. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Так и читай стандарт, 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
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    J0E

    Не нашел ничего правильного. В общем-то ответ на мой вопрос это "any implementation-defined values". Все остальное - не интересно.
     
  8. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Судя по функциональности заявленной в стандарте -- это именно обёртка. Ну или может я чего-то непонимаю. Давай считать что это 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):
    1. -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‐
    2.               mines what other locales are available is implementation-defined.
    Всё это, почему то, склоняет меня к мысли, что в std::locale нет и быть не может способа выяснить список установленных локалей, и правильную мысль ты уже успел уловить: "implementation-defined".