ข้อผิดพลาดของภาษา Python: การตั้งค่าภาษาที่ไม่รองรับ


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? ถ้าไม่ได้คุณต้องติดตั้งมัน
Bakuriu

1
ที่เกี่ยวข้อง: สคริปต์ทุบตีเพื่อติดตั้งตำแหน่งที่ตั้งทั้งหมดบน Ubuntu
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')มันผิด. locale.setlocale(locale.LC_ALL, 'de_DE.utf8')คุณจำเป็นต้อง
Martin Thoma

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 ท้ายที่สุดหากปัญหาเกิดขึ้นภายในเครื่องโซลูชันที่แท้จริงคือการเพิ่มคำสั่งสองคำสั่งแรกลงในแอปพลิเคชันเริ่มต้นของคุณ
RolandiXor

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน export LC_ALL="en_US.UTF-8"ล้มเหลวด้วย -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) สิ่งที่ทำงานได้ทำสิ่งนี้:export LC_ALL=C
Jonathan

205

ตามลิงค์นี้แก้ไขได้โดยป้อนคำสั่งนี้:

ส่งออก LC_ALL = C


4
มันหมายความว่าอะไร? - ตกลงมันตั้งค่าความแปรปรวนของสภาพแวดล้อมLC_ALLเป็นค่า'C'- แต่ทำไม schould จึงใช้งานได้?
Martin Thoma

3
เหตุใด LC_ALL จึงใช้งานได้ -> unix.stackexchange.com/questions/87745/what-does-lc-all-c-do
Ferhat

ฉันค้นหาและลองใช้สิ่งนี้ทุกครั้งที่ฉันเปลี่ยนคอมพิวเตอร์และใช้งานได้ทุกครั้งในขณะที่วิธีการอื่นไม่ทำ
MinKi Jo

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รหัสภาษาอยู่ที่ไหน(นำมาจากที่นี่ )

หลังจากคุณติดตั้งโลแคลแล้วคุณควรทำตามคำแนะนำของ Julien Palard และกำหนดค่าโลแคลใหม่ด้วย:

sudo dpkg-reconfigure locales

ไม่ได้ทำงานใน Debian docker-container ของฉัน แต่สิ่งนี้ใช้ได้ผล stackoverflow.com/questions/28405902/…
Chris

45

หนึ่งในคำตอบข้างต้นให้การแก้ปัญหา:

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

ปัญหาของการแก้ปัญหาข้างต้นคือต้องทำบน linux shell อย่างไรก็ตามหากคุณให้รหัสของคุณเพื่อทำงานกับเครื่องไคลเอนต์นี่เป็นวิธีที่ไม่ดี ฉันยังพยายามรันคำสั่งข้างต้นโดยใช้ 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"

หากไฟล์นี้จะอ่านได้อย่างเดียวที่คุณจะต้องทำตามขั้นตอนที่กล่าวถึงโดยGeekyBoy คำตอบที่ได้รับจากDr Beco ใน Superuserมีรายละเอียดที่เกี่ยวข้องกับการบันทึกไฟล์แบบอ่านอย่างเดียว

หลังจากบันทึกไฟล์แล้วให้ทำ:

$ source ~/.bashrc

ตอนนี้คุณจะไม่ประสบปัญหาเดียวกันอีกต่อไป


15

หากคุณใช้ Debian (หรือ Debian fork) คุณสามารถเพิ่มสถานที่โดยใช้:

dpkg-reconfigure locales

ที่ไม่dpkg-reconfigure localesทำให้คุณมีเมนูเลือกท้องถิ่นเช่นนี้: vpser.net/uploads/2013/01/dpkg-reconfigure-locales-1.jpg ?
Julien Palard

Nope ฉันเพิ่งได้รับผลลัพธ์ที่ฉันโพสต์ในการอัปเดตคำถามของฉัน
toom


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=

แต่ในการติดตั้ง Debian ใหม่ของฉันฉันเพิ่งเลือกภาษาอังกฤษเป็นภาษา ซึ่งในที่สุดก็ทำงานได้คือการกำหนดค่าแพคเกจสถานที่เพื่อเพิ่มและสร้างภาษาสเปนด้วย

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


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

update-locale LANG=de_DE.UTF-8

2
  • รันคำสั่งนี้ localeเพื่อรับสิ่งที่โลแคลถูกใช้ เช่น:

LANG = en_US.UTF-8
ภาษา = th: th
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"
LC_COLLATE = "en_US.UTF-8"
LC_MONETARY = "en_US .UTF-8 "
LC_MESSAGES =" en_US.UTF-8 "
LC_PAPER =" en_US.UTF-8 "
LC_NAME =" en_US.UTF-8 "
LC_ADDRESS =" 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

ในความคิดของฉันวิธีที่ง่ายที่สุดในการตั้งค่าโลแคลท้องถิ่นใน python {, 3} คือ:

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

จากนั้นโลแคลที่ทราบก็ใช้งานได้ดีหากคุณอยู่ในลินุกซ์ distro ที่ดีและควรทำงานกับการแจกแจงแบบไบนารีของ OS อื่น ๆ เช่นกัน (หรือนั่นเป็นข้อผิดพลาดของ IMHO)

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

2

วางไว้ในดังกล่าวข้างต้นDockerfileENV

# 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-reconfigure locales, locale-gen) และไม่มีอะไรทำงานในคอนเทนเนอร์ debian ของฉัน: 9 นี่เป็นวิธีมาตรฐานในการสร้างสถานที่ en_US.UTF-8 หรือไม่
jamshid

ใช่ฉันคิดว่าเป็นวิธีมาตรฐาน en_US.UTF-8 locale เมื่อคุณทำงานlocaleใน terminal คุณได้รับ `LANG = en_US.UTF-8 และสถานที่อื่น ๆ ? stackoverflow.com/questions/36394101/…
Seenu S

1

ข้อผิดพลาดนี้สามารถเกิดขึ้นได้หากคุณเพิ่งเพิ่มสถานที่ใหม่ คุณต้องรีสตาร์ทเชลล์การโต้ตอบของไพ ธ อน ( quit() และpython) เพื่อเข้าใช้งาน


1

ถ้าฉันเป็นคุณฉันจะใช้ BABEL: http://babel.pocoo.org/en/latest/index.html

ฉันได้รับปัญหาเดียวกันที่นี่โดยใช้ Docker ฉันลองทุกขั้นตอนและทำงานได้ไม่ดีรับข้อผิดพลาดของสถานที่ดังนั้นฉันตัดสินใจใช้ 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ไม่ได้อยู่ในรายการนี้ถึงจะใช้ได้!?!? อะไร?? และรายการภาษาที่สร้างขึ้นของหลามนั้นมีคอมโบจำนวนมากของ da และ DK ซึ่งฉันกำลังมองหา แต่ไม่มี UTF-8 สำหรับ da / DK อีก ...

ฉันอยู่ในจุด Linux distro (อิงเดเบียน) และที่นี่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คำสั่งที่จำเป็นและเรียกใช้uncommentlocale-gen

ตอนนี้locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')ก็ใช้ได้เช่นกันและฉันจะได้รับชื่อวันและเดือนที่มีการแปล

บทสรุปของฉัน:

Python: locale.locale_alias ไม่ได้มีประโยชน์เลยในการค้นหาโลแคลที่มีอยู่ !!!

Linux: มันค่อนข้างง่ายในการรับรายชื่อสถานที่และติดตั้งสถานที่ใหม่ มีความช่วยเหลือมากมาย

Windows: ฉันได้รับการตรวจสอบเล็กน้อย แต่ไม่มีข้อสรุปใด ๆ แม้ว่าจะมีโพสต์ที่นำไปสู่คำตอบ แต่ฉันไม่ได้รู้สึกอยากที่จะติดตามมัน


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

0

python ค้นหา. UFT-8 แต่คุณอาจมี. utf8 ลองติดตั้งแพ็คเกจ. UFT-8 ด้วย sudo dpkg-reconfigure locales


-2

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งชุดภาษาโดยทำ:

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


sudo dpkg-reconfigure locales

แพคภาษาอังกฤษนั้นได้รับการติดตั้งตามค่าเริ่มต้นนอกจากนี้ยังมีคำตอบทั้งหมดให้ที่นี่และอันนี้ไม่มีรูปแบบ
Skandix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.