ustaw LC_ *, ale nie LC_ALL

13

Chciałbym mieć ustawienia regionalne w Niemczech (Austria) (rozmiar papieru A4, 24 godziny, rrrr-mm-dd), ale anglojęzyczny interfejs użytkownika (nie lubię kiepskich tłumaczeń). Doszedłem do wniosku, że poprawnym sposobem na osiągnięcie tego jest ustawienie LC_zmiennych w następujący sposób .bashrc(popraw mnie, jeśli się mylę):

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8

Czy istnieje bardziej elegancki sposób, aby ustawić LC_ $ Everythingelse zamiast ustawiać każdą pojedynczą wartość? Ustawienie LC_ALL nie jest opcją, ponieważ ma pierwszeństwo przed LC_MESSAGES:

$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"

PS: To wspólna maszyna i nie jestem sudoer, więc zmiana ustawień całego systemu nie wchodzi w grę.

Heinzi
źródło

Odpowiedzi:

15

Istnieją trzy zestawy ustawień regionalnych¹:

  • LANG, ustawienie rezerwowe, jeśli nie określono wartości dla kategorii. Użytkownicy powinni w prosty sposób wskazywać swoje ustawienia regionalne.
  • LC_xxxdla każdej kategorii ( xxxmoże być MESSAGES, TIMEitp).
  • LC_ALLzastępuje wszystkie ustawienia. Jest to sposób na zastąpienie przez wszystkie ustawienia wszystkich ustawień w celu pracy w znanych ustawieniach narodowych (zwykle Cdomyślnych ustawieniach narodowych), zwykle w taki sposób, że różne polecenia generują dane wyjściowe w znanym formacie.

Możesz więc ustawić LANG=de_AT.UTF-8i LC_MESSAGES=C( Cjest to domyślne ustawienie regionalne i oznacza nieprzetłumaczone; en_USzwykle jest identyczne jak w Cprzypadku wiadomości).

Istnieją jednak dwie kategorie, w których nie zalecam zmiany wartości domyślnej, ponieważ psuje wiele programów:

  • LC_COLLATEto kolejność sortowania znaków . Nie jest to bardzo przydatne, ponieważ wskazuje tylko, jak sortować znaki, a nie jak sortować ciągi. Narzędzia, które potrafią sortować ciągi, nie używają LC_COLLATE. Ponadto wiele narzędzi oczekuje rzeczy takich jak „ [a-z]pasuje do wszystkich 26 małych liter ASCII i żadnych innych znaków ASCII”, ale nie jest to prawdą w większości domyślnych ustawień narodowych (try echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICwskazuje, jak wyświetlać liczby. W szczególności w wielu językach sprawia, że ​​liczby zmiennoprzecinkowe używają ,raczej niż .kropki dziesiętnej. Ale większość programów, które analizują liczby, oczekuje a .i traktuje ,jako separator pól.

Więc polecam

  • jawnie LC_COLLATE=C LC_NUMERIC=_C,
  • lub pozostawić LANGwyłączony i tylko ustawić wartość dla użytecznych kategorii ( LC_MESSAGES, LC_TIME, LC_PAPER, oraz LC_CTYPE(którego wartość może się zmieniać w zależności od terminalu)).

¹ Plus LANGUAGEz GNU libc. Jeśli nie słyszałeś o tym, nie tracisz wiele.

Gilles „SO- przestań być zły”
źródło
Dzięki za szczegółową odpowiedź i wyjaśnienia! Spróbuję jednak zlokalizować LC_NUMERIC, ponieważ numpad na niemieckich klawiaturach ma ,zamiast .(niestety), więc wprowadzanie liczb z kropką jest niewygodne (a większość aplikacji wydaje się ładnie współpracować z niestandardowym LC_NUMERIC). Nie do końca rozumiem twój przykład LC_COLLATE: W moim systemie podany przez ciebie przykład nie pasuje B.
Heinzi
@Heinzi Czy (powinien) LC_COLLATE wpływa na zakresy znaków?
Gilles „SO- przestań być zły”
10

Ustawienia regionalne strony podręcznika (7) mówią:

domyślne ustawienia regionalne [...] określa się, wykonując następujące czynności:

  1. Jeśli istnieje niepusta zmienna środowiskowa LC_ALL, używana jest wartość LC_ALL.

  2. Jeśli istnieje zmienna środowiskowa o tej samej nazwie co jedna z powyższych kategorii [LC_ *] i ma wartość inną niż null, jej wartość jest używana dla tej kategorii.

  3. Jeśli istnieje niepusta zmienna środowiskowa LANG, używana jest wartość LANG.

Możesz więc użyć LANG jako pewnego rodzaju analogu LC_ALL o niskim priorytecie: ustaw wartość LANG na de_ATi LC_MESSAGES na en_US:

$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"
Riccardo Murri
źródło