คุณตั้งค่าภาษาแบบไม่โต้ตอบบน Debian / Ubuntu ได้อย่างไร


33

โดยปกติผมทำงานaptitude -y install localesแล้วdpkg-reconfigure localesการตั้งค่าสถานที่เกิดเหตุ

ตอนนี้ฉันต้องการใส่มันลงในเชลล์สคริปฉันจะทำสิ่งต่อไปนี้โดยอัตโนมัติ / ไม่โต้ตอบได้อย่างไร?

  • เลือกen_US.UTF-8และตั้งเป็นค่าเริ่มต้นของระบบ
  • ปิดการใช้งานตำแหน่งที่ตั้งอื่นทั้งหมด
  • (ไม่บังคับ) ตรวจสอบว่า/etc/default/localeมีรายการเดียวและอย่างเดียวของLANG=en_US.UTF-8ที่คาดไว้

คำตอบ:


13

ดูสถานที่เกิดเหตุ - 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

เมื่อเช้านี้ด้วยสภาพที่สะอาดของ VM มันทำงานได้! ขอบคุณ!
เคนน์

อืม ... เมื่อคุณรันlocale-gen --purge en_GB.UTF-8การติดตั้งใหม่ทั้งหมดคุณจะได้รับผลลัพธ์ที่ไม่คาดคิด: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.แนวคิดใด ๆ ที่จะกำหนดรายการของตำแหน่งที่ตั้งตามที่คุณทำใน dpkg-reconfigure locales ไม่ใช่แบบโต้ตอบ?
Benjamin Nolan

ทั้งสองนี้ได้รับอนุญาตให้ปฏิเสธข้อผิดพลาด ....
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

3
Dockerfile เป็นสิ่งที่ฉันต้องการสำหรับสิ่งนี้ ขอบคุณ
peedee

5
โปรดอย่าอ้างอิงคำตอบอื่น ๆ ว่า "เหนือ", "ด้านล่าง" หรือคล้ายกัน คำตอบจะย้ายไปรอบ ๆ เมื่อผู้คนโหวตให้พวกเขายอมรับลบออกหรือเลือกคำสั่งซื้ออื่น ใช้ชื่อของบุคคลที่โพสต์คำตอบเสมอหรือดีกว่าให้ใช้ลิงก์แชร์ใต้คำตอบที่คุณแสดงความคิดเห็นเพื่อลิงก์ไปยังคำตอบอย่างชัดเจน
rjmunro

รุ่น neater เล็กน้อยของคำตอบนี้ - เฉพาะสำหรับ Dockerfiles .. แก้ไข: เนื่องจาก newlines ไม่ทำงานที่นี่โปรดอ้างอิงserverfault.com/a/801162/89669
mafrosis

ฉันต้องมีen_GB.UTF-8สถานที่ตั้งใน CircleCI - นี่เป็นคำตอบที่ดีที่สุดที่ทำงาน หวังว่าเนื่องจากความคิดเห็นนี้ Google อาจแสดงสิ่งนี้ว่ามีความเกี่ยวข้องเมื่อผู้คนพยายามค้นหาปัญหาที่ฉันมี
Alex Szabó

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale ซ้ำซ้อนกับ update-locale LANG = nb_NO.UTF-8
otonglet

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 / สนับสนุน' ไฟล์ ทุกบรรทัดจากไฟล์อินพุตจะถูกคัดลอก แต่มันจะกลายเป็นความคิดเห็นยกเว้นว่าจะเป็นรายการของโลแคล 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 เช่นเป็นBritish English :

    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'

รวมสิ่งเหล่านี้เข้าด้วยกันเป็นสคริปต์ทุบตีและคุณสามารถกำหนดค่าการตั้งค่าภาษาได้อย่างง่ายดายด้วยการเรียกใช้สคริปต์อย่างง่ายซึ่งไม่จำเป็นต้องมีการโต้ตอบกับผู้ใช้อีกต่อไป

จากประสบการณ์ของฉันการตั้งค่าใหม่จะไม่เปิดใช้งานทั้งหมดจนกว่าคุณจะรีบูตระบบของคุณสองครั้ง (อย่างน้อยใน 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

1
ฉันต้องการตั้งค่า ENV หลังจากนั้นมิฉะนั้นคุณจะได้รับข้อผิดพลาดนี้: "perl: คำเตือน: การตั้งค่าภาษาล้มเหลว \ perl: คำเตือน: โปรดตรวจสอบว่าการตั้งค่าภาษาของคุณ: \ LANG =" en_US.UTF-8 "\ ติดตั้งในระบบของคุณแล้ว \ perl: คำเตือน: กลับไปที่ตำแหน่งที่ตั้งมาตรฐาน ("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, build 874a737
linuxatico
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.