आप डेबियन / उबंटू पर गैर-संवादात्मक रूप से एक स्थानीय सेट कैसे करते हैं?


33

आमतौर पर, मैं चलाने aptitude -y install localesतो dpkg-reconfigure localesवातावरण स्थापित करने के लिए।

अब मैं इसे एक शेल स्क्रिप्ट में रखना चाहता हूं, मैं निम्नलिखित रूप से, स्वचालित रूप से / गैर-संवादात्मक रूप से कैसे कर सकता हूं?

  • en_US.UTF-8इसे सिस्टम डिफॉल्ट के रूप में चुनें और सेट करें
  • अन्य सभी स्थानों को अक्षम करें
  • (वैकल्पिक) यदि अपेक्षित /etc/default/localeके LANG=en_US.UTF-8रूप में एक और केवल प्रविष्टि है, तो सत्यापित करें

जवाबों:


13

स्थानीय-जीन देखें :

 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"))...
kenn

LANG = en_US.UTF-8 लोकेल-जीन --purge en_US.UTF-8
स्टोन

आज सुबह, वीएम के एक स्वच्छ राज्य के साथ, इसने काम किया! धन्यवाद!
kenn

हम्म ... जब आप locale-gen --purge en_GB.UTF-8एक साफ स्थापना पर चलते हैं , तो आपको यह अप्रत्याशित आउटपुट मिलता है: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.किसी भी विचार कि कैसे आप dpkg-reconfigure लोकेशनों में गैर-अंतःक्रियात्मक रूप से स्थानों की सूची सेट करते हैं?
बेंजामिन नोलन

यह दोनों अनुमति से वंचित त्रुटियां देते हैं ....
Cerin

47

काम करने के लिए ऊपर जवाब नहीं मिल सका। इसके बजाय, मैं इस विधि का उपयोग करता हूं (डॉकरफाइल्स के लिए):

# 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 बिल्कुल वही है जिसके लिए मुझे इसकी आवश्यकता थी। धन्यवाद।
पेड़ी

5
कृपया "ऊपर", "नीचे" या इसी तरह के अन्य उत्तरों को न देखें। उत्तर चारों ओर चलते हैं क्योंकि लोग उन्हें वोट देते हैं, उन्हें स्वीकार करते हैं, उन्हें हटाते हैं, या अलग-अलग आदेश देते हैं। हमेशा उस व्यक्ति के नाम का उपयोग करें जिसने उत्तर पोस्ट किया है, या इससे भी बेहतर, उस उत्तर के तहत शेयर लिंक का उपयोग करें, जो आप टिप्पणी करने के लिए उत्तर के लिंक से स्पष्ट रूप से पूछ रहे हैं।
rjmunro

इस उत्तर का थोड़ा नटर्न संस्करण - विशेष रूप से डॉकरीफाइल्स के लिए .. EDIT: चूंकि newlines यहाँ काम नहीं करते हैं, कृपया मेरे उत्तर का उल्लेख करें serverfault.com/a/801162/89669
mafrosis

मुझे en_GB.UTF-8सर्कलसीआई में लोकेल की स्थापना की आवश्यकता थी - यह सबसे अच्छा जवाब था जो काम कर रहा था। उम्मीद है कि इस टिप्पणी के कारण, Google इसे तब प्रासंगिक दिखा सकता है जब लोग उस समस्या की खोज करने की कोशिश करेंगे जो मैं कर रहा था।
एलेक्स ज़ाबो

echo 'LANG = "nb_NO.UTF-8"> / etc / default / locale अपडेट-लोकेल LANG = nb_NO.UTF-8 के साथ बेमानी है
otonglet

7

एक स्क्रिप्ट के भीतर, गैर-अंतःक्रियात्मक रूप से टाइमज़ोन और स्थानों को फिर से कॉन्फ़िगर करने के लिए, यहां मेरे लिए (डेबियन के तहत) काम करता है:

  • टाइमजोन को कॉन्फ़िगर करने के लिए, मैं पहली बार '/ etc / localtime' को '/ 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

    (ध्यान दें कि क्षेत्र '/ usr / शेयर / जानकारी' के तहत एक उपनिर्देशिका है, और क्षेत्र क्षेत्र उपनिर्देशिका के तहत एक फ़ाइल है)।

  • स्थानों को विन्यस्त के लिए, मैं पहली बार एक चलाने 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-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 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'

    (मैं इन सभी मापदंडों को अपडेट-लोकेल कमांड के एक ही आह्वान पर निर्दिष्ट कर सकता था, लेकिन जाहिर है, ऐसी प्रविष्टियां जिनमें '/ etc / default / locale' फ़ाइल लिखी जाती है, यदि मैं ऐसा करता हूं तो अप्रत्याशित है। ' उन्हें हमेशा उसी क्रम में रहना पसंद करें, यही कारण है कि मैं उन्हें एक-एक करके उत्पन्न करता हूं।)

    और अंत में, मैं अपडेट-लोकेल कमांड को पिछली बार एक बार चलाने के लिए , LANGUAGE चर (यानी, उन भाषाओं की सूची, जिनमें मैं अनुवाद योग्य पाठ संदेश प्रदर्शित करना चाहता हूं) सेट करना चाहता हूं:

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

इस सब को एक बैश स्क्रिप्ट में फेंक दें, और आप आसानी से स्क्रिप्ट के एक सरल रन के साथ अपनी लोकेल सेटिंग्स को फिर से कॉन्फ़िगर कर सकते हैं, जिसके लिए किसी अन्य उपयोगकर्ता सहभागिता की आवश्यकता नहीं होगी।

मेरे अनुभव में, हालाँकि, नई सेटिंग्स तब तक पूरी तरह से सक्रिय नहीं हो जाएंगी जब तक आप अपने सिस्टम को दो बार रिबूट नहीं करते (कम से कम डेबियन जेसी ज़ेफ़स पर)। पहले रिबूट के बाद, लॉगिन प्रबंधक नई सेटिंग्स को ठीक से ले जाएगा, लेकिन लॉगिन करने के बाद, आपका उपयोगकर्ता सत्र पुरानी सेटिंग्स का उपयोग करना जारी रखेगा; फिर, दूसरे रिबूट के बाद, आपका उपयोगकर्ता सत्र नई सेटिंग्स भी लेगा।


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
मैं ईएनवी सेट करना पसंद करता हूं, अन्यथा आपको यह त्रुटि मिलेगी: "पर्ल: चेतावनी: सेटिंग लोकेल विफल। \ पर्ल: चेतावनी: कृपया जांचें कि आपकी लोकेल सेटिंग: \ LANG =" en_US.UTF-8 "\ समर्थित हैं। आपके सिस्टम पर स्थापित \ पर्ल: चेतावनी: मानक स्थान ( 'सी') के लिए वापस
otonglet

6

मेरे लिए अतिरिक्त 3 ENV-VAR सेट करना आवश्यक था:

# - 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
यह एकमात्र समाधान है जो मेरे लिए काम करता है, मैं डॉकर संस्करण 17.06.1-CE पर हूं, 874a737 का निर्माण कर रहा हूं
linuxatico
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.