Bagaimana Anda mengatur lokal non-interaktif di Debian / Ubuntu?

33

Biasanya, saya jalankan aptitude -y install localeskemudian dpkg-reconfigure localesuntuk mengatur lokal.

Sekarang saya ingin memasukkannya ke dalam skrip shell, bagaimana saya dapat melakukan hal berikut secara otomatis / non-interaktif?

  • Pilih en_US.UTF-8dan atur sebagai standar sistem
  • Nonaktifkan semua lokal lain
  • (Opsional) Verifikasi jika /etc/default/localeberisi entri satu-dan-satunya LANG=en_US.UTF-8seperti yang diharapkan
kenn
sumber

Jawaban:

13

Lihat lokal-gen :

 locale-gen --purge en_US.UTF-8

dan

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Batu
sumber
1
Terima kasih, tapi saya dapat 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"))...
kenn
Coba LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Stone
Pagi ini, dengan kondisi VM yang bersih, itu berhasil! Terima kasih!
kenn
Hmm ... ketika Anda menjalankan locale-gen --purge en_GB.UTF-8instalasi yang bersih, Anda mendapatkan output yang tidak terduga ini: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.Ada ide bagaimana mengatur daftar lokal seperti yang Anda lakukan di dpkg-mengkonfigurasi ulang lokal non-interaktif?
Benjamin Nolan
Keduanya memberikan izin yang ditolak kesalahan ....
Cerin
47

Tidak bisa mendapatkan jawaban di atas berfungsi. Sebagai gantinya, saya menggunakan metode ini (untuk 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
sumber
3
Dockerfile adalah persis apa yang saya butuhkan untuk ini. Terima kasih.
peedee
5
Harap jangan merujuk jawaban lain sebagai "di atas", "di bawah" atau serupa. Jawaban bergerak ketika orang-orang memilihnya, menerimanya, menghapusnya, atau hanya memilih pesanan yang berbeda. Selalu gunakan nama orang yang memposting jawaban, atau lebih baik lagi, gunakan tautan bagikan di bawah jawaban yang Anda komentari untuk menautkan jawaban secara eksplisit.
rjmunro
Versi yang sedikit lebih rapi dari jawaban ini - khusus untuk Dockerfiles .. EDIT: karena baris baru tidak berfungsi di sini, silakan merujuk ke jawaban saya serverfault.com/a/801162/89669
mafrosis
Saya perlu en_GB.UTF-8mengatur lokal di CircleCI - ini adalah jawaban terbaik yang berfungsi. Berharap itu karena komentar ini, Google mungkin menunjukkan ini sebagai relevan ketika orang mencoba mencari masalah yang saya alami.
Alex Szabó
echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale tidak berguna dengan pembaruan-locale LANG = nb_NO.UTF-8
otonglet
7

Untuk mengkonfigurasi ulang zona waktu dan lokal secara non-interaktif, dari dalam skrip, inilah yang berfungsi untuk saya (di bawah Debian):

  • Untuk mengkonfigurasi zona waktu, saya pertama-tama membuat '/ etc / localtime' sebagai tautan lunak ke file zoneinfo yang sesuai di bawah direktori '/ usr / share / zoneinfo'. Kemudian, saya menjalankan perintah dpkg-reconfigure , dan semuanya akan diberlakukan. Jadi, misalnya, untuk mengatur zona waktu 'Eropa / Brussels':

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

    (Perhatikan bahwa AREA adalah subdirektori di bawah '/ usr / share / info', dan ZONE adalah file di bawah subdirektori AREA).

  • Untuk mengkonfigurasi locales, saya pertama kali menjalankan skrip sed yang akan membuat salinan baru dari file '/etc/locale.gen', berdasarkan pada isi file '/ usr / share / i18n / SUPPORTED'. Setiap baris dari file input akan disalin, tetapi akan diubah menjadi komentar kecuali itu adalah entri dari UTF-8 lokal untuk bahasa yang ingin saya sediakan di sistem saya (misalnya, Inggris, Belanda, Perancis, dan Jerman):

    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

    Selanjutnya, saya mengatur lokal lingkungan default di database debconf, misalnya, ke British English :

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

    Saya kemudian menghapus file '/ etc / default / locale' yang ada (hanya untuk memastikan bahwa konten yang lama tidak akan mengganggu pengaturan baru saya), dan menjalankan perintah dpkg-mengkonfigurasi ulang untuk menghasilkan semua lokal yang dipilih oleh skrip sed , dan untuk membuat file '/ etc / default / locale' baru dengan hanya sebuah entri untuk mengatur variabel 'LANG' menjadi lokal lingkungan default yang saya pilih:

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

    Kemudian, tergantung pada persyaratan saya, saya mungkin ingin menjalankan beberapa perintah pembaruan-lokal , untuk mengesampingkan, misalnya, variabel yang memengaruhi pemformatan nilai, dan mengaturnya ke lokal yang berbeda (seperti Bahasa Inggris Irlandia ):

    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'

    (Saya bisa menentukan semua parameter ini pada satu permintaan tunggal perintah pembaruan-lokal , tetapi tampaknya, urutan entri dapat ditulis ke file '/ etc / default / locale' tidak dapat diprediksi jika saya melakukannya. Saya lebih suka mereka selalu dalam urutan yang sama, itulah sebabnya saya membuat mereka satu per satu.)

    Dan akhirnya, saya mungkin ingin menjalankan perintah pembaruan-lokal untuk yang terakhir kalinya, untuk mengatur variabel LANGUAGE (yaitu, daftar bahasa tempat saya ingin pesan teks yang dapat diterjemahkan ditampilkan):

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

Letakkan semua ini bersama-sama menjadi skrip bash, dan Anda dapat dengan mudah mengkonfigurasi ulang pengaturan lokal Anda dengan menjalankan skrip yang sederhana, yang tidak akan memerlukan interaksi pengguna lebih lanjut.

Dalam pengalaman saya, bagaimanapun, pengaturan baru tidak akan sepenuhnya diaktifkan sampai setelah Anda reboot sistem Anda dua kali (setidaknya pada Debian Jessie Xfce). Setelah reboot pertama, manajer login akan mengambil pengaturan baru dengan baik, tetapi setelah Anda login, sesi pengguna Anda akan terus menggunakan pengaturan lama; kemudian, setelah reboot kedua, sesi pengguna Anda akan mengambil pengaturan baru juga.

Luvr
sumber
7

Berdasarkan hasil kerja yang baik dalam jawaban @ EirikW. Khusus untuk 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
sumber
1
Saya lebih suka mengatur ENV setelah dinyatakan Anda akan mendapatkan kesalahan ini: "perl: peringatan: Pengaturan lokal gagal. \ Perl: peringatan: Harap periksa bahwa pengaturan lokal Anda: \ LANG =" en_US.UTF-8 "\ didukung dan diinstal pada sistem Anda. \ perl: warning: Jatuh kembali ke standar lokal ("C").
otonglet
6

Bagi saya itu perlu untuk mengatur tambahan 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

Namun Terima kasih kepada ErikWs atas jawabannya: ( https://serverfault.com/a/689947 )

Mike Mitterer
sumber
1
Ini adalah satu-satunya solusi yang bekerja untuk saya, saya menggunakan Docker versi 17.06.1-ce, build 874a737
linuxatico