Locale instellingen (Linux)
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:
language
- ISO 639 language codeterritory
- ISO 3166 country codecodeset
- ISO-8859-1- of UTF-8-identifier. In de praktijk gebruik ik altijd een UTF-8-identifiermodifer
- Geen idee. Misschien zijn de aanduidingen@euro
op sommige regels in/etc/locale.gen
hier een voorbeeld van.
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
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
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
- 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
- http://isis.poly.edu/~qiming/fine-tuning-ubuntu-locale.html
- http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html
- http://www.freebsd.org/doc/nl/books/handbook/using-localization.html
- http://manpages.ubuntu.com/manpages/dapper/en/man5/locale.5.html
- http://www.kq22.com/linux/locale_files_under_ubuntu_374/ - Handig