Tính năngPluginGiáTài nguyên
Thay đổi ngôn ngữ
Tài nguyênCách biên dịch tệp .po sang .mo (4 phương pháp)

Cách biên dịch tệp .po sang .mo (4 phương pháp)

SimplePoTranslate Team3 tháng 5, 2026
Cách biên dịch tệp .po sang .mo (4 phương pháp)

Bạn đã dành cả buổi chiều để hoàn thiện bản dịch tiếng Đức. Mọi chuỗi trong tệp de_DE.po của bạn đều được đọc một cách đẹp đẽ, các placeholder còn nguyên vẹn, các dạng số nhiều đều chính xác. Bạn tải nó lên trang web của mình, chuyển ngôn ngữ sang tiếng Đức, và... không có gì. Trang vẫn bằng tiếng Anh. Bạn kiểm tra lại tên tệp, thư mục, text domain. Mọi thứ đều có vẻ đúng. Vậy tại sao WordPress không hiển thị bản dịch của bạn?

Chín trong mười lần câu trả lời đều giống nhau: bạn đã chỉnh sửa tệp .po nhưng chưa bao giờ biên dịch nó sang .mo. WordPress không đọc các tệp .po khi chạy – nó tải tệp nhị phân đã biên dịch .mo. Nếu bạn muốn các bản dịch của mình thực sự xuất hiện, bạn cần biên dịch po sang mo mỗi khi bạn thay đổi văn bản. Tệp .po là nguồn có thể chỉnh sửa của bạn; tệp .mo là những gì trang web hiển thị.

Hướng dẫn này giải thích lý do tại sao bước biên dịch đó tồn tại và sau đó trình bày bốn cách đáng tin cậy để thực hiện: WP-CLI, lệnh msgfmt cổ điển, Poedit và một công cụ đám mây tự động tạo ra tệp .mo cho bạn. Chúng tôi cũng sẽ đề cập đến cạm bẫy phổ biến nhất – quên biên dịch lại – và định dạng .l10n.php mới hơn mà WordPress hiện ưu tiên để tăng tốc độ.

Tại sao WordPress tải .mo mà không phải .po?

WordPress tải các tệp .mo vì chúng là các tệp nhị phân đã biên dịch được tối ưu hóa để tra cứu nhanh, trong khi các tệp .po là văn bản thuần túy được tạo ra để con người đọc và chỉnh sửa. Phân tích cú pháp văn bản trên mỗi lần tải trang sẽ chậm; đọc một bảng băm nhị phân được xây dựng sẵn gần như tức thì.

Một tệp .po dựa trên dòng và thân thiện với con người. Mỗi mục ghép nối một msgid nguồn với một msgstr đã dịch, cùng với các nhận xét ghi chú nguồn gốc của chuỗi. Điều đó rất tốt cho việc chỉnh sửa nhưng lại tệ cho hiệu suất – máy chủ sẽ phải phân tích lại toàn bộ tệp văn bản trên mỗi yêu cầu.

#: includes/cart.php:88
msgid "Your cart is empty"
msgstr "Ihr Warenkorb ist leer"

Một tệp .mo đóng gói cùng các cặp chuỗi đó vào một định dạng nhị phân với một bảng tra cứu nội bộ, vì vậy WordPress có thể chuyển thẳng đến một bản dịch mà không cần quét văn bản. Đánh đổi là tệp .mo không thể đọc được đối với con người và phải được tạo lại bất cứ khi nào tệp .po thay đổi. Nếu sự khác biệt giữa .po.mo vẫn còn mơ hồ, bài giải thích của chúng tôi về các tệp .po, .mo và .pot sẽ phân tích từng định dạng và cách chúng liên quan.

Bốn cách để biên dịch po sang mo

Không có một công cụ "đúng" duy nhất nào – lựa chọn tốt nhất phụ thuộc vào cách bạn làm việc. Dưới đây là bốn phương pháp đáng tin cậy, từ một lệnh một dòng đến một quy trình làm việc đám mây hoàn toàn tự động. Cả bốn đều tạo ra tệp nhị phân .mo giống hệt mà WordPress tải khi chạy.

Phương pháp 1: WP-CLI

Cách tiếp cận hiện đại và gọn gàng nhất là WP-CLI, có thể biên dịch toàn bộ thư mục các tệp .po chỉ bằng một lệnh. Nếu bạn đã quản lý WordPress từ dòng lệnh, điều này sẽ phù hợp tự nhiên với quy trình làm việc của bạn.

# Compile every .po file in the languages folder to .mo
wp i18n make-mo languages/

# Compile into a specific destination directory
wp i18n make-mo languages/ build/languages/

Lệnh make-mo quét thư mục mục tiêu, biên dịch từng tệp .po mà nó tìm thấy và ghi một tệp .mo tương ứng bên cạnh (hoặc vào đích bạn chỉ định). Nó xử lý các lô một cách mượt mà, điều này làm cho nó lý tưởng khi bạn duy trì nhiều ngôn ngữ cùng một lúc. Đây là công cụ được khuyến nghị cho bất kỳ dự án nào đã sử dụng WP-CLI.

Phương pháp 2: msgfmt

Tiện ích Gettext gốc cho công việc này là msgfmt, một phần của gói GNU gettext. Nó biên dịch một tệp .po duy nhất thành một tệp .mo duy nhất và có sẵn trên hầu hết mọi hệ thống Linux và macOS.

# Compile one file
msgfmt my-plugin-de_DE.po -o my-plugin-de_DE.mo

# Add statistics about translated, fuzzy, and untranslated strings
msgfmt --statistics my-plugin-de_DE.po -o my-plugin-de_DE.mo

# Install it first if missing
#   macOS:  brew install gettext
#   Debian: sudo apt-get install gettext

Cờ -o đặt tên cho tệp đầu ra. Cờ --statistics thực sự hữu ích – nó cho bạn biết có bao nhiêu chuỗi đã được dịch, mờ hoặc vẫn trống, vì vậy bạn có thể phát hiện một bản dịch chưa hoàn chỉnh trước khi xuất bản. Để viết script từng tệp một, msgfmt là lựa chọn đáng tin cậy, không cầu kỳ.

Bởi vì msgfmt là một công cụ dòng lệnh đơn giản, nó dễ dàng tích hợp vào tự động hóa. Bạn có thể bọc nó trong một vòng lặp shell để biên dịch toàn bộ thư mục, hoặc kết nối nó vào một pipeline CI để mỗi commit chạm vào tệp .po sẽ tự động tạo ra một tệp .mo mới. Một mẫu phổ biến là for f in languages/*.po; do msgfmt "$f" -o "${f%.po}.mo"; done, nó biên dịch mọi ngôn ngữ trong một lần chạy. Cờ --check bổ sung xác thực, báo lỗi các sự không khớp định dạng chuỗi giữa msgidmsgstr trước khi chúng đến sản xuất – một biện pháp bảo vệ rẻ tiền chống lại các lỗi placeholder bị hỏng làm hỏng bố cục đã dịch một cách thầm lặng.

Phương pháp 3: Poedit (Biên dịch khi lưu)

Nếu bạn chỉnh sửa bản dịch trong một trình soạn thảo đồ họa, Poedit sẽ tự động biên dịch cho bạn. Mỗi khi bạn lưu một tệp .po, Poedit sẽ ghi tệp .mo tương ứng ngay bên cạnh nó – không cần lệnh riêng, không cần bước bổ sung.

Đây là một lý do Poedit vẫn phổ biến với các dịch giả không quen thuộc với dòng lệnh. Bạn mở tệp .po, nhập bản dịch của mình, nhấn lưu và cả hai tệp đều được cập nhật cùng nhau. Bạn có thể xác nhận hành vi này trong tùy chọn của Poedit, nơi tính năng biên dịch .mo tự động khi lưu được bật theo mặc định. Poedit và các công cụ máy tính để bàn tương tự được đánh giá trong 5 công cụ miễn phí hàng đầu để chỉnh sửa và dịch các tệp PO trên Mac và Windows.

Điểm hạn chế của trình chỉnh sửa trên máy tính để bàn là việc biên dịch chỉ xảy ra khi một người mở tệp và lưu nó. Điều đó ổn cho một dự án một người, nhưng nó không thể mở rộng cho hàng chục ngôn ngữ hoặc một nhóm trao đổi tệp. Nếu ai đó chỉnh sửa tệp .po trong một công cụ khác và sao chép nó vào kho lưu trữ mà không mở Poedit, tệp .mo sẽ không bao giờ được cập nhật. Đối với các dự án lớn hơn hoặc có sự cộng tác, một phương pháp tự động – dòng lệnh hoặc đám mây – sẽ loại bỏ sự phụ thuộc vào việc nhớ nhấn lưu.

Phương pháp 4: Một công cụ đám mây tự động tạo .mo cho bạn

Lựa chọn thứ tư loại bỏ hoàn toàn bước biên dịch: sử dụng một dịch vụ đám mây trả về tệp .mo đã biên dịch cùng với tệp .po đã dịch. Bạn không bao giờ chạy lệnh hoặc lưu tệp hai lần – bạn tải lên, và các tệp đã hoàn thành, được đặt tên chính xác sẽ được trả về.

SimplePoTranslate hoạt động chính xác theo cách này. Bạn tải lên một tệp .po hoặc .pot, nó dịch các chuỗi bằng Context-Aware AI, và nó trả về một tệp ZIP duy nhất chứa cả .po.mo được tạo song song – đã được biên dịch, đã được đặt tên để khớp với text domain và ngôn ngữ của bạn. Không có bước biên dịch riêng biệt và không có khả năng quên một tệp nào.

Nó cũng xử lý các chi tiết gây lỗi cho các quy trình làm việc thủ công. Syntax Locking đóng băng các placeholder như %s, %1$s, và {name} cùng với các thẻ HTML trước khi dịch, để các biến của bạn tồn tại trong tệp .mo nguyên vẹn. Hỗ trợ đầy đủ Gettext plural có nghĩa là các dạng số nhiều phức tạp cũng được biên dịch chính xác – một chủ đề đáng tìm hiểu sâu, mà chúng tôi đề cập trong bài viết hiểu các dạng số nhiều trong Gettext. Và bởi vì nó chạy trên đám mây, không có plugin nào để cài đặt và không có công cụ xây dựng nào để duy trì.

Cạm bẫy phổ biến nhất: Bạn quên biên dịch lại

Lý do lớn nhất khiến bản dịch không xuất hiện là chỉnh sửa tệp .po nhưng quên biên dịch lại tệp .mo. WordPress tiếp tục tải tệp nhị phân cũ, vì vậy bản dịch mới của bạn không bao giờ hiển thị – và không có thông báo lỗi nào cho bạn biết lý do.

Mô hình tinh thần cần ghi nhớ: tệp .po là bản nháp của bạn, tệp .mo là những gì được phát hành. Bất kỳ thay đổi nào đối với tệp .po đều vô hình đối với WordPress cho đến khi bạn tạo lại tệp .mo. Hãy biến việc biên dịch lại thành một phản xạ sau mỗi lần chỉnh sửa, hoặc sử dụng một công cụ tự động biên dịch để không bao giờ bỏ qua bước này.

Cạm bẫy này đặc biệt khó nhận biết trong quá trình chuyển giao từ môi trường staging sang production. Một nhà phát triển chỉnh sửa và biên dịch lại cục bộ, thấy bản dịch hoạt động, sau đó chỉ triển khai tệp .po và quên tệp .mo – vì vậy môi trường production vẫn giữ văn bản cũ một cách thầm lặng. Bất cứ khi nào bạn di chuyển các tệp dịch giữa các môi trường, hãy di chuyển tệp .po và tệp .mo đã biên dịch mới cùng nhau, hoặc biên dịch như một phần của bước triển khai để tệp nhị phân luôn được xây dựng lại từ nguồn hiện tại.

Nếu các bản dịch của bạn vẫn không xuất hiện sau khi biên dịch lại, vấn đề thường là do sự không khớp tên, một thư mục sai hoặc một lớp bộ nhớ đệm giữ tệp cũ. Danh sách kiểm tra đầy đủ có trong bài viết tại sao bản dịch của bạn không hiển thị trong WordPress.

Một lưu ý về định dạng .l10n.php mới hơn

Các phiên bản WordPress gần đây đã giới thiệu một định dạng runtime thứ ba: .l10n.php. Thay vì một tệp .mo nhị phân, các bản dịch được lưu trữ dưới dạng một mảng PHP thuần túy mà bộ đệm opcode PHP có thể giữ trong bộ nhớ, giúp việc tra cứu thậm chí còn nhanh hơn .mo trên các trang web bận rộn.

<?php
return [
	'domain'  => 'my-plugin',
	'messages' => [ 'Your cart is empty' => 'Ihr Warenkorb ist leer' ],
];

WordPress tự động tạo các tệp .l10n.php khi có tệp .mo tương ứng, vì vậy bạn không cần phải tự xây dựng chúng. Hiện tại, việc biên dịch một tệp .mo chính xác vẫn là nền tảng – định dạng hiệu suất được bắt nguồn từ nó.

Tổng kết

Để biên dịch po sang mo một cách đáng tin cậy, hãy chọn phương pháp phù hợp với cách bạn làm việc: WP-CLI cho các lô dòng lệnh, msgfmt cho các tệp đơn lẻ có thống kê, Poedit để tự động biên dịch khi lưu, hoặc một công cụ đám mây xây dựng tệp .mo cho bạn để bước này không bao giờ bị bỏ qua. Cả bốn đều tạo ra cùng một tệp nhị phân mà WordPress cần khi chạy.

Dù bạn chọn con đường nào, hãy nhớ quy tắc vàng: chỉnh sửa tệp .po, sau đó biên dịch sang .mo – mỗi lần. Thói quen đó ngăn chặn lỗi dịch khó chịu nhất trong WordPress, lỗi mà mọi thứ có vẻ đúng nhưng trang web vẫn cố chấp hiển thị bằng tiếng Anh.

Sẵn sàng bỏ qua bước biên dịch thủ công mãi mãi? Hãy dùng thử SimplePoTranslate miễn phí — không yêu cầu thẻ tín dụng. Tải lên tệp .po của bạn và tải xuống gói .po + .mo sẵn sàng triển khai trên gói miễn phí chỉ trong vài phút.