Tại sao hầu hết mọi chương trình đều phàn nàn về địa phương của tôi?


29

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.gencó một vài ví dụ; tất cả các dòng UTF-8 đều có "Something.UTF-8" và các locale-genchương trình đang chạy en_US.UTF-8... donetrong 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-genLOCALE=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=CLC_ALL=en_US.UTF-8làm việc của Bruce Ediger (trên thực tế, cài đặt LC_ALLnó đã được sửa, cài đặt LANGkhô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 setlocalevới LC_ALL, nhận được một NULLtrở lại, và tạo ra một lỗi, ngay cả khi các cuộc gọi khác để setlocaletrả về một chuỗi tốt.

Dưới đây là top của một ltracesố 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)  

bạn có thể chia sẻ đầu ra của locale -a?
njsg

Tôi sẽ chỉ ra rằng bạn nên sử dụng .utf8trong LOCALELC_*, nhưng dường như cũng .UTF-8hoạt động ở đây ... Đối với en-US: nó có xuất hiện (không có .utf8) locale -akhông?
njsg

1
Làm export LANG=Cexport LC_ALL=en_US.UTF-8xem 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.
Bruce Ediger

Bạn có thể đăng nội dung của bạn /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).
Mikel

Và nội dung của /etc/locale.gencũng sẽ hữu ích.
Mikel

Câu trả lời:


18

Bạn đang thiếu một tệp sẽ được sử dụng để mặc định miền địa phương trong trường hợp không có $LANGhoặc $LC_ALL(hoặc tất cả các cụ thể hơn $LC_whatever) đang được đặt.

Trên glibc cũ hơn, đó là / usr / lib / locale / locale-archive. Vì GNU / Linux hỗn loạn, bạn nên sử dụng strace để xác định tệp nào được mong đợi trong các phiên bản cụ thể được sử dụng trên máy của bạn:

địa điểm tập tin strace -e
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
truy cập ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Không có tệp hoặc thư mục như vậy)
mở ("/ etc / ld.so.cache", O_RDONLY) = 3
mở ("/ lib / libc.so.6", O_RDONLY) = 3
mở ("/ usr / lib / locale / locale-archive", O_RDONLY | O_LARGEFILE) = 3

---------------------- Nhận xét được thêm 1 ngày sau:

"ltrace -S" sẽ ổn thôi, vì nó hiển thị các tòa nhà cao tầng.

Mặt khác, "ltrace" không hữu ích lắm (nghĩa là nó phản tác dụng so với strace), vì nó chỉ hiển thị các cuộc gọi cao nhất. Đó là những điều hiển nhiên (setlocale (3)), trong khi vấn đề thực sự xảy ra trong libc.

Có vẻ như bạn có nguyên liệu địa phương được cài đặt, vì en_US.UTF-8 công trình.

Nếu vậy, một cái gì đó như thế này sẽ khắc phục vấn đề của bạn, đặt mặc định toàn hệ thống:

localedef -f UTF-8 -i en_US en_US.UTF-8

sudo localedef -f UTF-8 -i en_US en_US.UTF-8hoạt động trên Raspbian 2018-11-13 Lite.
Ciro Santilli 心 心 事件

6

Tôi đã gặp vấn đề tương tự sau khi thiết lập /etc/locale.confchỉ hôm nay (liên quan đến những thay đổi gần đây /etc/rc.conf. Trong trường hợp của tôi, hóa ra là các địa phương không được cài đặt.

Kiểm tra /etc/locale.gen. Tất cả các vị trí mà tham chiếu biến môi trường của bạn phải được kích hoạt (nghĩa là không nhận xét) trong đó. Sau khi thực hiện các thay đổi của bạn, hãy chạy sudo locale-genđể cài đặt các địa điểm đã chọn.


2

Theo liên kết này giải quyết vấn đề của tôi:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

nó tạo ra một tập tin /etc/locale.confkhắc phục vấn đề này


1

Gần đây tôi đã gặp vấn đề tương tự, tất cả các tên tệp unicode được hiển thị không chính xác, khi tôi vô tình xóa 'LOCALE = en_US.utf8' trong /etc/rc.conf. Vì vậy, tôi đã kiểm tra tập lệnh khởi động:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

Giải pháp đơn giản là kiểm tra cả hai DAEMON_LOCALELOCALEtrong /etc/rc.conf, đảm bảo rằng cái đầu tiên không novà cái thứ hai không trống.


-1

Có lẽ một trong các cài đặt của bạn không hợp lệ? Đây là các cài đặt ngôn ngữ của tôi để tham khảo; chúng không gây ra bất kỳ lỗi nào (KUbfox 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=
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.