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