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ở Settings ‣ Translations ‣ Import / Xuất ‣ Xuất bản dịch

  • để 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

../../_images/po-export.png

Đ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, confirmplaceholder

  • 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ủa title, alt, ` Các thuộc tính label`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 stringhelp của chúng được xuất

    • nếu có lựa chọn và một danh sách (hoặc bộ dữ liệu), nó sẽ được xuất

    • nếu thuộc tính translate của họ được đặt thành True, 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_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 __todoo._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)

đặ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.")

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'),
};

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'),
};