2009-08-25 5 views
5

Từ Django Tài liệu:Sử dụng settings.LANGUAGES với tên dịch đúng bằng gettext()

Nếu bạn định nghĩa một tùy chỉnh LANGUAGES thiết lập, đó là OK để đánh dấu các ngôn ngữ như chuỗi dịch (như trong mặc định giá trị được hiển thị ở trên) - nhưng sử dụng chức năng "giả" gettext(), không phải chức năng trong django.utils.translation. Bạn không bao giờ nên nhập django.utils.translation từ trong vòng tệp cài đặt của bạn, bởi vì tự động mô-đun này phụ thuộc vào cài đặt và điều này sẽ gây ra nhập khẩu vòng . Giải pháp là để sử dụng chức năng "giả" gettext(). Đây là một tập tin cài đặt mẫu:

gettext = lambda s: s LANGUAGES = ( ('de', gettext('German')), ('en', gettext('English')), )

Với sự sắp xếp này, django-admin.py makemessages vẫn sẽ tìm và đánh dấu những chuỗi để dịch, nhưng bản dịch sẽ không xảy ra tại runtime - - vì vậy bạn sẽ phải nhớ để bọc các ngôn ngữ trong gettext() thực trong bất kỳ mã nào sử dụng LANGUAGES trong thời gian chạy.

Ý nghĩa chính xác của việc bao bọc ngôn ngữ trong thực tế gettext() là gì? Làm thế nào nó nên được gọi trong mã?

Trả lời

3

Chính xác những gì nó nói: gọi gettext() vào tên ngôn ngữ khi bạn thực sự sử dụng chúng hoặc hiển thị chúng cho người dùng:

from django.utils.translation import ugettext 

for lang_code, lang_name in settings.LANGUAGES: 
    translated_name = ugettext(lang_name) 
    ... 

(Thông thường bạn nên sử dụng ugettext hơn gettext, vì tất cả văn bản trong Django là unicode)

Để thực hiện điều tương đương trong một mẫu, chỉ cần sử dụng {% blocktrans%} thẻ, mà chỉ gọi ugettext đằng sau hậu trường:.

{% for lang in LANGUAGES %} 
    {% blocktrans %}{{ lang.1 }}{% endblocktrans %} 
{% endfor %} 
+0

Phương pháp này là stright khá về phía trước và dễ hiểu. Nhưng trong trường hợp này, whats điểm của việc sử dụng một wrapper giả trong settings.LANGUAGES? Kể từ khi bạn phải quấn trên mỗi dòng trong mã anyway, whats điểm của hàm wrapper được đề xuất bởi các hướng dẫn. –

+2

Vì khi bạn chạy công cụ dòng lệnh gettext trên cây nguồn của bạn (có thể thông qua ./manage.py makemessages), bạn muốn nó nhận ra những chuỗi đó là "cần dịch" để nó sẽ thêm chúng vào tệp PO của bạn. –

0

Đây là tái Tôi không thể nhận được bản dịch của tôi để làm việc, đọc và đọc lại các tài liệu, tìm kiếm giờ trực tuyến, và sau khi đọc bài đăng này tôi nhận ra nó xuống đến đây:

tôi ban đầu đã có:

LANGUAGES = (
    ('en', 'English'), 
    ('nl', 'Dutch'), 
    ) 

trong đó sẽ không làm việc, sau đó sau khi đọc bài viết này cố gắng

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ) 

Mà làm việc tất cả mọi thứ ... và tôi chỉ tìm kiếm này và nó là trong doc tại https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference, về phía nút chai m của phần này ...

0

trong Template bạn chỉ có thể làm như sau:

{% for lang in LANGUAGES %} 
     {% trans lang.1 %} 
{% endfor %} 
2

Theo latest docs bạn có thể sử dụng ugettext_lazy trong cài đặt mà không gây ra nhập khẩu tròn:

from django.utils.translation import ugettext_lazy as _ 

LANGUAGES = [ 
    ('de', _('German')), 
    ('en', _('English')), 
]