Sự khác nhau giữa tệp lưu trữ cục bộ và tệp Đối tượng máy trong thư mục / usr / share / locale / <locale_dir> / LC_MESSAGES /?


8

Theo tôi hiểu, locale-gentiện ích tạo /usr/lib/locale/locale-archivecơ sở dữ liệu dựa trên các mục trong /etc/locale.gentệp và tệp cấu hình / tệp cấu hình trong /usr/share/i18n/locales/. Ngoài ra, các tiện ích lưu trữ các tệp dịch của chúng ở định dạng Machine Object trong /usr/share/locale/<locale_dir>/LC_MESSAGES/thư mục. Ví dụ:

# dpkg -L wget | grep nl
/usr/share/locale/nl
/usr/share/locale/nl/LC_MESSAGES
/usr/share/locale/nl/LC_MESSAGES/wget.mo
#

Khi tôi thực hiện ví dụ strace -e open wget, sau đó tôi có thể thấy rằng cả hai /usr/lib/locale/locale-archive/usr/share/locale/nl/LC_MESSAGES/wget.mocác tệp được mở.

Dữ liệu bản địa hóa nào được lưu trữ trong các tệp trong /usr/share/locale/<locale_dir>/LC_MESSAGES/thư mục và dữ liệu bản địa hóa nào được lưu trữ trong /usr/lib/locale/locale-archive?

Câu trả lời:


3

Mặc dù gần như không biết gì về cách bản địa hóa được triển khai trong Linux, tôi đã cố gắng hết sức để tìm hiểu về nó.

Mô tả ngắn gọn

/ usr / lib / locale / locale-archive

locale-archivelà một tệp ánh xạ bộ nhớ được tạo bằng locale-gen(8)cách gọi localedef(1). Ánh xạ bộ nhớ có nghĩa là một khi nó được tạo và gọi bởi một chương trình, nó chỉ được tải một lần vào bộ nhớ.
Vì tất cả các bộ ngôn ngữ được xác định trong /etc/locale.genđược xác định trước và bản thân kho lưu trữ rất tĩnh, nên không cần thiết phải có nhiều lần trong bộ nhớ. Do đó, mỗi khi nó được gọi bởi một chương trình khác, quá trình sẽ được chỉ vào kho lưu trữ đã được tải trong bộ nhớ, do đó chỉ thêm vào bộ nhớ ảo của chương trình. Bằng cách này, không chỉ dấu chân bộ nhớ vật lý của quá trình được hạ xuống, mà còn mọi tòa nhà liên quan đến nội địa hóa đều được tăng tốc. (không cần thêm I / O đĩa!)

Ngoài ra, nó dường như hoạt động như một loại tệp cục bộ failback chứa tất cả các ngôn ngữ trên toàn hệ thống. Ngoài ra, kho lưu trữ được sử dụng rất nhiều bởi phần mềm được viết bằng glibc.


/usr/share/locale/$LOCALE_DIR/LC_MESSAGES/$PROGRAM.mo

Quốc tế hóa ( i18n, 18 chars between 'i' and 'n') phần mềm trong Linux có thể đạt được bằng cách sử dụng GNU-gettext.

  1. Khi một chương trình được viết, mọi câu lệnh in được điều chỉnh để sử dụng gettext()hàm GNU bao bọc chuỗi cần phải được in.
  2. Sau đó, xgettext(1)lặp lại qua nguồn, tạo .pot (Portable Object Template Files)trên đường đi của nó.
  3. Người dịch sau đó có thể sử dụng msginit(1)để phân tích nó thành .po (Portable Object)các tệp, thường đại diện cho một danh mục tin nhắn. Sau đó tất cả các chuỗi được dịch bằng tay.
  4. Sau đó, msgfmt(1)được sử dụng để biên dịch .potệp đã chỉnh sửa thành tệp nhị phân .mo (Message Object). Chúng có thể được vận chuyển cùng với gói phần mềm.

Khi cài đặt một gói trên một hệ thống, /usr/share/locale/<locale_dir>/LC_MESSAGES/sẽ được điền vào $PROGRAM.mocác tệp. Khi ví dụ như gọi wget, LANGbiến env của bạn sẽ trỏ wgetđến sử dụng cài đặt ngôn ngữ hiện tại của bạn, điều này dẫn đến việc wgetbao gồm các bản dịch được biên dịch sẵn qua con trỏ vào phần đọc .mo binary.

Chi tiết và nguồn bổ sung

Đối với kho lưu trữ cục bộ: Ánh

xạ bộ nhớ: Phương pháp danh sách gửi thư của CentOS
I18N Đóng gói: Tài liệu Fedora trên các phần tổng hợp lưu trữ miền địa phương khác nhau

Cũng xem xét các trang web cho locale(1), localedef(1)locale-gen(8).

Đối với .motệp:

Quá trình tạo .motệp: Wikipedia trên Gettext
GNU MO Định dạng tệp: giải thích và định dạng nhị phân

Cũng xem xét các trang web cho xgettext(1), msginit(1)msgfmt(1).

Ngoài ra hãy xem các biến ENV LC_MESSAGELOCPATH.


Tôi chắc chắn rằng điều này chỉ làm trầy xước bề mặt của chủ đề rộng lớn này. Tuy nhiên, tôi hy vọng điều này là đủ để bạn bắt đầu.

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.