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ã Python

Dịch tiêu chuẩn

Chỉ đị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:

  1. Đôi khi, bạn nên sử dụng
    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,
    }
    
    9 làm phương thức dịch mặc định cho một tệp cụ thể. Không 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,
    }
    
    7 trong không gian tên toàn cầu, nhà phát triển phải suy nghĩ về chức năng dịch phù hợp nhất.
  2. Nhân vật dấu gạch dướ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,
    }
    
    5) được sử dụng để thể hiện kết quả trước đó trong các thử nghiệm và thử nghiệm tương tác Python. Cài đặt 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,
    }
    
    7 toàn cầu gây nhiễu. Nhập khẩu rõ ràng
    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 vì
    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 tránh được vấn đề này.

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:

  • 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
  • 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,
    }
    
    9

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ên

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)
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ếng

Sử 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ệ
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
34 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)
35 Các giá trị tùy chọn

Ví dụ: để dịch văn bản trợ giúp của trường Tên trong mô hình sau, hãy làm như sau:

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
3

Bạn có thể đánh dấu tên của mối quan hệ

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
36,
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
37 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)
38 là có thể dịch bằng cách sử dụng các tùy chọ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)
34 của họ:

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
4

Giống như bạn sẽ làm 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)
34, bạn nên cung cấp một văn bản tên dài dòng chữ thường cho mối quan hệ vì django sẽ tự động chuẩn bị nó khi được yêu cầu.

Tên mô hình Tên giá trị ERT

Chúng tôi nên luôn cung cấp các tùy chọ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)
34 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)
42 rõ ràng thay vì dựa vào sự thất bại của trung tâm tiếng Anh và hơi ngây thơ về tên dài dòng mà Django thực hiện bằng cách xem tên lớp mô hì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)
5

Phương pháp mô hì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)
43 Đối số cho
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
44 Trang trí

Đối với các phương thức mô hình, bạn có thể cung cấp các bản dịch cho Django và trang web quản trị với đối số

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
43 cho trình trang trí
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
46:

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
6

Làm việc với các đối tượng dịch lười

Kết quả của một cuộc gọ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,
}
9 có thể được sử dụng bất cứ nơi nào bạn sẽ sử dụng một chuỗi (đối tượ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)
48) trong mã Django khác, nhưng nó có thể không hoạt động với mã Python tùy ý. Ví dụ: công việc sau đây của won vì thư viện yêu cầu không xử lý các đối tượ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)
49:

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
7

Bạn có thể tránh các vấn đề như vậy bằng cách chuyển các đối tượng

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,
}
9 vào các chuỗi văn bản trước khi chuyển chúng sang mã không phải là Django:

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
8

Nếu bạn không thích tê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)
49 dài, bạn có thể bí danh nó 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 (nhấn mạnh), như vậ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)
3

Sử dụng

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,
}
9 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)
54 để đánh dấu các chuỗi trong các mô hình và chức năng tiện ích là một hoạt động phổ biến. Khi bạn làm việc với các đối tượng này ở nơi khác trong mã của bạn, bạn nên đảm bảo rằng bạn không vô tình chuyển đổi chúng thành chuỗi, vì chúng nên được chuyển đổi càng muộn càng tốt (do đó địa phương chính xác có hiệu lực). Điều này đòi hỏi phải sử dụng chức năng trợ giúp được mô tả tiếp theo.

Bản dịch lười biếng và số nhiều

Khi sử dụng bản dịch lười cho chuỗi 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)
55), bạn thường không biết đối số
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
56 tại thời điểm định nghĩa chuỗi. Do đó, bạn được ủy quyền để chuyển một tên khóa thay vì số nguyên như đối số
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
56. Sau đó
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
56 sẽ được tra cứu trong từ điển dưới khóa đó trong quá trình nội suy chuỗi. Đây là ví dụ:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
0

Nếu chuỗi chứa chính xác một trình giữ chỗ không tên, bạn có thể nội suy trực tiếp với đối số

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
56:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
1

Chuỗi định dạng: ________ 160¶

Phương pháp Python 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)
61 sẽ không hoạt động khi
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
62 hoặc bất kỳ đối số nào đối với
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
61 có chứa các đối tượng dịch lười biếng. Thay vào đó, bạn có thể 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)
64, tạo ra một đối tượng lười biếng chỉ chạy phương thứ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)
61 khi kết quả được bao gồm trong một chuỗi. Ví dụ:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
2

Trong trường hợp này, các bản dịch lười biếng 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)
66 sẽ chỉ được chuyển đổi thành các chuỗi khi bản thâ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)
66 được sử dụng trong một chuỗi (thường là ở thời gian hiển thị mẫu).

Các công dụng lười biếng khác trong các bản dịch bị trì hoãn

Đối với bất kỳ trường hợp nào khác mà bạn muốn trì hoãn bản dịch, nhưng phải chuyển chuỗi có thể dịch làm đối số cho một hàm khác, bạn có thể bọc chức năng này bên trong một cuộc gọi lười biếng. Ví dụ:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
3

Và sau đó:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
4

Tên cục bộ của các ngôn ngữ

________ 168 (Lang_Code) [Nguồn] ¶lang_code)[source]

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)
69 cung cấp thông tin chi tiết về ngôn ngữ:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
5

Các thuộc tí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)
22,
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
71 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)
72 của từ điển chứa tên của ngôn ngữ trong tiếng Anh, trong chính ngôn ngữ và trong ngôn ngữ hoạt động hiện tại của bạn tương ứng. Thuộc tí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)
73 chỉ đúng đối với các ngôn ngữ hai chiều.

Nguồn của thông tin ngôn ngữ là mô -đun

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
74. Truy cập tương tự vào thông tin này có sẵn cho mã mẫu. Xem bên dưới.

Quốc tế hóa: Trong mã mẫu

Các bản dịch trong các mẫu django sử dụng hai thẻ mẫu và cú pháp hơi khác so với mã Python. Để cung cấp cho mẫu của bạn quyền truy cập vào các thẻ này, hãy đặ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)
75 về phía đầu mẫu của bạn. Như với tất cả các thẻ mẫu, thẻ này cần được tải trong tất cả các mẫu sử dụng các bản dịch, ngay cả các mẫu mở rộng từ các mẫu khác đã tải thẻ
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
76.Django templates uses two template tags and a slightly different syntax than in Python code. To give your template access to these tags, put
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
75 toward the top of your template. As with all template tags, this tag needs to be loaded in all templates which use translations, even those templates that extend from other templates which have already loaded the
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
76 tag.

Cảnh báo

Các chuỗi dịch sẽ không được thoát ra khi được hiển thị trong một mẫu. Điều này cho phép bạn đưa HTML vào các bản dịch, ví dụ để nhấn mạnh, nhưng các ký tự nguy hiểm có khả nă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)
77) cũng sẽ không thay đổi.

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 Thẻ mẫu

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)
79 dịch một chuỗi không đổi (được đặt trong trích dẫn đơn hoặc kép) hoặc nội dung biến:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
6

Nếu tùy chọ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)
80 có mặt, tra cứu biến vẫn diễn ra nhưng bản dịch bị bỏ qua. Điều này rất hữu ích khi có nội dung của người ta sẽ yêu cầu dịch trong tương lai:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
7

Trong nội bộ, các bản dịch nội tuyến sử dụng cuộc gọ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,
}
4.

Trong trường hợp một mẫu var (

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
82 ở trên) được chuyển đến thẻ, thẻ trước tiên sẽ giải quyết biến đó thành một chuỗi vào thời gian chạy và sau đó tra cứu chuỗi đó trong danh mục thông báo.

Nó không thể trộn một biến mẫu bên trong một chuỗi 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)
79. Nếu bản dịch của bạn yêu cầu các chuỗi với các biến (giữ chỗ), hãy 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)
84 thay thế.

Nếu bạn muốn truy xuất một chuỗi được dịch mà không hiển thị nó, bạn có thể sử dụng cú pháp sau:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
8

Trong thực tế, bạn sẽ sử dụng điều này để có được một chuỗi bạn có thể sử dụng ở nhiều nơi trong một mẫu hoặc bạn có thể sử dụng đầu ra làm đối số cho các thẻ hoặc bộ lọc mẫu khác:

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
9

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
79 cũng hỗ trợ các dấu hiệu theo ngữ cảnh bằng cách sử dụng từ khóa
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
86:contextual markers using the
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
86 keyword:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
0

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 Thẻ mẫu

Ngược lại với thẻ

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, thẻ
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 cho phép bạn đánh dấu các câu phức tạp bao gồm các chữ cái và nội dung biến để dịch bằng cách sử dụng các trình giữ chỗ:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
1

Để dịch một biểu thức mẫu - giả sử, truy cập các thuộc tính đối tượng hoặc sử dụng các bộ lọc mẫu - bạn cần liên kết biểu thức với một biến cục bộ để sử dụng trong khối dịch. Ví dụ:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
2

Bạn có thể sử dụng nhiều biểu thức bên trong một thẻ

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:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
3

Ghi chú

Định dạng dài hơn trước đó vẫn được hỗ trợ:

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
91

Các thẻ khối khác (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)
92 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)
93) không được phép bên trong thẻ
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.

Nếu việc giải quyết một trong các đối số khối không thành cô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)
31 sẽ quay trở lại ngôn ngữ mặc định bằng cách hủy kích hoạt ngôn ngữ hiện đang hoạt động tạm thời với 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)
96.

Thẻ này cũng cung cấp cho đa nguyên hóa. Để dùng nó:

  • Chỉ định và liên kết một giá trị bộ đếm với tê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. Giá trị này sẽ là một giá trị được sử dụng để chọn đúng dạng số nhiều.
  • Chỉ định cả hai dạng số ít và số nhiều ngăn cách chúng với thẻ
    from django.http import HttpResponse
    from django.utils.translation import gettext
    
    def my_view(request):
        output = gettext("Welcome to my site.")
        return HttpResponse(output)
    
    98 trong các thẻ
    from django.http import HttpResponse
    from django.utils.translation import gettext
    
    def my_view(request):
        output = gettext("Welcome to my site.")
        return HttpResponse(output)
    
    84 và
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    00.

Một ví dụ:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
4

Một ví dụ phức tạp hơn:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
5

Khi bạn sử dụng cả tính năng đa nguyên hóa và giá trị liên kết với các biến cục bộ ngoài giá trị bộ đếm, hãy nhớ rằng cấu 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)
31 được chuyển đổi nội bộ thành cuộc gọi
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
02. Điều này có nghĩa là các ghi chú tương tự liên quan đến các biến ngetText áp dụng.notes regarding ngettext variables apply.

Không thể thực hiện tra cứu URL ngược 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)
31 và nên được truy xuất (và lưu trữ) trước đó:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
6

Nếu bạn muốn truy xuất một chuỗi được dịch mà không hiển thị nó, bạn có thể sử dụng cú pháp sau:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
7

Trong thực tế, bạn sẽ sử dụng điều này để có được một chuỗi bạn có thể sử dụng ở nhiều nơi trong một mẫu hoặc hơn bạn có thể sử dụng đầu ra làm đối số cho các thẻ hoặc bộ lọc mẫu khá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)
84 cũng hỗ trợ các dấu hiệu theo ngữ cảnh bằng cách sử dụng từ khóa
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
86:contextual markers using the
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
86 keyword:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
8

Một tính năng khác hỗ trợ

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
84 là tùy chọn
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
07. Tùy chọn này sẽ xóa các ký tự mới từ đầu và phần cuối của nội dung của thẻ
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
84, thay thế bất kỳ khoảng trắng nào ở đầu và cuối dòng và hợp nhất tất cả các dòng thành một dòng bằng cách sử dụng ký tự không gian để tách chúng. Điều này khá hữu ích cho việc thụt nội dung của thẻ
from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
84 mà không có các ký tự thụt kết thúc trong mục nhập tương ứng 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, giúp quá trình dịch dễ dàng hơn.

Chẳng hạn, thẻ

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
84 sau:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
9

sẽ dẫn đến mục nhập

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
12 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, so với
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
14, nếu tùy chọn
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
07 chưa được chỉ định.

Chuyển đổi ngôn ngữ trong các mẫu

Nếu bạn muốn chọn một ngôn ngữ trong một mẫu, bạn có thể sử dụng thẻ mẫu

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
16:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
0

Mặc dù lần xuất hiện đầu tiên của Chào mừng bạn đến với trang của chúng tôi, sử dụng ngôn ngữ hiện tại, thì lần thứ hai sẽ luôn bằng tiếng Anh.

Quốc tế hóa: Trong mã JavaScript

Thêm bản dịch vào JavaScript đặt ra một số vấn đề:

  • Mã JavaScript không có quyền truy cập vào triển khai
    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.
  • Mã JavaScript không có quyền truy cập vào các 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 hoặc
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    19; Họ cần được cung cấp bởi máy chủ.
  • Các danh mục dịch cho JavaScript nên được giữ càng nhỏ càng tốt.

Django cung cấp một giải pháp tích hợp cho các vấn đề này: nó chuyển các bản dịch sang JavaScript, vì vậy bạn có thể gọ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,
}
6, v.v., từ bên trong JavaScript.

Giải pháp chính cho những vấn đề này là chế độ xem

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
21 sau đây, tạo ra thư viện mã JavaScript với các chức năng bắt chước giao diệ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, cộng với một loạt các chuỗi dịch.

Chế độ xem def my_view(request): words = ['Welcome', 'to', 'my', 'site.'] output = _(' '.join(words)) return HttpResponse(output) 21

Lớp ________ 221¶
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
21¶

Một quan điểm tạo ra thư viện mã JavaScript với các chức năng bắt chước giao diệ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, cộng với một loạt các chuỗi dịch.

Thuộc tính

________ 226¶

Miền dịch chứa chuỗi để thêm vào đầu ra xem. Mặc định là

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
27.

________ 228¶

Danh sách

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
29 trong số các ứng dụng được cài đặt. Những ứng dụng đó phải chứa thư mục
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
30. Tất cả các danh mục cộng với tất cả các danh mục được tìm thấy trong
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
31 (luôn được bao gồm) được hợp nhất thành một danh mục. Mặc định là
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
32, có nghĩa là tất cả các bản dịch có sẵn từ tất cả
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
33 được cung cấp trong đầu ra JavaScript.

Ví dụ với các giá trị mặc định::

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
1

Ví dụ với các gói tùy chỉnh::

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
2

Nếu URLConf gốc của bạn sử dụng

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34,
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
21 cũng phải được gói bởi
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34 để danh mục được tạo chính xác.

Ví dụ với

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34:
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
3

Ưu tiên của các bản dịch là các gói xuất hiện sau đó trong đối số

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
28 có ưu tiên cao hơn các gói xuất hiện ở đầu. Điều này rất quan trọng trong trường hợp các bản dịch đụng độ cho cùng một nghĩa đen.

Nếu bạn sử dụng nhiều hơn một chế độ xem

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
21 trên một trang web và một số trong số chúng xác định cùng một chuỗi, thì các chuỗi trong danh mục đã được tải trước lần cuối.

Sử dụng danh mục dịch JavaScript

Để sử dụng danh mục, hãy kéo tập lệnh được tạo động như thế này:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
4

Điều này sử dụng tra cứu URL ngược để tìm URL của chế độ xem danh mục JavaScript. Khi danh mục được tải, mã JavaScript của bạn có thể sử dụng các phương thức sau:

  • 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
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    02
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    42
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    43
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    44
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    45
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    46
  • def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    47

________ 86¶

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,
}
6 hoạt động tương tự như giao diệ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 tiêu chuẩn trong mã Python của bạn:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
5

________ 202¶

Hàm

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
02 cung cấp một giao diện để số nhiều các từ và cụm từ:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
6

________ 242¶

Hàm

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
42 hỗ trợ động tạo một chuỗi định dạng. Cú pháp nội suy được mượn từ Python, vì vậy hàm
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
42 hỗ trợ cả nội suy vị trí và được đặt tên:

  • Nội suy vị trí:

    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    56 chứa một đối tượng mảng JavaScript có các giá trị phần tử sau đó được nội suy tuần tự của họ trong trình giữ chỗ
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    57 tương ứng của chúng theo cùng thứ tự chúng xuất hiện. Ví dụ:

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    7

  • Nội suy được đặt tên: Chế độ này được chọn bằng cách chuyển tham số Boolean

    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    58 tùy chọn là
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    59.
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    56 chứa một đối tượng JavaScript hoặc mảng kết hợp. Ví dụ:

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    8

Mặc dù vậy, bạn không nên đi qua đầu với phép nội suy chuỗi: đây vẫn là JavaScript, vì vậy mã phải thực hiện các thay thế biểu hiện thường xuyên lặp đi lặp lại. Đây là một cách nhanh chóng như phép nội suy chuỗi trong Python, vì vậy hãy giữ nó đến những trường hợp mà bạn thực sự cần nó (ví dụ, kết hợp với

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
02 để tạo ra số nhiều phù hợp).

________ 244¶

Điều này mô phỏng chức năng

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 nhưng không làm gì, trả lại bất cứ điều gì được chuyển cho nó:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
9

Điều này rất hữu ích để ngăn chặn các phần của mã sẽ cần dịch trong tương lai.

________ 245¶

Hàm

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
45 hoạt động giống như biến thể Python (
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
66), cung cấp một từ được dịch theo ngữ cảnh:

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)
0

________ 246¶

Hàm

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
46 cũng hoạt động giống như biến thể Python (
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
69), cung cấp một từ được dịch theo ngữ cảnh số nhiều:pluralized contextually translated word:

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)
1

________ 247¶

Hàm

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
47 hoạt động theo cách tương tự như bộ lọc mẫu
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
72, xác định xem
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 đã cho có nên sử dụng dạng số nhiều của một từ hay không:

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)
2

Trong trường hợp đơn giản nhất, nếu không cần nhiều đa nguyên tùy chỉnh, điều này sẽ trả về

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
74 cho số nguyên
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
75 và
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
59 cho tất cả các số khác.

Tuy nhiên, đa nguyên hóa không đơn giản trong tất cả các ngôn ngữ. Nếu ngôn ngữ không hỗ trợ đa hóa, một giá trị trống được cung cấp.

Ngoài ra, nếu có các quy tắc phức tạp xung quanh đa nguyên hóa, chế độ xem danh mục sẽ đưa ra một biểu thức có điều kiện. Điều này sẽ đánh giá thành giá trị

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
59 (nên số nhiều) hoặc
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
74 (không nên số nhiều).not pluralize) value.

Chế độ xem def my_view(request): words = ['Welcome', 'to', 'my', 'site.'] output = _(' '.join(words)) return HttpResponse(output) 79

Lớp ________ 279¶
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
79¶

Để sử dụng một thư viện phía máy khách khác để xử lý các bản dịch, bạn có thể muốn tận dụng chế độ xem

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
79. Nó tương tự như
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
21 nhưng trả về phản hồi JSON.

Xem tài liệu cho

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
21 để tìm hiểu về các giá trị có thể có và sử dụng các thuộc tính
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
26 và
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
28.

Định dạng phản hồi như sau:

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)
3

Lưu ý về Performance¶

Các chế độ xem JavaScript/JSON I18N khác nhau tạo ra danh mục từ các tệp

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19 trên mỗi yêu cầu. Vì đầu ra của nó không đổi, ít nhất là đối với một phiên bản nhất định của một trang web, nên nó là một ứng cử viên tốt cho bộ nhớ đệm.

Bộ nhớ đệm phía máy chủ sẽ giảm tải CPU. Nó dễ dàng thực hiện với nhà trang trí

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
87. Để kích hoạt sự vô hiệu của bộ đệm khi dịch của bạn thay đổi, hãy cung cấp tiền tố khóa phụ thuộc phiên bản, như được hiển thị trong ví dụ dưới đây hoặc ánh xạ chế độ xem tại URL phụ thuộc phiên bản:

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)
4

Bộ nhớ đệm phía máy khách sẽ lưu băng thông và làm cho trang web của bạn tải nhanh hơn. Nếu bạn sử dụng ETAGS (

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
88), bạn đã được bảo hiểm. Nếu không, bạn có thể áp dụng các nhà trang trí có điều kiện. Trong ví dụ sau, bộ đệm bị vô hiệu bất cứ khi nào bạn khởi động lại máy chủ ứng dụng của mình:conditional decorators. In the following example, the cache is invalidated whenever you restart your application server:

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)
5

Bạn thậm chí có thể tạo trước danh mục JavaScript như một phần của quy trình triển khai của bạn và phục vụ nó dưới dạng tệp tĩnh. Kỹ thuật triệt để này được thực hiện trong Django-statici18n.

Quốc tế hóa: Trong các mẫu URL

Django cung cấp hai cơ chế để quốc tế hóa các mẫu URL:

  • Thêm tiền tố ngôn ngữ vào gốc của các mẫu URL để giúp
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    89 có thể phát hiện ngôn ngữ để kích hoạt từ URL được yêu cầu.
  • Tự tạo các mẫu URL có thể dịch thông qua hàm
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    90.

Tiền tố ngôn ngữ trong các mẫu URL

________ 291 (*urls, prefix_default_langage = true) ¶*urls, prefix_default_language=True

Hàm này có thể được sử dụng trong URLConf gốc và Django sẽ tự động đóng góp mã ngôn ngữ hoạt động hiện tại cho tất cả các mẫu URL được xác định trong

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34.

Cài đặt

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
93 thành
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
94 loại bỏ tiền tố khỏi ngôn ngữ mặc định (
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
95). Điều này có thể hữu ích khi thêm các bản dịch vào trang web hiện có để các URL hiện tại giành được thay đổi.

Ví dụ mẫu URL:

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)
6

Sau khi xác định các mẫu URL này, Django sẽ tự động thêm tiền tố ngôn ngữ vào các mẫu URL được thêm vào chức năng

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
91. Thí 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)
7

Với

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
97 và
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
98, các URL sẽ là:

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)
8

Cảnh báo

Đảm bảo rằng bạn không có các mẫu URL không bị cắt có thể va chạm với tiền tố ngôn ngữ tự động được thêm vào.

Dịch các mẫu URL

Các mẫu URL cũng có thể được đánh dấu 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,
}
9. Thí 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)
9

Sau khi bạn tạo ra các bản dịch, hàm

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
00 sẽ trả về URL bằng ngôn ngữ hoạt động. Thí dụ:

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
}
0

Cảnh báo

Trong hầu hết các trường hợp, tốt nhất là sử dụng các URL được dịch trong một khối tiền tố của mã ngôn ngữ (sử dụng

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34), để tránh khả năng URL được dịch bất cẩn gây ra va chạm với mẫu URL không được dịch.

Đảo ngược trong các mẫu

Nếu các URL cục bộ bị đảo ngược trong các mẫu, họ luôn sử dụng ngôn ngữ hiện tại. Để liên kết đến URL trong ngôn ngữ khác, hãy sử dụng thẻ mẫu

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
16. Nó cho phép ngôn ngữ đã cho trong phần mẫu kèm theo:

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
}
1

Thẻ

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
16 mong đợi mã ngôn ngữ là đối số duy nhất.

Bản địa hóa: Cách tạo tệp ngôn ngữ

Khi các chuỗi chữ của một ứng dụng đã được gắn thẻ cho bản dịch sau, bản thân dịch cần phải được viết (hoặc thu được). Đây là cách thức hoạt động.

Tệp tin nhắn

Bước đầu tiên là tạo một tệp tin nhắn cho một ngôn ngữ mới. Một tệp tin nhắn là một tệp văn bản đơn giản, đại diện cho một ngôn ngữ duy nhất, chứa tất cả các chuỗi dịch có sẵn và cách chúng nên được biểu diễn bằng ngôn ngữ đã cho. Tệp tin nhắn có phần mở rộng 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.message file for a new language. A message file is a plain-text file, representing a single language, that contains all available translation strings and how they should be represented in the given language. Message files have a
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 file extension.

Django đi kèm với một công 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)
02, tự động hóa việc tạo và bảo trì các tệp này.

Tiện ích GetText

Lệnh

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 (và
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
07 đã thảo luận sau) sử dụng các lệnh từ bộ công cụ GNU GetText:
a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
6,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
09,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
10 và
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
11.

Phiên bản tối thiểu của các tiện ích

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 hỗ trợ là 0,15.

Để tạo hoặc cập nhật tệp tin nhắn, hãy chạy lệnh này:

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
}
2

Trong đó

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
13 là tên ngôn ngữ cho tệp tin nhắn bạn muốn tạo. Ví dụ,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
14 cho người Bồ Đào Nha Brazil,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
15 cho người Đức Áo hoặc
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
16 cho người Indonesia.locale name for the message file you want to create. For example,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
14 for Brazilian Portuguese,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
15 for Austrian German or
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
16 for Indonesian.

Kịch bản nên được chạy từ một trong hai nơi:

  • Thư mục gốc của dự án Django của bạn (dự án chứa
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    17).
  • Thư mục gốc của một trong các ứng dụng Django của bạn.

Kịch bản chạy qua cây nguồn dự án hoặc cây nguồn ứng dụng của bạn và rút ra tất cả các chuỗi được đánh dấu để dịch (xem cách Django phát hiện ra các bản dịch và chắc chắn

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
31 được cấu hình chính xác). Nó tạo (hoặc cập nhật) một tệp tin nhắn trong thư mục
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
19. Trong ví dụ
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
13, tệp sẽ là
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
21.How Django discovers translations and be sure
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
31 is configured correctly). It creates (or updates) a message file in the directory
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
19. In the
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
13 example, the file will be
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
21.

Khi bạn chạy

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 từ thư mục gốc của dự án, các chuỗi được trích xuất sẽ được tự động phân phối cho các tệp tin nhắn thích hợp. Đó là, một chuỗi được trích xuất từ ​​một tệp của một ứng dụng chứa thư mục
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
30 sẽ được đi trong một tệp tin nhắn trong thư mục đó. Một chuỗi được trích xuất từ ​​một tệp của một ứng dụng mà không có bất kỳ thư mục
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
30 nào sẽ vào một tệp tin nhắn trong thư mục được liệt kê đầu tiên trong
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
31 hoặc sẽ tạo lỗi nếu
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
31 trống.

Theo mặc định, ____102 kiểm tra mọi tệp có phần mở rộng tệp

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
28,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
29 hoặc
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
30. Nếu bạn muốn ghi đè mặc định đó, hãy sử dụng tùy chọn
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
31 hoặc
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
32 để chỉ định các tiện ích mở rộng tệp để kiểm tra:

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
}
3

Tách nhiều tiện ích mở rộng với dấu phẩy và/hoặc sử dụng

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
32 hoặc
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
31 nhiều lần:

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
}
4

Sử dụng các mẫu jinja2?

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 không hiểu cú pháp của các mẫu jinja2. Để trích xuất các chuỗi từ một dự án có chứa các mẫu jinja2, thay vào đó, hãy sử dụng trích xuất tin nhắn từ Babel.

Ở đây, một ví dụ

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
36 Tệp cấu hình:

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
}
5

Hãy chắc chắn rằng bạn liệt kê tất cả các tiện ích mở rộng mà bạn sử dụng! Nếu không, Babel đã giành được nhận ra các thẻ được xác định bởi các tiện ích mở rộng này và sẽ bỏ qua các mẫu Jinja2 hoàn toàn có chứa chúng.

Babel cung cấp các tính năng tương tự như

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7, có thể thay thế nó nói chung và không phụ thuộc vào
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. Để biết thêm thông tin, hãy đọc tài liệu của nó về việc làm việc với các danh mục tin nhắn.

Không có gettext?

Nếu bạn không cài đặt các tiện ích

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,
a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 sẽ tạo các tệp trống. Nếu trường hợp đó, thì hãy cài đặt các tiện ích
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 hoặc sao chép tệp tin nhắn tiếng Anh (
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
42) nếu có và sử dụng nó làm điểm bắt đầu, đây là một tệp dịch trống.

Làm việc trên Windows?

Nếu bạn sử dụng Windows và cần cài đặt các tiện ích GNU GetText để

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 hoạt động, hãy xem getText trên Windows để biết thêm thông tin.gettext on Windows for more information.

Mỗi 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 chứa một chút siêu dữ liệu, chẳng hạn như thông tin liên hệ của Trình bảo trì dịch thuật, nhưng phần lớn tệp là danh sách các thông điệp - ánh xạ giữa các chuỗi dịch và văn bản được dịch thực tế cho ngôn ngữ cụ thể.messages – mappings between translation strings and the actual translated text for the particular language.

Ví dụ: nếu ứng dụng Django của bạn chứa chuỗi dịch cho 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, như vậy:

Sau đó,

from django.http import HttpResponse
from django.utils.translation import gettext

def my_view(request):
    output = gettext("Welcome to my site.")
    return HttpResponse(output)
02 sẽ tạo một 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 chứa đoạn trích sau - một thông báo:

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
}
6

Một lời giải thích nhanh:

  • def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    48 là chuỗi dịch, xuất hiện trong nguồn. Don lồng thay đổi nó.
  • def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    49 là nơi bạn đặt bản dịch cụ thể về ngôn ngữ. Nó bắt đầu trống rỗng, vì vậy, nó có trách nhiệm của bạn để thay đổi nó. Hãy chắc chắn rằng bạn giữ các trích dẫn xung quanh bản dịch của bạn.
  • Để thuận tiện, mỗi tin nhắn bao gồm, dưới dạng một dòng bình luận có tiền tố với
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    50 và nằm phía trên dòng
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    48, tên tệp và số dòng mà chuỗi dịch được lượm lặt.

Tin nhắn dài là một trường hợp đặc biệt. Ở đó, chuỗi đầu tiên trực tiếp sau

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
49 (hoặc
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
48) là một chuỗi trống. Sau đó, chính nội dung sẽ được viết trên một vài dòng tiếp theo là một chuỗi trên mỗi dòng. Những chuỗi đó được nối trực tiếp. Don Tiết quên không gian dấu vết trong dây; Nếu không, họ sẽ được xử lý với nhau mà không có khoảng trắng!

Tâm trí ký tự của bạn

Do cách các công 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 hoạt động trong nội bộ và vì chúng tôi muốn cho phép các chuỗi nguồn không ASCII trong lõi Django và các ứng dụng của bạn, bạn phải sử dụng UTF-8 làm mã hóa cho các 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 của bạn (mặc định khi các 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 được tạo). Điều này có nghĩa là mọi người sẽ sử dụng cùng một mã hóa, điều này rất quan trọng khi Django xử lý các 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.must use UTF-8 as the encoding for your
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 files (the default when
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 files are created). This means that everybody will be using the same encoding, which is important when Django processes the
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 files.

Mục nhập mờ

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 Đôi khi tạo các mục dịch được đánh dấu là mờ, ví dụ: Khi các bản dịch được suy ra từ các chuỗi được dịch trước đó. Theo mặc định, các mục mờ không được xử lý bởi
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
07.not processed by
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
07.

Để xem xét lại tất cả các mã và mẫu nguồn cho chuỗi dịch mới và cập nhật tất cả các tệp tin nhắn cho tất cả các ngôn ngữ, hãy chạy điều này:all languages, run this:

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
}
7

Biên dịch các tệp tin nhắn

Sau khi bạn tạo tệp tin nhắn của mình - và mỗi lần bạn thay đổi nó - bạn sẽ cần phải biên dịch nó thành một dạng hiệu quả hơn, để sử dụng 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,
}
6. Làm điều này với tiện ích
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
61.

Công cụ này chạy trên tất cả các 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 có sẵn và tạo các tệp
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19, là các tệp nhị phân được tối ưu hóa để sử dụng 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,
}
6. Trong cùng một thư mục mà bạn đã 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)
02, chạy
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
61 như thế này:

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
}
8

Đó là nó. Bản dịch của bạn đã sẵn sàng để 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)
27 Tệp: Mã hóa và sử dụng BOM.

Django chỉ hỗ trợ các 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 được mã hóa trong UTF-8 và không có bất kỳ BOM nào (đánh dấu thứ tự byte), vì vậy nếu trình soạn thảo văn bản của bạn thêm các điểm như vậy để bắt đầu các tệp theo mặc định thì bạn sẽ cần phải cấu hình lại nó.

Khắc phục sự 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 Phát hiện không chính xác def my_view(request): sentence = 'Welcome to my site.' output = _(sentence) return HttpResponse(output) 70 trong chuỗi với phần trăm dấu hiệu

Trong một số trường hợp, chẳng hạn như các chuỗi có dấu phần trăm theo sau là không gian và loại chuyển đổi chuỗi (ví dụ:

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
71),
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 không chính xác các chuỗi các chuỗi với
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
70.string conversion type (e.g.
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
71),
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 incorrectly flags strings with
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
70.

Nếu bạn cố gắng biên dịch các tệp tin nhắn với các chuỗi được gắn cờ không chính xác, bạn sẽ nhận được thông báo lỗi như

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
74 hoặc
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
75.

Để giải quyết vấn đề này, bạn có thể thoát khỏi các dấu hiệu phần trăm bằng cách thêm một dấu hiệu phần trăm thứ hai:

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
}
9

Hoặc bạn có thể sử dụng

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
76 để tất cả các dấu hiệu phần trăm được coi là nghĩa đen:

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,
}
0

Tạo tệp tin nhắn từ mã nguồn JavaScript

Bạn tạo và cập nhật các tệp tin nhắn giống như các tệp tin nhắn Django khác - với công 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)
02. Sự khác biệt duy nhất là bạn cần chỉ định rõ ràng những gì theo cách nói GetText được gọi là miền trong trường hợp này là miền
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
78, bằng cách cung cấp tham số
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
79, như thế này:

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,
}
1

Điều này sẽ tạo hoặc cập nhật tệp tin nhắn cho JavaScript cho tiếng Đức. Sau khi cập nhật các tệp tin nhắn, hãy chạy

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
61 giống như bạn làm với các tệp tin nhắn Django thông thường.

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 trên Windows¶

Điều này chỉ cần thiết cho những người muốn trích xuất ID tin nhắn hoặc biên dịch các tệp tin nhắ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)
27). Bản thân công việc dịch thuật liên quan đến việc chỉnh sửa các tệp hiện có thuộc loại này, nhưng nếu bạn muốn tạo tệp tin nhắn của riêng mình hoặc muốn kiểm tra hoặc biên dịch tệp tin nhắn đã thay đổi, hãy tải xuống trình cài đặt nhị phân được biên dịch trước.

Bạn cũng có thể sử dụng các nhị phâ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 mà bạn đã thu được ở nơi khác, miễn là lệnh
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
84 hoạt động đúng. Không cố gắng sử dụng các tiện ích dịch Django với gó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,
}
6 nếu lệnh
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
86 được nhập tại dấu nhắc lệnh Windows gây ra một cửa sổ bật lên nói rằng ____ ____387 đã tạo ra lỗi và sẽ bị đóng bởi windows.

Tùy chỉnh lệnh a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid' 7

Nếu bạn muốn chuyển các tham số bổ sung cho

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
6, bạn cần tạo lệnh
a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 tùy chỉnh và ghi đè thuộc tính
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
91 của nó:

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,
}
2

Nếu bạn cần linh hoạt hơn, bạn cũng có thể thêm một đối số mới vào lệnh

a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
7 tùy chỉnh của mình:

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,
}
3

Điều khoản khác¶

Chế độ xem chuyển hướng def my_view(request): sentence = 'Welcome to my site.' output = _(sentence) return HttpResponse(output) 93

________ 393 (yêu cầu) ¶request

Để thuận tiện, Django đi kèm với chế độ xem,

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
95, đặt sở thích ngôn ngữ của người dùng và chuyển hướng đến một URL nhất định hoặc, theo mặc định, trở lại trang trước.

Kích hoạt chế độ xem này bằng cách thêm dòng sau vào URLConf của bạn:

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,
}
4

(Lưu ý rằng ví dụ này làm cho chế độ xem có sẵn tại

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
96.)

Cảnh báo

Hãy chắc chắn rằng bạn không bao gồm URL trên trong

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
34 - nó cần phải tự phụ thuộc ngôn ngữ để hoạt động chính xác.

Chế độ xem dự kiến ​​sẽ được gọi thông qua phương thức

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
98, với tham số
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
16 được đặt trong yêu cầu. Nếu hỗ trợ phiên được bật, chế độ xem sẽ lưu lựa chọn ngôn ngữ trong phiên của người dùng. Nó cũng lưu lựa chọn ngôn ngữ trong một cookie được đặt tên là
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
00 theo mặc định. (Tên có thể được thay đổi thông qua cài đặt
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
01.)

Sau khi đặt lựa chọn ngôn ngữ, Django tìm kiếm tham số

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
02 trong dữ liệu
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
98 hoặc
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
04. Nếu điều đó được tìm thấy và Django coi đó là một URL an toàn (tức là nó không chỉ ra một máy chủ khác và sử dụng sơ đồ an toàn), thì việc chuyển hướng đến URL đó sẽ được thực hiện. Mặt khác, Django có thể quay trở lại để chuyển hướng người dùng đến URL từ tiêu đề
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
05 hoặc, nếu nó không được đặt, thành
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
06, tùy thuộc vào bản chất của yêu cầu:

  • Nếu yêu cầu chấp nhận nội dung HTML (dựa trên tiêu đề
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    07 HTTP), dự phòng sẽ luôn được thực hiện.
  • Nếu yêu cầu không chấp nhận HTML, dự phòng sẽ chỉ được thực hiện nếu tham số
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    02 được đặt. Nếu không, mã trạng thái 204 (không có nội dung) sẽ được trả về.

Tại đây, ví dụ về mã mẫu HTML:

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,
}
5

Trong ví dụ này, Django tra cứu URL của trang mà người dùng sẽ được chuyển hướng trong biến bối cảnh

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
09.

Cài đặt rõ ràng ngôn ngữ hoạt động

Bạn có thể muốn đặt ngôn ngữ hoạt động cho phiên hiện tại một cách rõ ràng. Có lẽ một sở thích ngôn ngữ của người dùng được lấy từ một hệ thống khác, ví dụ. Bạn đã được giới thiệu đến

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
10. Chỉ áp dụng cho chủ đề hiện tại. Để tồn tại ngôn ngữ cho toàn bộ phiên trong cookie, hãy đặt cookie
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
01 trên phản hồi:

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,
}
6

Thông thường bạn muốn sử dụng cả hai:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
10 thay đổi ngôn ngữ cho chủ đề này và việc đặt cookie làm cho ưu tiên này vẫn tồn tại trong các yêu cầu trong tương lai.

Sử dụng các bản dịch bên ngoài chế độ xem và mẫu

Mặc dù Django cung cấp một bộ công cụ i18n phong phú để sử dụng trong các chế độ xem và mẫu, nhưng nó không hạn chế việc sử dụng mã dành riêng cho Django. Các cơ chế dịch Django có thể được sử dụng để dịch các văn bản tùy ý sang bất kỳ ngôn ngữ nào được hỗ trợ bởi Django (tất nhiên là miễn là một danh mục dịch phù hợp tồn tại). Bạn có thể tải một danh mục dịch, kích hoạt nó và dịch văn bản sang ngôn ngữ bạn chọn, nhưng hãy nhớ chuyển sang ngôn ngữ gốc, vì việc kích hoạt một danh mục dịch được thực hiện trên cơ sở mỗi luồng và thay đổi đó sẽ ảnh hưởng đến mã chạy trong cùng một luồng .

Ví dụ:

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,
}
7

Gọi hàm này với giá trị

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
13 sẽ cung cấp cho bạn
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
14, bất kể
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
95 và ngôn ngữ được đặt bởi phần mềm trung gian.

Các chức năng cụ thể là

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
16 trả về ngôn ngữ được sử dụng trong luồng hiện tại,
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
10 kích hoạt danh mục dịch cho luồng hiện tại và
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
18 kiểm tra xem ngôn ngữ đã cho có được Django hỗ trợ hay không.

Để giúp viết mã ngắn gọn hơn, cũng có Trình quản lý ngữ cảnh

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
19 lưu trữ ngôn ngữ hiện tại trên ENTER và khôi phục nó khi thoát. Với nó, ví dụ trên trở thành:

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,
}
8

Ghi chú thực hiện

Đặc sản của Django Dịch

Máy móc dịch Django từ sử dụng 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 tiêu chuẩn đi kèm với Python. Nếu bạn biế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,
}
6, bạn có thể lưu ý các đặc sản này theo cách Django thực hiện dịch:

  • Miền chuỗi là
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    22 hoặc
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    78. Miền chuỗi này được sử dụng để phân biệt giữa các chương trình khác nhau lưu trữ dữ liệu của chúng trong thư viện tệp thông báo chung (thường là
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    24). Miền
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    22 được sử dụng cho các chuỗi dịch python và mẫu và được tải vào các danh mục dịch toàn cầu. Miền
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    78 chỉ được sử dụng cho các danh mục dịch JavaScript để đảm bảo rằng chúng càng nhỏ càng tốt.
  • Django không sử dụng
    a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
    
    6 một mình. Nó sử dụng giấy gói Python vào khoảng
    a format specification for argument 'name', as in 'msgstr[0]', doesn't exist in 'msgid'
    
    6 và
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    09. Điều này chủ yếu là để thuận tiện.

Cách Django phát hiện ra sở thích ngôn ngữ

Khi bạn đã chuẩn bị các bản dịch của mình - hoặc, nếu bạn muốn sử dụng các bản dịch đi kèm với Django - bạn sẽ cần phải kích hoạt dịch cho ứng dụng của mình.

Đằng sau hậu trường, Django có một mô hình rất linh hoạt để quyết định nên sử dụng ngôn ngữ nào-toàn bộ cài đặt, cho một người dùng cụ thể hoặc cả hai.

Để đặt ưu tiên ngôn ngữ toàn cài đặt, đặt

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
95. Django sử dụng ngôn ngữ này làm bản dịch mặc định - nỗ lực cuối cùng nếu không tìm thấy bản dịch phù hợp hơn thông qua một trong các phương thức được sử dụng bởi phần mềm trung gian địa phương (xem bên dưới).

Nếu tất cả những gì bạn muốn là chạy Django với ngôn ngữ mẹ đẻ của bạn, tất cả những gì bạn cần làm là đặt

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
95 và đảm bảo các tệp tin nhắn tương ứng và phiên bản được biên dịch của chúng (
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19) tồn tại.message files and their compiled versions (
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19) exist.

Nếu bạn muốn để mỗi người dùng riêng lẻ chỉ định ngôn ngữ họ thích, thì bạn cũng cần sử dụng

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
89.
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
89 Cho phép lựa chọn ngôn ngữ dựa trên dữ liệu từ yêu cầu. Nó tùy chỉnh nội dung cho mỗi người dùng.

Để sử dụng

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
89, thêm
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
36 vào cài đặt
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
37 của bạn. Bởi vì vấn đề thứ tự phần mềm trung gian, hãy làm theo các hướng dẫn này:

  • Hãy chắc chắn rằng nó là một trong những phần mềm trung gian đầu tiên được cài đặt.
  • Nó sẽ đến sau
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    38, bởi vì
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    89 sử dụng dữ liệu phiên. Và nó sẽ đến trước
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    40 vì
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    40 cần một ngôn ngữ được kích hoạt để giải quyết URL được yêu cầu.
  • Nếu bạn sử dụng
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    42, hãy đặt
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    89 sau nó.

Ví dụ:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
37 của bạn có thể trông như thế này:

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,
}
9

(Để biết thêm về phần mềm trung gian, xem tài liệu phần mềm trung gian.)middleware documentation.)

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
89 cố gắng xác định sở thích ngôn ngữ của người dùng bằng cách làm theo thuật toán này:

  • Đầu tiên, nó tìm kiếm tiền tố ngôn ngữ trong URL được yêu cầu. Điều này chỉ được thực hiện khi bạn đang sử dụng hàm

    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    91 trong URLConf gốc của bạn. Xem Quốc tế hóa: Trong các mẫu URL để biết thêm thông tin về tiền tố ngôn ngữ và cách quốc tế hóa các mẫu URL.Internationalization: in URL patterns for more information about the language prefix and how to internationalize URL patterns.

  • Thất bại điều đó, nó tìm kiếm một cookie.

    Tên của cookie được sử dụng được đặt bởi cài đặt

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    01. (Tên mặc định là
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    00.)

  • Không thành công, nó nhìn vào tiêu đề

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    49 HTTP. Tiêu đề này được gửi bởi trình duyệt của bạn và cho máy chủ bạn thích ngôn ngữ nào, theo thứ tự theo ưu tiên. Django thử từng ngôn ngữ trong tiêu đề cho đến khi tìm thấy một bản dịch có sẵn.

  • Không thành công, nó sử dụng cài đặt toàn cầu

    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    95.

Notes:

  • Ở mỗi nơi này, sở thích ngôn ngữ dự kiến ​​sẽ ở định dạng ngôn ngữ tiêu chuẩn, như một chuỗi. Ví dụ, người Bồ Đào Nha Brazil là

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    51.language format, as a string. For example, Brazilian Portuguese is
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    51.

  • Nếu một ngôn ngữ cơ sở có sẵn nhưng ngôn ngữ được chỉ định thì không, Django sử dụng ngôn ngữ cơ sở. Ví dụ: nếu người dùng chỉ định

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    52 (tiếng Đức Áo) nhưng Django chỉ có sẵn
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    13, Django sử dụng
    def my_view(request):
        sentence = 'Welcome to my site.'
        output = _(sentence)
        return HttpResponse(output)
    
    13.

  • Chỉ có thể chọn các ngôn ngữ được liệt kê trong cài đặt

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    55. Nếu bạn muốn giới hạn lựa chọn ngôn ngữ đối với một tập hợp các ngôn ngữ được cung cấp (vì ứng dụng của bạn không cung cấp tất cả các ngôn ngữ đó), hãy đặt
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    55 thành danh sách các ngôn ngữ. Ví dụ:

    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,
    }
    
    0

    Ví dụ này hạn chế các ngôn ngữ có sẵn để chọn tự động cho tiếng Đức và tiếng Anh (và bất kỳ ngôn ngữ phụ nào, như

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    57 hoặc
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    58).

  • Nếu bạn xác định cài đặt

    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    55 tùy chỉnh, như được giải thích trong viên đạn trước đó, bạn có thể đánh dấu tên ngôn ngữ là chuỗi dịch - nhưng sử dụng
    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,
    }
    
    9 thay vì
    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 để tránh nhập tròn.

    Ở đây, một tệp cài đặt mẫu:

    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,
    }
    
    1

Sau khi

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
89 xác định ưu tiên của người dùng, nó sẽ có khả năng ưu tiên này là
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
63 cho mỗi
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
64. Hãy đọc giá trị này trong mã xem của bạn. Đây là một ví dụ:

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,
}
2

Lưu ý rằng, với bản dịch tĩnh (không có phần mềm trung gian), ngôn ngữ nằm trong

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
65, trong khi với bản dịch động (phần mềm trung gian), nó trong
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
63.

Cách Django phát hiện ra các bản dịch

Vào thời gian chạy, Django xây dựng một danh mục hợp nhất trong bộ nhớ của các dịch vụ theo nghĩa đen. Để đạt được điều này, nó tìm kiếm các bản dịch bằng cách làm theo thuật toán này liên quan đến thứ tự nó kiểm tra các đường dẫn tệp khác nhau để tải các tệp tin nhắn được biên dịch (

def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19) và ưu tiên của nhiều bản dịch cho cùng một chữ:message files (
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19) and the precedence of multiple translations for the same literal:

  1. Các thư mục được liệt kê trong
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    31 có quyền ưu tiên cao nhất, với các thư mục xuất hiện đầu tiên có quyền ưu tiên cao hơn so với những người xuất hiện sau đó.
  2. Sau đó, nó tìm kiếm và sử dụng nếu nó tồn tại một thư mục
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    30 trong mỗi ứng dụng được cài đặt được liệt kê trong
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    33. Những người xuất hiện đầu tiên có quyền ưu tiên cao hơn so với những người xuất hiện sau đó.
  3. Cuối cùng, bản dịch cơ sở do Django cung cấp trong
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    71 được sử dụng như một dự phòng.

Trong tất cả các trường hợp, tên của thư mục chứa bản dịch dự kiến ​​sẽ được đặt tên bằng ký hiệu tên địa phương. Ví dụ.

def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
13,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
14,
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
74, v.v ... Các chuỗi chưa được dịch cho các biến thể ngôn ngữ lãnh thổ sử dụng các bản dịch của ngôn ngữ chung. Ví dụ: chuỗi
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
14 chưa được dịch sử dụng các bản dịch
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
76.locale name notation. E.g.
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
13,
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
14,
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
74, etc. Untranslated strings for territorial language variants use the translations of the generic language. For example, untranslated
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
14 strings use
def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
76 translations.

Bằng cách này, bạn có thể viết các ứng dụng bao gồm các bản dịch của riêng họ và bạn có thể ghi đè các bản dịch cơ sở trong dự án của mình. Hoặc, bạn có thể xây dựng một dự án lớn trong số một số ứng dụng và đặt tất cả các bản dịch vào một tệp tin nhắn phổ biến lớn cụ thể cho dự án bạn đang soạn. Sự lựa chọn là của bạn.

Tất cả các kho lưu trữ tệp tin nhắn được cấu trúc theo cùng một cách. Họ đang:

  • Tất cả các đường dẫn được liệt kê trong
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    31 trong tệp cài đặt của bạn được tìm kiếm
    def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    78
  • def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    79
  • def my_view(request, m, d):
        output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
        return HttpResponse(output)
    
    80

Để tạo tệp tin nhắn, bạn sử dụng công 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)
02. Và bạn sử dụng
def my_view(request):
    sentence = 'Welcome to my site.'
    output = _(sentence)
    return HttpResponse(output)
61 để tạo các tệp nhị phân
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
19 được sử dụng 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,
}
6.

Bạn cũng có thể chạy

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)
85 để thực hiện xử lý trình biên dịch tất cả các thư mục trong cài đặt
def my_view(request):
    words = ['Welcome', 'to', 'my', 'site.']
    output = _(' '.join(words))
    return HttpResponse(output)
31 của bạn.

Sử dụng ngôn ngữ cơ sở không tiếng Anh

Django đưa ra giả định chung rằng các chuỗi ban đầu trong một dự án có thể dịch được viết bằng tiếng Anh. Bạn có thể chọn ngôn ngữ khác, nhưng bạn phải nhận thức được những hạn chế nhất định:

  • 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 chỉ cung cấp hai hình thức số nhiều cho các thông điệp gốc, vì vậy bạn cũng sẽ cần cung cấp một bản dịch cho ngôn ngữ cơ sở để bao gồm tất cả các dạng số nhiều nếu các quy tắc số nhiều cho ngôn ngữ cơ sở khác với tiếng Anh.
  • Khi một biến thể tiếng Anh được kích hoạt và các chuỗi tiếng Anh bị thiếu, ngôn ngữ dự phòng sẽ không phải là
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    95 của dự án, mà là các chuỗi ban đầu. Ví dụ, một người dùng tiếng Anh truy cập một trang web với
    def my_view(request):
        words = ['Welcome', 'to', 'my', 'site.']
        output = _(' '.join(words))
        return HttpResponse(output)
    
    95 được đặt thành các chuỗi tiếng Tây Ban Nha và nguyên bản được viết bằng tiếng Nga sẽ thấy văn bản Nga hơn là tiếng Tây Ban Nha.