Làm thế nào để thay đổi biến môi trường miền địa phương?


18

Tôi đã tạo các tệp bản địa hóa en_US.utf8 , et_EE.iso88591ru_RU.utf8 . Bây giờ nếu tôi cố gắng thay đổi bất kỳ biến cục bộ nào thành ru_RU.utf8 hoặc en_US.utf8 , thì điều này không có tác dụng gì:

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

Tuy nhiên, nếu tôi thay đổi biến LANG = , thì tất cả các biến khác trừ LANGUAGE =LC_ALL = lấy giá trị của biến LANG = . Có cách nào để sửa đổi từng biến cục bộ riêng biệt không? Bên cạnh đó, tôi sửa mà biến miền địa phương không phải là các biến shell thông thường, nhưng giống như các tham số để locale tiện ích?

Câu trả lời:


15

Bạn có thể đặt bất kỳ danh mục địa phương một cách độc lập. LANGchỉ áp dụng cho các danh mục không được thiết lập rõ ràng.

LANGLC_xxxlà các biến môi trường thông thường. Chúng không phải là cài đặt cho localetiện ích: localechương trình không tham gia vào bất kỳ quá trình xử lý ngôn ngữ nào, nó chỉ là một tiện ích nhỏ để báo cáo các cài đặt ngôn ngữ hiện có và hiện có.

Khi bạn viết LC_TIME=ru_RU.utf8, điều này không đặt biến môi trường, chỉ có biến shell. Các biến shell là nội bộ của shell, chúng không được các chương trình khác nhìn thấy. Mặt khác, các biến môi trường được kế thừa bởi các chương trình mà trình bao khởi động. Bạn cũng cần xuất biến ra môi trường:

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

hoặc trực tiếp

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

"LANG và LC_xxx là các biến môi trường thông thường" Làm thế nào để bạn biết điều đó LANGLC_xxxlà các biến môi trường? chương trình thử nghiệm của tôi rằng chỉ LANGLANGUAGELC_MESSAGESLC_ALLlà các biến môi trường, trong khi các biến số khác như LC_CTYPELC_MONETARYkhông biến môi trường (cũng có, họ không biến vỏ)?
rony_t

@rony_t Bạn có thể xem mã nguồn của các ứng dụng và thư viện, xem tài liệu của họ hoặc thử nghiệm với chúng. Ví dụ: tính toán env LC_TIME=en_GB datevới env LC_TIME=fr_FR dateenv PATH="$PATH" date(rõ ràng, chọn các địa điểm tồn tại trên hệ thống của bạn). Rõ ràng, mỗi biến có thể hoặc không thể được đặt trong môi trường của một quy trình nhất định. Bạn đã làm thử nghiệm gì? Bạn có chắc chắn ứng dụng bạn đã sử dụng hoạt động khác nhau dựa trên LC_CTYPE(khá phổ biến) và LC_MONETARY(khá hiếm) không?
Gilles 'SO- ngừng trở nên xấu xa'

Trong nhà ga, tôi thực hiện các printenvlệnh để liệt kê các biến môi trường của bash, và chỉ LANGLANGUAGELC_MESSAGESLC_ALLđược liệt kê như là biến môi trường. Tôi cũng thực hiện lệnh set -o posixtiếp theo là lệnh setđể có được các biến môi trường và các biến vỏ bash, và chỉ LANGLANGUAGELC_MESSAGESLC_ALLđược niêm yết. Vì vậy, phương tiện này LANGLANGUAGELC_MESSAGESLC_ALLlà các biến môi trường và phần còn lại của các biến địa phương không phải là, và cũng có thể họ không biến vỏ.
rony_t

@rony_t số Nó có nghĩa là bạn đã thiết lập các biến môi trường LANG, LANGUAGE, LC_MESSAGESLC_ALL. (Hoặc bạn đã làm điều này một cách rõ ràng hoặc phân phối của bạn hoặc quản trị viên hệ thống của bạn đã làm điều đó cho bạn.) Bạn có thể đặt biến môi trường theo bất kỳ tên nào (hợp lệ về mặt cú pháp)! Nhưng một số tên có ý nghĩa đối với một số ứng dụng và một số tên thì không. LC_MESSAGES, LC_CTYPE, LC_TIMEVà như vậy được sử dụng bởi các ứng dụng mà quan tâm đến ngôn ngữ của thông báo lỗi, mã hóa ký tự, định dạng thời gian, và vân vân.
Gilles 'SO- ngừng trở nên xấu xa'

@rony_t Nhân tiện, cấu hình của bạn rất lạ. Cài đặt LC_ALLghi đè tất cả các cài đặt khác, vì vậy giá trị của các biến cục bộ khác không thành vấn đề. Nó thường chỉ được sử dụng tạm thời để buộc một chương trình sử dụng một ngôn ngữ nhất định, không có nghĩa là có nó trong môi trường bình thường của bạn.
Gilles 'SO- ngừng trở nên xấu xa'

6

Theo các bản phân phối dựa trên Fedora / CentOS / RHEL, tôi tin rằng bạn có thể thay đổi ngôn ngữ thành một trong những miền được hiển thị khi bạn chạy locale -alệnh trong tệp hệ thống này:

/etc/sysconfig/i18n

Ví dụ trên hệ thống Fedora 14 của tôi:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

Trong Gnome, bạn có thể chạy ứng dụng trợ giúp:

system-config-language

Điều này mang đến GUI này:

             ss của lang.  gui

Tôi nghĩ rằng nó hơi khác nhau đối với các bản phân phối Debian / Ubuntu. Tôi tin rằng đây là tập tin này:

/etc/default/locale

Tôi tin rằng chúng là các biến môi trường nhưng không hoàn toàn chắc chắn về cách các ứng dụng sử dụng chúng nếu có.

Người giới thiệu


4

Ít nhất trên RedHat 6, lưu ý rằng nếu LC_ALL được đặt, thì việc đặt các biến môi trường LC_ * khác sẽ không có hiệu lực, vì LC_ALL được ưu tiên hơn tất cả các biến môi trường LC_ * khác.

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=

1

Trong các hệ thống Debian, người ta có thể chạy dpkg-reconfigure localesđể đặt ngôn ngữ chính và cung cấp ngôn ngữ khác; sau đó người ta có thể chạy update-localeđể đặt LANGUAGEbiến môi trường /etc/default/localeđể có ngôn ngữ dự phòng.


2
dpkg-reconfigure locales, không phảilocale
lauriys
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.