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

33

Обычно я бегу aptitude -y install localesто , dpkg-reconfigure localesчтобы настроить локаль.

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

  • Выберите en_US.UTF-8и установите его как системное значение по умолчанию
  • Отключить все остальные локали
  • (Необязательно) Проверьте, /etc/default/localeсодержит ли единственная запись, LANG=en_US.UTF-8как ожидалось
кенна
источник

Ответы:

13

Смотрите locale-gen :

 locale-gen --purge en_US.UTF-8

а также

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Камень
источник
1
Спасибо, но я получаю File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module> sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))...
Кенн
Попробуйте LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Stone
Сегодня с чистым состоянием ВМ все заработало! Благодарность!
Кенн
Хм… когда вы запускаете locale-gen --purge en_GB.UTF-8чистую установку, вы получаете неожиданный вывод: есть Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.идеи, как настроить список локалей, как это делается в dpkg-перенастраивать локали неинтерактивно?
Бенджамин Нолан
Это оба дают разрешение на отказ в ошибках ....
Cerin
47

Не удалось получить ответ выше, чтобы работать. Вместо этого я использую этот метод (для 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
EirikW
источник
3
Dockerfile - именно то, для чего мне это нужно. Спасибо.
Пиди
5
Пожалуйста, не называйте другие ответы как «выше», «ниже» или аналогичные. Ответы перемещаются по мере того, как люди голосуют за них, принимают их, удаляют их или просто выбирают разные заказы. Всегда используйте имя человека, который разместил ответ, или, что еще лучше, используйте ссылку «Поделиться» под ответом, который вы комментируете, для явной ссылки на ответ.
rjmunro
Немного более точная версия этого ответа - специально для Dockerfiles .. РЕДАКТИРОВАТЬ: так как переводы строки здесь не работают, пожалуйста, обратитесь к моему ответу serverfault.com/a/801162/89669
mafrosis
Мне нужно было en_GB.UTF-8настроить язык в CircleCI - это был лучший ответ, который работал. Надеясь, что из-за этого комментария Google может показать это как актуальное, когда люди пытаются найти проблему, которая возникла у меня.
Алекс Сабо
echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale является избыточной с локалью обновления LANG = nb_NO.UTF-8
отонглет
7

Чтобы переконфигурировать часовой пояс и локализацию неинтерактивно, из скрипта, вот что работает для меня (в 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). После первой перезагрузки менеджер входа в систему примет новые настройки в порядке, но после входа в систему пользовательский сеанс продолжит использовать старые настройки; затем, после второй перезагрузки, ваша пользовательская сессия также примет новые настройки.

Лувр
источник
7

На основании хорошей работы в ответе @ 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
mafrosis
источник
1
Я предпочитаю устанавливать ENV после того, как в противном случае вы получите эту ошибку: "perl: warning: Ошибка установки языкового стандарта. \ Perl: warning: Пожалуйста, проверьте, что ваши настройки языкового стандарта: \ LANG =" en_US.UTF-8 "\ поддерживаются и установлен в вашей системе. \ perl: warning: Откат к стандартной локали («C»).
otonglet
6

Для меня было необходимо установить дополнительные 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 )

Майк Миттерер
источник
1
Это единственное решение, которое у меня сработало, я на Docker версии 17.06.1-ce, сборка 874a737
linuxatico