Thay đổi định nghĩa miền địa phương (trái ngược với cài đặt ngôn ngữ)


8

Nhận xét sơ bộ : Câu hỏi này là không về thiết lập một miền địa phương bằng cách thay đổi LC_ALL, LC_TIME, LANG, vv, nó là khá về việc thay đổi một miền địa phương định nghĩa , ví dụ như trong /usr/share/i18n/locales/de_DE, hoặc tương ứng, để có được gợi ý về các lựa chọn thích hợp hơn thay đổi những thiết lập hệ thống.

Các ý định là để có được cơ quan đại diện thời gian ISO %Y-%m-%d%H:%M:%Skhông có tác dụng phụ không mong muốn.

Các đề xuất mà tôi tìm thấy trên mạng vẫn chưa phù hợp (ví dụ: đặt ngôn ngữ thành "Đan Mạch" sẽ không duy trì tên ngày chính tả của ngôn ngữ bản địa).

Bây giờ lựa chọn duy nhất tôi hiện đang thấy để có được hành vi mong muốn là thay đổi định nghĩa về địa phương bản địa của tôi /usr/share/i18n/locales/de_DE. Đây không phải là một giải pháp hoàn hảo vì với các bản cập nhật hệ thống, các tệp đã thay đổi có thể bị ghi đè lại.

Câu hỏi của tôi là:

  1. Có bất kỳ tùy chọn liên quan đến miền địa phương tốt hơn để có được chức năng mong muốn hơn là thay đổi tệp ngôn ngữ hệ thống cụ thể không?
  2. Có bất kỳ vấn đề nào để mong đợi khi thay đổi một tệp định nghĩa miền địa phương cụ thể không? (Và làm thế nào có thể ngăn chặn được rằng tập tin này bị ghi đè trong trường hợp cập nhật hệ thống?)
  3. Sẽ tốt hơn nếu xác định một biến thể cụ thể mới của tệp ngôn ngữ hiện có và sử dụng biến thể đó trong LC_*cài đặt? (Và làm thế nào để tập tin / định nghĩa mới được hệ thống biết chính xác?)
  4. Bất cứ một đề nghị nào khác?

Tôi khuyên bạn nên sao chép tệp ngôn ngữ mà bạn quan tâm, đặt cho bản sao đó một tên duy nhất (ví dụ: en_XX- Tôi không biết những hạn chế ở đây là gì, bản dùng thử và lỗi có thể đủ), thực hiện bất kỳ thay đổi nào bạn muốn và sử dụng nó như là miền địa phương. Bạn sẽ phải tạo lại danh sách hoặc bất cứ điều gì sau đó, v.v.
goldilocks

1
Bạn có thể muốn đọc câu hỏi của tôi , trong đó có chi tiết về những gì tôi đã làm. Tôi vẫn chưa gói nó lên, nhưng bây giờ nó hoạt động khá độc đáo. Đơn giản chỉ cần cài đặt LC_TIME(trong /etc/environmenthoặc /etc/default/localehoặc /etc/locale.conftùy thuộc vào distro) là bản địa sửa đổi (tôi gọi tôi isodate.UTF-8) và các định dạng tương ứng sẽ được chọn từ đó locale tùy biến cho chỉ có thời gian / ngày. Đây là cách tôi tùy chỉnh en_UScài đặt khác của mình để hiển thị ngày / giờ ISO.
0xC0000022L

1
@Janis: trên Debian và Ubuntu, bạn cũng sẽ muốn đặt tên miền địa phương của mình vào /var/lib/locales/supported.d/local(hoặc một trong các tệp khác trong đó) và chạy dpkg-reconfigure localesdưới dạng siêu người dùng cho định nghĩa miền địa phương sẽ được biên dịch. Và đúng vậy, thiết lậpLC_TIME để trỏ đến một miền địa phương tùy chỉnh dường như là phương pháp ít xâm phạm nhất trong tất cả những gì tôi thấy cho đến nay. Đó là lý do tại sao hệ thống của bạn có cài đặt toàn cầu, nơi LC_TIMEcó thể được đặt khác với "ngôn ngữ chung".
0xC0000022L

@ 0xC0000022L; Kinh nghiệm của bạn ở đây rất có giá trị. Với các đề xuất cho đến nay tôi sẽ đi tìm một tệp ngôn ngữ mới. Tôi vẫn chưa quyết định liệu tôi nên sử dụng copyphương pháp tiếp cận trên các phần hay giữ các phần khác dự phòng (để tôi có thể diffchống lại tệp gốc).
Janis

Câu trả lời:


5

Trong một câu hỏi gần đây tôi đã hỏi những gì thực hành tốt nhất cho loại thay đổi này. Không có câu trả lời nào. Tuy nhiên, tôi có thể cung cấp cho bạn công thức tôi đang sử dụng, đã được chứng minh là hoạt động tốt. Tất cả các chương trình chọn ngày lên chính xác.

Mô tả của tôi là dành cho Ubuntu, nhưng có thể sẽ hoạt động trên Debian và Mint.

Chuẩn bị

Sao chép ngôn ngữ bạn muốn tùy chỉnh từ /usr/share/i18n/localesmột tệp mới. Ví dụ

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

Điều chỉnh tất cả ngoại trừ các LC_TIMEphần để:

copy "de_DE"

Điều chỉnh LC_TIMEphần để phù hợp với kết quả mong muốn của bạn. Bạn có thể sử dụng các cài đặt từ câu hỏi được liên kết ở trên của tôi làm mẫu. Có vẻ như đây là khá nhiều chính xác những gì bạn muốn.

Nếu ngôn ngữ của bạn không sử dụng ký hiệu "AM / PM", hãy đặt chúng thành trống:

t_fmt_ampm ""
am_pm   "";""

Làm cho nó được biết đến với hệ thống

Chỉnh sửa tệp /var/lib/locales/supported.d/localvà thêm thông tin về định nghĩa ngôn ngữ của bạn ở đó. Tức là thêm một dòng như thế này nếu tên tệp của bạn ở trên là isodate, điều chỉnh khác:

de_DE.UTF-8@isodate UTF-8

Nếu /var/lib/locales/supported.d/localkhông tồn tại, tạo một tệp có tên đó. Đừng đặt các thay đổi của bạn vào tệp enhoặc detệp tương ứng trong thư mục đó, vì chúng có thể bị ghi đè ngay khi các gói language-pack-*-baselanguage-pack-*hệ thống của bạn nhận được bản cập nhật.

Bây giờ chạy dpkg-reconfigure locales:

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

Trong trường hợp của bạn, điều này sẽ chỉ ra rằng de_DE.UTF-8@isodatemiền địa phương đã được tạo (giả sử bạn không có vấn đề về cú pháp).

Cuối cùng nhưng không kém phần quan trọng, thêm vào như sau /etc/default/locale:

LC_TIME="de_DE.UTF-8@isodate"

Điều này sẽ đảm bảo rằng chỉ LC_TIME ghi đè ngôn ngữ mặc định được xác định bằng cách sử dụng LANG.

Đăng nhập lại và bạn sẽ có thể thấy ngày / giờ ISO mới khi sử dụng datehoặc các công cụ khác sử dụng chức năng thời gian chạy libc tương ứng.


Mục đích ở đây là thực hiện thay đổi ít xâm phạm nhất trong khi cũng không hoạt động chống lại hệ thống (ví dụ như chống lại người quản lý gói và bạn bè). Tất nhiên bạn cũng có thể chỉ cần tạo một bản sao ngôn ngữ của mình, cài đặt nó theo cách tương tự như đã nêu ở trên và sau đó điều chỉnh LANG. Vấn đề là, miễn là bạn không muốn có nguy cơ thay đổi bị ghi đè bởi bản cập nhật gói, bạn phải sử dụng một bản sao tùy chỉnh (bất kỳ tùy chỉnh nào bạn thực hiện; tức là copyhoặc đơn giản là giữ các phần khi chúng ở trong đó bản gốc). Và cho dù bạn thay đổi LANGđể trỏ đến định nghĩa miền địa phương tùy chỉnh đầy đủ - hoặc cho dù bạn thêm LC_TIME chỉ trỏ đến phần tùy chỉnh có liên quan cùng tên của tệp định nghĩa ngôn ngữ tùy chỉnh - bạn sẽ không phải điều chỉnh một trong các cài đặt chung.


3
Là một cách thực hành tốt nhất, bạn sẽ có hậu tố địa phương của bạn với @s Something như thế en_US.UTF-8@isodate.
Stéphane Chazelas

@ StéphaneChazelas: Hah! Tuyệt vời. Tuy nhiên, sau đó bạn có thể không copynhững LC_IDENTIFICATIONvà làm thế nào sẽ ảnh hưởng đến việc đặt tên của các tập tin và làm thế nào bạn tham khảo các địa phương trong /etc/default/locale/var/lib/locales/supported.d/localtương ứng? Bạn có thể nói?
0xC0000022L

1
Bạn sẽ tạo một en_US@isodatetệp định nghĩa và sử dụng localedefđể tạo các tệp chính xác; xem sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README để biết chi tiết (và sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ ... cho một ví dụ).
Stephen Kitt

1
Có, trong mọi trường hợp, bạn muốn thay đổi phần LC_IDENTIFICATION (en_US @ isodate) vì đó là một ngôn ngữ khác, Lệnh kết thúc sẽ là localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate, tôi không chắc về cấu hình dành riêng cho Debian, nhận xét của tôi chủ yếu là về cách để đặt tên cho miền địa phương.
Stéphane Chazelas

1
Theo tôi hiểu, trên Debian, bạn thêm định nghĩa miền địa phương vào /usr/local/share/i18n/locales, thêm các cặp miền địa phương / charmap được hỗ trợ /usr/local/share/i18n/SUPPORTEDvà chạy dpkg-reconfigure locales(xem thêm /etc/locale.gen).
Stephen Kitt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.