पायथन लोकेल त्रुटि: असमर्थित लोकल सेटिंग


317

अजगर में ऐसा करने पर मुझे निम्न त्रुटि क्यों मिलती है:

>>> import locale
>>> print str( locale.getlocale() )
(None, None)
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 531, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

यह fr या nl जैसे अन्य स्थानों के साथ भी काम करता है। मैं Ubuntu 11.04 का उपयोग कर रहा हूं।

अद्यतन: निम्नलिखित करने से कुछ नहीं निकला:

dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

8
क्या आपके पास de_DEसूचीबद्ध है locale -a? यदि आप इसे स्थापित नहीं करना चाहिए ।
बाकुरिु

1
संबंधित: Ubuntu पर सभी स्थानों को स्थापित करने के लिए एक बैश स्क्रिप्ट
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')गलत है। आपको चाहिए locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
मार्टिन थोमा

2
आप कभी-कभी उस भाषा / देश के लिए एक उपलब्ध एन्कोडिंग की खोज कर सकते हैं जिसे आप अंतर्निहित उपनाम का उपयोग करना चाहते हैं locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']):।
jrgray

जवाबों:


647

निम्न आदेश चलाएँ

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

इसका हल निकाल लेंगे।

कुछ सिस्टम पर उदा । .UTF-8के आउटपुट में पाए गए वास्तविक सिंटैक्स से भाग का मिलान करना सुनिश्चित करें ।locale -a.utf8


8
मुझे dpkg कमांड का उपयोग नहीं करना पड़ा। आखिरकार, यदि समस्या स्थानीय रूप से हो रही है, तो असली समाधान यह होगा कि पहले दो आदेशों को अपने स्टार्टअप अनुप्रयोगों में जोड़ा जाए।
रॉलंडीएक्सोर

2
यह मेरे लिए काम नहीं किया। जो काम कर रहा था, export LC_ALL="en_US.UTF-8"-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)export LC_ALL=C
योनातन

204

इस लिंक के अनुसार , यह इस कमांड को दर्ज करके हल किया गया है:

निर्यात LC_ALL = C


4
इसका क्या मतलब है? - ठीक है, यह एक पर्यावरण वैरिएबल LC_ALLको वैल्यू पर सेट करता है 'C'- लेकिन यह काम क्यों करता है?
मार्टिन थॉमा

3
क्यों LC_ALL काम करता है -> unix.stackexchange.com/questions/87745/what-does-lc-all-c-do
Ferhat

मैं हर बार जब मैं कंप्यूटर बदलता हूं तो यह खोज और कोशिश करता हूं और यह हर बार काम करता है जबकि अन्य तरीके नहीं।
मिनकी जो

197

आपके पास शायद कोई de_DEस्थान उपलब्ध नहीं है ।

आप locale -aकमांड के साथ उपलब्ध स्थानों की सूची देख सकते हैं । उदाहरण के लिए, मेरी मशीन पर:

$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
it_CH.utf8
it_IT.utf8
POSIX

ध्यान दें कि यदि आप लोकेल सेट करना चाहते हैं तो आपको it_ITयह भी निर्दिष्ट करना होगा .utf8:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'it_IT')   # error!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 539, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>> locale.setlocale(locale.LC_ALL, 'it_IT.utf8')
'it_IT.utf8'

नया स्थान उपयोग स्थापित करने के लिए:

sudo apt-get install language-pack-id

idभाषा कोड कहाँ है ( यहाँ से लिया गया है )

आपके द्वारा लोकेल स्थापित करने के बाद आपको जूलियन पालार्ड सलाह का पालन करना चाहिए और उन स्थानों को फिर से कॉन्फ़िगर करना चाहिए:

sudo dpkg-reconfigure locales

यह मेरे डेबियन डॉकटर-कंटेनर में काम नहीं किया। लेकिन यह काम कर गया। stackoverflow.com/questions/28405902/…
क्रिस

45

उपरोक्त उत्तर में से एक समाधान प्रदान करता है:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

उपरोक्त समाधान के साथ समस्या यह है कि इसे लिनक्स शेल पर किया जाना है। हालाँकि, यदि आप क्लाइंट मशीन पर काम करने के लिए अपना कोड प्रदान कर रहे हैं तो यह एक बुरा तरीका है। मैंने os.system () का उपयोग करके उपरोक्त आदेशों को निष्पादित करने का भी प्रयास किया, लेकिन फिर भी यह काम नहीं करता है।

समाधान है कि मेरे लिए काम किया है

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')

32

कमांड द्वारा दिखाए गए आउटपुट में, लापता मूल्यों को भरने के लिए अधिक स्थायी समाधान होगा: locale

से आउटपुट localeहै:

 $ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

अनुपलब्ध मानों को भरने के लिए ~ / .bashrc:

 $ vim ~/.bashrc

उपरोक्त आदेश के बाद निम्नलिखित पंक्तियाँ जोड़ें (मान लें कि आप अपनी भाषा के लिए en_US.UTF-8 चाहते हैं):

export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

यदि यह फ़ाइल ReadOnly है, तो आपको GeekyBoy द्वारा बताए गए चरणों का पालन करने की आवश्यकता होगी । सुपर बिकर में डॉ। बीको द्वारा दिए गए उत्तर में आसानी से फाइलों को सहेजने से संबंधित विवरण हैं।

फाइल को सेव करने के बाद करें:

$ source ~/.bashrc

अब आप एक ही समस्या का सामना नहीं करेंगे।


15

यदि आप एक डेबियन (या डेबियन कांटा) पर हैं, तो आप निम्न स्थानों को जोड़ सकते हैं:

dpkg-reconfigure locales

क्या dpkg-reconfigure localesआप इस तरह से एक स्थानीय चयन मेनू लाते हैं: vpser.net/uploads/2013/01/dpkg-reconfigure-locales-1.jpg ?
जुलिएन पैलार्ड

नहीं। मुझे सिर्फ अपने सवाल के अपडेट में पोस्ट किया गया आउटपुट मिलता है।
21


4

रिकॉर्ड के लिए, मेरे पास यही समस्या थी, लेकिन किसी भी समाधान ने काम नहीं किया। मैंने अपने कंप्यूटर को अपग्रेड किया था और अपने पीसी को माइग्रेट किया था। मेरे पास मिश्रित मिश्रित अंग्रेजी और स्पेनिश था:

$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

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

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8

4

बस .bashrc फ़ाइल खोलें और इसे जोड़ें

निर्यात LC_ALL = C

और फिर टर्मिनल में स्रोत .bashrc टाइप करें।


4

आप त्रुटि स्पष्ट रूप से कहते हैं, आप स्थानीय उपयोग करने की कोशिश कर रहे हैं कुछ नहीं था।

>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 581, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

locale.Error: असमर्थित लोकल सेटिंग

उपलब्ध सेटिंग की जांच करने के लिए, उपयोग करें locale -a

deb@deb-Latitude-E7470:/ambot$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

तो आप एक का उपयोग कर सकते हैं,

>>> locale.setlocale(locale.LC_ALL, 'en_AG.utf8')
'en_AG.utf8'
>>> 

के लिये de_DE

यह फ़ाइल या तो मैन्युअल रूप से समायोजित की जा सकती है या टूल, अपडेट-लोकेल का उपयोग करके अपडेट की जा सकती है।

update-locale LANG=de_DE.UTF-8

2
  • इस कमांड localeको चलाने के लिए कि लोकेल का उपयोग क्या है। जैसे कि:

LANG = en_US.UTF-8
LANGUAGE = en_US: en
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"
LC_COLLATE = "en_US.UTF-8"
LCMM " .UTF-8 "
LC_MESSAGES =" en_US.UTF-8 " LC_PAPER =" en_US.UTF-8 " LC_NAME ="
en_US.UTF-8 "
LC_ADDRES ="
en_US.UTF-8 "
LC_TELEPHONE =" en_US.UTF-8
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL =

  • /etc/locale-genफ़ाइल में पहले चरण में सूचीबद्ध स्थानों की सूची खोजें । उपयोग किए गए लोगों को असुविधा
  • locale-genनए जोड़े गए स्थानों को बनाने के लिए चलाएं

2

मेरी राय में, अजगर {3,} में स्थानीय लोकल को सेटअप करने का सबसे आसान तरीका है:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'

फिर, लोकेल अवगत सामान सिर्फ काम करता है, यदि आप एक सभ्य लिनेक्स डिस्ट्रो पर हैं, और अन्य ओएस के बाइनरी वितरण पर भी काम करना चाहिए (या यह एक बग आईएमएचओ है)।

>>> import datetime as dt
>>> print(dt.date.today().strftime("%A %d. %B %Y"))
Sonntag 11. Dezember 2016

2

इसे Dockerfileउपरोक्त में रखें ENV

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

ENV LANG en_US.UTF-8

धन्यवाद, मैंने अन्य समाधानों की कोशिश की (dpkg- पुन: कॉन्फ़िगर किए गए स्थान, स्थान-जीन) और मेरे डेबियन में कुछ और काम नहीं किया: 9 कंटेनर। क्या यह वास्तव में en_US.UTF-8 लोकेल बनाने का एक मानक तरीका है?
जामशिड

हां, मुझे लगता है कि इसका मानक तरीका en_US.UTF-8 लोकेल है। जब आप localeटर्मिनल में चलते हैं तो आपको `LANG = en_US.UTF-8 और अन्य लोकेल मिलते हैं। stackoverflow.com/questions/36394101/…
सीनू

1

यह त्रुटि तब हो सकती है, यदि आपने अभी नया लोकेल जोड़ा है। आपको इस तक पहुंचने के लिए अजगर इंटरएक्टिव शेल ( quit() और फिर से शुरू करने की आवश्यकता है python


1

अगर मैं तुम होते, तो मैं BABEL का उपयोग करता: http://babel.pocoo.org/en/latest/index.html

मुझे डॉकर का उपयोग करते हुए यहां एक ही मुद्दा मिला है, मैंने हर एक कदम की कोशिश की है और अच्छी तरह से काम नहीं किया है, हमेशा स्थानीय त्रुटि हो रही है, इसलिए मैंने BABEL का उपयोग करने का फैसला किया, और सब कुछ अच्छी तरह से काम किया।


0

एक ही समस्या के साथ मैं यहाँ उतरे विशिष्ट स्थानीय लोगों में नामों को थूकने के लिए अजगर प्राप्त करने की कोशिश कर रहा हूं।

जवाब का पीछा करने में, चीजें मुझे थोड़ी रहस्यमयी लगीं।

मुझे वह अजगर कोड लगा।

import locale
print locale.getdefaultlocale()
>> ('en_DK', 'UTF-8')

और वास्तव में locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')काम करता है

यहाँ युक्तियों का उपयोग करके मैंने आगे यह देखने के लिए परीक्षण किया कि अजगर कोड का उपयोग करके क्या उपलब्ध है

import locale
loc_list = [(a,b) for a,b in locale.locale_alias.items() ]
loc_size = len(loc_list)
print loc_size,'entries'

for loc in loc_list:
    try:
        locale.setlocale(locale.LC_TIME, loc[1])
        print 'SUCCES set {:12} ({})'.format(loc[1],loc[0])
    except:
        pass

कौन सी पैदावार

858 entries
SUCCES set en_US.UTF-8  (univ)
SUCCES set C            (c.ascii)
SUCCES set C            (c.en)
SUCCES set C            (posix-utf2)
SUCCES set C            (c)
SUCCES set C            (c_c)
SUCCES set C            (c_c.c)
SUCCES set en_IE.UTF-8  (en_ie.utf8@euro)
SUCCES set en_US.UTF-8  (universal.utf8@ucs4)
SUCCES set C            (posix)
SUCCES set C            (english_united-states.437)
SUCCES set en_US.UTF-8  (universal)

जिनमें से केवल ऊपर काम कर रहा है! लेकिन en_DK.UTF-8यह इस सूची में नहीं है, हालांकि यह काम करता है?!?!? क्या?? और अजगर जनित लोकेल सूची में दा और डीके के बहुत सारे कॉम्बो होते हैं, जिन्हें मैं ढूंढ रहा हूं, लेकिन फिर से दा / डीके के लिए कोई यूटीएफ -8 नहीं ...

मैं एक बिंदु लिनक्स डिस्ट्रो (डेबियन आधारित) पर हूं, और यहां localeअन्य के बीच कहता है LC_TIME="en_DK.UTF-8", जो मुझे पता है कि काम करता है, लेकिन मुझे जिस लोकेल की आवश्यकता नहीं है।

locale -a कहते हैं

C
C.UTF-8
en_DK.utf8
en_US.utf8
POSIX

तो निश्चित रूप से करने की जरूरत है अन्य स्थान स्थापित है, जो मैं संपादन करके किया /etc/locale.gen, टिप्पणी हटाएं आवश्यक लाइन da_DK.UTF-8 UTF-8और चलाने के आदेशlocale-gen

अब locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')काम भी करता है, और मैं अपने स्थानीयकृत दिन और महीने के नाम प्राप्त कर सकता हूं।

मेरी धारणा:

अजगर: locale.locale_alias उपलब्ध स्थानों को खोजने में सभी सहायक नहीं है !!!

लिनक्स: लोकल लिस्ट प्राप्त करना और नया लोकेल इंस्टॉल करना काफी आसान है। बहुत सारी मदद उपलब्ध है।

विंडोज: मैं थोड़ी जांच कर रहा हूं, लेकिन कुछ भी निर्णायक नहीं है। हालांकि उत्तर देने के लिए अग्रणी पोस्ट हैं, लेकिन मैंने इसे आगे बढ़ाने के आग्रह को महसूस नहीं किया है।


0

अगर मैं सही ढंग से समझूं, तो यहां त्रुटि का मुख्य स्रोत स्थान-नाम का सटीक सिंटैक्स है। विशेष रूप से यह वितरण के बीच अंतर लगता है। मैंने यहाँ विभिन्न उत्तर / टिप्पणियों में उल्लेख किया है:

de_DE.utf8
de_DE.UTF-8

हालांकि यह स्पष्ट रूप से एक इंसान के लिए समान है, वही आपके मानक निर्धारक एल्गोरिथ्म के लिए नहीं है।

तो आप शायद इनकी तर्ज पर कुछ करेंगे:

DESIRED_LOCALE=de
DESIRED_LOCALE_COUNTRY=DE
DESIRED_CODEPAGE_RE=\.[Uu][Tt][Ff].?8
if [ $(locale -a | grep -cE "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}") -eq 1 ]
then
    export LC_ALL=$(locale -a | grep -m1 -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")
    export LANG=$LC_ALL
else
    echo "Not exactly one desired locale definition found: $(locale -a | grep -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")" >&2
fi


-2

पहले, सुनिश्चित करें कि आपके पास ऐसा करने से भाषा पैक स्थापित है:

sudo apt-get install language-pack-en-base


sudo dpkg-reconfigure locales

अंग्रेजी लैंग्वेजपैक डिफ़ॉल्ट रूप से स्थापित किया गया है - इसके अलावा इसका उत्तर पहले से ही दिया गया है और इसे तैयार करने में कमी है।
स्कैंडिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.