Django локалізація.

Основи Python и Django. -> Django локалізація.

Django локалізація.

Налаштування під локалізацію.

Функції перекладів.

from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext as _

lasy - лінивий переклад. Це колись перекладає щоразу заново за фактом вимоги. Рекомендується використовувати у формах та моделях т.к. вони виконуються один раз при завантаженні програми і нам можливо знадобиться згодом отримати різний переклад полів різними мовами.

Перемикання локалі по дефолту.

LANGUAGE_CODE = 'ru'

Налаштування папки для перекладів.

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

Список мов.

from django.utils.translation import ugettext_lazy as _

LANGUAGES = (
    ('ru', _('Russian')),
    ('en', _('English')),
)

Локалізація полів адмінки.

from django.utils.translation import ugettext as _

...

image = models.ImageField(verbose_name=_(u'Image')...

Локалізація шаблонів інтерфейсу.

{% load i18n %}

...

<title>{% translate "This is the title." %}</title>

Перемикання мов.

from django.utils import translation

def set_language(request):
    next = request.REQUEST.get('next', None)
    if not next:
        next = request.META.get('HTTP_REFERER', None)
    if not next:
        next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'GET':
        lang_code = request.GET.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session['django_language'] = lang_code
            else:
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
            translation.activate(lang_code)
    return response

Отримання поточної мови у шаблоні.

{% load i18n %}
...
{% get_current_language as LANGUAGE_CODE %}

Більше вишукано через шаблонний процесор.

def lang_context_processor(request):
    return {'LANG': request.LANGUAGE_CODE}

З наступним включенням до налаштувань.

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'myproject.myapp.templatecontext.lang_context_processor',
)

Інструмент для перекладу rosetta

Посилання на документацію

Встановлення

 pip install django-rosetta

Включаємо у проект.

INSTALLED_APPS = [
    ..
    'rosetta',

Включаємо роутинг.

 path('rosetta/', include('rosetta.urls')),

Створюємо папку locale.

Прописуємо шлях до локалів.

LOCALE_PATHS = [os.path.join(BASE_DIR, "locale")]

Генеруємо файли перекладів.

 ./manage.py makemessages -l ru

 ./manage.py compilemessages

Портуємо переклади дефолтом

Переклад через яндекс.

ROSETTA_ENABLE_TRANSLATION_SUGGESTIONS = True
YANDEX_TRANSLATE_KEY = 'trnsl.1.1.20140521T130035Z.1014ae2799c685e3.97b1345108ab3a8520d96f730016a9dac947049b'
ROSETTA_MESSAGES_SOURCE_LANGUAGE_CODE = 'en'
ROSETTA_MESSAGES_SOURCE_LANGUAGE_NAME = 'English'

Переклад моделі.

Посилання на документацію

Встановлення.

pip install django-modeltranslation

Включення ДО django.contrib.admin!

INSTALLED_APPS = (
    ...
    'modeltranslation',
    'django.contrib.admin',  # optional
    ....
)

Повинен бути список мов.

LANGUAGES = (
    ('de', gettext('German')),
    ('en', gettext('English')),
)

Переклад дефолтом.

MODELTRANSLATION_DEFAULT_LANGUAGE = 'ru'

Переклад моделі.

Створюємо translation.py в папці програми, де підключаємо клас перекладу до класу існуючої моделі.

from modeltranslation.translator import translator, TranslationOptions
from .models import News

class NewsTranslationOptions(TranslationOptions):
    fields = ('title', 'text')

translator.register(News, NewsTranslationOptions)

Інтеграція з адмінкою.

from django.contrib import admin
from news.models import News
from modeltranslation.admin import TranslationAdmin

class NewsAdmin(TranslationAdmin):
    pass

admin.site.register(News, NewsAdmin)

Команда заповнення перекладу дефолтної мови (перенесення зі старого поля).

 python manage.py update_translation_fields

Апдейт полів під час додавання нової мови або нового поля для перекладу.

python manage.py sync_translation_fields

Завантаження даних із json.

python manage.py loaddata --populate=all fixtures.json