Habituellement, je lance aptitude -y install locales
puis dpkg-reconfigure locales
pour configurer les paramètres régionaux.
Maintenant, je veux le mettre dans un script Shell, comment puis-je faire de manière fiable ce qui suit, automatiquement/sans interaction?
en_US.UTF-8
et le définir comme système par défaut/etc/default/locale
contient une seule et unique entrée de LANG=en_US.UTF-8
comme prévuVoir locale-gen:
locale-gen --purge en_US.UTF-8
et
echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Impossible de faire fonctionner la réponse ci-dessus. Au lieu de cela, j'utilise cette méthode (pour Dockerfiles):
# Configure timezone and locale
echo "Europe/Oslo" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata && \
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
sed -i -e 's/# nb_NO.UTF-8 UTF-8/nb_NO.UTF-8 UTF-8/' /etc/locale.gen && \
echo 'LANG="nb_NO.UTF-8"'>/etc/default/locale && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=nb_NO.UTF-8
Basé sur l'excellent travail de @ EirikW. Spécifique à un Dockerfile
:
ENV LANG=en_GB.UTF-8
RUN apt-get install -y locales && \
sed -i -e "s/# $LANG.*/$LANG.UTF-8 UTF-8/" /etc/locale.gen && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=$LANG
Pour reconfigurer le fuseau horaire et les paramètres régionaux de manière non interactive, à partir d'un script, voici ce qui fonctionne pour moi (sous Debian):
Pour configurer le fuseau horaire, je crée d'abord '/ etc/localtime' en tant que lien logiciel vers le fichier zoneinfo approprié sous le répertoire '/ usr/share/zoneinfo'. Ensuite, j'exécute la commande dpkg-reconfigure, et tout sera mis en place. Ainsi, par exemple, pour créer le fuseau horaire "Europe/Bruxelles":
AREA='Europe'
ZONE='Brussels'
ZONEINFO_FILE='/usr/share/zoneinfo/'"${AREA}"'/'"${ZONE}"
ln --force --symbolic "${ZONEINFO_FILE}" '/etc/localtime'
dpkg-reconfigure --frontend=noninteractive tzdata
(Notez que l'AREA est un sous-répertoire sous '/ usr/share/info', et la ZONE est un fichier sous le sous-répertoire AREA).
Pour configurer les paramètres régionaux, j'exécute d'abord un script sed qui créera une nouvelle copie du fichier '/etc/locale.gen', basée sur le contenu du '/ usr/share/i18n/Fichier pris en charge. Chaque ligne du fichier d'entrée sera copiée, mais elle sera transformée en commentaire, sauf s'il s'agit d'une entrée de paramètres régionaux UTF-8 pour une langue que je souhaite rendre disponible sur mon système (par exemple, anglais, néerlandais, français, et allemand):
sed --regexp-extended --expression='
1 {
i\
# This file lists locales that you wish to have built. You can find a list\
# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add\
# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change\
# this file, you need to rerun locale-gen.\
\
}
/^(en|nl|fr|de)(_[[:upper:]]+)?(\.UTF-8)?(@[^[:space:]]+)?[[:space:]]+UTF-8$/! s/^/# /
' /usr/share/i18n/SUPPORTED > /etc/locale.gen
Ensuite, j'ai défini les paramètres régionaux de l'environnement par défaut dans la base de données debconf, par exemple, sur anglais britannique:
debconf-set-selections <<< 'locales locales/default_environment_locale select en_GB.UTF-8'
Je supprime ensuite le fichier '/ etc/default/locale' existant (juste pour m'assurer que son ancien contenu n'interfère pas avec mes nouveaux paramètres), et exécute la commande dpkg-reconfigure pour générer tout les paramètres régionaux sélectionnés par le script sed, et pour créer un nouveau fichier '/ etc/default/locale' avec juste une entrée pour définir la variable 'LANG' sur les paramètres régionaux de l'environnement par défaut que vous avez sélectionnés:
rm --force --verbose /etc/default/locale
dpkg-reconfigure --frontend=noninteractive locales
Ensuite, en fonction de mes besoins, je souhaiterai peut-être exécuter quelques commandes pdate-locale, pour remplacer, par exemple, les variables qui affectent la mise en forme des valeurs et les définir sur des paramètres régionaux différents (tels que anglais irlandais):
update-locale LC_NUMERIC='en_IE.UTF-8'
update-locale LC_TIME='en_IE.UTF-8'
update-locale LC_MONETARY='en_IE.UTF-8'
update-locale LC_PAPER='en_IE.UTF-8'
update-locale LC_NAME='en_IE.UTF-8'
update-locale LC_ADDRESS='en_IE.UTF-8'
update-locale LC_TELEPHONE='en_IE.UTF-8'
update-locale LC_MEASUREMENT='en_IE.UTF-8'
update-locale LC_IDENTIFICATION='en_IE.UTF-8'
(J'aurais pu spécifier tous ces paramètres sur une seule invocation de la commande pdate-locale, mais apparemment, l'ordre dans lequel les entrées sont écrites dans le fichier '/ etc/default/locale' est imprévisible si je le fais. Je préfère qu'ils soient toujours dans le même ordre, c'est pourquoi je les génère un par un.)
Et enfin, je voudrais peut-être exécuter la commande pdate-locale une dernière fois, pour configurer la variable LANGUAGE (c'est-à-dire la liste des langues dans lesquelles je veux que les messages texte traduisibles soient affichés):
update-locale LANGUAGE='en_GB:en_US:en'
Jetez tout cela ensemble dans un script bash, et vous pouvez facilement reconfigurer vos paramètres régionaux avec une simple exécution du script, qui ne nécessitera aucune autre interaction de l'utilisateur.
D'après mon expérience, cependant, les nouveaux paramètres ne seront entièrement activés qu'après avoir redémarré votre système deux fois (au moins sur Debian Jessie Xfce). Après le premier redémarrage, le gestionnaire de connexion prendra correctement les nouveaux paramètres, mais après votre connexion, votre session utilisateur continuera à utiliser les anciens paramètres; puis, après le deuxième redémarrage, votre session utilisateur prendra également les nouveaux paramètres.
Pour moi, il fallait régler les 3 ENV-Vars supplémentaires:
# - Set the locale + timezone --------------------------------------------------
RUN echo "Europe/Vienna" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata && \
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
sed -i -e 's/# de_AT.UTF-8 UTF-8/de_AT.UTF-8 UTF-8/' /etc/locale.gen && \
echo 'LANG="de_AT.UTF-8"'>/etc/default/locale && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=de_AT.UTF-8
ENV LANG de_AT.UTF-8
ENV LANGUAGE de_AT.UTF-8
ENV LC_ALL de_AT.UTF-8
Cependant, merci à ErikWs pour sa réponse: ( https://serverfault.com/a/689947 )