LC_ * सेट करें, लेकिन LC_ALL नहीं


13

मुझे एक जर्मन (ऑस्ट्रिया) लोकेल (ए 4 पेपर का आकार, 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"

पुनश्च: यह एक साझा मशीन है और मैं सुडोल नहीं हूं, इसलिए सिस्टम-वाइड सेटिंग्स बदलना विकल्प नहीं है।

जवाबों:


15

स्थानीय सेटिंग के तीन सेट हैं:

  • LANGयदि आप किसी श्रेणी के लिए कोई मान निर्दिष्ट नहीं करते हैं, तो फ़ॉलबैक सेटिंग। यह उपयोगकर्ताओं के लिए सरल तरीके से उनके स्थान का संकेत देने के लिए प्रेरित है।
  • LC_xxxप्रत्येक श्रेणी के लिए ( xxxहो सकता है MESSAGES, TIME, आदि)।
  • LC_ALLसभी सेटिंग्स को ओवरराइड करता है। यह अनुप्रयोगों के लिए एक ज्ञात लोकेल (आमतौर पर C, डिफ़ॉल्ट लोकेल) में काम करने के लिए सभी सेटिंग्स को ओवरराइड करने का एक तरीका है , आमतौर पर इसलिए कि विभिन्न कमांड एक ज्ञात प्रारूप में आउटपुट का उत्पादन करते हैं।

तो आप सेट कर सकते हैं LANG=de_AT.UTF-8और LC_MESSAGES=C( Cडिफ़ॉल्ट लोकेल है और अनट्रांसलेटेड है; en_USआमतौर पर Cसंदेशों के लिए समान है )।

हालाँकि, दो श्रेणियां हैं जहाँ मैं डिफ़ॉल्ट को बदलने की सलाह नहीं देता, क्योंकि यह बहुत सारे कार्यक्रमों को तोड़ देता है:

  • LC_COLLATEचरित्र है मिलान के क्रम। यह बहुत उपयोगी नहीं है क्योंकि यह केवल वर्णों को क्रमबद्ध करने के लिए इंगित करता है, न कि कैसे छंटाई करने के लिए। उपकरण जो स्ट्रिंग्स को सॉर्ट करना जानते हैं, उनका उपयोग नहीं करते LC_COLLATE। इसके अलावा बहुत सारे उपकरण ऐसी चीजों की उम्मीद करते हैं, जैसे " [a-z]सभी 26 ASCII लोअरकेस और कोई अन्य 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। यदि आपने इसके बारे में नहीं सुना है, तो आप बहुत याद नहीं कर रहे हैं।


विस्तृत उत्तर और स्पष्टीकरण के लिए धन्यवाद! मैं एक स्थानीयकृत LC_NUMERIC की कोशिश करूँगा, हालाँकि, जब जर्मन कीबोर्ड पर नंबरपैड ,एक .(दुर्भाग्य से) के स्थान पर है , इसलिए एक डॉट के साथ संख्याओं को दर्ज करना असुविधाजनक है (और अधिकांश एप्लिकेशन एक गैर-मानक LC_NUMERIC के साथ अच्छी तरह से काम करते हैं)। मैं आपके LC_COLLATE उदाहरण को पूरी तरह से नहीं समझता: मेरे सिस्टम पर, आपके द्वारा दिया गया उदाहरण मेल नहीं खाता B
हेनजी


10

आदमी पेज स्थान (7) का कहना है:

डिफ़ॉल्ट लोकेल [...] को निम्न चरणों का उपयोग करके निर्धारित किया जाता है:

  1. यदि कोई अशक्त वातावरण चर LC_ALL है, तो LC_ALL का मान उपयोग किया जाता है।

  2. यदि उपरोक्त श्रेणी [LC_ *] में से एक के समान नाम वाला एक पर्यावरण चर मौजूद है और गैर-शून्य है, तो इसका मान उस श्रेणी के लिए उपयोग किया जाता है।

  3. यदि कोई अशक्त वातावरण चर LANG है, तो LANG का मान उपयोग किया जाता है।

तो, आप LC_ALL की निम्न-पूर्वता अनुरूपता के रूप में LANG का उपयोग कर सकते हैं: 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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.