locale - opis obsługi wielu języków
Locale to zestaw reguł językowych i kulturalnych.
Obejmują one aspekty takie, jak język komunikatów,
różne zestawy znaków, konwencje leksykograficzne itd.
Program musi umieć określić swoje locale i
zachowywać się odpowiednio, aby można go było
przenieść do innych kultur.
Nagłówek <locale.h> deklaruje typy
danych, funkcje i makra przydatne w tym przedsięwzięciu.
Funkcje deklarowane to setlocale(3), ustawiająca
bieżące locale, i localeconv(3), pobierająca
informacje o formatowaniu liczb.
Istnieją różne kategorie informacji
regionalnych, których potrzebować może program;
zadeklarowane są one jako makra. Używając ich jako
pierwszego argumentu funkcji setlocale(3), możliwe jest
ustawienie poniższych informacji regionalnych:
- LC_ADDRESS
(rozszerzenie GNU, od glibc 2.2)
- Zmienia ustawienia opisujące formaty (np. adresy pocztowe)
służące do opisywania położenia i
rzeczy okołogeograficznych. Aplikacje wymagające tej
informacji mogą korzystać z nl_langinfo(3) do
pozyskania niestandardowych elementów, takich jak
_NL_ADDRESS_COUNTRY_NAME (nazwa kraju w danym języku) i
_NL_ADDRESS_LANG_NAME (nazwa języka w danym języku),
które zwracają przykładowo łańcuchy
"Deutschland" i "Deutsch" (dla niemieckich locale).
Inne nazwy elementów są wypisane w
<langinfo.h>.)
- LC_COLLATE
- Kategoria obejmuje zasady zestawiania używane do sortowania i
wyrażeń regularnych, w tym klasy ekwiwalentów
znaków i zestawiania elementów wieloznakowych. Ta kategoria
locale zmienia zachowanie funkcji strcoll(3) i strxfrm(3),
porównujących łańcuchy znaków w
alfabecie lokalnym. Na przykład niemieckie scharfes S sortowane
jest jako "ss".
- LC_CTYPE
- Kategoria określa interpretację sekwencji bajtów jako
znaków (np. znaki jednobajtowe albo wielobajtowe),
klasyfikację znaków (np. alfabetyczna lub numeryczna) i
zachowanie klas znaków. W systemach glibc ta kategoria
określa również reguły transliteracji
znaków do iconv(1) i iconv(3). Zmienia zachowanie
operacji na znakach i funkcji klasyfikacyjnych, takich jak
isupper(3) i toupper(3), oraz znakowych funkcji
wielobajtowych, takich jak mblen(3) i wctomb(3).
- LC_IDENTIFICATION
(rozszerzenie GNU, od glibc 2.2)
- Zmienia ustawienia powiązane z metadanymi locale. Aplikacje
wymagające tej informacji mogą korzystać z
nl_langinfo(3) do pozyskania niestandardowych elementów
takich jak _NL_IDENTIFICATION_TITLE (tytuł tego dokumentu
locale) i _NL_IDENTIFICATION_TERRITORY (terytorium geograficzne do
którego odnosi się ten dokument locale), które
mogą zwrócić łańcuchy takie jak
"English locale for the USA" i "USA". Inne nazwy
elementów są wypisane w <langinfo.h>.
- LC_MONETARY
- Kategoria określa formatowanie używane do wartości
numerycznych związanych z pieniędzmi. Zmienia
informację zwracaną przez localeconv(3), która
opisuje sposób, w jaki zwykle drukowane są liczby, ze
szczegółami takimi jak kropka dziesiętna kontra
przecinek dziesiętny. Informacja ta jest używana
wewnętrznie przez funkcję strfmon(3).
- LC_MESSAGES
- Kategoria wpływa na język, w którym
wyświetlane są komunikaty, oraz to, jak wygląda
odpowiedź twierdząca i przecząca. Biblioteka GNU C
zawiera funkcje gettext(3), ngettext(3) oraz
rpmatch(3), ułatwiające użycie tych
informacji. Funkcje GNU z rodziny gettext biorą pod uwagę
również zmienną środowiska LANGUAGE
(zawierającą rozdzieloną dwukropkami listę
ustawień językowych), jeśli bieżące
ustawienia językowe są poprawne i różne od
"C". Ta kategoria wpływa również na
zachowanie catopen(3).
- LC_MEASUREMENT
(rozszerzenie GNU, od glibc 2.2)
- Zmienia ustawienia związane z systemem miar w locale (np. metryczny
albo jednostki używane w USA). Aplikacje mogą
korzystać z nl_langinfo(3) do pozyskania niestandardowego
elementu _NL_MEASUREMENT_MEASUREMENT, który zwraca
wskaźnik do znaku który ma wartość 1 (system
metryczny) lub 2 (system imperialny).
- LC_NAME
(rozszerzenie GNU, od glibc 2.2)
- Zmienia ustawienia opisujące formy grzecznościowe. Aplikacje
wymagające tej informacji mogą korzystać z
nl_langinfo(3) do pozyskania niestandardowych elementów
takich jak _NL_NAME_NAME_MR (forma grzecznościowa dla
panów) i _NL_NAME_NAME_MS (forma grzecznościowa dla
pań), które zwracają łańcuchy takie jak
"Herr" i "Frau" (dla niemieckich ustawień
regionalnych). Inne nazwy elementów są wypisane w
<langinfo.h>.
- LC_NUMERIC
- Kategoria określa reguły formatowania używane dla
wartości numerycznych niezwiązanych z pieniędzmi
— np. separator tysięcy i separator dziesiętny
(kropka w większości krajów anglojęzycznych
lub przecinek w wielu innych). Wpływa na takie funkcje, jak
printf(3), scanf(3) i strtod(3). Tę
informację można również odczytać za
pomocą localeconv(3).
- LC_PAPER
(rozszerzenie GNU, od glibc 2.2)
- Zmienia ustawienia związane z wymiarami standardowego rozmiaru
papieru (np. letter albo A4). Aplikacje wymagające wymiarów
mogą je pozyskać korzystając z nl_langinfo(3),
aby otrzymać niestandardowe elementy _NL_PAPER_WIDTH i
_NL_PAPER_HEIGHT, które zwrócą wartości
int określające wymiary w milimetrach.
- LC_TELEPHONE
(rozszerzenie GNU, od glibc 2.2)
- Zmienia ustawienia opisujące formaty używane w telefonii.
Aplikacji potrzebujące tej informacji mogą korzystać
z nl_langinfo(3) aby pobrać niestandardowe elementy takie
jak _NL_TELEPHONE_INT_PREFIX (międzynarodowy prefiks
używany do wybrania numerów w tym locale), który
zwróci przykładowo "49" (dla Niemiec). Inne
elementy są wypisane w <langinfo.h>.
- LC_TIME
- Kategoria określa formatowanie wartości daty i czasu.
Przykładowo większość Europy używa
zegara 24-godzinnego, a w USA korzysta się z zegara 12-godzinnego.
Ustawienie w tej kategorii wpływa na zachowanie funkcji takich jak
strftime(3) i strptime(3).
- LC_ALL
- Wszystko powyższe.
Jeśli drugim argumentem setlocale(3) jest
łańcuch pusty "" oznaczający locale
domyślne, ustala się je w następujący
sposób:
- (1)
- Jeśli istnieje niepusta zmienna środowiskowa LC_ALL,
używana jest wartość LC_ALL
- (2)
- Jeśli istnieje i jest niepusta zmienna środowiskowa o tej
samej nazwie co jedna z kategorii powyżej, dla tej kategorii
używana jest jej wartość.
- (3)
- Jeśli istnieje niepusta zmienna środowiskowa LANG,
używana jest wartość LANG
Wartości dotyczące lokalnego formatowania
dostępne są w strukturze lconv, zwracanej przez
funkcję localeconv(3). lconv ma
następującą deklarację:
struct lconv {
/* Informacje numeryczne (niewalutowe) */
char *decimal_point; /* Znak dziesiętny */
char *thousands_sep; /* Separator grup cyfr po lewej
stronie znaku dziesiętnego */
char *grouping; /* Każdy element jest liczbą cyfr
w grupie; elementy z wyższym indeksem są
bardziej na lewo. Element o wartości
CHAR_MAX oznacza, że dalsze grupowanie
nie następuje. Element o wartości 0 oznacza,
że poprzedni element jest używany do
pozostałych grup po lewej stronie. */
/* Pozostałe pola służą do informacji walutowych */
char *int_curr_symbol; /* Pierwsze trzy znaki to symbol waluty
z ISO 4217. Czwarty znak to separator.
Piąty to '\0'. */
char *currency_symbol; /* Symbol lokalnej waluty */
char *mon_decimal_point; /* Znak dziesiętny */
char *mon_thousands_sep; /* Jak thousands_sep (powyżej) */
char *mon_grouping; /* Jak grouping (powyżej) */
char *positive_sign; /* Znak dla wartości dodatnich */
char *negative_sign; /* Znak dla wartości ujemnych */
char int_frac_digits; /* Międzynarodowe cyfry dziesiętne */
char frac_digits; /* Lokalne cyfry dziesiętne */
char p_cs_precedes; /* 1, jeśli symbol waluty poprzedza wartość
dodatnią, 0, jeśli następuje po niej */
char p_sep_by_space; /* 1, jeśli symbol waluty oddziela
od wartości dodatniej spacja */
char n_cs_precedes; /* 1, jeśli symbol waluty poprzedza wartość
ujemną, 0 jeśli następuje po niej */
char n_sep_by_space; /* 1, jeśli symbol waluty oddziela
od wartości ujemnej spacja */
/* Dodatnie i ujemne pozycje znaku:
0 Wartość i symbol waluty w nawiasach.
1 Znak poprzedza wartość i symbol waluty.
2 Znak następuje po wartości i symbolu waluty.
3 Znak następuje tuż przez symbolem waluty.
4 Znak następuje tuż po symbolu waluty. */
char p_sign_posn;
char n_sign_posn;
};
POSIX.1-2008 standaryzuje wiele rozszerzeń API locale w
oparciu o implementację, która pojawiła się jako
pierwsza w glibc 2.3. Rozszerzenia opracowano aby rozwiązać
problemy z tradycyjnym API locale, które nie radziło sobie
dobrze z aplikacjami wielowątkowymi i z programami które
korzystają z wielu ustawień regionalnych.
Rozszerzenia zajmują się formą nowych funkcji
do tworzenia i działania na obiektach locale (newlocale(3),
freelocale(3), duplocale(3) i uselocale(3)) oraz
różnymi nowymi funkcjami bibliotecznymi z przyrostkiem
"_l" (np. toupper_l(3)), które rozszerzają
tradycyjne, zależne od ustawień regionalnych API (np.
toupper(3)) pozwalając na określenie obiektu locale
który ma zostać zastosowany przy wykonywaniu funkcji.
ŚRODOWISKO
Następujące zmienne środowiskowe są
używane przez newlocale(3) i setlocale(3)
wpływając na wszystkie nieuprzywilejowane zlokalizowane
programy:
- LOCPATH
- Lista ścieżek oddzielonych dwukropkami (':'), które
służą do odnalezienia danych locale. Jeżeli
zmienna jest ustawiona, to używane są tylko skompilowane
indywidualnie pliki z danymi z LOCPATH oraz z domyślnej
ścieżki danych locale, natomiast dostępne archiwa
lokalne nie są wykorzystywane (zob. localedef(1)).
Indywidualnie kompilowane pliki z danymi locale są wyszukiwane w
podkatalogach zależnych od bieżących ustawień
regionalnych. Przykładowo jeśli dla kategorii wykorzystuje
się en_GB.UTF-8, to przeszukiwane są
następujące podkatalogi (w podanej kolejności):
en_GB.UTF-8, en_GB.utf8, en_GB, en.UTF-8,
en.utf8 i en.
- /usr/lib/locale/locale-archive
- Zwykle domyślne położenie archiwum locale.
- /usr/lib/locale
- Zwykle domyślna ścieżka dla skompilowanych
indywidualnie plików locale.
iconv(1), locale(1), localedef(1),
catopen(3), gettext(3), iconv(3), localeconv(3),
mbstowcs(3), newlocale(3), ngettext(3),
nl_langinfo(3), rpmatch(3), setlocale(3),
strcoll(3), strfmon(3), strftime(3), strxfrm(3),
uselocale(3), wcstombs(3), locale(5),
charsets(7), unicode(7), utf-8(7)
Tłumaczenie niniejszej strony podręcznika: Gwidon S.
Naskrent <naskrent@hoth.amu.edu.pl>, Robert Luberda
<robert@debian.org> i Michał Kułach
<michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną
dokumentacją. Bliższe informacje o warunkach licencji
można uzyskać zapoznając się z
GNU General
Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika
prosimy zgłaszać na adres listy dyskusyjnej
manpages-pl-list@lists.sourceforge.net.