Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       newlocale, freelocale - создаёт, изменяет и освобождает объект локали

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <locale.h>

       locale_t newlocale(int category_mask, const char *locale,
                          locale_t base);
       void freelocale(locale_t locobj);

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       newlocale(), freelocale():
           Начиная с glibc 2.10:
               _XOPEN_SOURCE >= 700
           До glibc 2.10:
               _GNU_SOURCE

ОПИСАНИЕ

       Функция  newlocale() создаёт новый объект локали или изменяет существующий, возвращая ссылку на новый или
       изменённый объект. Значение base определяет что именно делает вызов — создаёт или  изменяет  существующий
       объект:

       •  Если base равно (locale_t) 0, то создаётся новый объект.

       •  Если  base  ссылается  на  корректный  существующий  объект локали (т. е., объект, полученный ранее от
          вызовов newlocale() или duplocale(3)), то этот объект изменяется при вызове. При  успешном  выполнении
          содержимое base не определено (в частности, объект, на который ссылается base, может быть освобождён и
          создан  новый  объект).  Поэтому  вызывающий  должен понимать до вызова newlocale(), что не использует
          base, и, следовательно, ссылаться на изменённый объект через ссылку, возвращённую функцией. При ошибке
          вызова, содержимое base остаётся корректным и не изменяется.

       Если значение base равно специальному объекту локали  LC_GLOBAL_LOCALE  (смотрите  duplocale(3))  или  не
       равно (locale_t) 0 и это некорректный указатель объекта локали, то поведение не определено.

       Аргумент   category_mask   представляет   собой  битовую  маску,  которая  определяет  категории  локали,
       устанавливаемые в создаваемом объекте  локали  или  в  изменяемом  существующем  объекте.  Маска  создаёт
       побитовым   OR  из  констант  LC_ADDRESS_MASK,  LC_CTYPE_MASK,  LC_COLLATE_MASK,  LC_IDENTIFICATION_MASK,
       LC_MEASUREMENT_MASK, LC_MESSAGES_MASK, LC_MONETARY_MASK,  LC_NUMERIC_MASK,  LC_NAME_MASK,  LC_PAPER_MASK,
       LC_TELEPHONE_MASK  и  LC_TIME_MASK.  Также  значением  маски может быть LC_ALL_MASK, которая эквивалентна
       сложению всех указанных ранее констант.

       Для каждой категории, указанной в category_mask, данные локали из locale будут  использованы  в  объекте,
       возвращаемом  newlocale(). Если создаётся новый объект локали, то данные для всех категорий, не указанных
       в category_mask, берутся из локали по умолчанию («POSIX»).

       Для всех категорий, которые можно указать в category_mask, уже определены следующие значения locale:

       "POSIX"
              Минимальное окружение локали для программ на языке Си.

       "С"    Эквивалентно «POSIX».

       ""     Определяемое реализацией родное окружение соответствует значениям переменных окружения LC_* и LANG
              (смотрите locale(7)).

   freelocale()
       Функция freelocale() освобождает ресурсы, связанные с locobj, объектом локали, ранее полученным из вызова
       newlocale() или duplocale(3). Если значение locobj равно  LC_GLOBAL_LOCALE  или  не  является  корректным
       объектом локали, то результат не определён.

       После того, как объект локали освобождён, программа не должна больше его использовать.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       On  success,  newlocale()   returns a handle that can be used in calls to duplocale(3), freelocale(), and
       other functions that take a locale_t argument.  On error, newlocale()   returns  (locale_t) 0,  and  sets
       errno to indicate the error.

ОШИБКИ

       EINVAL Один или более бит в category_mask не соответствуют корректной категории локали.

       EINVAL Значение locale равно NULL.

       ENOENT Значение locale не является указателем на строку, ссылающуюся на корректную локаль.

       ENOMEM Недостаточно памяти для создания объекта локали.

СТАНДАРТЫ

       POSIX.1-2008.

ИСТОРИЯ

       glibc 2.3.

ПРИМЕЧАНИЯ

       Каждый объект локали, созданный newlocale(), должен освобождаться с помощью freelocale().

ПРИМЕРЫ

       Следующая  программа принимает два аргумента командной строки, каждый из которых описывает локаль. Первый
       аргумент обязателен и используется для назначения категории  LC_NUMERIC  в  объекте  локали,  создаваемой
       newlocale().  Второй  аргумент  необязателен;  если  он  задан,  то используется для назначения категории
       LC_TIME объекта локали.

       После создания и инициализации объекта, программа применяет его с помощью uselocale(3), а затем тестирует
       изменения локали:

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

       (2)  Выводит дату. На формат и язык влияет значение LC_TIME.

       В следующих сеансах работы показан пример запуска программы.

       Категории LC_NUMERIC присвоено fr_FR (французская):

           $ ./a.out fr_FR
           123456,789
           Fri Mar  7 00:25:08 2014

       Категории LC_NUMERIC присвоено fr_FR (французская), а категории LC_TIMEit_IT (итальянская):

           $ ./a.out fr_FR it_IT
           123456,789
           ven 07 mar 2014 00:26:01 CET

       Значению  LC_TIME  присвоена  пустая  строка,  что приводит к получению настройки из переменных окружения
       (которые, в данном случае, равны mi_NZ, новозеландская маори):

           $ LC_ALL=mi_NZ ./a.out fr_FR ""
           123456,789
           Te Paraire, te 07 o Poutū-te-rangi, 2014 00:38:44 CET

   Исходный код программы
       #define _XOPEN_SOURCE 700
       #include <locale.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <time.h>

       #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)

       int
       main(int argc, char *argv[])
       {
           char buf[100];
           time_t t;
           size_t s;
           struct tm *tm;
           locale_t loc, nloc;

           if (argc < 2) {
               fprintf(stderr, "Usage: %s locale1 [locale2]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           /* Create a new locale object, taking the LC_NUMERIC settings
              from the locale specified in argv[1]. */

           loc = newlocale(LC_NUMERIC_MASK, argv[1], (locale_t) 0);
           if (loc == (locale_t) 0)
               errExit("newlocale");

           /* If a second command-line argument was specified, modify the
              locale object to take the LC_TIME settings from the locale
              specified in argv[2]. We assign the result of this newlocale()
              call to 'nloc' rather than 'loc', since in some cases, we might
              want to preserve 'loc' if this call fails. */

           if (argc > 2) {
               nloc = newlocale(LC_TIME_MASK, argv[2], loc);
               if (nloc == (locale_t) 0)
                   errExit("newlocale");
               loc = nloc;
           }

           /* Apply the newly created locale to this thread. */

           uselocale(loc);

           /* Test effect of LC_NUMERIC. */

           printf("%8.3f\n", 123456.789);

           /* Test effect of LC_TIME. */

           t = time(NULL);
           tm = localtime(&t);
           if (tm == NULL)
               errExit("time");

           s = strftime(buf, sizeof(buf), "%c", tm);
           if (s == 0)
               errExit("strftime");

           printf("%s\n", buf);

           /* Free the locale object. */

           uselocale(LC_GLOBAL_LOCALE);    /* So 'loc' is no longer in use */
           freelocale(loc);

           exit(EXIT_SUCCESS);
       }

СМОТРИТЕ ТАКЖЕ

       locale(1), duplocale(3), setlocale(3), uselocale(3), locale(5), locale(7)

ПЕРЕВОД

       Русский перевод этой страницы руководства разработал(и) Alex Nik <rage.iz.me@gmail.com>, Azamat  Hackimov
       <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru>,
       Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                    newlocale(3)