Ubah definisi lokal (sebagai lawan dari pengaturan lokal)

8

Komentar awal : Pertanyaan ini tidak tentang pengaturan lokal dengan mengubah LC_ALL, LC_TIME, LANG, dll, itu lebih tentang mengubah lokal definisi , misalnya dalam /usr/share/i18n/locales/de_DE, atau masing-masing, untuk mendapatkan saran tentang pilihan yang lebih tepat daripada mengubah mereka pengaturan sistem.

The niat adalah untuk mendapatkan representasi waktu ISO %Y-%m-%d dan %H:%M:%Stanpa efek samping yang tidak diinginkan.

Saran yang saya temukan di internet belum semuanya sesuai (misalnya, menetapkan lokal ke "Denmark" tidak akan mempertahankan nama hari kerja yang dieja bahasa asli bahasa tersebut).

Sekarang satu-satunya pilihan yang saya lihat saat ini untuk mendapatkan perilaku yang diinginkan adalah mengubah definisi lokal asli saya /usr/share/i18n/locales/de_DE. Ini bukan solusi yang sempurna karena dengan pembaruan sistem, file yang diubah itu dapat ditimpa lagi.

Pertanyaan saya adalah:

  1. Apakah ada opsi terkait lokal yang lebih baik untuk mendapatkan fungsi yang diinginkan daripada mengubah file lokal sistem tertentu?
  2. Apakah ada masalah yang diharapkan saat mengubah file definisi lokal tertentu? (Dan bagaimana bisa dicegah bahwa file ini ditimpa jika terjadi pembaruan sistem?)
  3. Apakah akan lebih baik untuk menentukan varian spesifik baru dari file lokal yang ada dan menggunakannya dalam LC_*pengaturan? (Dan bagaimana file / definisi baru itu diketahui dengan benar oleh sistem?)
  4. Ada saran lain?
Janis
sumber
Saya sarankan Anda menyalin file lokal yang Anda minati, berikan salinan itu nama unik (mis. en_XX- Saya tidak tahu apa batasannya, percobaan dan kesalahan mungkin sudah cukup), buat perubahan apa pun yang Anda inginkan , dan gunakan sebagai lokal. Anda harus membuat ulang daftar atau apa pun sesudahnya, dll.
goldilocks
1
Anda mungkin ingin membaca pertanyaan saya , yang berisi detail tentang apa yang saya lakukan. Saya belum mengemasnya, tetapi untuk saat ini ini berfungsi dengan cukup baik. Cukup mengatur LC_TIME(di /etc/environmentatau /etc/default/localeatau /etc/locale.conftergantung pada distro) ke lokal dimodifikasi (saya menelepon saya isodate.UTF-8) dan format masing-masing akan dijemput dari yang lokal disesuaikan untuk hanya waktu / tanggal. Ini adalah bagaimana saya menyesuaikan en_USpengaturan saya yang lain untuk menampilkan tanggal / waktu ISO.
0xC0000022L
1
@ Janis: di Debian dan Ubuntu Anda juga ingin memasukkan nama lokal Anda /var/lib/locales/supported.d/local(atau salah satu file lain di sana) dan dijalankan dpkg-reconfigure localessebagai superuser untuk definisi lokal yang akan dikompilasi. Dan ya, pengaturanLC_TIME untuk menunjuk ke lokal yang dikustomisasi tampaknya menjadi metode yang paling tidak mengganggu dari semua yang saya lihat sejauh ini. Itu sebabnya sistem Anda memiliki pengaturan global di mana LC_TIMEdapat diatur berbeda dari "keseluruhan lokal".
0xC0000022L
@ 0xC0000022L; Pengalaman Anda di sini sangat berharga. Dengan saran sejauh ini saya akan mencari file lokal baru. Saya belum memutuskan apakah saya harus menggunakan copypendekatan pada bagian, atau menjaga bagian lain redundan (sehingga saya dapat diffmelawan file asli).
Janis

Jawaban:

5

Dalam sebuah pertanyaan baru - baru ini saya bertanya apa praktik terbaik untuk perubahan semacam ini. Belum ada jawaban. Namun, saya bisa memberi Anda resep yang saya gunakan, yang telah terbukti bekerja dengan baik. Semua program mengambil tanggal dengan benar.

Deskripsi saya untuk Ubuntu, tetapi kemungkinan akan bekerja pada Debian dan Mint.

Persiapan

Salin lokal tempat Anda ingin menyesuaikan dari /usr/share/i18n/localeske file baru. Misalnya

cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate

Sesuaikan semua dengan pengecualian LC_TIMEbagian ke:

copy "de_DE"

Sesuaikan LC_TIMEbagian untuk mencocokkan hasil yang Anda inginkan. Anda dapat menggunakan pengaturan dari pertanyaan saya yang ditautkan di atas sebagai templat. Sepertinya ini persis seperti yang Anda inginkan.

Jika lokal Anda tidak menggunakan notasi "AM / PM", setel itu menjadi kosong:

t_fmt_ampm ""
am_pm   "";""

Membuatnya dikenal oleh sistem

Edit file /var/lib/locales/supported.d/localdan tambahkan info tentang definisi lokal Anda di sana. Yaitu menambahkan baris seperti ini jika nama file Anda di atas isodate, sesuaikan sebaliknya:

de_DE.UTF-8@isodate UTF-8

Jika /var/lib/locales/supported.d/localtidak ada, buat file dengan nama itu. Jangan memasukkan perubahan Anda ke masing-masing enatau defile di folder itu, karena mereka akan ditimpa segera setelah language-pack-*-basedan language-pack-*paket pada sistem Anda menerima pembaruan.

Sekarang jalankan dpkg-reconfigure locales:

# dpkg-reconfigure locales
Generating locales...
  de_DE.UTF-8@isodate... done
  de_DE.UTF-8... up-to-date
Generation complete.

Dalam kasus Anda ini akan menunjukkan bahwa de_DE.UTF-8@isodatelokal telah dibuat (dengan asumsi Anda tidak memiliki masalah sintaksis).

Terakhir, tambahkan yang berikut ini ke /etc/default/locale:

LC_TIME="de_DE.UTF-8@isodate"

Ini akan memastikan bahwa hanya LC_TIME mengesampingkan lokal default yang ditentukan menggunakan LANG.

Login lagi dan Anda harus dapat melihat tanggal / waktu ISO baru saat menggunakan dateatau alat lain menggunakan fungsi runtime libc masing-masing.


Maksudnya di sini adalah untuk membuat perubahan yang paling tidak mengganggu sementara juga tidak bekerja melawan sistem (misalnya terhadap manajer paket dan teman-teman). Tentu saja Anda juga dapat dengan mudah membuat salinan lokal Anda, menginstalnya dengan cara yang sama seperti diuraikan di atas dan kemudian menyesuaikan LANG. Intinya adalah, selama Anda tidak ingin menjalankan risiko perubahan Anda ditimpa oleh pembaruan paket, Anda harus menggunakan salinan yang disesuaikan (kustomisasi apa pun yang Anda pilih ; mis. copyAtau cukup simpan bagian-bagian seperti saat berada di asli). Dan apakah Anda mengubah LANGke titik ke penuh definisi lokal disesuaikan - atau apakah Anda menambahkan LC_TIME hanya menunjuk ke bagian khusus yang relevan dengan nama yang sama dari file definisi lokal khusus - Anda tidak akan menyesuaikan pengaturan global.

0xC0000022L
sumber
3
Sebagai praktik terbaik, Anda akan suffix lokal Anda dengan @something like en_US.UTF-8@isodate.
Stéphane Chazelas
@ StéphaneChazelas: Hah! Luar biasa. Namun, maka Anda tidak bisa copydengan LC_IDENTIFICATIONdan bagaimana akan yang mempengaruhi penamaan file dan bagaimana Anda merujuk ke lokal dalam /etc/default/localedan /var/lib/locales/supported.d/localmasing-masing? Bisakah Anda memberi tahu?
0xC0000022L
1
Anda akan membuat en_US@isodatefile definisi dan digunakan localedefuntuk menghasilkan file yang benar; lihat sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README untuk detail (dan sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ ... sebagai contoh).
Stephen Kitt
1
Ya, dalam hal apa pun, Anda ingin mengubah bagian LC_IDENTIFICATION (en_US @ isodate) karena ini adalah lokasi yang berbeda, Perintah akhirnya adalah localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate, Saya tidak yakin tentang konfigurasi khusus Debian, komentar saya kebanyakan tentang bagaimana untuk menyebutkan lokasi.
Stéphane Chazelas
1
Seperti yang saya pahami, di Debian Anda akan menambahkan definisi lokal Anda /usr/local/share/i18n/locales, tambahkan pasangan locale / charmap yang didukung /usr/local/share/i18n/SUPPORTED, dan jalankan dpkg-reconfigure locales(lihat juga /etc/locale.gen).
Stephen Kitt