Tôi đang sử dụng Arch Linux và tôi đã làm theo hướng dẫn trên wiki về việc đặt ngôn ngữ của mình.
Gần như mọi chương trình chạy đều phàn nàn về miền địa phương - thậm chí locale
. Nó trông như thế này:
% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=
hoặc là:
% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_TIME = "en-US",
LC_NUMERIC = "en-US",
LC_MONETARY = "en-US",
LC_MEASUREMENT = "en-US",
LC_CTYPE = "en_US.UTF-8",
LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")
Một cái gì đó hơi khó hiểu là /etc/locale.gen
có một vài ví dụ; tất cả các dòng UTF-8 đều có "Something.UTF-8" và các locale-gen
chương trình đang chạy en_US.UTF-8... done
trong khi nó đang chạy, nhưng locale -a
, được cho là hiển thị cho bạn các chương trình địa phương có sẵn en_US.utf8
. Tôi đã thử các kết hợp khác nhau của cả hai định dạng trong /etc/locale-gen
và LOCALE=
trong /etc/rc.conf
, nhưng không có gì khắc phục được vấn đề.
Thông tin thêm:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
Đề xuất thiết lập LANG=C
và LC_ALL=en_US.UTF-8
làm việc của Bruce Ediger (trên thực tế, cài đặt LC_ALL
nó đã được sửa, cài đặt LANG
không thành vấn đề), nhưng tôi muốn biết điều gì đang xảy ra. Theo SUS , LC_ALL sẽ ghi đè tất cả các biến LC_ * khác nếu nó được đặt và không null. Trong hệ thống của tôi, nó được đặt, nhưng nó là null, vì vậy nó nên được bỏ qua và thay vào đó nên sử dụng các giá trị khác. Đó không phải là những gì đang xảy ra, có vẻ như các ứng dụng được gọi setlocale
với LC_ALL
, nhận được một NULL
trở lại, và tạo ra một lỗi, ngay cả khi các cuộc gọi khác để setlocale
trả về một chuỗi tốt.
Dưới đây là top của một ltrace
số locale
(di chuyển sang phải để xem các giá trị chức năng cửa sổ mới)
% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510) = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "") = "en_US.UTF-8"
setlocale(5, "") = "en_US.UTF-8"
textdomain("libc") = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4) = 0
setlocale(6, "") = NULL
dcgettext(0, 0x405aa8, 5, 0, 0) = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)
.utf8
trong LOCALE
và LC_*
, nhưng dường như cũng .UTF-8
hoạt động ở đây ... Đối với en-US: nó có xuất hiện (không có .utf8
) locale -a
không?
export LANG=C
và export LC_ALL=en_US.UTF-8
xem những gì xảy ra. Máy tính xách tay Arch linux của tôi có LOCALE="en_US.UTF-8"
/etc/rc.conf và tôi không thể tìm ra nơi máy tính xách tay của mình đặt LANG = C.
/etc/locale.conf
? Có vẻ như bạn vô tình viết LANG=en-US
(có dấu gạch ngang) thay vì LANG=en_US
(với dấu gạch dưới).
/etc/locale.gen
cũng sẽ hữu ích.
locale -a
?