Locale instellingen (Linux)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Om Linux aan te passen aan locale instellingen (bv. taal, datum, valuta, decimale scheidingsteken, duizendtal-scheidingsteken), heb je de nodige instellingen ter beschikking. Meestal wil ik een combinatie van verschillende locales. Bv. Engels, maar wel met komma's, datumaanduidingen en euro's zoals in Nederland.

Het is elke keer weer een gepiel om dat goed te krijgen. Bij voorkeur doe ik dit zo low-level mogelijk, dus via Bash. Daarmee kom ik een heel eind, maar niet voor 100%: Instellingen in Gnome kunnen deze instellingen nogal overrulen. Dus vaak moet je ook in Gnome dingen aanpassen (nieuwe theorie: Juist helemaal nix in Gnome aanpassen - Dan worden wellicht de systeeminstellingen overgenomen!)

Achtergrond

Locales worden gebruikt door glibc en andere locale-aware programma's om text, datum, valuata, soorteervolgorde, etc. aan te passen aan locale gebruiken.

Het behelst een systeem met zo'n drie onderdelen:

  • Local Names: Specificaties van talen/landen
  • System variables: Zoals taal, valuta, etc.
  • Configuraties: Dit is waar local names aan system variables toegewezen worden. Dat kan ik verschillende bestanden en op verschillende manieren.

Locale Names

Locales of local names zijn in de vorm [1]

language[_territory].[codeset][@modifier]

waarbij geldt:

Alle beschikbare locales kun je opvragen mbv. less /etc/locale.gen. Dit zijn de NL-gerelateerde locales:

nl_AW UTF-8
nl_BE ISO-8859-1
nl_BE.UTF-8 UTF-8
nl_BE@euro ISO-8859-15
nl_NL ISO-8859-1
nl_NL.UTF-8 UTF-8
nl_NL@euro ISO-8859-15

Merk op dat er niet zoiets bestaat als en_NL (Engelstalig + Nederland). Ik heb me er bij neergelegd dat ik qua taal en_US UTF-8 gebruik.

Dit zijn de instellen op één van m'n computers. Dit was voordat ik de locale had geconfigureerd:

LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="C"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="C"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

Locales aanmaken

Om een local te kunnen gebruiken, moet je 'm eerst aanmaken: sudo vim /etc/locale.gen. Uit-commentariseer de gewenste locales. Voor mij zijn dat meestal deze twee regels:

en_US.UTF-8 UTF-8
nl_NL.UTF-8 UTF-8

Sla het bestand op, en genereer de betreffende locales mbv.

locale-gen

Ik denk dat de betreffende bestanden vervolgens uit /us/lib/locale/locale-archive worden gevist, en op de juiste plekken in het OS worden geplaatst.

System Locale

De system Locale is (lijkt me) de standaard-locale-configuratie. Die kun je opvragen met localectl. Op deze computer geeft dit:

strompf@Dell2017 /etc $ localectl
   System Locale: LANG=en_US.UTF-8
                  LANGUAGE=en_US:en
                  LC_NUMERIC=nl_NL.UTF-8
                  LC_MONETARY=nl_NL.UTF-8
                  LC_PAPER=nl_NL.UTF-8
                  LC_NAME=nl_NL.UTF-8
                  LC_ADDRESS=nl_NL.UTF-8
                  LC_TELEPHONE=nl_NL.UTF-8
                  LC_MEASUREMENT=nl_NL.UTF-8
                  LC_IDENTIFICATION=nl_NL.UTF-8
       VC Keymap: n/a
      X11 Layout: us
       X11 Model: pc105
     X11 Variant: euro

Verbazend, want het probleem was juist dat alles op en_EN was ingesteld. Ik weet niet waar localectl z'n informatie vandaan haalt. man localctl gaf dat niet aan.

Verder kun je de system locale configureren in bestand /etc/locale.conf Dat bestand bestaat niet op deze computer.

User locale

Er zijn verschillende manieren om gebruiker-specifieke instellingen te configureren:

  • ~/.config/locale/conf
  • .bashrc
  • Meer? Er is zelfs een bestand waarin je de precedence kunt aangeven
  • GNOME - Yep: Instellingen daar, overrulen in mijn geval de eerdere instellingen (Linux Mint, geïnstalleerd eind 2016).

Voorbeeld van ~/.config/locale/conf:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_NUMERIC=nl_NL.UTF-8
LC_MONETARY=nl_NL.UTF-8
LC_PAPER=nl_NL.UTF-8
LC_NAME=nl_NL.UTF-8
LC_ADDRESS=nl_NL.UTF-8
LC_TELEPHONE=nl_NL.UTF-8
LC_MEASUREMENT=nl_NL.UTF-8
LC_IDENTIFICATION=nl_NL.UTF-8

en een voorbeeld van .bashrc (eigen verzinsel, kunnen fouten in zitten):

###########################################
# Locale
###########################################
#
export LANG=en_US.UTF-8
export LANGUAGE=en_US:en
# export LC_CTYPE="en_US.UTF-8"         # Wat is dit?
export LC_NUMERIC=nl_NL.UTF-8
export LC_TIME=nl_NL.UTF-8
export LC_COLLATE=nl_NL.UTF-8
export LC_MONETARY=nl_NL.UTF-8
# export LC_MESSAGES="en_US.UTF-8       # ?
export LC_PAPER=nl_NL.UTF-8
export LC_NAME=nl_NL.UTF-8
export LC_ADDRESS=nl_NL.UTF-8
export LC_TELEPHONE=nl_NL.UTF-8
export LC_MEASUREMENT=nl_NL.UTF-8
export LC_IDENTIFICATION=nl_NL.UTF-8

Overzicht actuele instellingen

locale

geeft een overzicht van actuele instellingen.

locale -a

geeft een overzicht van gegenereerde/beschikbare locales. Op de computer waarop ik dit schrijf, is dit de output:

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
nl_NL.utf8
POSIX

Hier zitten allerlei local names tussen die ik niet heb geactiveerd in /etc/locale.gen. Dit zijn hoogstwaarschijnlijk instellingen vanuit GNOME.

locale -m

geeft een overzicht van beschikbare character maps.

Gebruik de optie -v (verbose) voor meer info. Gebruik commando man locale voor een overzicht van overige opties.

Voorbeeld van een deel van de output van local -va:

locale: nl_NL.utf8      archive: /usr/lib/locale/locale-archive
-------------------------------------------------------------------------------
    title | Dutch locale for the Netherlands
   source | RAP
  address | Sankt Jørgens Alle 8, DK-1615 København V, Danmark
    email | xxxbug-glibc-locales@gnu.org
 language | Dutch
territory | Netherlands
 revision | 1.0
     date | 2000-06-29
  codeset | UTF-8

locale: C.UTF-8         directory: /usr/lib/locale/C.UTF-8
-------------------------------------------------------------------------------
    title | C locale
    email | xxx@debian.org
 language | C
 revision | 1.5
     date | 2012-11-18
  codeset | UTF-8

GNOME

Linux Mint, dec. 2017: Fijnmazige instellingen ontbreken. Je kunt écht alleen nog maar twee dingen instellen: taal/interface/date/time en nummers/valuta/adres/meeteenheden. Er wordt zelfs niet aangegeven welke system variables precies ingesteld worden

Het is al een paar keer genoemd. Hierbij nog een keer: Goede kans dat GNOME de bash-instellingen overruled. En da's nogal jammer, want de instellingen in GNOME zijn nooit erg werkzaam geweest, maar in Linux Mint (dec. 2016) zijn een hoop subinstellingen zelfs verdwenen`

LibreOffice

Vermoedelijk is er ook geen ontkomen aan, om in LibreOffice/Open Office instellingen locaal te specificeren. Da's goed én slecht nieuws: Ik ben blij dat het überhaupt kan

Locale instellen (casus juli 2017)

Dit betreft een nieuw-geïnstalleerde computer met Linux Mint. Alles staat nog zo'n beetje ingesteld op US. Ihb.: punten ipv. komma's & dollars ipv. euro's in Calc:

strompf@Dell2017 ~ $ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

en (al snap ik hier minder het nut van):

strompf@Dell2017 ~ $ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
nl_NL.utf8
POSIX

Bronnen

Achtergrond

Casus juli 2017