đặt LC_ * nhưng không LC_ALL


14

Tôi muốn có một ngôn ngữ tiếng Đức (Áo) (khổ giấy A4, thời gian 24 giờ, yyyy-mm-dd), nhưng giao diện người dùng sử dụng tiếng Anh (tôi không thích bản dịch kém). Tôi đoán rằng cách chính xác để đạt được điều này là đặt các LC_biến như sau .bashrc(vui lòng sửa lại cho tôi nếu tôi sai):

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8

Có cách nào thanh lịch hơn để đặt LC_ $ mọi thứ thay vì đặt mọi giá trị không? Đặt LC_ALL không phải là một tùy chọn, vì nó được ưu tiên hơn LC_MESSAGES:

$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"

PS: Đó là một máy dùng chung và tôi không sudoer, vì vậy thay đổi cài đặt toàn hệ thống không phải là một tùy chọn.

Câu trả lời:


16

Có ba bộ cài đặt ngôn ngữ:

  • LANG, cài đặt dự phòng, nếu bạn chưa chỉ định giá trị cho danh mục. Người dùng có thể chỉ ra ngôn ngữ của họ một cách đơn giản.
  • LC_xxxcho mỗi thể loại ( xxxcó thể MESSAGES, TIMEvv).
  • LC_ALLghi đè tất cả các cài đặt. Đó là cách để các ứng dụng ghi đè tất cả các cài đặt để hoạt động ở một miền đã biết (thường là Cmiền địa phương mặc định), thông thường để các lệnh khác nhau tạo ra đầu ra theo định dạng đã biết.

Vì vậy, bạn có thể đặt LANG=de_AT.UTF-8LC_MESSAGES=C( Clà ngôn ngữ mặc định và có nghĩa là chưa được dịch; en_USthường giống Cvới tin nhắn).

Tuy nhiên, có hai loại mà tôi không khuyên bạn nên thay đổi mặc định, vì nó phá vỡ rất nhiều chương trình:

  • LC_COLLATElà thứ tự đối chiếu nhân vật . Nó không hữu ích lắm vì nó chỉ cho biết cách sắp xếp các ký tự chứ không phải cách sắp xếp các chuỗi. Các công cụ biết cách sắp xếp các chuỗi không sử dụng LC_COLLATE. Hơn nữa, rất nhiều công cụ mong đợi những thứ như, [a-z]phù hợp với tất cả 26 chữ cái viết thường ASCII và không có ký tự ASCII nào khác, nhưng điều đó không đúng trong hầu hết các ngôn ngữ không mặc định (thử echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICchỉ ra cách hiển thị số. Đặc biệt, trong nhiều ngôn ngữ, nó làm cho các số dấu phẩy động sử dụng ,thay vì .dấu thập phân. Nhưng hầu hết các chương trình phân tích số đều mong đợi a .và coi a ,là dấu phân cách trường.

Vì vậy, tôi khuyên bạn nên

  • hoặc rõ ràng LC_COLLATE=C LC_NUMERIC=_C,
  • hoặc để lại LANGunset và chỉ đặt một giá trị cho các loại hữu ích ( LC_MESSAGES, LC_TIME, LC_PAPER, cộng LC_CTYPE(có giá trị có thể thay đổi tùy thuộc vào bạn terminal)).

¹ Cộng LANGUAGEvới GNU libc. Nếu bạn đã không nghe về nó, bạn sẽ không bỏ lỡ nhiều.


Cảm ơn câu trả lời chi tiết và những lời giải thích! Tuy nhiên, tôi sẽ thử LC_NUMERIC được bản địa hóa, vì bàn phím trên bàn phím tiếng Đức có ,vị trí .(không may), vì vậy việc nhập số bằng dấu chấm là bất tiện (và hầu hết các ứng dụng dường như hoạt động độc đáo với LC_NUMERIC không chuẩn). Tôi không hoàn toàn hiểu ví dụ LC_COLLATE của bạn: Trên hệ thống của tôi, ví dụ bạn đưa ra không khớp B.
Heinzi


10

Vị trí trang người đàn ông (7) nói:

miền địa phương mặc định [...] được xác định bằng các bước sau:

  1. Nếu có biến môi trường không null LC_ALL, giá trị của LC_ALL được sử dụng.

  2. Nếu một biến môi trường có cùng tên với một trong các loại [LC_ *] ở trên tồn tại và không có giá trị, giá trị của nó được sử dụng cho danh mục đó.

  3. Nếu có một biến môi trường không null LANG, giá trị của LANG được sử dụng.

Vì vậy, bạn có thể sử dụng LANG như một loại tương tự có mức độ ưu tiên thấp của LC_ALL: đặt giá trị của LANG thành de_ATvà LC_MESSAGES thành en_US:

$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"
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.