atur LC_ * tetapi tidak LC_ALL


13

Saya ingin memiliki lokal Jerman (Austria) (ukuran kertas A4, waktu 24 jam, yyyy-mm-dd), tetapi antarmuka pengguna berbahasa Inggris (saya tidak suka terjemahan yang buruk). Saya pikir cara yang benar untuk mencapai ini adalah dengan mengatur LC_variabel sebagai berikut di .bashrc(tolong perbaiki saya jika saya salah):

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

Apakah ada cara yang lebih elegan untuk mengatur LC_ $ everythingelse daripada mengatur setiap nilai tunggal? Mengatur LC_ALL bukan opsi, karena lebih diutamakan daripada 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: Ini mesin yang dibagikan dan saya tidak sudoer, jadi mengubah pengaturan sistem bukan merupakan pilihan.

Jawaban:


15

Ada tiga set pengaturan lokal¹:

  • LANG, pengaturan mundur, jika Anda belum menentukan nilai untuk suatu kategori. Pengguna cenderung menunjukkan lokal mereka dengan cara yang sederhana.
  • LC_xxxuntuk setiap kategori ( xxxbisa MESSAGES, TIME, dll).
  • LC_ALLmengabaikan semua pengaturan. Ini adalah cara bagi aplikasi untuk mengesampingkan semua pengaturan untuk bekerja di lokal yang dikenal (biasanya C, lokal default), biasanya sehingga berbagai perintah menghasilkan output dalam format yang dikenal.

Jadi, Anda dapat mengatur LANG=de_AT.UTF-8dan LC_MESSAGES=C( Cadalah lokal default dan berarti tidak diterjemahkan; en_USbiasanya identik dengan Cuntuk pesan).

Namun, ada dua kategori di mana saya tidak menyarankan mengubah default, karena itu merusak banyak program:

  • LC_COLLATEadalah karakter pemeriksaan order. Ini tidak terlalu berguna karena hanya menunjukkan cara mengurutkan karakter, bukan cara mengurutkan string. Alat yang tahu cara mengurutkan string tidak digunakan LC_COLLATE. Selain itu, banyak alat mengharapkan hal-hal seperti " [a-z]cocok dengan semua 26 huruf kecil ASCII dan tidak ada karakter ASCII lainnya", tetapi itu tidak benar di sebagian besar lokal non-default (coba echo B | LC_COLLATE=en_US grep '[a-z]').
  • LC_NUMERICmenunjukkan cara menampilkan angka. Secara khusus, dalam banyak bahasa, itu membuat angka floating point menggunakan ,bukan .sebagai titik desimal. Tetapi sebagian besar program yang menguraikan angka mengharapkan .dan memperlakukan ,sebagai pemisah bidang.

Jadi saya rekomendasikan untuk

  • baik secara eksplisit LC_COLLATE=C LC_NUMERIC=_C,
  • atau meninggalkan LANGunset dan hanya menetapkan nilai untuk kategori berguna ( LC_MESSAGES, LC_TIME, LC_PAPER, ditambah LC_CTYPE(yang nilainya dapat bervariasi tergantung pada Anda terminal)).

¹ Plus LANGUAGEdengan libc GNU. Jika Anda belum pernah mendengarnya, Anda tidak akan kehilangan banyak hal.


Terima kasih atas jawaban terperinci dan penjelasannya! Saya akan mencoba LC_NUMERIC yang dilokalkan, karena numpad pada keyboard Jerman ,menggantikan .(sayangnya), sehingga memasukkan angka dengan titik tidak nyaman (dan sebagian besar aplikasi tampaknya bekerja dengan baik dengan LC_NUMERIC non-standar). Saya tidak sepenuhnya memahami contoh LC_COLLATE Anda: Di sistem saya, contoh yang Anda berikan tidak cocok B.
Heinzi


10

The halaman manual lokal (7) mengatakan:

lokal default [...] ditentukan menggunakan langkah-langkah berikut:

  1. Jika ada variabel lingkungan non-null LC_ALL, nilai LC_ALL digunakan.

  2. Jika variabel lingkungan dengan nama yang sama dengan salah satu kategori [LC_ *] di atas ada dan tidak nol, nilainya digunakan untuk kategori itu.

  3. Jika ada variabel lingkungan non-null LANG, nilai LANG digunakan.

Jadi, Anda dapat menggunakan LANG sebagai semacam analog dengan LC_ALL presedensi rendah: setel nilai LANG menjadi de_ATdan LC_MESSAGES menjadi 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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.