ตั้งค่า LC_ * แต่ไม่ใช่ LC_ALL


13

ฉันต้องการมีภาษาเยอรมัน (ออสเตรีย) (ขนาดกระดาษ A4 เวลา 24 ชั่วโมง yyyy-mm-dd) แต่ส่วนติดต่อผู้ใช้เป็นภาษาอังกฤษ (ฉันไม่ชอบการแปลที่ไม่ดี) ฉันคิดว่าวิธีที่ถูกต้องเพื่อให้บรรลุนี้คือการตั้งค่าLC_ตัวแปรดังต่อไปนี้ในของฉัน.bashrc(โปรดแก้ไขฉันหากฉันผิด):

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

มีวิธีหรูหรากว่าการตั้งค่า LC_ $ ทุกอย่างอื่นแทนที่จะตั้งค่าทุกค่าหรือไม่ การตั้งค่า LC_ALL ไม่ใช่ตัวเลือกเนื่องจากมีความสำคัญกว่า 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: มันเป็นเครื่องที่ใช้ร่วมกันและฉันไม่ได้ sudoer ดังนั้นการเปลี่ยนการตั้งค่าทั้งระบบไม่ใช่ตัวเลือก

คำตอบ:


15

การตั้งค่าภาษามีสามชุด¹:

  • LANGการตั้งค่าทางเลือกหากคุณไม่ได้ระบุค่าสำหรับหมวดหมู่ มันมีไว้สำหรับผู้ใช้เพื่อระบุสถานที่ของพวกเขาในวิธีที่ง่าย
  • LC_xxxสำหรับแต่ละประเภท ( xxxสามารถMESSAGES, TIMEฯลฯ )
  • LC_ALLแทนที่การตั้งค่าทั้งหมด เป็นวิธีสำหรับแอปพลิเคชันที่จะแทนที่การตั้งค่าทั้งหมดเพื่อให้ทำงานในสถานที่ที่รู้จัก (โดยปกติCคือสถานที่เริ่มต้น) เพื่อให้คำสั่งต่างๆสร้างผลลัพธ์ในรูปแบบที่เป็นที่รู้จัก

ดังนั้นคุณสามารถตั้งค่าLANG=de_AT.UTF-8และLC_MESSAGES=C( Cเป็นสถานที่เริ่มต้นและหมายถึง untranslated; en_USมักจะเหมือนกันCสำหรับข้อความ)

อย่างไรก็ตามมีสองประเภทที่ฉันไม่แนะนำให้เปลี่ยนค่าเริ่มต้นเพราะแบ่งโปรแกรมมากมาย:

  • LC_COLLATEเป็นตัวอักษรที่เรียงการสั่งซื้อ มันไม่ได้มีประโยชน์มากเพราะมันบ่งบอกถึงวิธีการเรียงลำดับอักขระเท่านั้นไม่ใช่วิธีเรียงสตริง LC_COLLATEเครื่องมือที่รู้วิธีการจัดเรียงสายไม่ได้ใช้ นอกจากนี้เครื่องมือจำนวนมากคาดหวังสิ่งต่าง ๆ เช่น“ [a-z]ตรงกับตัวอักษรพิมพ์เล็ก ASCII ทั้งหมด 26 ตัวและไม่มีตัวอักษร ASCII อื่น ๆ ” แต่นั่นไม่เป็นความจริงในภาษาที่ไม่ใช่ค่าเริ่มต้นส่วนใหญ่ (ลองecho B | LC_COLLATE=en_US grep '[a-z]')
  • LC_NUMERICระบุวิธีแสดงหมายเลข โดยเฉพาะอย่างยิ่งในหลาย ๆ ภาษามันทำให้ตัวเลขทศนิยมใช้,มากกว่า.ทศนิยม แต่โปรแกรมส่วนใหญ่ที่วิเคราะห์ตัวเลขคาดหวัง.และถือว่า,เป็นตัวคั่นฟิลด์

ดังนั้นฉันแนะนำให้

  • อย่างชัดเจนLC_COLLATE=C LC_NUMERIC=_C,
  • หรือปล่อยให้LANGไม่มีการตั้งค่าและการตั้งค่าเพียงค่าสำหรับประเภทที่มีประโยชน์ ( LC_MESSAGES, LC_TIME, LC_PAPERบวกLC_CTYPE(มีค่าอาจแตกต่างกันไปขึ้นอยู่กับขั้วของคุณ))

¹ บวกLANGUAGEกับ GNU libc หากคุณไม่เคยได้ยินเกี่ยวกับมันคุณจะไม่หายไปมาก


ขอบคุณสำหรับคำตอบโดยละเอียดและคำอธิบาย! ฉันจะลองใช้ LC_NUMERIC ที่แปลเป็นภาษาท้องถิ่นแล้วเนื่องจาก numpad บนคีย์บอร์ดเยอรมันมี,ตำแหน่ง.(น่าเสียดาย) ดังนั้นการป้อนตัวเลขด้วยจุดจึงไม่สะดวก (และแอปส่วนใหญ่ดูเหมือนจะทำงานได้ดีกับ LC_NUMERIC ที่ไม่ได้มาตรฐาน) ฉันไม่เข้าใจเช่น LC_COLLATE ของคุณ: ในระบบของฉันตัวอย่างที่คุณให้ไม่ได้Bแข่งขัน
Heinzi


10

สถานที่เกิดเหตุหน้าคน (7)พูดว่า:

โลแคลเริ่มต้น[... ]ถูกกำหนดโดยใช้ขั้นตอนต่อไปนี้:

  1. หากมีตัวแปรสภาวะแวดล้อมที่ไม่ใช่ค่า null LC_ALL จะใช้ค่า LC_ALL

  2. หากตัวแปรสภาพแวดล้อมที่มีชื่อเดียวกันกับหมวดหมู่หนึ่ง [LC_ *] ด้านบนมีอยู่และไม่เป็นโมฆะค่าจะถูกใช้สำหรับหมวดหมู่นั้น

  3. หากมีตัวแปรสภาวะแวดล้อมที่ไม่เป็นค่าว่าง LANG จะใช้ค่า LANG

ดังนั้นคุณสามารถใช้ LANG เป็นแอนะล็อกที่มีลำดับความสำคัญต่ำของ LC_ALL: ตั้งค่า LANG เป็นde_ATและ LC_MESSAGES เป็น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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.