लगभग हर कार्यक्रम को मेरे लोकेल की शिकायत क्यों है?


29

मैं आर्क लिनक्स का उपयोग कर रहा हूं, और मैंने अपने लोकेल को सेट करने के बारे में विकी के निर्देशों का पालन किया है ।

लगभग हर कार्यक्रम जो लोकल के बारे में शिकायत करता है - यहां तक ​​कि locale। यह इस तरह दिख रहा है:

% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=

या:

% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "en-US",
    LC_NUMERIC = "en-US",
    LC_MONETARY = "en-US",
    LC_MEASUREMENT = "en-US",
    LC_CTYPE = "en_US.UTF-8",
    LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")

कुछ गड़बड़ है कि /etc/locale.genकई उदाहरण हैं; सभी UTF-8 लाइनों में "something.UTF-8" है, और यह चलते समय locale-genशो en_US.UTF-8... doneचल रहा है, लेकिन locale -a, जो आपको उपलब्ध स्थानों को दिखाने के लिए माना जाता है en_US.utf8। मैंने दोनों प्रारूपों के विभिन्न संयोजनों की कोशिश की है , /etc/locale-genऔर कुछ भी नहीं किया है।LOCALE=/etc/rc.conf

अतिरिक्त जानकारी:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

ब्रूस एडगर के सुझाव LANG=Cऔर LC_ALL=en_US.UTF-8काम करने का सुझाव (वास्तव में, LC_ALLइसे तय करना, सेटिंग LANGमायने नहीं रखती थी), लेकिन मैं जानना चाहता हूं कि क्या हो रहा है। SUS के अनुसार , LC_ALL अन्य सभी LC_ * वेरिएबल्स को ओवरराइड करेगा यदि यह सेट है और अशक्त नहीं है। मेरे सिस्टम में, यह सेट है, लेकिन यह अशक्त है, इसलिए इसे अनदेखा किया जाना चाहिए, और इसके बजाय अन्य मानों का उपयोग किया जाना चाहिए। यही कारण है कि क्या हो रहा है नहीं है ऐसा लगता है कि आवेदन पत्र बुला रहे हैं, setlocaleके साथ LC_ALL, एक हो रही NULL, पीठ और एक त्रुटि पैदा होने पर भी अन्य कॉल करने के लिए setlocaleएक अच्छा स्ट्रिंग लौटाने।

यहाँ एक के शीर्ष है ltraceकी locale(समारोह वापसी मान देखने के लिए स्क्रॉल दाएं)

% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510)                                                                      = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "")                                                                                   = "en_US.UTF-8"
setlocale(5, "")                                                                                   = "en_US.UTF-8"
textdomain("libc")                                                                                 = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4)                                         = 0
setlocale(6, "")                                                                                   = NULL
dcgettext(0, 0x405aa8, 5, 0, 0)                                                                    = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)  

क्या आप इसका उत्पादन साझा कर सकते हैं locale -a?
njsg

मैं कहना है कि आप का उपयोग करना चाहिए जा रहा था .utf8में LOCALEऔर LC_*, लेकिन जाहिरा तौर पर .UTF-8भी काम करता है यहाँ ... en-US के लिए के रूप में: यह (बिना प्रकट होता है .utf8में) locale -a?
njsg

1
करो export LANG=Cऔर export LC_ALL=en_US.UTF-8देखो क्या होता है। मेरे Arch linux लैपटॉप LOCALE="en_US.UTF-8"में /etc/rc.conf है, और मैं यह पता नहीं लगा सकता कि मेरा लैपटॉप LANG = C कहां सेट करता है।
ब्रूस एडिगर जूल

क्या आप अपनी सामग्री पोस्ट कर सकते हैं /etc/locale.conf? ऐसा लगता है कि आपने गलती से LANG=en-US(हाइफन के साथ) LANG=en_US(अंडरस्कोर के साथ ) लिखा है ।
मिकेल

और सामग्री /etc/locale.genभी उपयोगी होगी।
मिकेल

जवाबों:


18

आप जो के अभाव में स्थानीय डिफ़ॉल्ट करने के लिए इस्तेमाल किया जाएगा एक फ़ाइल वंचित हो रहे हैं $LANGया $LC_ALL(या सभी अधिक विशिष्ट का $LC_whatever) सेट किया जा रहा है।

पुराने glibc पर, यह / usr / lib / लोकेल / लोकेल-आर्काइव है। चूँकि GNU / Linux अव्यवस्थित है, इसलिए आपको यह निर्धारित करने के लिए स्ट्रेस का उपयोग करना चाहिए कि आपकी मशीन में उपयोग किए जाने वाले विशेष संस्करणों में कौन सी फाइलें अपेक्षित हैं:

स्ट्रेस -ई फ़ाइल लोकेल
निष्पादित करें ("/ usr / bin / locale", ["locale"], [/ * 36 vars * / /)) 0
पहुंच ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (ऐसी कोई फ़ाइल या निर्देशिका नहीं)
खुला ("/ etc / ld.so.cache", O_RDONLY) = 3
खुला ("/ lib / libc.so.6", O_RDONLY) = 3
खुला ("/ usr / lib / स्थानीय / स्थानीय-संग्रह", O_RDONLY | O_LARGEB) - 3

---------------------- टिप्पणियाँ 1 दिन बाद जोड़ा गया:

"ltrace -S" ठीक होना चाहिए, क्योंकि यह syscalls दिखाता है।

अन्यथा, "लेट्रेस" बहुत मददगार नहीं है (यानी यह काउंटरप्रैक्टिव बनाम स्ट्रेस है), क्योंकि यह केवल ऊपरवाला कॉल दिखाता है। वे स्पष्ट हैं (सेट्लोकाले (3)), जबकि वास्तविक समस्या libc के भीतर होती है।

ऐसा लगता है जैसे आपके पास कच्चा स्थानीय डेटा स्थापित है, क्योंकि en_US.UTF-8 काम करता है।

यदि ऐसा है, तो कुछ इस तरह आपकी समस्या को ठीक करना चाहिए, एक सिस्टम-वाइड डिफ़ॉल्ट सेट करना:

localedef -f UTF-8 -i en_US en_US.UTF-8

sudo localedef -f UTF-8 -i en_US en_US.UTF-8रास्पियन 2018-11-13 लाइट पर काम करता है।
सिरो संतिली 新疆 改造 iro i 事件 '25

6

मेरे पास /etc/locale.confबस आज की स्थापना के बाद एक ही मुद्दा था (हाल के बदलावों से संबंधित) /etc/rc.confमेरे मामले में, यह पता चला कि स्थान स्थापित नहीं थे।

जाँच करें /etc/locale.gen। आपके वातावरण चर संदर्भों के सभी स्थानों को सक्रिय किया जाना चाहिए (यानी टिप्पणी नहीं की गई है)। अपने परिवर्तन करने के बाद, sudo locale-genचयनित स्थानों को स्थापित करने के लिए चलाएँ ।


2

इस लिंक के बाद मेरी समस्या हल हो गई:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

यह एक फ़ाइल उत्पन्न /etc/locale.confकरता है जो इस समस्या को ठीक करता है


1

मुझे हाल ही में ऐसी ही समस्याएं थीं, सभी यूनिकोड फ़ाइल नामों को गलत तरीके से प्रदर्शित किया गया था, जब मैंने गलती से 'LOCALE = en_US.utf8' को हटा दिया था /etc/rc.conf। इसलिए मैंने बूट स्क्रिप्ट की जाँच की:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

सरल समाधान दोनों की जाँच है DAEMON_LOCALEऔर LOCALEमें /etc/rc.conf, सुनिश्चित करें कि पहले एक नहीं था बनाने noऔर दूसरा एक खाली नहीं था।


-1

हो सकता है कि आपकी कोई सेटिंग अमान्य है? संदर्भ के लिए ये मेरी स्थानीय सेटिंग्स हैं; वे किसी भी त्रुटि का कारण नहीं बनते हैं (KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.