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 ugettext
và ugettext_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 ugettext
và ugettext_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!
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 ... –
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
'_' 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. –