LC_ * ayarlandı, ancak LC_ALL değil


13

Almanca (Avusturya) yerel ayarına sahip olmak istiyorum (A4 kağıt boyutu, 24 saat, yyyy-aa-gg), ancak İngilizce kullanıcı arayüzü (Kötü çevirileri sevmem). Bunu başarmanın doğru yolunun LC_değişkenlerimi aşağıdaki gibi ayarlamak olduğunu düşündüm .bashrc(yanlışsam lütfen düzeltin):

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

Her bir değeri ayarlamak yerine LC_ $ everythingelse öğesini ayarlamanın daha zarif bir yolu var mı? LC_ALL'ı ayarlamak bir seçenek değildir, çünkü LC_MESSAGES'a göre öncelik taşır:

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

Not: Bu paylaşılan bir makine ve sudoer değilim, bu nedenle sistem genelindeki ayarları değiştirmek bir seçenek değil.

Yanıtlar:


15

Üç yerel ayar grubu vardır¹:

  • LANG, bir kategori için bir değer belirtmediyseniz, yedek ayar. Kullanıcıların yerel ayarlarını basit bir şekilde belirtmeleri amaçlanmıştır.
  • LC_xxxher bir kategori için ( xxxolabilir MESSAGES, TIMEvs.).
  • LC_ALLtüm ayarları geçersiz kılar. Uygulamaların, bilinen bir yerel ayarda (genellikle Cvarsayılan yerel ayar) çalışmak için tüm ayarları geçersiz kılmalarının bir yoludur , böylece çeşitli komutlar bilinen bir biçimde çıktı üretir.

Böylece LANG=de_AT.UTF-8ve ayarlayabilirsiniz LC_MESSAGES=C( Cvarsayılan yerel ayardır ve çevrilmemiş anlamına gelir; en_USgenellikle Cmesajlar için aynıdır ).

Ancak, çok sayıda programı bozduğu için varsayılanı değiştirmenizi önermediğim iki kategori var:

  • LC_COLLATEkarakter harmanlama sırasıdır. Çok yararlı değil, çünkü sadece karakterlerin nasıl sıralanacağını, dizelerin nasıl sıralanacağını değil. Dizeleri sıralamayı bilen araçlar kullanmaz LC_COLLATE. Ayrıca, birçok araç “ [a-z]26 ASCII küçük harfiyle eşleşir ve başka ASCII karakteri içermez ” gibi şeyler bekler , ancak bu, varsayılan olmayan yerel ayarların çoğunda doğru değildir (deneyin echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICsayıların nasıl görüntüleneceğini gösterir. Özellikle, birçok dilde, kayan nokta sayılarının ondalık noktadan ,ziyade kullanılmasını sağlar .. Ancak sayıları ayrıştıran birçok program a'yı bir alan ayırıcısı olarak görür .ve tedavi eder ,.

Bu yüzden tavsiye ederim

  • ister açık bir şekilde LC_COLLATE=C LC_NUMERIC=_C,
  • ya da bırakın LANGsertleşmemiş ve sadece yararlı kategoriler için bir değeri ( LC_MESSAGES, LC_TIME, LC_PAPERartı LC_CTYPE(değeri bağlı olarak değişebilir, terminal)).

GN Artı LANGUAGEGNU libc ile. Eğer bunu duymamış olsaydın, çok fazla eksik değilsin.


Ayrıntılı cevap ve açıklamalar için teşekkürler! Ancak, yerel klavyeler LC_NUMERIC'i deneyeceğim, çünkü Alman klavyelerindeki numpad ,bir .(maalesef) yerine sahip olduğundan, nokta ile sayı girmek zahmetli (ve çoğu uygulama standart olmayan bir LC_NUMERIC ile iyi çalışıyor gibi görünüyor). Ben tam olarak LC_COLLATE örneği anlamıyorum: Benim sistemde, verdi örneği yok değil maç B.
Heinzi


10

Adam sayfa yerel (7) der ki:

varsayılan yerel ayar [...] aşağıdaki adımlar kullanılarak belirlenir:

  1. Boş olmayan bir ortam değişkeni LC_ALL varsa, LC_ALL değeri kullanılır.

  2. Yukarıdaki [LC_ *] kategorilerinden biriyle aynı ada sahip bir ortam değişkeni varsa ve null değilse, değeri bu kategori için kullanılır.

  3. Boş olmayan bir ortam değişkeni LANG varsa, LANG değeri kullanılır.

Böylece, LANG'ı LC_ALL'ın bir tür düşük öncelikli analogu olarak de_ATkullanabilirsiniz en_US: LANG değerini ve LC_MESSAGES olarak ayarlayın :

$ 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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.