Hướng dẫn translate html page django - dịch trang html django
Dịch¶Tổng quan¶Để tạo một dự án Django có thể dịch, bạn phải thêm một số lượng móc tối thiểu vào mã và mẫu python của bạn. Những móc này được gọi là chuỗi dịch. Họ nói với Django: Từ văn bản này nên được dịch sang ngôn ngữ của người dùng cuối, nếu một bản dịch cho văn bản này có sẵn trong ngôn ngữ đó. Đó là trách nhiệm của bạn đối với Mark Transable String; Hệ thống chỉ có thể dịch các chuỗi mà nó biết.translation strings. They tell Django: “This text should be translated into the end user’s language, if a translation for this text is available in that language.” It’s your responsibility to mark translatable strings; the system can only translate strings it knows about. Show
Django sau đó cung cấp các tiện ích để trích xuất các chuỗi dịch vào một tệp tin nhắn. Tệp này là một cách thuận tiện để các dịch giả cung cấp tương đương với các chuỗi dịch trong ngôn ngữ đích. Khi các dịch giả đã điền vào tệp tin nhắn, nó phải được biên dịch. Quá trình này dựa trên bộ công cụ GNU GetText.message file. This file is a convenient way for translators to provide the equivalent of the translation strings in the target language. Once the translators have filled in the message file, it must be compiled. This process relies on the GNU gettext toolset. Khi điều này được thực hiện, Django sẽ chăm sóc việc dịch các ứng dụng web một cách nhanh chóng trong mỗi ngôn ngữ có sẵn, theo tùy chọn ngôn ngữ của người dùng. Các móc quốc tế hóa của Django, theo mặc định, và điều đó có nghĩa là có một chút chi phí liên quan đến i18N ở một số nơi của khung. Nếu bạn không sử dụng quốc tế hóa, bạn nên mất hai giây để đặt text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }3 trong tệp cài đặt của mình. Sau đó, Django sẽ thực hiện một số tối ưu hóa để không tải máy móc quốc tế hóa. Quốc tế hóa: Trong mã PythonDịch tiêu chuẩnChỉ định chuỗi dịch bằng cách sử dụng hàm text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }4. Nó quy ước nhập khẩu này dưới dạng bí danh ngắn hơn, text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }5, để tiết kiệm gõ. Ghi chú Thư viện tiêu chuẩn của Python, mô -đun text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }6 cài đặt text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }7 vào không gian tên toàn cầu, dưới dạng bí danh cho text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }4. Ở Django, chúng tôi đã chọn không tuân theo thực hành này, vì một vài lý do:
Những chức năng nào có thể được coi là text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }5? Do cách thức hoạt động của a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'6 (được sử dụng bởi a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'7), chỉ có thể nhập các chức năng lấy một đối số chuỗi duy nhất là text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }5:
Trong ví dụ này, văn bản from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)01 được đánh dấu là chuỗi dịch: from django.http import HttpResponse from django.utils.translation import gettext as _ def my_view(request): output = _("Welcome to my site.") return HttpResponse(output) Bạn có thể viết mã này mà không cần sử dụng bí danh. Ví dụ này giống hệt với cái trước: from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output) Dịch hoạt động trên các giá trị tính toán. Ví dụ này giống hệt với hai cái trước: def my_view(request): words = ['Welcome', 'to', 'my', 'site.'] output = _(' '.join(words)) return HttpResponse(output) Dịch hoạt động trên các biến. Một lần nữa, ở đây, một ví dụ giống hệt nhau: def my_view(request): sentence = 'Welcome to my site.' output = _(sentence) return HttpResponse(output) . Các chuỗi bạn chuyển sang text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }7 hoặc text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }4 có thể lấy các chỗ ngồi chỗ, được chỉ định với cú pháp nội suy dây có tên Python. Thí dụ: def my_view(request, m, d): output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d} return HttpResponse(output) Kỹ thuật này cho phép các bản dịch cụ thể về ngôn ngữ sắp xếp lại văn bản giữ chỗ. Ví dụ, một bản dịch tiếng Anh có thể là from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)06, trong khi bản dịch tiếng Tây Ban Nha có thể là from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)07 - với các khoản giữ chỗ trong tháng và ban ngày. Vì lý do này, bạn nên sử dụng phép nội suy được đặt tên (ví dụ: from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)08) thay vì nội suy vị trí (ví dụ: from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)09 hoặc from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)10) bất cứ khi nào bạn có nhiều hơn một tham số. Nếu bạn sử dụng phép nội suy vị trí, các bản dịch sẽ không thể sắp xếp lại văn bản giữ chỗ. Do trích xuất chuỗi được thực hiện bởi lệnh a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'6, chỉ các cú pháp được text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }6 hỗ trợ được hỗ trợ bởi Django. Cụ thể, các chuỗi Python F chưa được hỗ trợ bởi a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'6 và chuỗi mẫu JavaScript cần text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }6 0.21+.f-strings are not yet supported by a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'6, and JavaScript template strings need text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, }6 0.21+. Đánh dấu các chuỗi là không cóSử dụng chức năng from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)15 để đánh dấu một chuỗi thành chuỗi dịch mà không cần dịch nó. Chuỗi sau đó được dịch từ một biến. Sử dụng điều này nếu bạn có các chuỗi không đổi nên được lưu trữ bằng ngôn ngữ nguồn vì chúng được trao đổi qua các hệ thống hoặc người dùng - chẳng hạn như chuỗi trong cơ sở dữ liệu - nhưng nên được dịch tại thời điểm cuối cùng có thể, chẳng hạn như khi chuỗi được trình bày cho người dùng. Sự đa nguyênSử dụng chức năng from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)16 để chỉ định các tin nhắn số nhiều. from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)17 có ba đối số: chuỗi dịch đơn, chuỗi dịch số nhiều và số lượng đối tượng. Chức năng này rất hữu ích khi bạn cần ứng dụng Django của mình để bản địa hóa các ngôn ngữ trong đó số lượng và độ phức tạp của các dạng số nhiều lớn hơn hai dạng được sử dụng trong tiếng Anh ('đối tượng' cho số ít và 'đối tượng' cho tất cả các trường hợp from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)18 khác với một, không phân biệt giá trị của nó.) Ví dụ: from django.http import HttpResponse from django.utils.translation import ngettext def hello_world(request, count): page = ngettext( 'there is %(count)d object', 'there are %(count)d objects', count, ) % { 'count': count, } return HttpResponse(page) Trong ví dụ này, số lượng đối tượng được truyền sang các ngôn ngữ dịch dưới dạng biến from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)18. Lưu ý rằng đa nguyên hóa là phức tạp và hoạt động khác nhau trong mỗi ngôn ngữ. So sánh from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)18 với 1 không phải là quy tắc chính xác. Mã này trông tinh vi, nhưng sẽ tạo ra kết quả không chính xác cho một số ngôn ngữ: from django.utils.translation import ngettext from myapp.models import Report count = Report.objects.count() if count == 1: name = Report._meta.verbose_name else: name = Report._meta.verbose_name_plural text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(name)s available.', count, ) % { 'count': count, 'name': name } Don Tiết cố gắng thực hiện logic đơn lẻ của riêng bạn; Nó đã thắng được đúng. Trong trường hợp như thế này, hãy xem xét một cái gì đó như sau: text = ngettext( 'There is %(count)d %(name)s object available.', 'There are %(count)d %(name)s objects available.', count, ) % { 'count': count, 'name': Report._meta.verbose_name, } Ghi chú Khi sử dụng from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)17, hãy đảm bảo bạn sử dụng một tên duy nhất cho mọi biến ngoại suy có trong nghĩa đen. Trong các ví dụ trên, lưu ý cách chúng tôi sử dụng biến python from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)22 trong cả hai chuỗi dịch. Ví dụ này, ngoài việc không chính xác trong một số ngôn ngữ như đã lưu ý ở trên, sẽ thất bại: text = ngettext( 'There is %(count)d %(name)s available.', 'There are %(count)d %(plural_name)s available.', count, ) % { 'count': Report.objects.count(), 'name': Report._meta.verbose_name, 'plural_name': Report._meta.verbose_name_plural, } Bạn sẽ gặp lỗi khi chạy from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)23: a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid' Điểm đánh dấu theo ngữ cảnhĐôi khi các từ có một số nghĩa, chẳng hạn như from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)24 trong tiếng Anh, trong đó đề cập đến một tên tháng và một động từ. Để cho phép các dịch giả dịch các từ này một cách chính xác trong các bối cảnh khác nhau, bạn có thể sử dụng hàm from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)25 hoặc hàm from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)26 nếu chuỗi cần nhiều. Cả hai đều lấy một chuỗi ngữ cảnh làm biến đầu tiên. Trong tệp from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)27 kết quả, chuỗi sau đó sẽ xuất hiện thường xuyên như có các dấu hiệu ngữ cảnh khác nhau cho cùng một chuỗi (ngữ cảnh sẽ xuất hiện trên dòng from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)28), cho phép người dịch cung cấp một bản dịch khác nhau cho mỗi người trong số chúng. Ví dụ: from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)0 or: from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)1 sẽ xuất hiện trong tệp from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)27 như: from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)2 Các điểm đánh dấu theo ngữ cảnh cũng được hỗ trợ bởi các thẻ mẫu from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)30 và from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)31. Dịch thuật lười biếngSử dụng các phiên bản lười biếng của các hàm dịch trong from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)32 (dễ dàng nhận ra bởi hậu tố from django.http import HttpResponse from django.utils.translation import gettext def my_view(request): output = gettext("Welcome to my site.") return HttpResponse(output)33 trong tên của chúng) để dịch các chuỗi uể oải - khi giá trị được truy cập thay vì khi chúng được gọi. Các chức năng này lưu trữ một tham chiếu lười biếng đến chuỗi - không phải là bản dịch thực tế. Bản thân bản dịch sẽ được thực hiện khi chuỗi được sử dụng trong bối cảnh chuỗi, chẳng hạn như trong kết xuất mẫu. Điều này rất cần thiết khi các cuộc gọi đến các chức năng này được đặt trong các đường dẫn mã được thực thi tại thời gian tải mô -đun. Đây là một cái gì đó có thể dễ dàng xảy ra khi xác định các mô hình, hình thức và hình thức mô hình, bởi vì Django thực hiện chúng sao cho các trường của chúng thực sự là các thuộc tính cấp lớp. Vì lý do đó, hãy đảm bảo sử dụng các bản dịch lười biếng trong các trường hợp sau: Các trường mô hình và các mối quan hệ |