Обычно я бегаю aptitude -y install locales
затем dpkg-reconfigure locales
для настройки локали.
Теперь я хочу поместить его в сценарий оболочки, как я могу надежно сделать следующее, автоматически / не интерактивно?
en_US.UTF-8
и установите его по умолчанию/etc/default/locale
содержит единственную запись LANG=en_US.UTF-8
как и ожидалосьНе смог получить @ 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). После первой перезагрузки менеджер входа в систему примет новые настройки нормально, но после входа в систему ваш сеанс пользователя продолжит использовать старые настройки; затем, после второй перезагрузки, ваш пользовательский сеанс также примет новые настройки.