Lỗi ngôn ngữ Python: cài đặt ngôn ngữ không được hỗ trợ


317

Tại sao tôi gặp lỗi sau khi thực hiện việc này trong python:

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

Điều này làm việc với các địa phương khác như fr hoặc nl là tốt. Tôi đang sử dụng Ubuntu 11.04.

Cập nhật: Thực hiện các thao tác sau không mang lại kết quả gì:

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
Bạn có một de_DEdanh sách trong locale -a? Nếu không bạn phải cài đặt nó.
Bakuriu

1
Liên quan: một tập lệnh bash để cài đặt tất cả các ngôn ngữ trên Ubuntu.
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')sai. Bạn cần locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma

2
Đôi khi bạn có thể khám phá một mã hóa có sẵn cho ngôn ngữ / quốc gia bạn muốn bằng cách sử dụng các bí danh tích hợp : locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Câu trả lời:


647

Chạy các lệnh sau

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

Nó sẽ giải quyết điều này.

Đảm bảo khớp .UTF-8phần với cú pháp thực tế được tìm thấy trong đầu ra của locale -aeg .utf8trên một số hệ thống.


8
Tôi đã không phải sử dụng lệnh dpkg. Rốt cuộc, nếu sự cố xảy ra cục bộ, thì giải pháp thực sự sẽ là thêm hai lệnh đầu tiên vào các ứng dụng khởi động của bạn.
RolandiXor

2
Điều này đã không làm việc cho tôi. export LC_ALL="en_US.UTF-8"thất bại với -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) những gì đã làm việc này:export LC_ALL=C
Jonathan

205

Theo liên kết này , nó đã giải quyết bằng cách nhập lệnh này:

xuất LC_ALL = C


4
Nó có nghĩa là gì? - ok nó đặt một varibale môi trường LC_ALLthành giá trị 'C'- nhưng tại sao lại làm việc này?
Martin Thoma


Tôi tìm kiếm và thử điều này mỗi lần khi tôi thay đổi máy tính và điều này hoạt động mọi lúc trong khi các phương pháp khác thì không.
MinKi Jo

197

Bạn có thể không có bất kỳ de_DEmiền địa phương có sẵn.

Bạn có thể xem danh sách các địa điểm có sẵn bằng locale -alệnh. Ví dụ: trên máy của tôi:

$ 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

Lưu ý rằng nếu bạn muốn đặt miền địa phương thành it_ITbạn cũng phải chỉ định .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'

Để cài đặt một ngôn ngữ mới sử dụng:

sudo apt-get install language-pack-id

nơi idđược mã ngôn ngữ (lấy từ đây )

Sau khi bạn đã cài đặt ngôn ngữ, bạn nên làm theo lời khuyên của Julien Palard và cấu hình lại các ngôn ngữ đó bằng:

sudo dpkg-reconfigure locales

Điều đó không hoạt động trong docker-container Debian của tôi. Nhưng điều này đã làm việc. stackoverflow.com/questions/28405902/
Chris

45

Một trong những câu trả lời trên cung cấp giải pháp:

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

Vấn đề với giải pháp trên là nó phải được thực hiện trên shell linux. Tuy nhiên, nếu bạn đang cung cấp mã của mình để hoạt động trên máy khách thì đây là một cách tiếp cận tồi. Tôi cũng đã thử thực hiện các lệnh trên bằng os.system (), nhưng nó vẫn không hoạt động.

Giải pháp hiệu quả với tôi là

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

32

Giải pháp lâu dài hơn sẽ là điền vào các giá trị còn thiếu, trong đầu ra được hiển thị bằng lệnh: locale

Đầu ra từ localelà:

 $ 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=

Để điền vào các giá trị còn thiếu, chỉnh sửa ~ / .bashrc:

 $ vim ~/.bashrc

Thêm các dòng sau sau lệnh trên (giả sử bạn muốn en_US.UTF-8 là ngôn ngữ của bạn):

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

Nếu tệp này là ReadOnly, bạn sẽ cần phải làm theo các bước được đề cập bởi The GeekyBoy . Câu trả lời được đưa ra bởi Tiến sĩ Beco trong Superuser có các chi tiết liên quan đến việc lưu các tệp chỉ đọc.

Sau khi lưu tệp, hãy làm:

$ source ~/.bashrc

Bây giờ bạn sẽ không phải đối mặt với cùng một vấn đề nữa.



6

Trên Arch Linux tôi đã có thể sửa lỗi này bằng cách chạy sudo locale-gen


4

Đối với hồ sơ, tôi có vấn đề tương tự, nhưng không có giải pháp nào hiệu quả. Tôi đã nâng cấp máy tính của mình và di chuyển PC. Tôi đã có một ngôn ngữ hỗn hợp tiếng Anh và tiếng Tây Ban Nha:

$ 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=

Nhưng, trên bản cài đặt Debian mới của tôi, tôi chỉ chọn tiếng Anh là ngôn ngữ. Điều cuối cùng đã làm việc là cấu hình lại gói địa phương để thêm và tạo tiếng Tây Ban Nha.

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

4

Chỉ cần mở tệp .bashrc và thêm tệp này

xuất LC_ALL = C

và sau đó nhập nguồn .bashrc trong terminal.


4

Bạn lỗi rõ ràng nói rằng, bạn đang cố gắng sử dụng ngôn ngữ địa phương không có gì đó.

>>> 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: cài đặt ngôn ngữ không được hỗ trợ

Để kiểm tra cài đặt có sẵn, sử dụng 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

để bạn có thể sử dụng một trong số đó,

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

cho de_DE

Tập tin này có thể được điều chỉnh thủ công hoặc cập nhật bằng cách sử dụng công cụ, cập nhật ngôn ngữ.

update-locale LANG=de_DE.UTF-8

2
  • chạy lệnh này localeđể có được ngôn ngữ được sử dụng. Nhu la:

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"
LC_COLLATE .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 ="
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL =

  • tìm kiếm danh sách địa phương được liệt kê trong bước đầu tiên trong /etc/locale-gentập tin. Không chú ý đến những người đã sử dụng
  • chạy locale-genđể tạo các địa phương mới được thêm vào

2

Theo tôi, cách dễ nhất để thiết lập ngôn ngữ cục bộ trong python {, 3} là:

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

Sau đó, công cụ nhận biết bản địa chỉ hoạt động, nếu bạn đang ở trên một bản phân phối linux tốt và cũng sẽ hoạt động trên các bản phân phối nhị phân của các HĐH khác (hoặc đó là lỗi IMHO).

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

2

Đặt nó ở Dockerfiletrên 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

Cảm ơn, tôi đã thử các giải pháp khác (dpkg-recfigure loc, locale-gen) và không có gì khác hoạt động trong debian của tôi: 9 container. Đây có thực sự là một / cách tiêu chuẩn để tạo miền địa phương en_US.UTF-8 không?
Jamshid

Vâng, tôi nghĩ đó là cách tiêu chuẩn en_US.UTF-8 locale. Khi bạn chạy localetrong thiết bị đầu cuối, bạn nhận được `LANG = en_US.UTF-8 và ngôn ngữ khác? stackoverflow.com/questions/36394101/ từ
Seenu S

1

Lỗi này có thể xảy ra, nếu bạn vừa thêm một miền địa phương mới. Bạn cần khởi động lại shell tương tác python ( quit() và python) để có quyền truy cập vào nó.


1

Nếu tôi là bạn, tôi sẽ sử dụng BABEL: http://babel.pocoo.org/en/latest/index.html

Tôi gặp vấn đề tương tự ở đây khi sử dụng Docker, tôi đã thử từng bước một và không hoạt động tốt, luôn gặp lỗi cục bộ, vì vậy tôi quyết định sử dụng BABEL và mọi thứ đều hoạt động tốt.


0

Trong khi cố gắng để con trăn phun ra những cái tên ở địa phương cụ thể, tôi đã đến đây với cùng một vấn đề.

Theo đuổi câu trả lời, tôi thấy có một chút thần bí.

Tôi tìm thấy mã trăn.

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

Và thực sự locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')hoạt động

Sử dụng các mẹo ở đây tôi đã thử nghiệm thêm để xem những gì có sẵn bằng mã python

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

mang lại

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)

Trong đó chỉ có ở trên là làm việc! Nhưng cái en_DK.UTF-8này không có trong danh sách này, mặc dù nó hoạt động!?!? Gì?? Và danh sách miền địa phương tạo ra python có chứa rất nhiều combo của da và DK, mà tôi đang tìm kiếm, nhưng một lần nữa không có UTF-8 cho da / DK ...

Tôi đang sử dụng bản phân phối Point Linux (dựa trên Debian) và ở đây localenói về những thứ khác LC_TIME="en_DK.UTF-8"mà tôi biết là hoạt động, nhưng không phải là ngôn ngữ tôi cần.

locale -a nói

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

Vì vậy, chắc chắn cần phải cài đặt ngôn ngữ khác , mà tôi đã làm bằng cách chỉnh sửa /etc/locale.gen, bỏ dòng cần thiết da_DK.UTF-8 UTF-8và chạy lệnhlocale-gen

Bây giờ locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')cũng hoạt động và tôi có thể lấy tên ngày và tháng được bản địa hóa của mình.

Kết luận của tôi:

Python: locale.locale_alias hoàn toàn không hữu ích trong việc tìm kiếm các địa điểm có sẵn !!!

Linux: Khá dễ dàng để có được danh sách miền địa phương và cài đặt miền địa phương mới. Rất nhiều sự giúp đỡ có sẵn.

Windows: Tôi đã nghiên cứu một chút, nhưng không có kết luận gì. Mặc dù có những bài đăng dẫn đến câu trả lời, nhưng tôi không cảm thấy thôi thúc theo đuổi nó.


0

Nếu tôi hiểu chính xác, nguồn lỗi chính ở đây là cú pháp chính xác của tên miền địa phương. Đặc biệt là dường như khác nhau giữa các bản phân phối. Tôi đã thấy đề cập ở đây trong các câu trả lời / bình luận khác nhau:

de_DE.utf8
de_DE.UTF-8

Mặc dù điều này rõ ràng là giống nhau đối với một con người, nhưng điều tương tự không đúng với thuật toán xác định tiêu chuẩn của bạn.

Vì vậy, bạn có thể sẽ làm một cái gì đó dọc theo dòng:

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 tìm kiếm .UFT-8, nhưng bạn có thể có .utf8 thử cài đặt các gói .UFT-8 với sudo dpkg-cấu hình lại các ngôn ngữ


-2

trước tiên, hãy đảm bảo bạn đã cài đặt gói ngôn ngữ bằng cách thực hiện:

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


sudo dpkg-reconfigure locales

gói ngôn ngữ tiếng Anh được cài đặt theo mặc định - hơn nữa câu trả lời đã được đưa ra ở đây và câu hỏi này thiếu trong việc hình thành.
Skandix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.