Назад | Перейти на главную страницу

Как установить языковой стандарт в Debian / Ubuntu в неинтерактивном режиме?

Обычно я бегаю aptitude -y install locales затем dpkg-reconfigure locales для настройки локали.

Теперь я хочу поместить его в сценарий оболочки, как я могу надежно сделать следующее, автоматически / не интерактивно?

Не смог получить @ Stone ответ работать. Вместо этого я использую этот метод (для 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

Видеть locale-gen:

 locale-gen --purge en_US.UTF-8

и

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale

На основе прекрасной работы в ответе @EirikW. Специфично для 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

Для меня было необходимо установить дополнительные 3 ENV-Vars:

# - 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

Однако спасибо ErikWs за ​​его ответ: (https://serverfault.com/a/689947)

Чтобы перенастроить часовой пояс и локали неинтерактивно, из скрипта, вот что у меня работает (в Debian):

  • Для настройки часового пояса я сначала создаю / etc / localtime как мягкую ссылку на соответствующий zoneinfo файл в каталоге / usr / share / zoneinfo. Затем я запускаю dpkg-reconfigure команду, и все будет поставлено на свои места. Так, например, для настройки часового пояса «Европа / Брюссель»:

    AREA='Europe'
    ZONE='Brussels'
    
    ZONEINFO_FILE='/usr/share/zoneinfo/'"${AREA}"'/'"${ZONE}"
    ln --force --symbolic "${ZONEINFO_FILE}" '/etc/localtime'
    dpkg-reconfigure --frontend=noninteractive tzdata
    

    (Обратите внимание, что AREA - это подкаталог в '/ usr / share / info', а ZONE - это файл в подкаталоге AREA).

  • Для настройки локалей я сначала запускаю sed сценарий, который создаст новую копию файла '/etc/locale.gen' на основе содержимого файла '/ usr / share / i18n / SUPPORTED'. Каждая строка из входного файла будет скопирована, но она будет превращена в комментарий, если только это не запись локали UTF-8 для языка, который я хочу сделать доступным в моей системе (например, английский, голландский, французский, и немецкий):

    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
    

    Затем я установил локаль среды по умолчанию в базе данных debconf, например, на Британский английский:

    debconf-set-selections <<< 'locales locales/default_environment_locale select en_GB.UTF-8'
    

    Впоследствии я удаляю существующий файл / etc / default / locale (просто чтобы убедиться, что его старое содержимое не мешает моим новым настройкам) и запускаю dpkg-reconfigure команда для создания всех локалей, которые sed выбранный скрипт и создать новый файл '/ etc / default / locale' только с записью для установки переменной 'LANG' в выбранную мной локаль среды по умолчанию:

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

    Затем, в зависимости от моих требований, я могу запустить несколько update-locale команды, чтобы переопределить, например, переменные, которые влияют на форматирование значений, и установить для них другой языковой стандарт (например, Ирландский английский):

    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'
    

    (Я мог бы указать все эти параметры за один вызов update-locale команда, но, очевидно, порядок, в котором записи записываются в файл '/ etc / default / locale', будет непредсказуемым, если я это сделаю. Я предпочитаю, чтобы они всегда были в одном порядке, поэтому я генерирую их один за другим.)

    И, наконец, я могу захотеть запустить update-locale в последний раз, чтобы настроить переменную LANGUAGE (т.е. список языков, на которых я хочу отображать переводимые текстовые сообщения):

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

Сложите все это вместе в сценарий bash, и вы сможете легко изменить настройки локали с помощью простого запуска сценария, который не потребует дальнейшего взаимодействия с пользователем.

Однако, по моему опыту, новые настройки не будут полностью активированы до тех пор, пока вы не перезагрузите систему дважды (по крайней мере, в Debian Jessie Xfce). После первой перезагрузки менеджер входа в систему примет новые настройки нормально, но после входа в систему ваш сеанс пользователя продолжит использовать старые настройки; затем, после второй перезагрузки, ваш пользовательский сеанс также примет новые настройки.