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. Dit overzicht krijg je met het commando locale:

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

LC_ALL

Alle onderdelen van de locale zijn systeemvariabelen. Dus ook LC_ALL. Deze dient om overige instellen te overrulen. Het lijkt normaal te zijn dat hier geen waarde is ingevuld [2]

Cannot set LC_ALL to default locale (casus voorjaar 2018)

Probleem

Tijdens installatie van een webserver gedurende voorjaar 2018:

> locale

locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=nl_NL.UTF-8
LC_TIME=nl_NL.UTF-8
LC_COLLATE=nl_NL.UTF-8
LC_MONETARY=nl_NL.UTF-8
LC_MESSAGES="en_US.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
LC_ALL=

Oplossing

sudo dpkg-reconfigure locales

Ik vermoed dat nu pas de bijbehorende databronnen beschikbaar gemaakt worden.

Test:

>locale

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=nl_NL.UTF-8
LC_TIME=nl_NL.UTF-8
LC_COLLATE=nl_NL.UTF-8
LC_MONETARY=nl_NL.UTF-8
LC_MESSAGES="en_US.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
LC_ALL=

...En geen foutmelding!

Casus: Locale instellen (mei 2018)

Dit betreft een verse Linux Mint-installatie met Engels als taal.

Oude situatie

  • In Calc wordt de punt gebruikt als decimaal-scheidingsteken
  • Output van locale - Hier zit aardig wat Nederlands bij!
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"   ← Capitalisation - Gebruik van hoofdletters
LC_NUMERIC=nl_NL.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=nl_NL.UTF-8
LC_MESSAGES="en_US.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
LC_ALL=

Output van localectl - Ook met aardig wat NL-instellingen:

localectl
   System Locale: LANG=en_US.UTF-8
                  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

Output van 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

Er is dus wel degelijk een Nederlandstalige locale aangemaakt. Hij is waarschijnlijk alleen nog niet in gebruik genomen.

De map ~/.config/locale bestaat niet

Acties

Dit werkte als enige
  • Nieuwe instellingen aan .bashrc toegevoegd, maar Calc bleef punten & dollars gebruiken
  • In Gnome dit ook ingesteld - Werkt niet goed, want onvoldoende fijnmazig
  • In Calc ingesteld (zie screenshot) - Eindelijk werkt het.

Conclusies

Ik denk dat het allemaal goed was ingesteld, maar dat Gnome de systeeminstellingen overruled. Aangezien de instellingen Gnome niet fijnmazig genoeg zijn om dit afdoende in te stellen, gaat dit altijd verkeerd, en moet je het inderdaad gewoon in Calc instellen.

Bronnen

Achtergrond

Casus juli 2017