Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
Jan. 25, 2018, 5:45 a.m.

Интернационализация и локализация сайта на Django

Django

Здравствуйте.
Не могли бы вы написать, как делали на своем сайте интернационализацию и локализацию? В принципе я ее сделал, но у меня не получается сделать как у вас выбор языка в навбаре - как это реаливать? Насколько я понимаю это нужно создать несколько url один под ru, второй под en и вьюхи которые будут обрабатывать?

27

Добрый день.

Да, правильно понимаете. Я вам кину код вьюшки позже... Часов так через двенадцать, как дома буду.
0

Спасибо, буду ждать с нетерпением!

0

Итак, как обещал.

Во-первых, маршрут для url и соответственно вьюшка там всего одна.
Вариант для Django 1.11
url(r'^lang/(?P<lang_code>[a-z]{2})/$', views.lang, name='lang'),
Вариант для Django 2.0
path('lang/<lang_code>/', views.lang, name='lang'),
В шаблоне вёрстка в упрощённом варианте выглядит так
<a href="{% url 'lang' 'ru' %}">{% trans "Русский" %}</a>
<a href="{% url 'lang' 'en' %}">{% trans "Английский" %}</a>
А сама вьюшка выглядит так
# -*- coding: utf-8 -*-

import re
from urllib.parse import urlsplit, urlunsplit

from django.conf import settings
from django.http import HttpResponseRedirect, HttpResponse
from django.utils.http import is_safe_url, urlunquote
from django.utils.translation import (
    LANGUAGE_SESSION_KEY, check_for_language
)

from MyMainAppp import settings as MySettings


def lang(request, lang_code):
    next = request.POST.get('next', request.GET.get('next'))
    if (next or not request.is_ajax()) and not is_safe_url(url=next, host=request.get_host()):
        next = request.META.get('HTTP_REFERER')
        if next:
            next = urlunquote(next)  # HTTP_REFERER may be encoded.
        if not is_safe_url(url=next, host=request.get_host()):
            next = '/'
    response = HttpResponseRedirect(next) if next else HttpResponse(status=204)

    if lang_code and check_for_language(lang_code):
        if next:
# Ниже идёт пояснение MySettings.LANGUAGES for code_tuple in MySettings.LANGUAGES:
settings_lang_code = "/" + code_tuple[0] parsed = urlsplit(next) if parsed.path.startswith(settings_lang_code): path = re.sub('^' + settings_lang_code, '', parsed.path) next = urlunsplit((parsed.scheme, parsed.netloc, path, parsed.query, parsed.fragment)) response = HttpResponseRedirect(next) if hasattr(request, 'session'): request.session[LANGUAGE_SESSION_KEY] = lang_code else: response.set_cookie( settings.LANGUAGE_COOKIE_NAME, lang_code, max_age=settings.LANGUAGE_COOKIE_AGE, path=settings.LANGUAGE_COOKIE_PATH, domain=settings.LANGUAGE_COOKIE_DOMAIN, ) return response
Изначально вьюшку я взял из исходников самого Django и модифицировал, чтобы она работала именно так, как сейчас работает на сайте. В Django есть встроенный функционал для смены языка, то есть имеется и вьюшка, но как вы и сами наверняка заметили, её поведение немного отличается от того, что реализовано у меня на сайте.

Что касается настроенных языков, то в файле настроек это будет выглядеть так
LANGUAGES = (
    ('ru', 'Russian'),
    ('en', 'English'),
)
Код вьюшки работает одинаково, как для Django 1.11, так и для Django 2.0
1

Спасибо, воспользуюсь вашим примером.

0

тут не много не понятно. это вы импортировали settings своего проекта? чет у меня тут не получилось с импортом.

from MyMainAppp import settings as MySettings
0

Да. именно, это импорт из моего проекта.

У вас в самом главном App вашего проекта должен быть файл settings, так вот в нём я добавил настройку языков.
LANGUAGES = (
    ('ru', 'Russian'),
    ('en', 'English'),
)
Его и импортируйте
0

В общем у меня тут какая то проблема не получается импортировать settings во вьюху он тупо не видит путь. Сделал так

for code_tuple in settings.LANGUAGES:
но наверно он видит только этот путь
from django.conf import settings
и ошибок сейчас нет.
При этом переключение в шаблоне работает, но только нет в главном урл приставок ru и en как у вас, после которых уже идут основные урлы. Это наверно из-за того, что не получилось импортировать settings?


0

Да, наверняка из-за этого не приставок.

У меня есть Главное MyMainApp, которое содержит файлы
settings.py
urls.py
views.py
То есть весь выше приведённый код из этих файлов.
Поэтому и этот импорт будет правильным
from MyMainAppp import settings as MySettings
А у вас наверное структура несколько отличается, поэтому и не видит пути
0

Ясно.
У меня так выглядит структура

0

У вас сам файл в навигаторе выглядит так, будет он не подключён в проект или вообще удалён... Он не должен быть серым подсвечен.

Что-то у вас с настройками проекта в IDE
0

это он в гитигноре у меня прописан, чтоб на гитхаб не отправлялся.

0

Понятно. Тогда это не должно мешать.

.. Стоп.. А где у вас расположен файл languages.py ?
По факту, сделали бы лучше в students файл views.py, да перенесли бы туда вьюшку lang. Всё стало бы проще немного.
0

Файл languages.py лежит здесь. student/views/languages.py
Попробую сейчас как вы сказали.

0

Да с импортом сейчас все получилось. Но в урл нет приставок ru и en. Может что-то упустил?
У меня еще на скриншоте желтым выдел импорт функции urlparse, пишет Python version 3.6 does not have module urlparse. У меня проект на питоне 2,7

0

ммм.. Вы сейчас работаете с Django 2.0 или с Django 1.11?

К слову, в Django 2.0 полностью отказались от поддержки Python 2.7. Я делал перевод этой новости, поскольку мимо такого трудно пройти мимо. Подробности здесь .
Я так понимаю, вы делаете какую-то курсовую (или я что-то путаю)? Если это требование преподавателя про Python 2.7, то переговорите с ним на этот счёт, поскольку работать с Python 2.7 в рамках Django уже является бессмысленным занятием в принципе.

И ещё, я вам привёл пример кода с библиотекой для Python 3
from urllib.parse import urlsplit, urlunsplit

0

Я работаю с джанго 1.10.5 и пайтон 2.7
Да я вкурсе, что с версии джанго 2.0 поддерживается только пайтон 3.6
Я делаю пример по книге в которой еще джанго 1.7 использовался и питон 2.7

В любом случае спасибо за помощь. Классный у вас сайт.

1

Пожалуйста и спасибо за отзыв.

По возможности, постарайтесь переписывать пример на современный лад. Если это возможно и доступно вам в рамках задания.
0

Забыл еще спросить. Перевод поста как вы делали на своем сайте? Имею в виду текст статьи отдельно каждую статью переводили в файле django.po как и все остальное?

0

Я использую батарейку django-modeltranslation. А также ещё ряд полезных батареек .

0

Спасибо.

0

Здравствуйте.
Еще один вопрос по этой теме. Как у вас в html сделана смена языка т.е. когда делаешь смену языка, то его иконка меняется автоматически в навбаре на выбранный язык?

0

Добрый день.
Комплект иконок, который я использую является, как это правильно называется, типо web font комплектом изображений, работает, как иконки в Bootstrap-3, я просто подставляю код языка в теге и иконка меняется.
Как вернусь с работы, кину пример реализации в коде вам.

0

ок, буду ждать, спасибо вам.

0

В шаблоне можно использовать встраиваемые теги для получения кода языка (en или ru)

{% load get_current_language from i18n %}
{% get_current_language as LANGUAGE_CODE %}
А далее код подставляется в шаблон, где у меня иконка флажка
<span class="flag-icon flag-icon-{{ LANGUAGE_CODE }}"></span>
Ещё можно немного иначе сделать, что-то вроде хака
<span class="flag-icon flag-icon-{% trans "Current_Language" %}"></span>
А уже в переводах эту строку Current_Language для английского и русского языков переводите как ru или en.
0

Спасибо, все получилось. Сделал по первому варианту.

0
urlpatterns = i18n_patterns(
    path('1admin/', admin.site.urls),
    ….
)
# LANGUAGE
LANGUAGE_CODE = 'ru'

gettext = lambda s: s
LANGUAGES = (
    ('ru', gettext('Russian')),
    ('en', gettext('English')),
)

LOCALE_PATHS = (
    'locale',
)

MODELTRANSLATION_LANGUAGES = ('ru', 'en')
MODELTRANSLATION_DEFAULT_LANGUAGE = 'ru'

не легче просто указать ???

0

Это и так всё указывается.

Проблема в Django в другом. Дефолтный обработчик языка, когда идёт переключение языка пользователем, срабатывает просто как триггер, переключая на следующий язык, когда вы кликаете на ссылку языка.

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

В Django отсутствует данный механизм вообще, пришлось модифицировать функцию переключения языка, чтобы она работала именно таким образом.

modeltranslation - это хорошая батарейка, но она к проблеме отношения не имеет, также как и i18n. Они свою работу выполняют на отлично, но не могут обеспечить именно такую кнопочку с языками, как у меня на сайте в правом верхнем углу.

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
v
Jan. 17, 2019, 11:51 a.m.
vitalir12

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:20points,
  • Rating points-10
v
Jan. 17, 2019, 11:49 a.m.
vitalir12

C++ - Test 002. Constants

  • Result:50points,
  • Rating points-4
v
Jan. 17, 2019, 11:13 a.m.
vitalir12

C++ - Тест 003. Условия и циклы

  • Result:28points,
  • Rating points-10
Last comments
I
Jan. 16, 2019, 8:06 a.m.
IscanderChe

Заработало. Забыл model->select(); вписать.
I
Jan. 16, 2019, 8:02 a.m.
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
Jan. 16, 2019, 7:51 a.m.
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
Jan. 16, 2019, 7:43 a.m.
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Now discuss on the forum
Jan. 18, 2019, 11:26 a.m.
nayk1982

Для Desktop делал так: void pause(int ms){ QTimer timer; timer.setInterval( qBound(1, ms, 3600000) ); timer.setSingleShot(true); QEventLoop loop; QObject::connect(&...
Jan. 17, 2019, 12:01 p.m.
Алексей Внуков

у меня просто есть отдельное поле с чекбоксамими какие колонки нужно отображать CheckBox { id: checkBox text: qsTr("some text") checked: true onC...
Jan. 15, 2019, 4:53 p.m.
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
Jan. 15, 2019, 12:52 p.m.
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
Join us in social networks

For registered users on the site there is a minimum amount of advertising