2013-05-12 22 views
5

Tôi đang làm việc với Django 1.5.1 và tôi đang gặp một số "hành vi lạ" với bản dịch. Tôi đang sử dụng ugettextugettext_lazy trong cùng một tệp Python. Nếu tôi tổ chức nhập khẩu như:ugettext và ugettext_lazy chức năng không được công nhận bởi makemessages trong Python Django

from django.utils.translation import ugettext as trans 
from django.utils.translation import ugettext_lazy as _ 

hoặc

from django.utils.translation import ugettext as trans, ugettext_lazy as _ 

Các chuỗi đánh dấu là trans("string") được bỏ qua khi chạy makemessages lệnh.

Tuy nhiên, nếu tôi không đổi tên ugettext nó hoạt động tốt với cả hai phiên bản:

from django.utils.translation import ugettext 
from django.utils.translation import ugettext_lazy as _ 

hoặc

from django.utils.translation import ugettext, ugettext_lazy as _ 

Bây giờ trans("string") hoạt động tốt.

Vì vậy, không ai biết tại sao việc đổi tên nhập này đang gây ra hàm được đổi tên không được gọi? Đây có phải là một "giới hạn" thực sự của Python không, tôi không biết khi đổi tên nhiều hơn một hàm trong cùng một mô-đun?


CẬP NHẬT

Sau một số thử nghiệm, tôi đã nhận ra rằng thậm chí tạo ra một mô-đun python rỗng bên trong một ứng dụng với đoạn mã sau nó không hoạt động:

from django.utils.translation import ugettext_lazy as translate 

a = translate("string") 

Tuy nhiên , nếu sử dụng _ cho bí danh hoạt động:

from django.utils.translation import ugettext_lazy as _ 

a = _("string") 

My kết luận là: Bạn chỉ có thể sử dụng _ bí danh cho ugettextugettext_lazy (hoặc bất kỳ chức năng dịch thuật khác có liên quan) trong Django hoặc nếu không nó sẽ không được công nhận bởi makemessages lệnh. Lời giải thích kỹ thuật có thể được tìm thấy trong câu trả lời của Robert Lujo.

Cảm ơn!

+0

Bạn có thể "đổi tên" như nhiều ký hiệu (chức năng hoặc bất cứ điều gì) như bạn muốn, Python tên chỉ là bí danh, và cả hai hình thức nhập khẩu (một lớp lót hoặc hai lót) là tương đương, do đó, vấn đề là ở nơi khác. FWIW Tôi mạnh mẽ nghi ngờ bạn rebind tên "trans" để cái gì khác một nơi nào đó sau khi nhập khẩu ... –

+0

Hi! Tôi không ghi đè 'trans' trong mô-đun (tôi đã thực hiện tìm kiếm với Eclipse). Có thể nào là do đổi tên '_'? – Caumons

+0

'_' là tên Python hợp lệ và không có sức mạnh ma thuật. wrt/rename, 'từ x import y as z' là tương đương chính xác' from x import y; z = y; del y' như vậy ở đây một lần nữa không có gì huyền diệu xảy ra. wrt/khẳng định của bạn rằng "bạn không ghi đè' trans' ", một tìm kiếm văn bản đơn giản có thể không đủ. Một mẫu (chống) rất phổ biến là ghi đè nhập sao, nghĩa là 'từ x nhập y; từ z import * ', nơi nó xảy ra' z' cũng xuất khẩu một biểu tượng 'y'.Ngoài ra và nếu bạn không quen thuộc với Python, hàm _don't_ của Python nằm trong một không gian tên riêng biệt, chúng là các biến thông thường. –

Trả lời

19

Django makemessages lệnh tiện ích trong nội bộ gọi chương trình xgettext như thế này:

cmd = (
    'xgettext -d %s -L Python %s %s --keyword=gettext_noop ' 
    '--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 ' 
    '--keyword=ugettext_noop --keyword=ugettext_lazy ' 
    '--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 ' 
    '--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 ' 
    '--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 ' 
    '--add-comments=Translators -o - "%s"' % 
    (domain, wrap, location, work_file)) 

(nguồn có thể được tìm thấy here). Vì vậy, một số từ khóa được định nghĩa trước bởi xgettext tiện ích (kiểm tra tài liệu tham khảo cho --keyword):

  • cho python - gettext, ugettext, dgettext, ngettext, ungettext, dngettext, _

và một số thêm bởi tiện ích django:

  • gettext_lazy, ngettext_lazy, ugettext_noop, ugettext_lazy, ungettext_lazy, pgettext, npgettext, pgettext_lazy, npgettext_lazy

Từ khóa trans không nằm trong bất kỳ bộ từ khóa nào, vì vậy bạn không nên sử dụng nó để đánh dấu văn bản cho bản dịch.

+0

Cảm ơn câu trả lời của bạn, tôi vừa cập nhật câu hỏi của mình sau khi thử nghiệm thêm. – Caumons

+0

Đây chính là vấn đề! Tôi đã đổi tên các hàm 'ugettext' và' ugettext_lazy' bằng cách sử dụng bí danh không được bao gồm làm từ khóa và do đó nó bị bỏ qua. Nó không phải là vấn đề nhập khẩu. Vì vậy, để kết luận, chỉ cần nói rằng bí danh CHỈ được cho phép là '_'. Cảm ơn câu trả lời của bạn! :) – Caumons

0

Những ghi chú này về multi-language support for Django project có thể cho phép bạn xác định những gì là sai. Hầu hết có thể đổi tên không phải là nguyên nhân gốc rễ cho thất bại.

Một số cảnh báo trong những ghi chú:

  • Mỗi mẫu cho trang web của bạn phải tải các thư viện thẻ i18n sử dụng {% load %}

  • Bạn cần phải tạo thư mục locale bằng tay trước khi chạy makemessages - đó bạn thường làm, nếu bạn không nhận được thông báo lỗi

  • Tệp ngôn ngữ phải được biên dịch thành .mo tệp trước khi bạn sử dụng chúng - bạn cũng đã làm

EDIT

Trong trang i liên quan đến bài viết của tôi, họ đang sử dụng cú pháp này trong các mẫu:

{% trans "Hello" %} 

nó là cái gì bạn đã cố gắng chưa?

+0

Sự cố không liên quan đến vấn đề này, vì việc sử dụng ugettext_lazy như _ hoạt động hoàn hảo và sử dụng ugettext không có bí danh. – Caumons

+0

Tôi vừa cập nhật câu hỏi của mình sau khi thử nghiệm thêm. – Caumons

+0

Tôi vừa chấp nhận câu trả lời của @ RobertLujo khi anh ấy trả lời hoàn hảo câu hỏi của tôi. Thanks anyway :) – Caumons

3

bí danh ugettext bất ngờ có thể được xử lý bằng cách ghi đè các lệnh makemessages, chẳng hạn như trong:

from django.core.management.commands import makemessages 

class Command(makemessages.Command): 
    """ 
    Extends the makemessages command to look for additional aliases. 
    """ 
    xgettext_options = makemessages.Command.xgettext_options + ['--keyword=_lazy'] 

Xem https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#customizing-the-makemessages-command

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