Mô-đun dịch¶
Phần này giải thích cách cung cấp khả năng dịch cho mô-đun của bạn.
Ghi chú
Nếu bạn muốn đóng góp vào việc dịch chính SoOn, vui lòng tham khảo trang Wiki của SoOn.
Xuất thuật ngữ có thể dịch được¶
Một số thuật ngữ trong mô-đun của bạn có thể dịch được. Kết quả là, ngay cả khi bạn chưa thực hiện bất kỳ công việc cụ thể nào về dịch thuật, bạn vẫn có thể xuất các thuật ngữ có thể dịch được trong mô-đun của mình và có thể tìm thấy nội dung để làm việc.
Việc xuất bản dịch được thực hiện thông qua giao diện quản trị bằng cách đăng nhập vào giao diện phụ trợ và mở
để ngôn ngữ về mặc định (ngôn ngữ mới/mẫu trống)
chọn định dạng Tệp PO
chọn mô-đun của bạn
nhấp vào Export và tải xuống tệp

Điều này cung cấp cho bạn một tệp có tên yourmodule.pot
. Tệp này sẽ được chuyển đến thư mục yourmodule/i18n/
. Tệp này là Mẫu PO chỉ liệt kê các chuỗi có thể dịch và từ đó có thể tạo các bản dịch thực tế (tệp PO). Bạn có thể tạo tệp PO bằng msginit, bằng công cụ dịch chuyên dụng như POEdit hoặc chỉ cần sao chép mẫu sang tệp mới có tên lingu.po
. Các tệp dịch phải được đặt trong yourmodule/i18n/
, bên cạnh yourmodule.pot
và sẽ được SoOn tự động tải khi ngôn ngữ tương ứng được cài đặt (thông qua :menuselection:` Cài đặt --> Bản dịch --> Ngôn ngữ`)
Ghi chú
bản dịch cho tất cả các ngôn ngữ được tải cũng được cài đặt hoặc cập nhật khi cài đặt hoặc cập nhật mô-đun
Xuất khẩu ngầm¶
SoOn tự động xuất các chuỗi có thể dịch được từ nội dung loại "dữ liệu":
trong các chế độ xem không phải QWeb, tất cả các nút văn bản đều được xuất cũng như nội dung của các thuộc tính
string
,help
,sum
,confirm
vàplaceholder
Các mẫu QWeb (cả phía máy chủ và phía máy khách), tất cả các nút văn bản đều được xuất ngoại trừ bên trong các khối
t-translation="off"
, nội dung củatitle
,alt
, ` Các thuộc tínhlabel`
vàplaceholder
cũng được xuấtđối với
Field
, trừ khi mô hình của chúng được đánh dấu bằng_translate = False
:thuộc tính
string
vàhelp
của chúng được xuấtnếu có
lựa chọn
và một danh sách (hoặc bộ dữ liệu), nó sẽ được xuấtnếu thuộc tính
translate
của họ được đặt thànhTrue
, thì tất cả các giá trị hiện có của họ (trên tất cả các bản ghi) sẽ được xuất
thông báo trợ giúp/lỗi của
_constraints
và_sql_constraints
được xuất
Xuất khẩu rõ ràng¶
Khi gặp các tình huống "bắt buộc" hơn trong mã Python hoặc mã Javascript, SoOn không thể tự động xuất các thuật ngữ có thể dịch được nên chúng phải được đánh dấu rõ ràng để xuất. Điều này được thực hiện bằng cách gói một chuỗi ký tự trong lệnh gọi hàm.
Trong Python, hàm gói là odoo._()
:
title = _("Bank Accounts")
Trong JavaScript, hàm gói thường là odoo.web._t()
:
title = _t("Bank Accounts");
Cảnh báo
Chỉ các chuỗi ký tự mới có thể được đánh dấu để xuất, không phải biểu thức hoặc biến. Đối với các trường hợp chuỗi được định dạng, điều này có nghĩa là chuỗi định dạng phải được đánh dấu chứ không phải chuỗi được định dạng
Phiên bản lười biếng của _
và _t
là odoo._lt()
trong python và odoo.web._lt()
trong javascript. Việc tra cứu bản dịch chỉ được thực hiện khi hiển thị và có thể được sử dụng để khai báo các thuộc tính có thể dịch được trong các phương thức lớp của các biến toàn cục.
Ghi chú
Theo mặc định, các bản dịch của mô-đun không được hiển thị ở giao diện người dùng và do đó không thể truy cập được từ JavaScript. Để đạt được điều đó, tên mô-đun phải có tiền tố là website
(giống như website_sale
, website_event
, v.v.) hoặc đăng ký rõ ràng bằng cách triển khai _get_translation_frontend_modules_name()
cho mô hình ir.http
.
Điều này có thể trông giống như sau:
from odoo import models
class IrHttp(models.AbstractModel):
_inherit = 'ir.http'
@classmethod
def _get_translation_frontend_modules_name(cls):
modules = super()._get_translation_frontend_modules_name()
return modules + ['your_module']
Biến¶
Không đoạn trích có thể hoạt động nhưng nó sẽ không dịch văn bản chính xác:
_("Scheduled meeting with %s" % invitee.name)
Có đặt các biến động làm tham số tra cứu bản dịch (điều này sẽ dự phòng nguồn trong trường hợp thiếu phần giữ chỗ trong bản dịch):
_("Scheduled meeting with %s", invitee.name)
khối¶
Không chia bản dịch của bạn thành nhiều khối hoặc nhiều dòng:
# bad, trailing spaces, blocks out of context
_("You have ") + len(invoices) + _(" invoices waiting")
_t("You have ") + invoices.length + _t(" invoices waiting");
# bad, multiple small translations
_("Reference of the document that generated ") + \
_("this sales order request.")
Có giữ trong một khối, cung cấp ngữ cảnh đầy đủ cho người dịch:
# good, allow to change position of the number in the translation
_("You have %s invoices wainting") % len(invoices)
_.str.sprintf(_t("You have %s invoices wainting"), invoices.length);
# good, full sentence is understandable
_("Reference of the document that generated " + \
"this sales order request.")
Số nhiều¶
Đừng đa dạng hóa các thuật ngữ theo cách tiếng Anh:
msg = _("You have %(count)s invoice", count=invoice_count)
if invoice_count > 1:
msg += _("s")
Hãy lưu ý rằng mọi ngôn ngữ đều có dạng số nhiều khác nhau:
if invoice_count > 1:
msg = _("You have %(count)s invoices", count=invoice_count)
else:
msg = _("You have one invoice")
Đọc so với thời gian chạy¶
Không gọi tra cứu bản dịch khi khởi chạy máy chủ:
ERROR_MESSAGE = {
# bad, evaluated at server launch with no user language
'access_error': _('Access Error'),
'missing_error': _('Missing Record'),
}
class Record(models.Model):
def _raise_error(self, code):
raise UserError(ERROR_MESSAGE[code])
Không gọi tra cứu bản dịch khi tệp javascript được đọc:
# bad, js _t is evaluated too early
var core = require('web.core');
var _t = core._t;
var map_title = {
access_error: _t('Access Error'),
missing_error: _t('Missing Record'),
};
Có sử dụng phương pháp tra cứu dịch lười biếng:
ERROR_MESSAGE = {
'access_error': _lt('Access Error'),
'missing_error': _lt('Missing Record'),
}
class Record(models.Model):
def _raise_error(self, code):
# translation lookup executed at error rendering
raise UserError(ERROR_MESSAGE[code])
hoặc do đánh giá động nội dung có thể dịch được:
# good, evaluated at run time
def _get_error_message(self):
return {
access_error: _('Access Error'),
missing_error: _('Missing Record'),
}
Thực hiện trong trường hợp việc tra cứu bản dịch được thực hiện khi tệp JS được đọc, hãy sử dụng _lt
thay vì _t
để dịch thuật ngữ khi nó được sử dụng:
# good, js _lt is evaluated lazily
var core = require('web.core');
var _lt = core._lt;
var map_title = {
access_error: _lt('Access Error'),
missing_error: _lt('Missing Record'),
};