gettext --- Dịch vụ quốc tế hóa đa ngôn ngữ¶
Source code: Lib/gettext.py
Mô-đun gettext cung cấp các dịch vụ quốc tế hóa (I18N) và bản địa hóa (L10N) cho các mô-đun và ứng dụng Python của bạn. Nó hỗ trợ cả danh mục tin nhắn GNU gettext API và API dựa trên lớp, cấp độ cao hơn có thể phù hợp hơn cho các tệp Python. Giao diện được mô tả bên dưới cho phép bạn viết các thông báo mô-đun và ứng dụng của mình bằng một ngôn ngữ tự nhiên, đồng thời cung cấp danh mục các thông báo đã dịch để chạy trong các ngôn ngữ tự nhiên khác nhau.
Một số gợi ý về cách bản địa hóa các mô-đun và ứng dụng Python của bạn cũng được cung cấp.
GNU gettext API¶
Mô-đun gettext xác định API sau, rất giống với GNU gettext API. Nếu bạn sử dụng API này, bạn sẽ ảnh hưởng đến việc dịch toàn bộ ứng dụng của mình trên toàn cầu. Thông thường đây là điều bạn muốn nếu ứng dụng của bạn là đơn ngữ, với việc lựa chọn ngôn ngữ tùy thuộc vào ngôn ngữ của người dùng. Nếu bạn đang bản địa hóa một mô-đun Python hoặc nếu ứng dụng của bạn cần chuyển đổi ngôn ngữ một cách nhanh chóng, bạn có thể muốn sử dụng API dựa trên lớp để thay thế.
- gettext.bindtextdomain(domain, localedir=None)¶
Liên kết domain với thư mục miền địa phương localedir. Cụ thể hơn,
gettextsẽ tìm kiếm các tệp.monhị phân cho tên miền nhất định bằng cách sử dụng đường dẫn (trên Unix):localedir/language/LC_MESSAGES/domain.mo, trong đó language được tìm kiếm trong các biến môi trườngLANGUAGE,LC_ALL,LC_MESSAGESvàLANGtương ứng.Nếu localedir bị bỏ qua hoặc
Nonethì liên kết hiện tại cho domain sẽ được trả về. [1]
- gettext.textdomain(domain=None)¶
Thay đổi hoặc truy vấn tên miền toàn cầu hiện tại. Nếu domain là
Nonethì miền toàn cầu hiện tại sẽ được trả về, nếu không thì miền chung sẽ được đặt thành domain, miền này sẽ được trả về.
- gettext.gettext(message)¶
Trả về bản dịch đã bản địa hóa của message, dựa trên thư mục tên miền, ngôn ngữ và ngôn ngữ toàn cầu hiện tại. Hàm này thường được đặt bí danh là
_()trong không gian tên cục bộ (xem ví dụ bên dưới).
- gettext.dgettext(domain, message)¶
Giống như
gettext(), nhưng tra cứu thông báo trong domain được chỉ định.
- gettext.ngettext(singular, plural, n)¶
Giống như
gettext(), nhưng hãy xem xét các dạng số nhiều. Nếu tìm thấy bản dịch, hãy áp dụng công thức số nhiều cho n và trả về thông báo kết quả (một số ngôn ngữ có nhiều hơn hai dạng số nhiều). Nếu không tìm thấy bản dịch nào, hãy trả về singular nếu n là 1; trả lại plural nếu không.Công thức Số nhiều được lấy từ tiêu đề danh mục. Đó là biểu thức C hoặc Python có biến tự do n; biểu thức đánh giá theo chỉ mục của số nhiều trong danh mục. Xem the GNU gettext documentation để biết cú pháp chính xác được sử dụng trong các tệp
.povà công thức cho nhiều ngôn ngữ.
- gettext.dngettext(domain, singular, plural, n)¶
Giống như
ngettext(), nhưng tra cứu thông báo trong domain được chỉ định.
- gettext.pgettext(context, message)¶
- gettext.dpgettext(domain, context, message)¶
- gettext.npgettext(context, singular, plural, n)¶
- gettext.dnpgettext(domain, context, singular, plural, n)¶
Tương tự như các hàm tương ứng không có
ptrong tiền tố (nghĩa làgettext(),dgettext(),ngettext(),dngettext()), nhưng bản dịch bị giới hạn ở thông báo đã cho context.Added in version 3.8.
Lưu ý rằng GNU gettext cũng định nghĩa một phương thức dcgettext(), nhưng điều này được cho là không hữu ích nên hiện tại nó chưa được triển khai.
Đây là ví dụ về cách sử dụng điển hình cho API này:
nhập gettext
gettext.bindtextdomain('myapplication', '/path/to/my/lingu/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('Đây là một chuỗi có thể dịch được.'))
API dựa trên lớp¶
Mô-đun API dựa trên lớp của mô-đun gettext mang lại cho bạn sự linh hoạt và tiện lợi hơn so với GNU gettext API. Đó là cách được khuyến nghị để bản địa hóa các ứng dụng và mô-đun Python của bạn. gettext định nghĩa một lớp GNUTranslations thực hiện phân tích cú pháp các tệp định dạng GNU .mo và có các phương thức trả về chuỗi. Các phiên bản của lớp này cũng có thể tự cài đặt trong không gian tên tích hợp dưới dạng hàm _().
- gettext.find(domain, localedir=None, languages=None, all=False)¶
Hàm này thực hiện thuật toán tìm kiếm tệp
.motiêu chuẩn. Nó cần một domain, giống hệt với những gìtextdomain()cần. localedir tùy chọn giống như trongbindtextdomain(). Tùy chọn languages là danh sách các chuỗi, trong đó mỗi chuỗi là một mã ngôn ngữ.Nếu localedir không được cung cấp thì thư mục ngôn ngữ hệ thống mặc định sẽ được sử dụng. [2] Nếu languages không được cung cấp thì các biến môi trường sau sẽ được tìm kiếm:
LANGUAGE,LC_ALL,LC_MESSAGESvàLANG. Giá trị đầu tiên trả về giá trị không trống được sử dụng cho biến languages. Các biến môi trường phải chứa một danh sách các ngôn ngữ được phân tách bằng dấu hai chấm, danh sách này sẽ được phân tách bằng dấu hai chấm để tạo ra danh sách các chuỗi mã ngôn ngữ dự kiến.find()sau đó mở rộng và chuẩn hóa các ngôn ngữ, sau đó lặp lại chúng, tìm kiếm tệp hiện có được xây dựng từ các thành phần này:localedir/language/LC_MESSAGES/domain.moTên tệp đầu tiên tồn tại được trả về bởi
find(). Nếu không tìm thấy tệp nào như vậy thìNonesẽ được trả về. Nếu all được cung cấp, nó sẽ trả về danh sách tất cả các tên tệp, theo thứ tự chúng xuất hiện trong danh sách ngôn ngữ hoặc các biến môi trường.
- gettext.translation(domain, localedir=None, languages=None, class_=None, fallback=False)¶
Trả về một phiên bản
*Translationsdựa trên domain, localedir và languages, những phiên bản này lần đầu tiên được chuyển tớifind()để nhận danh sách các đường dẫn tệp.moliên quan. Các phiên bản có tên tệp.mogiống hệt nhau sẽ được lưu vào bộ đệm. Lớp thực tế được khởi tạo là class_ nếu được cung cấp, nếu không thì làGNUTranslations. Hàm tạo của lớp phải lấy một đối số file object.Nếu tìm thấy nhiều tệp, các tệp sau này sẽ được sử dụng làm dự phòng cho các tệp trước đó. Để cho phép thiết lập dự phòng,
copy.copy()được sử dụng để sao chép từng đối tượng dịch từ bộ đệm; dữ liệu phiên bản thực tế vẫn được chia sẻ với bộ đệm.Nếu không tìm thấy tệp
.mo, hàm này sẽ tăngOSErrornếu fallback sai (là mặc định) và trả về một phiên bảnNullTranslationsnếu fallback là đúng.Thay đổi trong phiên bản 3.11: tham số codeset bị loại bỏ.
- gettext.install(domain, localedir=None, *, names=None)¶
Thao tác này sẽ cài đặt hàm
_()trong không gian tên dựng sẵn của Python, dựa trên domain và localedir được truyền cho hàmtranslation().Đối với tham số names, vui lòng xem mô tả về phương thức
install()của đối tượng dịch thuật.Như được thấy bên dưới, bạn thường đánh dấu các chuỗi trong ứng dụng của mình là phù hợp để dịch, bằng cách gói chúng trong lệnh gọi hàm
_(), như sau:print(_('Chuỗi này sẽ được dịch.'))
Để thuận tiện, bạn muốn cài đặt hàm
_()trong không gian tên dựng sẵn của Python để có thể dễ dàng truy cập hàm này trong tất cả các mô-đun của ứng dụng của bạn.Thay đổi trong phiên bản 3.11: names hiện chỉ là thông số từ khóa.
Lớp NullTranslations¶
Các lớp dịch là những gì thực sự thực hiện việc dịch các chuỗi thông báo của tệp nguồn gốc sang các chuỗi thông báo đã dịch. Lớp cơ sở được tất cả các lớp dịch thuật sử dụng là NullTranslations; điều này cung cấp giao diện cơ bản mà bạn có thể sử dụng để viết các lớp dịch thuật chuyên ngành của riêng mình. Dưới đây là các phương pháp của NullTranslations:
- class gettext.NullTranslations(fp=None)¶
Nhận một file object fp tùy chọn, lớp cơ sở này bỏ qua. Khởi tạo các biến thể hiện "được bảo vệ" _info và _charset được thiết lập bởi các lớp dẫn xuất, cũng như _fallback, được thiết lập thông qua
add_fallback(). Sau đó nó gọiself._parse(fp)nếu fp không phải làNone.- _parse(fp)¶
Không hoạt động trong lớp cơ sở, phương thức này lấy đối tượng tệp fp và đọc dữ liệu từ tệp, khởi tạo danh mục thông báo của nó. Nếu bạn có định dạng tệp danh mục thư không được hỗ trợ, bạn nên ghi đè phương pháp này để phân tích cú pháp định dạng của mình.
- add_fallback(fallback)¶
Thêm fallback làm đối tượng dự phòng cho đối tượng dịch hiện tại. Đối tượng dịch thuật nên tham khảo phương án dự phòng nếu nó không thể cung cấp bản dịch cho một tin nhắn nhất định.
- gettext(message)¶
Nếu một dự phòng đã được đặt, hãy chuyển tiếp
gettext()tới dự phòng. Nếu không, hãy trả về message. Bị ghi đè trong các lớp dẫn xuất.
- ngettext(singular, plural, n)¶
Nếu một dự phòng đã được đặt, hãy chuyển tiếp
ngettext()tới dự phòng. Ngược lại, trả về singular nếu n là 1; trả lại plural nếu không. Bị ghi đè trong các lớp dẫn xuất.
- pgettext(context, message)¶
Nếu một dự phòng đã được đặt, hãy chuyển tiếp
pgettext()tới dự phòng. Nếu không, hãy trả lại tin nhắn đã dịch. Bị ghi đè trong các lớp dẫn xuất.Added in version 3.8.
- npgettext(context, singular, plural, n)¶
Nếu một dự phòng đã được đặt, hãy chuyển tiếp
npgettext()tới dự phòng. Nếu không, hãy trả lại tin nhắn đã dịch. Bị ghi đè trong các lớp dẫn xuất.Added in version 3.8.
- info()¶
Trả về một từ điển chứa siêu dữ liệu được tìm thấy trong tệp danh mục thư.
- charset()¶
Trả về mã hóa của tệp danh mục tin nhắn.
- install(names=None)¶
Phương thức này cài đặt
gettext()vào không gian tên tích hợp, liên kết nó với_.Nếu tham số names được cung cấp, thì tham số đó phải là một chuỗi chứa tên của các hàm bạn muốn cài đặt trong không gian tên nội trang bên cạnh
_(). Tên được hỗ trợ là'gettext','ngettext','pgettext'và'npgettext'.Lưu ý rằng đây chỉ là một cách, mặc dù là cách thuận tiện nhất, để cung cấp chức năng
_()cho ứng dụng của bạn. Vì nó ảnh hưởng đến toàn bộ ứng dụng trên toàn cầu và đặc biệt là không gian tên tích hợp nên các mô-đun được bản địa hóa không bao giờ nên cài đặt_(). Thay vào đó, họ nên sử dụng mã này để cung cấp_()cho mô-đun của mình:nhập gettext t = gettext.translation('mymodule', ...) _ = t.gettext
Điều này chỉ đặt
_()trong không gian tên chung của mô-đun và do đó chỉ ảnh hưởng đến các lệnh gọi trong mô-đun này.Thay đổi trong phiên bản 3.8: Đã thêm
'pgettext'và'npgettext'.
Lớp GNUTranslations¶
Mô-đun gettext cung cấp một lớp bổ sung bắt nguồn từ NullTranslations: GNUTranslations. Lớp này ghi đè _parse() để cho phép đọc các tệp .mo định dạng GNU gettext ở cả định dạng big-endian và little-endian.
GNUTranslations phân tích siêu dữ liệu tùy chọn ra khỏi danh mục dịch thuật. Quy ước với GNU gettext là đưa siêu dữ liệu làm bản dịch cho chuỗi trống. Siêu dữ liệu này nằm trong cặp RFC 822-style key: value và phải chứa khóa Project-Id-Version. Nếu tìm thấy khóa Content-Type thì thuộc tính charset được sử dụng để khởi tạo biến phiên bản _charset "được bảo vệ", mặc định là None nếu không tìm thấy. Nếu mã hóa bộ ký tự được chỉ định thì tất cả id tin nhắn và chuỗi tin nhắn được đọc từ danh mục sẽ được chuyển đổi sang Unicode bằng cách sử dụng mã hóa này, nếu không thì ASCII được giả định.
Vì id tin nhắn cũng được đọc dưới dạng chuỗi Unicode nên tất cả các phương thức *gettext() sẽ coi id tin nhắn là chuỗi Unicode chứ không phải chuỗi byte.
Toàn bộ tập hợp các cặp khóa/giá trị được đặt vào một từ điển và được đặt làm biến phiên bản _info "được bảo vệ".
Nếu số ma thuật của tệp .mo không hợp lệ, số phiên bản chính không mong muốn hoặc nếu các sự cố khác xảy ra khi đọc tệp, việc khởi tạo lớp GNUTranslations có thể tăng OSError.
- class gettext.GNUTranslations¶
Các phương thức sau được ghi đè từ quá trình triển khai lớp cơ sở:
- gettext(message)¶
Tra cứu id message trong danh mục và trả về chuỗi thông báo tương ứng, dưới dạng chuỗi Unicode. Nếu không có mục nào trong danh mục cho id message và một dự phòng đã được đặt thì việc tra cứu sẽ được chuyển tiếp tới phương thức
gettext()của dự phòng. Nếu không, id message sẽ được trả về.
- ngettext(singular, plural, n)¶
Thực hiện tra cứu dạng số nhiều của id tin nhắn. singular được sử dụng làm id tin nhắn nhằm mục đích tra cứu trong danh mục, trong khi n được sử dụng để xác định nên sử dụng dạng số nhiều nào. Chuỗi thông báo trả về là chuỗi Unicode.
Nếu không tìm thấy id tin nhắn trong danh mục và chỉ định một dự phòng thì yêu cầu sẽ được chuyển tiếp đến phương thức
ngettext()của dự phòng. Ngược lại, khi n là 1 thì singular được trả về và plural được trả về trong tất cả các trường hợp khác.Đây là một ví dụ:
n = len(os.listdir('.')) cat = GNUTranslations(somefile) tin nhắn = cat.ngettext( 'Có tập tin %(num)d trong thư mục này', 'Có %(num)d tập tin trong thư mục này', n) % {'num': n}
- pgettext(context, message)¶
Tra cứu id context và message trong danh mục và trả về chuỗi thông báo tương ứng, dưới dạng chuỗi Unicode. Nếu không có mục nào trong danh mục cho id message và context và một dự phòng đã được đặt thì việc tra cứu sẽ được chuyển tiếp tới phương thức
pgettext()của dự phòng. Nếu không, id message sẽ được trả về.Added in version 3.8.
- npgettext(context, singular, plural, n)¶
Thực hiện tra cứu dạng số nhiều của id tin nhắn. singular được sử dụng làm id tin nhắn nhằm mục đích tra cứu trong danh mục, trong khi n được sử dụng để xác định nên sử dụng dạng số nhiều nào.
Nếu không tìm thấy id thông báo cho context trong danh mục và một dự phòng được chỉ định thì yêu cầu sẽ được chuyển tiếp đến phương thức
npgettext()của dự phòng. Ngược lại, khi n là 1 thì singular được trả về và plural được trả về trong tất cả các trường hợp khác.Added in version 3.8.
Hỗ trợ danh mục tin nhắn Solaris¶
Hệ điều hành Solaris xác định định dạng tệp .mo nhị phân của riêng nó, nhưng vì không tìm thấy tài liệu nào về định dạng này nên nó không được hỗ trợ tại thời điểm này.
Trình tạo danh mục¶
GNOME sử dụng một phiên bản mô-đun gettext của James Henstridge, nhưng phiên bản này có API hơi khác một chút. Việc sử dụng tài liệu của nó là:
nhập gettext
cat = gettext.Catalog(domain, localedir)
_ = cat.gettext
print(_('xin chào thế giới'))
Để tương thích với mô-đun cũ hơn này, hàm Catalog() là bí danh của hàm translation() được mô tả ở trên.
Một điểm khác biệt giữa mô-đun này và mô-đun của Henstridge: các đối tượng danh mục của anh ấy hỗ trợ quyền truy cập thông qua ánh xạ API, nhưng điều này dường như không được sử dụng nên hiện không được hỗ trợ.
Quốc tế hóa các chương trình và mô-đun của bạn¶
Quốc tế hóa (I18N) đề cập đến hoạt động trong đó một chương trình được nhận biết bằng nhiều ngôn ngữ. Bản địa hóa (L10N) đề cập đến việc điều chỉnh chương trình của bạn, sau khi được quốc tế hóa, cho phù hợp với ngôn ngữ và thói quen văn hóa địa phương. Để cung cấp thông báo đa ngôn ngữ cho các chương trình Python của bạn, bạn cần thực hiện các bước sau:
chuẩn bị chương trình hoặc mô-đun của bạn bằng cách đánh dấu đặc biệt các chuỗi có thể dịch được
chạy một bộ công cụ trên các tệp đã đánh dấu của bạn để tạo danh mục thư thô
tạo bản dịch theo ngôn ngữ cụ thể của danh mục tin nhắn
sử dụng mô-đun
gettextđể chuỗi thông báo được dịch chính xác
Để chuẩn bị mã cho I18N, bạn cần xem tất cả các chuỗi trong tệp của mình. Bất kỳ chuỗi nào cần dịch phải được đánh dấu bằng cách gói nó trong _('...') --- nghĩa là gọi hàm _. Ví dụ:
tên tệp = 'mylog.txt'
message = _('viết thông điệp tường trình')
với open(filename, 'w') là fp:
fp.write(tin nhắn)
Trong ví dụ này, chuỗi 'writing a log message' được đánh dấu là có thể dịch, trong khi các chuỗi 'mylog.txt' và 'w' thì không.
Có một số công cụ để trích xuất các chuỗi dùng để dịch. GNU gettext ban đầu chỉ hỗ trợ mã nguồn C hoặc C++ nhưng phiên bản mở rộng xgettext của nó quét mã được viết bằng một số ngôn ngữ, bao gồm cả Python, để tìm các chuỗi được đánh dấu là có thể dịch được. Babel là thư viện quốc tế hóa Python bao gồm tập lệnh pybabel để trích xuất và biên dịch danh mục thư. Chương trình xpot của François Pinard thực hiện công việc tương tự và có sẵn như một phần của po-utils package của anh ấy.
(Python cũng bao gồm các phiên bản Python thuần túy của các chương trình này, được gọi là pygettext.py và msgfmt.py; một số bản phân phối Python sẽ cài đặt chúng cho bạn. pygettext.py tương tự như xgettext, nhưng chỉ hiểu mã nguồn Python và không thể xử lý các ngôn ngữ lập trình khác như C hoặc C++. pygettext.py hỗ trợ giao diện dòng lệnh tương tự như xgettext; để biết chi tiết về cách sử dụng nó, hãy chạy pygettext.py --help. msgfmt.py tương thích nhị phân với GNU msgfmt. Với hai chương trình này, bạn có thể không cần gói GNU gettext để quốc tế hóa các ứng dụng Python của mình.)
xgettext, pygettext và các công cụ tương tự tạo ra các tệp .po là danh mục thư. Chúng là các tệp có cấu trúc mà con người có thể đọc được, chứa mọi chuỗi được đánh dấu trong mã nguồn, cùng với phần giữ chỗ cho các phiên bản đã dịch của các chuỗi này.
Bản sao của các tệp .po này sau đó sẽ được chuyển cho từng người dịch, những người viết bản dịch cho mọi ngôn ngữ tự nhiên được hỗ trợ. Họ gửi lại các phiên bản dành riêng cho ngôn ngữ đã hoàn thành dưới dạng tệp <language-name>.po được biên dịch thành tệp danh mục nhị phân .mo có thể đọc được bằng chương trình msgfmt. Các tệp .mo được mô-đun gettext sử dụng để xử lý dịch thực tế trong thời gian chạy.
Cách bạn sử dụng mô-đun gettext trong mã của mình tùy thuộc vào việc bạn đang quốc tế hóa một mô-đun hay toàn bộ ứng dụng của mình. Hai phần tiếp theo sẽ thảo luận về từng trường hợp.
Bản địa hóa mô-đun của bạn¶
Nếu bạn đang bản địa hóa mô-đun của mình, bạn phải cẩn thận để không thực hiện các thay đổi chung, ví dụ: vào không gian tên tích hợp. Bạn không nên sử dụng GNU gettext API mà thay vào đó là API dựa trên lớp.
Giả sử mô-đun của bạn được gọi là "thư rác" và các tệp .mo dịch ngôn ngữ tự nhiên khác nhau của mô-đun nằm trong /usr/share/locale ở định dạng GNU gettext. Đây là những gì bạn sẽ đặt ở đầu mô-đun của mình:
nhập gettext
t = gettext.translation('spam', '/usr/share/locale')
_ = t.gettext
Bản địa hóa ứng dụng của bạn¶
Nếu bạn đang bản địa hóa ứng dụng của mình, bạn có thể cài đặt hàm _() trên toàn cầu vào không gian tên tích hợp, thường là trong tệp trình điều khiển chính của ứng dụng. Điều này sẽ cho phép tất cả các tệp dành riêng cho ứng dụng của bạn chỉ sử dụng _('...') mà không cần phải cài đặt rõ ràng nó trong mỗi tệp.
Trong trường hợp đơn giản, bạn chỉ cần thêm đoạn mã sau vào tệp trình điều khiển chính của ứng dụng của mình
nhập gettext
gettext.install('myapplication')
Nếu bạn cần đặt thư mục miền địa phương, bạn có thể chuyển nó vào hàm install()
nhập gettext
gettext.install('myapplication', '/usr/share/locale')
Thay đổi ngôn ngữ một cách nhanh chóng¶
Nếu chương trình của bạn cần hỗ trợ nhiều ngôn ngữ cùng lúc, bạn có thể muốn tạo nhiều phiên bản dịch rồi chuyển đổi giữa chúng một cách rõ ràng, như vậy:
nhập gettext
lang1 = gettext.translation('ứng dụng của tôi', ngôn ngữ=['en'])
lang2 = gettext.translation('ứng dụng của tôi', ngôn ngữ=['fr'])
lang3 = gettext.translation('ứng dụng của tôi', ngôn ngữ=['de'])
# start bằng cách sử dụng ngôn ngữ1
lang1.install()
# ... thời gian trôi qua, người dùng chọn ngôn ngữ 2
lang2.install()
# ... thời gian trôi qua, người dùng chọn ngôn ngữ 3
lang3.install()
Bản dịch hoãn lại¶
Trong hầu hết các tình huống mã hóa, các chuỗi được dịch ở nơi chúng được mã hóa. Tuy nhiên, đôi khi, bạn cần đánh dấu các chuỗi để dịch nhưng hãy hoãn bản dịch thực tế cho đến sau này. Một ví dụ cổ điển là:
động vật = ['nhuyễn thể',
'hải âu',
'chuột',
'chim cánh cụt',
'con trăn',]
# ...
đối với a ở động vật:
in (a)
Ở đây, bạn muốn đánh dấu các chuỗi trong danh sách animals là có thể dịch được, nhưng thực tế bạn không muốn dịch chúng cho đến khi chúng được in.
Đây là một cách bạn có thể xử lý tình huống này:
def _(tin nhắn): trả lại tin nhắn
động vật = [_('nhuyễn thể'),
_('chim hải âu'),
_('chuột'),
_('chim cánh cụt'),
_('trăn'), ]
del _
# ...
đối với a ở động vật:
in(_(a))
Điều này hoạt động vì định nghĩa giả của _() chỉ đơn giản trả về chuỗi không thay đổi. Và định nghĩa giả này sẽ tạm thời ghi đè bất kỳ định nghĩa nào về _() trong không gian tên tích hợp (cho đến lệnh del). Tuy nhiên, hãy cẩn thận nếu bạn có định nghĩa trước đó về _() trong không gian tên cục bộ.
Lưu ý rằng lần sử dụng _() thứ hai sẽ không xác định "a" là có thể dịch sang chương trình gettext vì tham số này không phải là một chuỗi ký tự.
Một cách khác để xử lý vấn đề này là với ví dụ sau
def N_(tin nhắn): tin nhắn trả về
động vật = [N_('nhuyễn thể'),
N_('hải âu'),
N_('chuột'),
N_('chim cánh cụt'),
N_('trăn'), ]
# ...
đối với a ở động vật:
in(_(a))
Trong trường hợp này, bạn đang đánh dấu các chuỗi có thể dịch được bằng hàm N_(), hàm này sẽ không xung đột với bất kỳ định nghĩa nào về _(). Tuy nhiên, bạn sẽ cần hướng dẫn chương trình trích xuất tin nhắn của mình cách tìm kiếm các chuỗi có thể dịch được được đánh dấu bằng N_(). xgettext, pygettext, pybabel extract và xpot đều hỗ trợ điều này thông qua việc sử dụng chuyển đổi dòng lệnh -k. Việc lựa chọn N_() ở đây là hoàn toàn tùy ý; nó có thể dễ dàng là MarkThisStringForTranslation().
Lời cảm ơn¶
Những người sau đây đã đóng góp mã, phản hồi, đề xuất thiết kế, các triển khai trước đó và kinh nghiệm quý báu cho việc tạo ra mô-đun này:
Peter Funk
James Henstridge
Juan David Ibáñez Palomar
Marc-André Lemburg
Martin von Lowis
Francois Pinard
Barry Warsaw
Gustavo Niemeyer
Chú thích cuối trang