2011-09-21 23 views
36

Trong các mẫu Django, bạn có thể sử dụng {{ _("Hello World") }} hoặc {% trans "Hello World" %} để đánh dấu chuỗi được dịch. Trong tài liệu, cách tiếp cận "chính thức" có vẻ là thẻ {% trans %}, nhưng cú pháp _() được đề cập quá once._() hoặc {% trans%} trong các mẫu Django?

Cách các phương pháp này khác nhau (ngoại trừ cú pháp) và tại sao phải là một phương pháp thích hợp hơn là khác?

Một điểm khác biệt là bạn rõ ràng không thể sử dụng {% trans %} bằng thẻ và bộ lọc. Nhưng điều đó có nghĩa là tôi chỉ có thể sử dụng _() ở mọi nơi, chẳng hạn như {{ _("String") }}? Nó hoạt động và trông sạch hơn và nhất quán hơn so với sử dụng {% trans "String" %} với các chuỗi độc lập và _() với các thẻ và bộ lọc.

Trả lời

42

Vì vậy, có vẻ như không có sự khác biệt về mặt kỹ thuật như của Django 1.5. Tiêu bản động cơ nội bộ đánh dấu một biến cho dịch (bằng cách thiết lập translate thuộc tính của nó) trong hai trường hợp:

  • khi bạn làm {% trans VAR %} (xem TranslateNode), hoặc
  • nếu tên của một biến bắt đầu với _( và kết thúc với ) (xem Variable.__init__).

Sau đó, khi biến đang được resolved, Django kết thúc tốt đẹp với nó ugettext hoặc pgettext nếu nó thấy thuộc tính translate.

Tuy nhiên, như có thể thấy từ mã nguồn, có một số cân nhắc linh hoạt trong việc ủng hộ {% trans %} tag:

  • bạn có thể làm {% trans "String" noop %}, mà sẽ đưa các chuỗi cho dịch vào các tập tin .po, nhưng won không thực sự dịch đầu ra khi hiển thị (không có thuộc tính nội bộ translate trên biến, không có cuộc gọi ugettext);
  • bạn có thể chỉ định ngữ cảnh tin nhắn *, như {% trans "May" context "verb" %};
  • bạn có thể đặt thông báo đã dịch thành biến để sử dụng sau này *, như {% trans "String" as translated_string %}.

* Kể từ Django 1.4.

Vui lòng sửa lỗi hoặc đăng câu trả lời hay hơn trong trường hợp tôi thiếu bất kỳ thứ gì.

+1

+1 để truy cập nguồn để kiểm tra điều này. –

1

Thẻ mẫu chuyển tiếp gọi hàm ugettext(). Ở Django _() là bí danh của ugettext(). Điều này được bao gồm trong django docs.

+2

Tôi biết rằng '_()' được sử dụng, theo quy ước, làm bí danh cho 'ugettext()' _in Mã Python_, nhưng không phải trong các mẫu. Và vì tất cả chúng ta không đặt một cái gì đó như 'từ django.utils.translation nhập khẩu ugettext như _' trong các mẫu của chúng tôi, nó không rõ ràng làm thế nào chính xác làm gạch dưới làm việc. – Tony

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