Debian / Ubuntu'da etkileşimli olmayan bir yerel ayarı nasıl belirlersiniz?


33

Genellikle, çalıştırmak aptitude -y install localessonra dpkg-reconfigure localesyerel kurmak.

Şimdi bir kabuk betiğine koymak istiyorum, aşağıdakileri otomatik olarak / etkileşimli olarak nasıl güvenilir bir şekilde yapabilirim?

  • Seçin en_US.UTF-8ve sistem varsayılanı olarak ayarlayın
  • Diğer tüm yerel ayarları devre dışı bırak
  • (İsteğe bağlı) Beklendiği gibi /etc/default/localeyalnızca bir tek giriş içerip içermediğini doğrulayın.LANG=en_US.UTF-8

Yanıtlar:


13

Yerel-gen bakın :

 locale-gen --purge en_US.UTF-8

ve

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

1
Teşekkürler, ama alıyorum 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

LANG'ı deneyin = en_US.UTF-8 yerel ayar-gen
Taş

Bu sabah temiz bir VM durumu ile işe yaradı! Teşekkürler!
kenn

Hmm… locale-gen --purge en_GB.UTF-8temiz bir kurulumda çalıştırdığınızda , beklenmeyen bir çıktı elde edersiniz: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.dpkg yeniden yapılandırma yerel ayarları etkileşimli olmayan olarak yerel ayarları nasıl ayarlayacağınıza dair bir fikriniz var mı?
Benjamin Nolan

Bu vermek izni hem .... reddedildi hataları
Cerin

47

Çalışmak için yukarıdaki cevabı alamadı. Bunun yerine, bu yöntemi kullanıyorum (Dockerfiles için):

# 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 tam da bunun için ihtiyacım olan şeydi. Teşekkürler.
Peedee

5
Lütfen "yukarıda", "aşağıda" veya benzeri gibi diğer cevaplara bakmayın. Yanıtlar, insanlar kendileri için oy verirken, kabul ettiklerinde, silindiklerinde veya farklı siparişler seçtiklerinde hareket ederler. Her zaman cevabı yazan kişinin adını kullanın, hatta daha da iyisi, açık bir şekilde cevaba bağlantı vermek için yorum yaptığınız cevabın altındaki paylaşım bağlantısını kullanın.
rjmunro

Bu cevabın biraz düzenli olmayan sürümü - özellikle Dockerfiles için .. EDIT: newlines burada çalışmadığı için lütfen cevabımı bakın serverfault.com/a/801162/89669
mafrosis

Ben var gerekiyordu en_GB.UTF-8yerel CircleCI kurmak - Bu çalışıyordu iyi cevap oldu. Bu yorum nedeniyle, Google, benim sahip olduğum sorunu aramaya çalıştığında bunu alakalı olarak gösterebilir.
Alex Szabó

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale, güncelleme yerel ayarıyla gereksiz. LANG = nb_NO.UTF-8
otonglet

7

Saat dilimini ve yerel ayarları etkileşimli olarak, bir komut dosyasından yeniden yapılandırmak için, işte benim için işe yarar (Debian'ın altında):

  • Saat dilimini yapılandırmak için ilk önce '/ usr / share / zoneinfo' dizini altındaki uygun zoneinfo dosyasına yumuşak bir bağlantı olarak '/ etc / localtime' oluşturuyorum . Sonra dpkg-reconfigure komutunu çalıştırdım ve her şey yerine konacak. Örneğin, 'Avrupa / Brüksel' saat dilimini kurmak için:

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

    (AREA'nın '/ usr / share / info' altındaki bir alt dizin olduğunu ve ZONE'nin AREA alt dizinindeki bir dosya olduğunu unutmayın).

  • Yerel ayarları yapılandırmak için önce '/ usr / share / i18n / SUPPORTED' dosyasının içeriğine bağlı olarak '/etc/locale.gen' dosyasının yeni bir kopyasını yaratacak bir sed komut dosyası çalıştırıyorum . Giriş dosyasındaki her satır kopyalanacak, ancak sistemimde kullanmak istediğim bir dil için UTF-8 yerel ayarının bir girişi olmadığı sürece bir yoruma çevrilecek (örneğin, İngilizce, Hollandaca, Fransızca, ve Almanca):

    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

    Daha sonra, örneğin debconf veritabanındaki varsayılan ortam yerel ayarını İngiliz İngilizcesi olarak ayarlarım :

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

    Daha sonra mevcut '/ etc / default / locale' dosyasını kaldırdım (yalnızca eski içeriğinin yeni ayarlarıma engel olamayacağından emin olmak için) ve sed komut dosyasının seçtiği tüm yerel ayarları oluşturmak için dpkg-reconfigure komutunu çalıştırdım ve 'LANG' değişkenini seçili varsayılan ortam yerel ayarıma ayarlamak için yalnızca giriş içeren yeni bir '/ etc / default / locale' dosyası oluşturmak için:

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

    Ardından, gereksinimlerime bağlı olarak , örneğin değerlerin biçimlendirmesini etkileyen değişkenleri geçersiz kılmak için birkaç güncelleme-yerel ayar komutları çalıştırmak ve bunları farklı bir yerel ayar ( İrlanda İngilizcesi gibi ) ayarlamak isteyebilirim :

    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'

    (Bu parametrelerin hepsini update-locale komutunun tek bir başlatması için belirtebilirdim , ancak görünüşe göre, girdilerin '/ etc / default / locale' dosyasına yazılma sırası tahmin edilemez. her zaman aynı sırada olmalarını tercih ediyorum, bu yüzden onları birer birer üretiyorum.)

    Son olarak, LANGUAGE değişkenini ayarlamak için update-locale komutunu son bir kez çalıştırmak isteyebilirim (örneğin, çevrilebilir metin mesajlarının görüntülenmesini istediğim dillerin listesi):

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

Bunları bir bash betiğine birlikte atın ve yerel ayarlarınızı daha fazla kullanıcı etkileşimi gerektirmeyecek şekilde betiğin basit bir çalışmasıyla kolayca yeniden yapılandırabilirsiniz.

Ancak tecrübelerime göre, sisteminizi iki kez yeniden başlatana kadar (en azından Debian Jessie Xfce'de) yeni ayarlar tamamen devreye girmeyecek. İlk yeniden başlatmanın ardından, oturum açma yöneticisi yeni ayarları tamamlayacaktır, ancak oturum açtıktan sonra kullanıcı oturumunuz eski ayarları kullanmaya devam edecektir; daha sonra, ikinci yeniden başlatmanın ardından, kullanıcı oturumunuz yeni ayarları da alacaktır.


7

@ EirikW'nin cevabındaki ince çalışmalara dayanarak. Şuna özgü 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
Aksi takdirde ENV'yi ayarlamayı tercih ederim, aksi takdirde şu hatayı alırsınız: "perl: warning: Yerel ayarı ayarlama. \ Perl: warning: Lütfen yerel ayarlarınızın kontrol edildiğini kontrol edin: \ LANG =" en_US.UTF-8 "\ sisteminizde yüklü. \ perl: uyarı: standart yerel ayarlara geri dönme ("C").
otonglet

6

Benim için ek 3 ENV-Vars ayarlamak gerekliydi:

# - 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

Ancak ErikWs'e cevabından dolayı teşekkür ederim: ( https://serverfault.com/a/689947 )


1
Bu benim için çalışan tek çözüm, ben Docker sürüm 17.06.1-ce, 874a737 yapı
linuxatico
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.