2009-04-11 45 views
21

Tôi hiện đang viết một ứng dụng bằng Python và cần cung cấp bản địa hóa cho nó.Cách dễ nhất để tạo các tệp bản địa hóa

Tôi có thể sử dụng gettext và các tiện ích đi kèm với nó để tạo tệp .po và .mo. Nhưng chỉnh sửa các tệp .po cho từng ngôn ngữ, từng người một, có vẻ hơi tẻ nhạt. Sau đó, tạo thư mục cho từng ngôn ngữ và tạo các tệp .mo, từng cái một, có vẻ như quá mức cần thiết. Kết quả cuối cùng là một cái gì đó như:

/en_US/LC_MESSAGES/en_US.mo 
/en_CA/LC_MESSAGES/en_CA.mo 
etc. 

Tôi có thể sai, nhưng có vẻ như phải có cách tốt hơn để thực hiện việc này. Có ai có bất kỳ công cụ, thủ thuật hoặc kiến ​​thức chung mà tôi chưa tìm thấy?

Cảm ơn trước!

EDIT: Để rõ ràng hơn một chút, tôi đang tìm kiếm thứ gì đó giúp tăng tốc quá trình. vì nó đã khá dễ dàng. Ví dụ, trong .NET, tôi có thể tạo tất cả các chuỗi cần được dịch sang tệp excel. Sau đó, người dịch có thể điền vào tệp excel và thêm các cột cho mỗi ngôn ngữ. Sau đó, tôi có thể sử dụng xls2resx để tạo các tệp tài nguyên ngôn ngữ. Có điều gì giống như vậy cho gettext? Tôi nhận ra tôi có thể viết một kịch bản để tạo và đọc từ một csv và tạo ra các tập tin - Tôi chỉ hy vọng có một cái gì đó đã được thực hiện.

Trả lời

26

Tôi vừa mới làm điều này cho một dự án tôi đang làm việc trên, đối với chúng tôi quá trình này là như thế này:

Trước tiên, tôi có một tập tin POTFILES.in chứa một danh sách các file nguồn cần dịch. Chúng tôi thực sự có hai tệp (ví dụ: admin.in và user.in), vì giao diện quản trị không phải lúc nào cũng cần dịch. Vì vậy, chúng tôi chỉ có thể gửi người dịch chỉ tệp có chứa các chuỗi mà người dùng thấy.

Chạy lệnh sau sẽ tạo ra một mẫu .pot từ POTFILES.in:

xgettext --files-from=POTFILES.in --directory=.. --output=messages.pot 

Chạy lệnh trên từ po/thư mục, mà phải là một thư mục con của dự án của bạn và chứa POTFILES. trong tập tin. Tệp .pot có cùng định dạng giống như tệp .po, nhưng nó là một mẫu không chứa bản dịch. Bạn tạo một mẫu mới bất cứ khi nào các chuỗi dịch mới có thể được thêm vào các tệp nguồn của bạn.

Để cập nhật các tập tin đã được dịch .po và thêm chuỗi mới với họ, hãy chạy:

msgmerge --update --no-fuzzy-matching --backup=off da.po messages.pot 

Trong ví dụ trên để vô hiệu hóa kết hợp mờ, như dây đàn của chúng tôi là một mớ hỗn độn và nó đã làm hại nhiều hơn lợi . Tôi cũng vô hiệu hóa các tập tin sao lưu, như tất cả mọi thứ là trong lật đổ ở đây. Chạy lệnh trên cho mỗi ngôn ngữ, trong trường hợp này tôi cập nhật bản dịch danish.

Cuối cùng chạy msgfmt để tạo ra các tập tin .mo từ các tập tin .po:

msgfmt nl.po --output-file nl.mo 

Ofcourse, bạn sẽ không muốn chạy này bằng tay mỗi lần, vì vậy tạo ra một số kịch bản (hoặc tốt hơn là một hoặc nhiều Makefiles) để làm điều này cho bạn.

Lưu ý rằng bố cục thư mục của bạn hơi khác so với trường hợp của tôi, vì vậy bạn sẽ phải điều chỉnh tên tệp/đường dẫn đầu ra một chút, nhưng các bước phải giống nhau.

4

Nó giúp tôi hiểu cách bạn muốn đạt được bản dịch thực sự mà không cần chỉnh sửa tệp .po cho từng ngôn ngữ? Ma thuật?

Chỉnh sửa (sau khi bình luận) - làm thế nào để tự động hóa việc tạo ra các .po file:

tôi không sử dụng gettext, nhưng từ wiki page có vẻ như bạn chỉ cần gọi

msginit --locale = xx --input = name.pot

cho mọi ngôn ngữ bạn muốn hỗ trợ. Tôi sẽ tạo một tập lệnh tạo tất cả các tệp ngôn ngữ, cung cấp cho họ các dịch giả và khi bạn đưa chúng trở lại chạy msgfmt trên chúng.

+0

Rõ ràng, tôi muốn các tệp .po được chỉnh sửa, nhưng mở từng tệp một là một sự lãng phí thời gian đáng kinh ngạc. Không có cách nào để xác định TẤT CẢ các ngôn ngữ và bản dịch trong bảng tính hay gì đó, sau đó có tệp .po được tạo? – landyman

3

Sử dụng tập lệnh. Giả sử mã nguồn của bạn nằm trong thư mục $ SRC, do đó hãy tạo thư mục $ SRC/po cho các tệp i18n (nồi, po, mo, v.v.). Sau đó tạo tệp $ SRC/po/POTFILES.in trong đó chỉ định đường dẫn đến các tệp mã nguồn với các cuộc gọi hàm gettext. Nó có thể trông giống như:

[encoding: UTF-8] 
./main.cpp 
./plugins/list.cpp 

Bây giờ bạn có thể sử dụng các lệnh sau (bên trong thư mục $ SRC):

Để cập nhật tổng thể-file messages.pot:

intltool-update --pot --gettext-package=messages --verbose 

Đối với việc sáp nhập thay đổi từ messages.pot đến fr.tập tin po, ví dụ:

msgmerge -U fr.po messages.pot 

Để tạo mo lệnh sử dụng file:

msgmerge -o - fr.po messages.pot | msgfmt -c -o fr/LC_MESSAGES/programname.mo - 

Dĩ nhiên mục fr/LC_MESSAGES/phải được tạo ra trước khi cuộc gọi đó, bạn cũng có thể xóa fr/LC_MESSAGES hiện/programname.mo trước khi thực hiện

Để tăng tốc quá trình, hãy đặt tất cả các lệnh đó vào các tệp .sh tương ứng chẳng hạn.

3

Bạn có thể thử Translate Toolkit để chuyển đổi tệp po khác nhau (ví dụ: po2csv). Các dự án con Pootle cho phép quản lý bản dịch trên web.

2

Đề xuất của tôi là django-rosetta, cung cấp cho bạn giao diện dựa trên web để chỉnh sửa bản dịch của bạn. Django không cần phải tham gia vào ứng dụng của bạn, bạn chỉ sử dụng nó cho một cơ sở chỉnh sửa trực tuyến .PO.

Một trang web dịch mới thú vị khác mà tôi cho rằng đã được xây dựng bằng Django/Pinax là Transifex, mặc dù tôi không chắc liệu nó có cho phép chỉnh sửa trực tiếp các tệp .PO.

6

Bạn có thể sử dụng Transifex, được sử dụng bởi một vài dự án Python (Django, Mercurial). Nó có một trình soạn thảo dựa trên web và máy khách dòng lệnh để tự động hóa và cũng hỗ trợ .NET, nếu điều đó có thể giúp đỡ.

Tuyên bố từ chối trách nhiệm: Tôi là người dẫn đầu dự án Transifex.

+0

Transifex là con đường để đi! Chúng tôi sử dụng nó tại http://www.bugsense.com và chúng tôi không thể nghĩ ra bất kỳ cách nào khác để quản lý nội địa hóa – PanosJee

Các vấn đề liên quan