Рубрики
Без рубрики

Интернационализация приложения Django

Узнайте, как вы можете настроить приложение Django, чтобы быть доступным на нескольких языках. Помечено Django, Python, Internationalization, I18N.

Интернационализация

Многое время мы сталкиваемся с проблемой, чтобы устроить наши приложения, что это может быть доступной на нескольких языках. Это то, что мы называем, Интернационализация Отказ

Посмотрим, как мы можем архивировать это.

Переводы Django

Перед началом, давайте клонируем наш базовый код (котировки), установите VirtualenV и инициализируйте проект.

python -m venv cat-quotes-project # Creating our virtualenv
cd cat-quotes-project
source bin/activate
git clone git@github.com:levivm/cat-quotes.git cat-quotes
cd cat-quotes
pip install -r requirements.txt
./manage.py migrate

Это должно быть нашей структурой дире

cat
├── cat
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── quotes
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── templates
    │   └── quotes.html
    ├── tests.py
    ├── urls.py
    └── views.py

Запустите свой сервер ./manage.py runserver 8000 и посетить http://localhost: 8000/cats/quints/ Отказ Вы должны посмотреть что-то вроде этого

Есть два основных шага, чтобы перевести приложение Django. Первый – маркировка строк, которые должны быть переведены, и вторым – генерировать языковые файлы, где вы определите переведенные строки для этих отмеченных.

Маркировка строк.

Django предоставляет две функции для определения трансляции строк. Они UgetText () и Ugettext_lazy () Отказ

Мы собираемся использовать Ugettext_lazy () Отказ Итак, нам нужно начать маркировку.

Давайте найдем наши котировки кота, открыть Цитаты/Просмотр

from django.views.generic import TemplateView


class CatQuotesView(TemplateView):
    template_name = "quotes.html"

    def get_context_data(self, *args, **kwargs):
        context = super(CatQuotesView, self).get_context_data(**kwargs)

        cat_quote_one = "I'm bilingual cat and know how to meow in several languages: Meow."
        cat_quote_two = "I'm not angry, go to kill yourself."
        context.update({
            'cat_quote_one': cat_quote_one,
            'cat_quote_two': cat_quote_two
        })
        return context

Импорт Ugettext_lazy.

from django.utils.translation import ugettext_lazy as _

Оберните наши котировки кота, используя _ () Отказ Не волнуйся, _ это просто псевдоним, вы можете использовать Ugettext_lazy () если ты хочешь.

cat_quote_one = _("I'm bilingual cat and know how to meow in several languages: Meow.")
cat_quote_two = _("I'm not angry, go to kill yourself.")

Итак, наш взгляд заканчивается, как это

from django.views.generic import TemplateView
from django.utils.translation import ugettext_lazy as _


class CatQuotesView(TemplateView):
    template_name = "quotes.html"

    def get_context_data(self, *args, **kwargs):
        context = super(CatQuotesView, self).get_context_data(**kwargs)

        cat_quote_one = _("I'm bilingual cat and know how to meow in several languages: Meow.")
        cat_quote_two = _("I'm not angry, go to kill yourself.")
        context.update({
            'cat_quote_one': cat_quote_one,
            'cat_quote_two': cat_quote_two
        })
        return context

Перевод отмеченных струн или струн перевода.

Перед началом разрешать перевод строки, нам нужно создать папку с именем локаль в нашей Цитаты приложение. Таким же образом, если у вас есть больше приложений, вам просто нужно создать его для каждого, который вы хотите перевести. В локаль DIR – это где собираемся жить всеми нашими файлами перевода.

Давайте создадим файл сообщения для наших струн перевода. Этот файл – это текстовая равнина, представляющая один язык. Он содержит все доступные строки перевода (наши отмеченные строки) и как они должны быть переведены. Эти файлы имеют .PO расширение файла.

Для создания или обновления нашего файла сообщения мы собираемся использовать команду MakeMessages предоставляется Джанго.

Примечание: нам нужно Установить GNU GetText набор инструментов

Чтобы создать или обновить файл сообщения, нам нужно запустить команду в корне нашего приложения, содержащего отмеченные строки. В нашем случае Цитаты/ Отказ

django-admin makemessages -l es_ES

Где es_es Представляет местное имя для файла сообщения. Например, EN-US Для объединенного государственного английского языка Де для немецкого и тд.

Он вспоминает все наши маркированные строки и обновляет .PO файл. Затем нам нужно открыть наш файл .po и установить правильный перевод для каждой строки.

После запуска команды ваш Цитаты Каталог приложений должен выглядеть так:

├── __init__.py
├── admin.py
├── apps.py
├── locale
│   └── es-ES
│       └── LC_MESSAGES
│           └── django.po
├── migrations
│   └── __init__.py
├── models.py
├── templates
│   └── quotes.html
├── tests.py
├── urls.py
└── views.py

У нас есть новая папка по имени ES-ES (Папка для испанских файлов перевода), внутри нее есть папка lc_messages, содержащая .PO файл. Этот файл должен иметь такие записи:

#: views.py:11
msgid "I'm bilingual cat and know how to meow in several languages: Meow."
msgstr ""

#: views.py:12
msgid "I'm not angry, go to kill yourself."
msgstr ""

Msgid это строка перевода, которая появляется в источнике. Не меняй это.

msgstr где вы поместите свой канал перевод. Вначале было бы пусто, вы должны изменить его.

#: views.py:11
msgid "I'm bilingual cat and know how to meow in several languages: Meow."
msgstr "Soy un gato bilingüe y sé como hacer meow en varios idiomas: Meow."

#: views.py:12
msgid "I'm not angry, go to kill yourself."
msgstr "No estoy molesto, mátate."

После создания нашего файла сообщения нам нужно преобразовать его в более эффективную форму, A .Мо расширение файла. Это оптимизированный двоичный файл.

Чтобы создать эти файлы, нам нужно использовать команду Django-Admin Compiledages В нашем корневом каталоге проекта.

Это создало бы или обновить наши .Мо Файл из .PO Удлинительный файл.

Настройки Django

Нам нужно указать наше приложение Django, которое мы хотим использовать дополнительный язык. По умолчанию Django Set Язык config var с этим значением:

LANGUAGES = [
    ('en-us', 'English'),
]

Мы собираемся добавить испанский в Django App доступные языки («ES-ES», _ («испанский»)) (Примечание, это ES-ES не es_es ).

LANGUAGES = [
    ('en-us','English'),
    ('es-ES', 'Spanish')
]

Есть несколько способов активации/с использованием переводов Django. Вручную или префиксом URL.

Активирующий перевод вручную

Давайте активировать испанский язык на наш взгляд, чтобы сделать это, нам нужно импортировать перевод Utils и активировать его, используя Перевод .activate () Отказ Он ожидает, что код языка в качестве параметра. Вы можете сделать то, что вы хотите, views.py , Models.py или любой файл django.

from django.views.generic import TemplateView
from django.utils.translation import ugettext_lazy as _

from django.utils import translation


class CatQuotesView(TemplateView):
    template_name = "quotes.html"

    def get_context_data(self, *args, **kwargs):
        context = super(CatQuotesView, self).get_context_data(**kwargs)

        SPANISH_LANGUAGE_CODE = 'es-ES'
        translation.activate(SPANISH_LANGUAGE_CODE)

        cat_quote_one = _("I'm bilingual cat and know how to meow in several languages: Meow.")
        cat_quote_two = _("I'm not angry, go to kill yourself.")
        context.update({
            'cat_quote_one': cat_quote_one,
            'cat_quote_two': cat_quote_two
        })
        return context

Давайте снова посетим наши которыки http://localhost: 8000/cats/quints/ Отказ

Итак, мы получили наши цитаты, переведенные на испанский.

Использование строк переводов в шаблонах

Как и мы отмечаем строки для перевода на наше представление, мы можем сделать это в нашем шаблоне Django. Прежде чем сделать это, нам нужно дать наш шаблон доступ к некоторому типу тегов, чтобы сделать эту работу, поставить {% RAW%} {% Load I18N%} к верхней части вашего шаблона. Итак, после этого мы собираемся использовать {% Trans%} тег. Давайте добавим название нашей страницы Коты котировки для Dummys к Цитаты/шаблоны/Quottes.html и перевести его на испанский.

{% load i18n %}
...............................
...............................

{% trans "Cat quotes for dummys." %}


это должно выглядеть так

Наш титул уже отмечен для перевода. Чтобы обновить наш файл перевода, повторно запустите django-admin makemessages -l es_es команда в Цитаты app root dir and Добавьте перевод для новой записи в нашем .PO Файл Цитаты/locale/es_es/lc_messages/django.po

#: templates/quotes.html:81
msgid "Cat quotes for dummys."
msgstr "Citas de gatos para principiantes."

Снова скомпилируйте, используя Django-Admin Compiledages И мы должны получить это.

Примечание: Помните, что мы активировали испанский язык по умолчанию на наш взгляд.

Активация перевода по префиксе URL

Как вы можете заметить, было бы настолько утомительно активировать и деактивировать наш язык вручную. Более того, мы хотим иметь возможность использовать определенный язык, учитывая префикс в нашем URL.

Добавление префикса языка в корню шаблонов URL-адреса, чтобы сделать это возможным для Localemiddleware Чтобы обнаружить язык для активации из запрошенного URL.

Чтобы сделать это, во-первых, нам нужно добавить django.middleware.locale. Localemiddleware В нашем Промежуточное программное обеспечение параметр.

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.locale.LocaleMiddleware'
]

Что промежуточное программное обеспечение заботится о активации языка от нашего префикса URL Lang, то есть en-us/any_url .

Кроме того, мы должны разрешить языковые коды в наших URL. Использование i18n_patterns () Мы можем архивировать это.

Эта функция может использоваться в корневом URLCONF и Django автоматически добавьте текущий код активного языка на все шаблоны URL, определенные внутри.

Наш новый /cats/urls.py должен выглядеть так

from django.conf.urls import url, include
from django.contrib import admin
from django.conf.urls.i18n import i18n_patterns


urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

urlpatterns += i18n_patterns(
    url(r'cats/', include('quotes.urls', namespace='cat_quotes')),
)

Наконец, нам нужно удалить вручную активацию языка с наших взглядов. Мы больше не нуждаются в этом.

from django.views.generic import TemplateView
from django.utils.translation import ugettext_lazy as _


class CatQuotesView(TemplateView):
    template_name = "quotes.html"

    def get_context_data(self, *args, **kwargs):
        context = super(CatQuotesView, self).get_context_data(**kwargs)

        cat_quote_one = _("I'm bilingual cat and know how to meow in several languages: Meow.")
        cat_quote_two = _("I'm not angry, go to kill yourself.")
        context.update({
            'cat_quote_one': cat_quote_one,
            'cat_quote_two': cat_quote_two
        })
        return context

Давайте посетить http://localhost: 8000/en-us/cats/quints/

Теперь наша испанская версия http://localhost: 8000/ES-ES/Cats/quitations/

Примечание: Язык Pre IX в нашем URL должен точно соответствовать нашим определенным языковым кодам в settings.py файл.

То есть мы получили наше приложение CAT QUOTE, переведенное на два языка.

Если вы нашли этот пост полезным, делитесь и распространяете слово.

Оригинал: “https://dev.to/levivm/django-app-internationalization-lj9”