เปลี่ยนภาษาชั่วคราวสำหรับข้อความเทอร์มินัล / คำเตือน / ข้อผิดพลาด


22

ข้อความในเครื่องเทอร์มินัลของฉันแสดงเป็นภาษารัสเซียโดยค่าเริ่มต้นซึ่งเป็นภาษาดั้งเดิมของฉัน

สักครู่ฉันต้องการให้พวกเขาเป็นภาษาอังกฤษ (เช่นเพื่อวางในฟอรัม) จากนั้นเปลี่ยนกลับเป็นภาษาเริ่มต้น

ฉันจะทำสวิตช์และสลับกลับโดยใช้ bash ได้อย่างไร

คำตอบ:


23

มีตัวแปรสภาพแวดล้อมหลายตัวสำหรับการเปลี่ยนการตั้งค่าภาษา คุณสามารถดูการตั้งค่าโลแคลปัจจุบันของคุณได้โดยการรันlocaleคำสั่ง เปลี่ยนการตั้งค่าสถานที่เกิดเหตุทั้งหมดเป็นภาษาอังกฤษ, LANG=Cการใช้งาน นี้Cสถานที่เกิดเหตุอยู่เสมอโดยไม่ต้องมีการติดตั้งชุดภาษาเพิ่มเติม (เพื่อเปลี่ยนเป็นภาษาที่ไม่ใช่ภาษาอังกฤษเป็นการชั่วคราวโปรดดูที่โพสต์ของ@ mklement0 )

ตัวอย่าง:

การดำเนินการคำสั่งด้วยการตั้งค่าภาษาเริ่มต้นและพิมพ์การตั้งค่าภาษาปัจจุบัน:

$ /nonexistent
bash: /nonexistent: Bestand of map bestaat niet
$ locale
LANG=nl_NL.UTF-8
LANGUAGE=
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

แทนที่ภาษาชั่วคราวสำหรับหนึ่งโปรแกรมและแสดงว่าเป็นจริงชั่วคราว:

$ LANG=C ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ ls /nonexistent
ls: kan geen toegang krijgen tot /nonexistent: Bestand of map bestaat niet

เปลี่ยนโลแคลสำหรับคำสั่งทั้งหมดที่ดำเนินการในเชลล์ปัจจุบันและรวมการพิสูจน์อีกครั้ง:

$ LANG=C
$ ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

6
สำหรับผู้ใช้อื่น ๆ ที่มีปัญหาได้รับนี้ไปทำงาน - การตั้งค่าLANGหรือLANG_ALLไม่ทำงานสำหรับฉันเลยLANGUAGEคือ ดูเหตุใดการแทนที่ตัวแปรสภาพแวดล้อม LANG จึงไม่เปลี่ยนภาษาสำหรับฉัน
gertvdijk

1
@ gertvdijk: ขอบคุณสำหรับสิ่งนั้น เหตุผลที่คำตอบนี้ทำงานได้โดยไม่ต้องตั้งค่าLANGUAGEเป็นข้อยกเว้น : GNU gettext ให้ความสำคัญกับLANGUAGEค่ายกเว้นถ้า (มีผลบังคับ) LC_MESSAGESมูลค่า (ปกติตั้งทางอ้อมผ่านLANGหรือLC_ALL) เป็นอย่างใดอย่างหนึ่งCหรือ POSIX(ไวพจน์ของมัน) นอกจากนี้ยังทราบว่าLANGUAGEเกิดขึ้นจะไม่มีการตั้งค่าในคำตอบนี้ในขณะที่มันจะถูกกำหนดโดยค่าเริ่มต้นและหากมีการตั้งคุณต้องแทนที่มันเพื่อสลับไปยังสถานที่เฉพาะเจาะจงของภาษา (เมื่อเทียบกับ "C" / "POSIX") ซึ่งเป็น สิ่งที่คุณพบ
mklement0

คำตอบของคุณใช้งานได้ดีเมื่อเปลี่ยนเป็นโลแคล "C" (ด้วยข้อความภาษาอังกฤษของสหรัฐอเมริกาตามที่ต้องการ) แต่จะไม่ทำงานสำหรับสถานที่อื่นเว้นแต่LANGUAGEจะไม่มีการตั้งค่าหรือลบล้างอย่างชัดเจน เมื่อพิจารณาจากชื่อสามัญของคำถามเป็นไปได้ว่าผู้คนจะพบคำตอบที่ต้องการเปลี่ยนไปใช้ภาษาที่ไม่ใช่ภาษาอังกฤษด้วยดังนั้นโปรดลองเพิ่มข้อมูลนี้ในคำตอบของคุณ
mklement0

@ mklement0 เนื่องจากบริบทของคำถาม (การโพสต์ข้อความแสดงข้อผิดพลาดภาษาอังกฤษ) ฉันคิดว่าโพสต์ปัจจุบันเพียงพอแล้ว คุณสามารถเพิ่มคำตอบอื่นที่จะอธิบายรายละเอียดที่อยู่รอบ ๆLANGUAGEถ้าคุณต้องการ :)
Lekensteyn

ฉันได้เพิ่มคำตอบของคุณเองตามที่คุณแนะนำ หากคุณเห็นด้วยกับการประเมินของฉันว่าผู้อ่านในอนาคตอาจมาที่นี่เพื่อเปลี่ยนเป็นภาษาใด ๆ (ตามที่หลายคนระบุไว้แล้ว) โปรดเพิ่มลิงก์ไปยังคำตอบของฉันสำหรับคำถามของคุณ นอกเหนือจากที่ผมขอแนะนำให้เปลี่ยนค่าของLANGUAGEในการส่งออกไปยังตัวอย่างของคุณซึ่งเป็นค่าเริ่มต้นที่เกิดขึ้นจริงเมื่อสถานที่ของคุณคือnl nl_NL.UTF-8
mklement0

9

คำตอบที่เป็นประโยชน์ Lekensteyn ของการทำงานที่ดีถ้าคุณต้องการเปลี่ยนไปใช้ภาษาอังกฤษในความต้องการเป็น OP ที่ร้องขอ แต่ถ้าคุณต้องการที่จะเปลี่ยนไปใช้ที่แตกต่างกันภาษาตามความต้องการ , การทำงานมากขึ้นเป็นสิ่งจำเป็น

ก่อนเริ่มต้นคุณต้องติดตั้งตารางข้อความด้วยsudo apt-get install language-pack-<lang-tag>ซึ่ง<lang-tag>เป็นแท็กย่อยภาษา RTF 5646 แบบง่ายเช่นesสำหรับสเปน

ข้อมูลความเป็นมา

GNU gettextสาธารณูปโภคชั่นให้ความสำคัญกับการที่ไม่เป็นมาตรฐานLANGUAGEตัวแปรสภาพแวดล้อม[1] มากกว่า POSIX กำหนดตัวแปรสภาพแวดล้อมของสถานที่เกิดเหตุLC_ALL, LC_MESSAGESและLANG(ตามลำดับ)

ระบุว่าLANGUAGEถูกตั้งค่าตามค่าเริ่มต้นบนระบบ Ubuntu [2]คือสตริงย่อยของLANGค่าที่สะท้อนแท็กภาษาอย่างง่าย (เช่นesสำหรับสเปน) หรือแท็กภาษาในภูมิภาค (เช่นde_DEสำหรับตัวแปรเยอรมันของเยอรมัน) คุณต้องยกเลิกการตั้งค่าหรือลบล้างLANGUAGEเพื่อให้ข้อความภาษาอื่นมีผล [3]

ตัวเลือก 1: ตั้งค่า LANGUAGE

ตัวอย่าง : สลับไปที่esข้อความสเปน ( ) ข้อความเฉพาะกิจ:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

หมายเหตุ : แท็กภาษาอย่างง่ายเช่นesเพียงพอ แต่คุณอาจเพิ่มตัวระบุภูมิภาค (เช่นes_ARสำหรับอาร์เจนตินา) และแม้กระทั่งคำต่อท้ายชุดอักขระ (เช่นes_AR.UTF-8)
อย่างไรก็ตามข้อความที่แปลแล้วอาจมีอยู่ในระดับภาษาเท่านั้นและทางเลือกคือการใช้ข้อความที่ตรงกับส่วนภาษา ( esในกรณีนี้)

ตัวเลือก 2: Unset LANGUAGEและ setLC_ALL

โซลูชันทางเลือกนี้จะยกเลิกการกำหนดค่า LANGUAGEก่อนจากนั้นใช้ตัวแปรสภาพแวดล้อมของโลแคล POSIX LC_ALLเพื่อตั้งค่าโดยนัยLC_MESSAGES[4] :

$ LANGUAGE= LC_ALL=es_ES.UTF-8 ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

โซลูชันนี้มีข้อดีของการตั้งค่าลักษณะการแปลทั้งหมดเป็นโลแคลที่ระบุ (เช่นLC_TIMEสำหรับรูปแบบวันที่ / เวลา) และการตั้งค่า (โดยนัย) LC_MESSAGESยังแจ้งโปรแกรมที่ไม่ใช่ GNU ของภาษาที่ต้องการ

โปรดทราบว่าLC_ALLต้องใช้ชื่อเต็มภาษาที่แน่นอนรวมถึงคำต่อท้าย charset เพื่อให้มีประสิทธิภาพ ( es_ES.UTF-8) (ซึ่งแตกต่างจากLANGUAGEที่แท็กภาษาแบบง่าย ๆ นั้นเพียงพอ (เช่นes)) เช่นเดียวกับการตั้งค่าและLC_MESSSAGES LANGการระบุชื่อโลแคลที่ไม่ถูกต้อง / ไม่ได้ติดตั้งจะทำให้เกิดทางเลือกไปยังโลแคล POSIX ดังนั้นภาษาอังกฤษแบบสหรัฐอเมริกา


เชิงอรรถ

[1] เหตุผลว่าคำตอบ Lekensteyn ทำงานแม้โดยไม่ต้อง unsetting / เอาชนะLANGUAGEเป็นข้อยกเว้น : ถ้า (มีผลบังคับ) LC_MESSAGESมูลค่า (ปกติตั้งทางอ้อมผ่านLANGหรือLC_ALL) เป็นอย่างใดอย่างหนึ่งCหรือ (ไวพจน์ของมัน) POSIX, ค่าที่เป็นที่เคารพนับถือโดยไม่คำนึงถึงความคุ้มค่าของLANGUAGE, ถ้ามี. ตรงกันข้ามถ้า (มีผลบังคับ) LC_MESSAGESค่าอื่น ๆที่เฉพาะเจาะจงสถานที่เกิดเหตุLANGUAGEจะมีความสำคัญ

[2] นี้นำไปใช้อูบุนตูที่เหมาะสมแต่ไม่จำเป็นต้องรสชาติอื่น ๆ ; Lekensteyn ระบุว่าKubuntuไม่ได้LANGUAGEตั้งค่า
เนื้อหาLANGUAGEควรจะไม่ได้ตั้งค่าได้โดยเริ่มต้นที่ระบุว่าในกรณีที่ไม่มีของLC_MESSAGESค่านัยโดยLANGค่า (ซึ่งกำหนดสถานที่ปัจจุบัน) เป็นที่เคารพนับถือ

[3] คุณยังสามารถใช้วิธีนี้เพื่อเปลี่ยนเป็น [US] ภาษาอังกฤษโดยการกำหนดอย่างใดอย่างหนึ่งLANGUAGE=CหรือLANGUAGE=POSIX(เป็นทางเลือกให้LANG=C/ LANG=POSIX) แม้ว่าฉันจะไม่ชัดเจนว่าเป็นที่รู้จักอย่างแข็งขันหรือเป็นกลไกทางเลือกเนื่องจากค่าเหล่านี้ไม่ ไม่ต้องเริ่มด้วยแท็กภาษา en_USบางทีอาจจะเป็นทางเลือกที่ดีกว่าจะ

[4] มีความเป็นขอบพยายามที่จะก่อให้เกิดการปฏิบัติการกับ: กรณีที่วิธีนี้ไม่ได้ทำงานเส้นทาง - - ไม่ว่าจะเป็นญาติหรือแน่นอนไม่ได้เปลี่ยนไปใช้ภาษาที่ระบุไว้ในขณะที่ชื่อไฟล์เพียง : ไม่
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilityไม่ไม่ทำงาน (เอาท์พุทข้อความ ในสถานที่ปัจจุบัน) ในขณะที่
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utilityไม่ (ส่งออกข้อความข้อผิดพลาดสเปน)
หากใครรู้ว่าทำไมและมีเหตุผลที่ดีสำหรับสิ่งนี้หรือไม่โปรดแจ้งให้เราทราบ


Tip of the hat to @ wjandreaสำหรับความช่วยเหลือของเขาในการจัดทำโพสต์นี้
mklement0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.