Làm cách nào để bạn đặt ngôn ngữ không tương tác trên Debian / Ubuntu?


33

Thông thường, tôi chạy aptitude -y install localessau đó dpkg-reconfigure localesđể thiết lập miền địa phương.

Bây giờ tôi muốn đặt nó vào một tập lệnh shell, làm thế nào tôi có thể thực hiện một cách đáng tin cậy các thao tác sau, tự động / không tương tác?

  • Chọn en_US.UTF-8và đặt nó làm mặc định hệ thống
  • Vô hiệu hóa tất cả các địa phương khác
  • (Tùy chọn) Xác minh nếu /etc/default/localechứa mục nhập một lần duy nhất LANG=en_US.UTF-8như mong đợi

Câu trả lời:


13

Xem miền địa phương :

 locale-gen --purge en_US.UTF-8

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

1
Cảm ơn, nhưng tôi đang nhận được 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

Hãy thử LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Đá

Sáng nay, với trạng thái sạch VM, nó đã hoạt động! Cảm ơn!
kenn

Khi bạn chạy locale-gen --purge en_GB.UTF-8trên một bản cài đặt sạch, bạn sẽ nhận được kết quả không mong muốn này: Bạn có Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.ý tưởng nào để thiết lập danh sách các địa điểm như bạn làm trong dpkg-cấu hình lại các địa điểm không tương tác không?
Benjamin Nolan

Điều này cho phép cả hai đều từ chối lỗi ....
Cerin

47

Không thể có được câu trả lời ở trên để làm việc. Thay vào đó, tôi sử dụng phương thức này (cho 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

3
Dockerfile chính xác là những gì tôi cần điều này cho. Cảm ơn.
peedee

5
Vui lòng không tham khảo các câu trả lời khác là "ở trên", "bên dưới" hoặc tương tự. Câu trả lời di chuyển xung quanh khi mọi người bỏ phiếu cho họ, chấp nhận chúng, xóa chúng hoặc chỉ chọn các đơn đặt hàng khác nhau. Luôn sử dụng tên của người đã đăng câu trả lời, hoặc thậm chí tốt hơn, sử dụng liên kết chia sẻ dưới câu trả lời bạn đang nhận xét để liên kết với câu trả lời một cách rõ ràng.
rjmunro

Phiên bản gọn gàng hơn của câu trả lời này - đặc biệt dành cho Dockerfiles .. EDIT: vì các dòng mới không hoạt động ở đây, vui lòng tham khảo câu trả lời của tôi serverfault.com/a/801162/89669
mafrosis

Tôi cần phải có en_GB.UTF-8ngôn ngữ được thiết lập trong CircleCI - đây là câu trả lời tốt nhất đang hoạt động. Hy vọng rằng vì nhận xét này, Google có thể hiển thị điều này có liên quan khi mọi người cố gắng tìm kiếm vấn đề mà tôi đang gặp phải.
Alex Szabó

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale là dự phòng với bản cập nhật LANG = nb_NO.UTF-8
otonglet

7

Để cấu hình lại múi giờ và các vùng không tương tác, từ bên trong một tập lệnh, đây là những gì hoạt động với tôi (trong Debian):

  • Để định cấu hình múi giờ, trước tiên tôi tạo '/ etc / localtime' dưới dạng liên kết mềm đến tệp zoneinfo thích hợp trong thư mục '/ usr / share / zoneinfo'. Sau đó, tôi chạy lệnh dpkg-recfigure và mọi thứ sẽ được đặt đúng chỗ. Vì vậy, ví dụ, để thiết lập múi giờ 'Châu Âu / Brussels':

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

    (Lưu ý rằng DIỆN là thư mục con trong '/ usr / share / thông tin' và ZONE là một tệp trong thư mục con DIỆN TÍCH).

  • Để định cấu hình các ngôn ngữ, trước tiên tôi chạy một tập lệnh sed sẽ tạo một bản sao mới của tệp '/etc/locale.gen', dựa trên nội dung của tệp '/ usr / share / i18n / HPORT TRỢ'. Mọi dòng từ tệp đầu vào sẽ được sao chép, nhưng nó sẽ được chuyển thành nhận xét trừ khi đó là mục nhập của ngôn ngữ UTF-8 cho ngôn ngữ mà tôi muốn cung cấp trên hệ thống của mình (ví dụ: tiếng Anh, tiếng Hà Lan, tiếng Pháp, và tiếng Đức):

    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

    Tiếp theo, tôi đặt ngôn ngữ môi trường mặc định trong cơ sở dữ liệu debconf, ví dụ : tiếng Anh Anh :

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

    Sau đó, tôi xóa tệp '/ etc / default / locale' hiện tại (chỉ để đảm bảo rằng nội dung cũ của nó sẽ không can thiệp vào cài đặt mới của tôi) và chạy lệnh dpkg-recfigure để tạo tất cả các vị trí mà tập lệnh sed đã chọn và để tạo tệp '/ etc / default / locale' mới chỉ bằng một mục nhập để đặt biến 'LANG' thành ngôn ngữ môi trường mặc định đã chọn của tôi:

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

    Sau đó, tùy thuộc vào yêu cầu của tôi, tôi có thể muốn chạy một vài lệnh cục bộ cập nhật , để ghi đè, ví dụ: các biến ảnh hưởng đến định dạng của các giá trị và đặt chúng thành một ngôn ngữ khác (chẳng hạn như tiếng Anh Ailen ):

    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'

    (Tôi có thể đã chỉ định tất cả các tham số này trên một lệnh gọi duy nhất của lệnh cập nhật cục bộ , nhưng rõ ràng, thứ tự các mục nhập được ghi vào tệp '/ etc / default / locale' là không thể đoán trước nếu tôi làm như vậy. thích chúng luôn luôn theo cùng một thứ tự, đó là lý do tại sao tôi tạo chúng từng cái một.)

    Và cuối cùng, tôi có thể muốn chạy lệnh cập nhật ngôn ngữ lần cuối, để thiết lập biến LANGUAGE (nghĩa là danh sách các ngôn ngữ mà tôi muốn tin nhắn văn bản có thể dịch được hiển thị):

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

Kết hợp tất cả những thứ này lại với nhau thành một tập lệnh bash và bạn có thể dễ dàng cấu hình lại các cài đặt ngôn ngữ của mình bằng một tập lệnh đơn giản, không cần thêm bất kỳ tương tác nào của người dùng.

Tuy nhiên, theo kinh nghiệm của tôi, các cài đặt mới sẽ không được kích hoạt hoàn toàn cho đến khi bạn khởi động lại hệ thống của mình hai lần (ít nhất là trên Debian Jessie Xfce). Sau lần khởi động lại đầu tiên, trình quản lý đăng nhập sẽ mất các cài đặt mới, nhưng sau khi bạn đăng nhập, phiên người dùng của bạn sẽ tiếp tục sử dụng các cài đặt cũ; sau đó, sau lần khởi động lại thứ hai, phiên người dùng của bạn cũng sẽ có các cài đặt mới.


7

Dựa trên công việc tốt trong câu trả lời của @ EirikW. Cụ thể cho một 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

1
Tôi thích đặt ENV sau khi bạn sẽ gặp lỗi này: "perl: cảnh báo: Cài đặt ngôn ngữ không thành công. \ Perl: cảnh báo: Vui lòng kiểm tra xem cài đặt ngôn ngữ của bạn: \ LANG =" en_US.UTF-8 "\ được hỗ trợ và được cài đặt trên hệ thống của bạn. \ perl: cảnh báo: Rơi trở lại miền địa phương tiêu chuẩn ("C").
otonglet

6

Đối với tôi, cần phải thiết lập thêm 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

Tuy nhiên, cảm ơn ErikWs vì câu trả lời của anh ấy: ( https://serverfault.com/a/689947 )


1
Đây là giải pháp duy nhất hiệu quả với tôi, tôi đang dùng Docker phiên bản 17.06.1-ce, xây dựng 874a737
linuxatico
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.