จะเปลี่ยนตัวแปรสภาวะแวดล้อมของโลแคลได้อย่างไร?


18

ฉันสร้างไฟล์การแปลภาษาท้องถิ่นen_US.utf8 , et_EE.iso88591และru_RU.utf8แล้ว ตอนนี้ถ้าฉันพยายามเปลี่ยนตัวแปรโลแคลใด ๆ เป็นru_RU.utf8หรือen_US.utf8ดังนั้นนี่จะไม่มีผลใด ๆ :

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

อย่างไรก็ตามหากฉันเปลี่ยนตัวแปรLANG =ดังนั้นตัวแปรอื่นทั้งหมดยกเว้นLANGUAGE =และLC_ALL =รับค่าของตัวแปรLANG = มีวิธีการแก้ไขตัวแปรแต่ละภาษาแยกกันหรือไม่? นอกจากนี้ฉันแก้ไขให้ถูกต้องว่าตัวแปรโลแคลไม่ใช่ตัวแปรเชลล์ปกติ แต่ต้องการพารามิเตอร์สำหรับยูทิลิตี้ของโลแคลอีกหรือไม่

คำตอบ:


15

คุณสามารถตั้งค่าหมวดหมู่สถานที่ใดก็ได้อย่างอิสระ LANGใช้กับหมวดหมู่ที่ไม่ได้ตั้งค่าไว้อย่างชัดเจนเท่านั้น

LANGและLC_xxxเป็นตัวแปรสภาพแวดล้อมทั่วไป พวกเขาไม่ใช่การตั้งค่าสำหรับlocaleยูทิลิตี้: localeโปรแกรมไม่ได้มีส่วนร่วมในการประมวลผลสถานที่ใด ๆ มันเป็นเพียงยูทิลิตี้ขนาดเล็กเพื่อรายงานการตั้งค่าสถานที่ปัจจุบันและที่มีอยู่

เมื่อคุณเขียนLC_TIME=ru_RU.utf8สิ่งนี้ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมเพียงตัวแปรเชลล์เท่านั้น ตัวแปรเชลล์เป็นตัวแปรภายในของเชลล์ซึ่งโปรแกรมอื่นไม่สามารถมองเห็นได้ ในทางกลับกันตัวแปรสภาพแวดล้อมได้รับการสืบทอดโดยโปรแกรมที่เชลล์เริ่มทำงาน คุณต้องส่งออกตัวแปรไปยังสภาพแวดล้อมเช่นกัน:

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

หรือโดยตรง

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

"LANG และ LC_xxx เป็นตัวแปรสภาพแวดล้อมปกติ"คุณจะรู้ได้อย่างไรLANGและLC_xxxเป็นตัวแปรสภาพแวดล้อม การทดสอบของฉันแสดงว่ามีเพียงLANGและLANGUAGEและLC_MESSAGESและLC_ALLเป็นตัวแปรสภาพแวดล้อมในขณะที่ตัวแปรอื่น ๆ เช่นLC_CTYPEและLC_MONETARYไม่ใช่ตัวแปรสภาพแวดล้อม (เช่นกันพวกเขาไม่ใช่ตัวแปรเชลล์)
rony_t

@rony_t คุณสามารถดูซอร์สโค้ดของแอปพลิเคชันและไลบรารีดูเอกสารของพวกเขาหรือทดสอบกับพวกเขา ตัวอย่างเช่นสอดคล้องenv LC_TIME=en_GB dateกับenv LC_TIME=fr_FR dateและenv PATH="$PATH" date(ชัดเลือกสถานที่ที่มีอยู่ในระบบของคุณ) เห็นได้ชัดว่าตัวแปรแต่ละตัวอาจหรือไม่อาจถูกตั้งค่าในสภาพแวดล้อมของกระบวนการที่กำหนด คุณทำการทดสอบอะไร คุณแน่ใจว่าโปรแกรมที่คุณใช้จะทำงานแตกต่างไปตามLC_CTYPE(กันอย่างเป็นธรรม) และLC_MONETARY(หายากสวย)?
Gilles 'หยุดชั่วร้าย'

ในเทอร์มินัลฉันดำเนินการprintenvคำสั่งเพื่อแสดงรายการตัวแปรสภาพแวดล้อมของ bash และเฉพาะLANGและLANGUAGEและLC_MESSAGESและLC_ALLถูกระบุว่าเป็นตัวแปรสภาพแวดล้อม ฉันยังรันคำสั่งset -o posixตามด้วยคำสั่งsetเพื่อรับตัวแปรสภาวะแวดล้อมและตัวแปรเชลล์ของ bash และมีเพียงLANGและLANGUAGEและLC_MESSAGESและLC_ALLถูกแสดงรายการ ดังนั้นนี่หมายความว่า LANGและLANGUAGEและLC_MESSAGESและLC_ALLเป็นตัวแปรสภาพแวดล้อมและตัวแปรโลแคลอื่น ๆ ไม่ใช่และไม่ใช่ตัวแปรเชลล์
rony_t

@rony_t เลขที่มันหมายความว่าคุณได้ตั้งค่าสภาพแวดล้อมตัวแปรLANG, LANGUAGE, และLC_MESSAGES LC_ALL(ไม่ว่าคุณจะทำสิ่งนี้อย่างชัดเจนหรือแจกจ่ายหรือผู้ดูแลระบบของคุณทำเพื่อคุณ) คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมด้วยชื่อใด ๆ (ที่ถูกต้อง syntactically) ชื่อ! แต่บางชื่อมีความหมายกับแอปพลิเคชั่นบางตัวและบางชื่อไม่ใช่ LC_MESSAGES, LC_CTYPE, LC_TIMEและอื่น ๆ ถูกนำมาใช้โดยการใช้งานที่ดูแลเกี่ยวกับภาษาของข้อความผิดพลาดการเข้ารหัสตัวอักษรรูปแบบเวลาและอื่น ๆ
Gilles 'หยุดความชั่วร้าย' Gilles

@rony_t การกำหนดค่าของคุณแปลกมาก การตั้งค่าของLC_ALLแทนที่การตั้งค่าอื่น ๆ ทั้งหมดดังนั้นค่าของตัวแปรโลแคลอื่น ๆ จึงไม่สำคัญ โดยปกติจะใช้เพียงชั่วคราวเพื่อบังคับให้โปรแกรมใช้สถานที่ที่กำหนดไม่เหมาะสมที่จะมีในสภาพแวดล้อมปกติของคุณ
Gilles 'หยุดความชั่วร้าย' Gilles '30

6

ภายใต้ distros ที่ใช้ Fedora / CentOS / RHEL ฉันเชื่อว่าคุณสามารถเปลี่ยน locale เป็นหนึ่งใน locale ที่แสดงเมื่อคุณรันlocale -aคำสั่งในไฟล์ระบบนี้:

/etc/sysconfig/i18n

ตัวอย่างเช่นในระบบ Fedora 14 ของฉัน:

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

ใน GNOME คุณสามารถเรียกใช้แอพช่วยเหลือได้:

system-config-language

ซึ่งแสดง GUI นี้:

             ss ของ lang  กุย

ฉันคิดว่ามันแตกต่างกันเล็กน้อยสำหรับ distros Debian / Ubuntu ฉันเชื่อว่าเป็นไฟล์นี้:

/etc/default/locale

ฉันเชื่อว่าเป็นตัวแปรสภาพแวดล้อม แต่ไม่แน่ใจว่าแอปพลิเคชันจะใช้ประโยชน์ได้อย่างไรถ้าหากทั้งหมด

อ้างอิง


4

อย่างน้อย RedHat 6 โปรดทราบว่าหากมีการตั้งค่า LC_ALL จากนั้นการตั้งค่าตัวแปรสภาพแวดล้อม LC_ * อื่น ๆ จะไม่มีผลกระทบเนื่องจาก LC_ALL จะมีความสำคัญเหนือกว่าตัวแปรสภาพแวดล้อม LC_ * อื่น ๆ ทั้งหมด

[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

ในระบบ Debian เราสามารถรันdpkg-reconfigure localesเพื่อตั้งค่าภาษาหลักและทำให้ผู้อื่นใช้งานได้ จากนั้นหนึ่งสามารถรันupdate-localeเพื่อตั้งค่าLANGUAGEตัวแปรสภาพแวดล้อม/etc/default/localeให้มีภาษาทางเลือก


2
dpkg-reconfigure localesไม่ใช่locale
lauriys
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.