Làm thế nào tôi có thể tùy chỉnh một ngôn ngữ hệ thống?


24

Tại Hệ thống Quản trị Hỗ trợ ngôn ngữ Văn bản. Tôi chỉ có thể chọn địa phương tiêu chuẩn, nhưng tôi muốn điều chỉnh. Ví dụ: trong Windows tôi có thể tùy chỉnh các thứ như định dạng ngày và giờ, đơn vị đo, dấu tách thập phân, tiền tệ, v.v ... bằng tay - làm cách nào tôi có thể làm điều này trong Ubuntu?

Câu trả lời:


28

Câu trả lời này sẽ trình bày cách tùy chỉnh hoàn toàn một miền, tùy ý sử dụng miền địa phương hiện tại làm cơ sở. Loại ngôn ngữ sẽ được sử dụng trong câu trả lời này là i18nloại; loại ngôn ngữ như vậy sẽ được ngụ ý trong mỗi lần đề cập đến từ "miền địa phương" trong phần thân của câu trả lời.

Tìm một hướng dẫn

Điều đầu tiên bạn cần tùy chỉnh một miền, là tìm hiểu định dạng của miền địa phương. Trình chỉnh sửa ngôn ngữ web này có một mô tả toàn diện về mọi lĩnh vực trong một miền địa phương, mặc dù không ai có thể sử dụng được theo cách ngay lập tức. Đây sẽ là hướng dẫn sử dụng.

Công cụ cần thiết

Các công cụ duy nhất bạn cần để làm việc với các địa phương là

  1. Một trình soạn thảo văn bản. Bất cứ điều gì sẽ làm, mặc dù VIM sẽ xuất sắc.
  2. Một trình chuyển đổi văn bản thành unicode. Nó sẽ được mong đợi nhất là bạn không có, vì vậy tôi sẽ cung cấp cho bạn một cái đơn giản. Đọc tiểu mục tiếp theo để có được nó.

Tôi khuyên bạn nên tạo một thư mục và lưu mọi thứ liên quan đến công việc bạn sẽ làm trên ngôn ngữ đó.

Trình chuyển đổi văn bản thành unicode (encodestr)

LƯU Ý: nếu bạn đang sử dụng các ký tự không phổ biến, bạn có thể gặp vấn đề với tập lệnh tôi viết bên dưới; bạn có thể muốn xem các tập lệnh thay thế được liên kết bởi nass .

Lưu mã sau vào một tập tin. Tập tin này sẽ được hệ thống của bạn xác định là tập lệnh python, không sao vì nó là tập lệnh. Hướng dẫn này giả định bạn đã gọi kịch bản encodestr.

#!/usr/bin/python

def encode(string):
    newstring = str()
    for ch in string:
        newstring += "<U%04X>" % ord(ch)
    return newstring

if __name__ == '__main__':
    import sys
    print encode(sys.argv[1])

Sau khi bạn đã lưu nó, hãy cho phép thực thi tập tin - điều này sẽ có ích. Bạn có thể làm điều đó bằng cách sử dụng nautilus hoặc bằng cách chạy từ một thiết bị đầu cuối lệnh sau, trên thư mục mà bạn đã lưu tập lệnh : chmod +x encodestr.

Bây giờ bạn có thể kiểm tra tập lệnh này bằng cách chạy trên cùng một thư mục : ./encodestr hello. Bạn sẽ nhận được một đầu ra bằng <U0068><U0065><U006C><U006C><U006F>.

Sửa đổi một miền địa phương hiện có

Sửa đổi một miền địa phương hiện tại là trường hợp dễ nhất, vì lý tưởng nhất là bạn sẽ chọn một miền phù hợp với nhu cầu của mình gần như hoàn toàn, trong trường hợp đó bạn chỉ cần thực hiện các sửa đổi nhỏ. Để điều chỉnh nó, bạn có thể sử dụng hướng dẫn để biết phần nào là phần bạn muốn thay đổi và cách bạn có thể thay đổi chúng. Tất cả các địa điểm được cài đặt nằm trong /usr/share/i18n/locales, tuy nhiên hướng dẫn chứa khá nhiều địa điểm từng được tạo.

Tuy nhiên, điều đầu tiên bạn sẽ nhận thấy khi bạn mở một miền địa phương là bạn sẽ đọc các từ tiếng Anh nhiều như <UXXXX>các mã lạ . Bạn sẽ cần có khả năng tạo các mã này - đây là nơi encodestrtập lệnh xuất hiện.

Khi bạn biết phần nào bạn phải thay đổi, bạn cần biết từng trường có trong phần đó.

Ví dụ: LC_TIMEphần chứa trường t_fmtvà nhiều phần khác. Mỗi lĩnh vực có mô tả riêng về hướng dẫn .

Bây giờ bạn đã biết trường nào cần sửa đổi, hãy sử dụng lại hướng dẫn để tìm ra giá trị nào mà trường chấp nhận.

Ví dụ, trường t_fmtchấp nhận văn bản và các biến strfmt phổ biến .

Chỉ khi bạn biết phải viết gì trên các trường bạn muốn sửa đổi, hãy chạy văn bản thông qua encodestrtập lệnh để có được mã hóa tương đương.

LƯU Ý: Không phải mọi trường đều cần được mã hóa, hãy sử dụng ngôn ngữ hiện có làm tài liệu tham khảo nếu cần.

Ví dụ: nếu bạn muốn có định dạng thời gian Time: %Ttrong t_fmttrường, hãy chạy ./encodestr "Time: %T"; điều này sẽ trở lại <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>và do đó bạn sẽ có dòng t_fmt <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>trong miền địa phương của bạn (tất nhiên trong phần tương ứng của nó).

Sau khi bạn đã sửa đổi mọi trường bạn muốn, bạn sẽ cần tiến hành cài đặt miền địa phương vào hệ thống, để nó có thể được sử dụng. Tiến hành phần cài đặt cho việc này.

Tạo một miền địa phương từ đầu

Trái ngược với sửa đổi một phương pháp, phương pháp khác bạn có thể sử dụng để tạo ngôn ngữ tùy chỉnh của mình là làm việc từ đầu. Điều này không khó lắm nếu - một lần nữa - bạn sử dụng hướng dẫn . Đây là một mẹo hữu ích: bạn có thể sao chép các phần từ các địa phương khác mà không cần các phương pháp sao chép và dán thực tế . Bạn chỉ cần làm theo định dạng này:

LC_SECTION
copy "locale"
END LC_SECTION

Trong trường hợp LC_SECTIONlà phần bạn muốn thay đổi, và localelà địa mà bạn muốn sao chép rằng đoạn từ.

Ví dụ: nếu bạn muốn sao chép định dạng thời gian trong ngôn ngữ tiếng Anh, bạn sẽ có văn bản này tệp địa phương tùy chỉnh của bạn:

LC_TIME
copy "en_GB"
END LC_TIME

Và điều đó giúp bạn tiết kiệm rất nhiều công việc và đảm bảo rằng mọi thay đổi được thực hiện đối với ngôn ngữ được tham chiếu sẽ được nhân đôi cho bạn.

Cài đặt ngôn ngữ tùy chỉnh của bạn

Các bước tôi sẽ trình bày dưới đây có thể không tối ưu, nhưng hiệu quả.

  1. Biên dịch ngôn ngữ của bạn. Đừng hoảng sợ! Điều này không mất thời gian. Chỉ cần chạy lệnh sudo localedef -i custom -f UTF-8 custom.UTF-8 -c -vnơi customtên của miền địa phương của bạn.

  2. Sao chép ngôn ngữ của bạn vào /usr/share/i18n/locales/thư mục. Bạn chắc chắn sẽ cần sudo privateiledges để làm điều này và bạn có thể làm điều đó với lệnh sudo cp locale /usr/share/i18n/locales/nơi localetên tệp của miền địa phương tùy chỉnh của bạn.

  3. Chỉ định miền địa phương của bạn trong /var/lib/locales/supported.d/. Ví dụ: tạo một tên tệp /var/lib/locales/supported.d/asdvà thêm dòng custom UTF-8, trong đó tùy chỉnh là tên miền địa phương của bạn.

  4. Chạy lệnh ma thuật. Tôi thực sự không biết chính xác lệnh này làm gì, nhưng nó rất quan trọng. Chạy đi sudo locale-gen. Rất có thể nó tạo ra các tham chiếu đến các địa điểm có sẵn khi cần thiết.

  5. Nói cho hệ thống của bạn sử dụng miền địa phương. Nếu bạn muốn ngôn ngữ được sử dụng theo cách toàn hệ thống, hãy sửa đổi /etc/environmenttệp. Nếu không, bạn có thể sửa đổi ~/.profiletệp của mình hoặc bất kỳ tệp nào có nguồn gốc khi khởi động. Nếu bạn không biết điều sau có nghĩa là đừng lo lắng, chỉ cần sử dụng ~/.profiletệp. Để biết những gì bạn phải viết trong đó, trước tiên hãy chạy localelệnh. Cần ban hành một danh sách với các mục như LANGUAGE, LC_MESSAGES, LC_CTYPEvà nhiều người khác. Bạn sẽ viết, cho mỗi phần bạn muốn (được liệt kê bởi các lệnh trước đó), trên dòng riêng biệt, điều này SECTION="locale"đâu SECTIONlà phần và localetên của miền địa phương tùy chỉnh của bạn.

Ví dụ: nếu bạn muốn sử dụng định dạng thời gian từ Hà Lan, nhưng ngôn ngữ tiếng Anh, hãy viết:

LANGUAGE="en_GB:en"
LC_TIME="nl_NL"

Chú ý: Nếu bạn muốn sử dụng một ngôn ngữ cho mỗi thiết lập miền địa phương, ghi LC_ALL="locale"nơi localelà tên của miền địa phương tùy chỉnh của bạn. Nếu bạn muốn sử dụng ngôn ngữ cho tất cả mọi thứ trừ ngôn ngữ, bạn có thể viết LANG="locale"và (trên một dòng khác, tất nhiên) LANGUAGE="locale":XX, nơi XXcó mã 2 chữ cái cho ngôn ngữ bạn muốn.

Ví dụ: nếu bạn muốn sử dụng ngôn ngữ Hà Lan và tiếng Anh, bạn có thể sử dụng:

LANG="nl_NL"
LANGUAGE="nl_NL:en"

Bạn đã hoàn thành

Lần sau khi bạn đăng nhập, ngôn ngữ của bạn sẽ được sử dụng. Bạn có thể kiểm tra điều này bằng cách chạy lại localelệnh.

Hãy bình luận về sự không nhất quán hoặc tuyên bố sai trong hướng dẫn này!


Xin chào, Mã python bạn sử dụng, không hoạt động cho tất cả các trường hợp. Đối với ký tự Hy Lạp πμ, nó xuất ra <U00CF><U0080><U00CE><U00BC>, thay vì các ký tự dự kiến <U03C0><U03BC>. Đây là một liên kết hoạt động.
NASS

Cảm ơn vì đầu vào của bạn! Tôi đã bao gồm nhận xét của bạn trong văn bản khi đến hạn :)
Severo Raz

Tôi đã phải thêm custom UTF-8vào /usr/share/i18n/SUPPORTEDtrước khi tôi có thể chạy sudo locale-gen. Nếu không, nó sẽ không có trong danh sách.
Wilbert

Sao chép phương thức chuyển đổi chuỗi của bạn vào bộ sưu tập tập lệnh shell của tôi: github.com/budhajeewa/shell-scripts/commit/ ,. Cảm ơn bạn!
budhajeewa

Nếu bất cứ ai đang tìm kiếm một hàm để thực hiện ngược lại phương thức trong câu trả lời này (tôi cần nó để đọc các giá trị hex hiện có trong các tệp cục bộ.), Tôi đã viết một tập lệnh PHP cho điều đó. github.com/budhajeewa/shell-scripts/commit/ ,. Nếu ai đó có thể viết nó bằng Python, hãy cho tôi biết. Tôi muốn thêm nó vào bộ sưu tập của tôi.
budhajeewa

8

Không chắc chắn loại tùy chỉnh bạn muốn, nhưng bạn có thể đặt một số biến cục bộ bằng cách sử dụng của bạn ~/.locale. Ví dụ: để nhận tin nhắn tiếng Anh nhưng giờ Đức và lượt thích tôi sử dụng

export LC_ALL=""
export LANG="en_GB.utf8"
export LC_CTYPE="de_DE.utf8"
export LC_NUMERIC="de_DE.utf8"
export LC_TIME="de_DE.utf8"
export LC_COLLATE="de_DE.utf8"
export LC_MONETARY="de_DE.utf8"
export LC_MESSAGES="en_GB.utf8"
export LC_PAPER="de_DE.utf8"
export LC_NAME="en_GB.utf8"
export LC_ADDRESS="de_DE.utf8"
export LC_TELEPHONE="de_DE.utf8"
export LC_MEASUREMENT="de_DE.utf8"
export LC_IDENTIFICATION="de_DE.utf8"

Tạo địa phương tùy chỉnh cũng có thể. Xem ví dụ hướng dẫn này cho ngày.


1
Không, tôi muốn tùy chỉnh cấp thấp hơn. Ví dụ: tin nhắn tiếng Anh, đơn vị số liệu, ngày / giờ tiếng Séc đã sửa đổi (DD.MM.YYYY HH: mm thay vì DMYYYY H.MM), dấu chấm dưới dạng dấu tách thập phân (có dấu phẩy cho ngôn ngữ này trong tiếng địa phương Séc) và € là tiền tệ (có tiền Kč tại địa phương Séc).
Ivan

Tôi hiểu rồi. Lấy en_UScho LC_NUMERICde_DEcho LC_MONETARYLC_MEASUREMENTmang đến cho bạn những tác dụng phụ khác? Xem thêm liên kết mới để tạo một miền địa phương cá nhân.
Carsten Thiel

1
các hướng dẫn đằng sau Liên kết dường như trả lời câu hỏi tuyệt vời, có lẽ bạn có thể sao chép các bit quan trọng nhất ở đây, trong trường hợp liên kết không thể truy cập vào một ngày nào đó?
Stefano Palazzo
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.