40 votes

Comment définir de manière non interactive une locale dans Debian/Ubuntu?

En général, j'exécute aptitude -y install locales puis dpkg-reconfigure locales pour configurer la locale.

Maintenant, je veux mettre cela dans un script shell, comment puis-je faire de manière fiable, automatiquement / de manière non interactive?

  • Choisir en_US.UTF-8 et le définir comme langue par défaut du système
  • Désactiver toutes les autres locales
  • (Facultatif) Vérifier si /etc/default/locale contient une et une seule entrée de LANG=en_US.UTF-8 comme prévu

58voto

EirikW Points 581

N'ai pas réussi à faire fonctionner la réponse de @stone. Au lieu de cela, j'utilise cette méthode (pour les Dockerfiles) :

# Configurez le fuseau horaire et la 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

17voto

mafrosis Points 341

Basé sur le travail minutieux de la réponse d'@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/" /etc/locale.gen && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=$LANG

16voto

Stone Points 6841

Voir 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

8voto

Pola Edward Points 109

Pour moi, il était nécessaire de définir les 3 variables ENV supplémentaires :

# - Définir la locale + fuseau horaire ---------------------------------------------
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)

7voto

luvr Points 71

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' comme un lien symbolique vers le fichier zoneinfo approprié dans le répertoire '/usr/share/zoneinfo'. Ensuite, j'exécute la commande dpkg-reconfigure, et tout sera mis en place. Par exemple, pour configurer 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

    (Remarquez que l'AREA est un sous-répertoire sous '/usr/share/info', et le ZONE est un fichier dans le sous-répertoire de l'AREA).

  • Pour configurer les paramètres régionaux, je lance d'abord un script sed qui va créer une nouvelle copie du fichier '/etc/locale.gen', basée sur le contenu du fichier '/usr/share/i18n/SUPPORTED'. Chaque ligne du fichier d'entrée sera copiée, mais deviendra un commentaire sauf s'il s'agit d'une entrée d'un paramètre régional 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\
    # Ce fichier répertorie les paramètres régionaux que vous souhaitez construire. Vous pouvez trouver une liste\
    # de paramètres régionaux valides pris en charge à /usr/share/i18n/SUPPORTED, et vous pouvez ajouter\
    # des paramètres régionaux définis par l'utilisateur à /usr/local/share/i18n/SUPPORTED. Si vous modifiez\
    # ce fichier, vous devez réexécuter locale-gen.\
    \
    
      }
    
    /^(en|nl|fr|de)(_[[:upper:]]+)?(\.UTF-8)?(@[^[:space:]]+)?[[:space:]]+UTF-8$/!   s/^/# /
    
    ' /usr/share/i18n/SUPPORTED >  /etc/locale.gen

    Ensuite, je définis le paramètre régional par défaut dans la base de données debconf, par exemple, en 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érera pas avec mes nouveaux paramètres), et j'exécute la commande dpkg-reconfigure pour générer tous les paramètres régionaux sélectionnés par le script sed, et pour créer un nouveau fichier '/etc/default/locale' avec seulement une entrée pour définir la variable 'LANG' sur mon paramètre régional par défaut sélectionné :

    rm --force --verbose /etc/default/locale
    dpkg-reconfigure --frontend=noninteractive locales

    Ensuite, selon mes besoins, je peux vouloir exécuter quelques commandes update-locale, pour remplacer, par exemple, les variables qui affectent le formatage des valeurs, et les définir sur un paramètre régional différent (comme l'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'

    (Je pourrais avoir spécifié tous ces paramètres lors d'une seule invocation de la commande update-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'elles soient toujours dans le même ordre, c'est pourquoi je les génère une par une.)

    Enfin, je peux vouloir exécuter une dernière fois la commande update-locale, pour configurer la variable LANGUAGE (c'est-à-dire, la liste des langues dans lesquelles je veux afficher les messages textuels traduisibles) :

    update-locale LANGUAGE='en_GB:en_US:en'

Regroupez tout cela dans un script bash, et vous pourrez facilement reconfigurer vos paramètres régionaux avec une simple exécution du script, sans nécessiter d'interaction utilisateur supplémentaire.

Cependant, d'après mon expérience, les nouveaux paramètres ne seront pas entièrement activés avant que vous ayez redémarré votre système deux fois (au moins sur Debian Jessie Xfce). Après le premier redémarrage, le gestionnaire de connexion prendra en compte les nouveaux paramètres, mais après la connexion, votre session utilisateur continuera à utiliser les anciens paramètres ; ensuite, après le deuxième redémarrage, votre session utilisateur prendra également en compte les nouveaux paramètres.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X