Сайт Django с 2 языками


Я хочу разработать сайт с 2 языками, один из которых по умолчанию, мой родной язык и дополнительный английский. Я планирую иметь свои домены как таковые:

www.mydomain.com/tr/
www.mydomain.com/en/

По умолчанию, как только пользователь вводит mydomain.com они будут перенаправлены на версию /tr/ и выберут, чтобы перейти к /en/, если они хотят через верхнее меню. И вот мой вопрос.

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

Спасибо

4 22

4 ответа:

Как я вижу, у вас есть два основных варианта:

(1) Вы можете хранить две отдельные копии сайта в виде различных приложений Django и просто иметь ваш urlconf, указывающий на эти приложения-так что url(r'^/en/', include(myproject.en)) будет в вашем urlconf, чтобы указать на ваше приложение на английском языке, а другой для другого языка. Это будет включать в себя поддержание различных наборов urlconf и различных HTML-шаблонов и т. д. Для двух приложений, которые могут быть полезны, если вы заинтересованы в том, чтобы сами URL-адреса также отражали различные языки (например, испанский "/pagina/uno" против английского "/page/one").

(2) вы записываете языковые предпочтения в куки (что вы действительно должны сделать в любом случае), используя сеансы Django, а затем заставляете шаблон доставлять соответствующую версию текста, как вам нравится, из этого куки. Код для этого может быть:

# views.py

# default to your native language
request.session['lang'] = 'tr'

# someone clicks the link to change to English
def switch_to_English_link(request):
    request.session['lang'] = 'en'

А затем в шаблонах, чтобы собрать эту информацию, вы бы использовали:

<!-- my_django_template.html -->
<div>
  <span>
     {% if request.session.lang == "en" %}
        This is my text in English!
     {% else %}
        Şimdi benim sitede Türk var!
     {% endif %}
  </span>
</div>

Итак, вот длинная версия вашего вопроса. Тестировался на Django 1.4 - 1.7.1:

В settings.py ...

Добавить в MIDDLEWEAR_CLASSES, locale, это позволяет выбирать язык на основе запроса:

'django.middleware.locale.LocaleMiddleware',

Добавьте LOCALE_PATHS, здесь будут храниться ваши файлы перевода:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'),
)

Включить i18N

USE_I18N = True

Установите LANGUAGES , что вы будете переводить сайт на:

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('pl', ugettext('Polish')),
)

Добавьте обработчик контекста шаблона i18n, запросы теперь будут включать LANGUAGES и LANGUAGE_CODE:

Для Django

TEMPLATE_CONTEXT_PROCESSORS = (
    ....
    'django.core.context_processors.i18n', # this one
)

For Django >= 1.8 поставьте его здесь:

TEMPLATES = [
    {
        'OPTIONS': { 'context_processors': [
        'django.template.context_processors.i18n', # this one
    ]}
]

Гнездо, в urls.py :

В url_patterns, добавьте ниже, это позволит установить вид перенаправления языка:

url(r'^i18n/', include('django.conf.urls.i18n')),
Подробнее об этом см. В разделе Разное в переводах .

Добавьте следующий импорт и инкапсулируйте URL-адреса, которые вы хотите перевести с помощью i18n_patterns. Вот как выглядит мой:

from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

urlpatterns += i18n_patterns('',
    (_(r'^dual-lang/'), include('duallang.urls')),
    (r'^', include('home.urls')),
)

Примечание: Вы также можете отбросить ваши URL-адреса администратора в i18n_patterns.

Оберните свой текст с помощью lazytext! импортируйте lazytext (как указано выше) и оберните каждую строку с ним, как so _('text'), вы даже можете перейти к другому urls.py файлы и сделать url-перевод так:

url(_(r'^dual_language/$'), landing, name='duallang_landing'),

Вы можете переносить текст, который хотите перевести, в другие файлы, такие как models.py, views.py и т.д.. Вот пример поля модели с переводами для label и help_text:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))

Django translation docs отлично подходит для вот это!

В ваших html-шаблонах...

Теперь вы можете войти в свои шаблоны и загрузить тэг шаблона i18n и использовать trans и transblock для статического материала, который вы хотите перевести. Вот пример:

{% load i18n %}

{% trans "This is a translation" %}<br><br>
{% blocktrans with book_t='book title'|title author_t='an author'|title %}
This is {{ book_t }} by {{ author_t }}. Block trans is powerful!
{% endblocktrans %}

Теперь запустите makemessages для каждого из ваших локалей:

./manage.py makemessages -l pl

И теперь все, что осталось, это зайти в папку /locales и отредактировать каждый из них .po-файлы. Заполните данные для каждого сайта. Вот один из таких примеров:

msgid "English"
msgstr "Angielski"

И, наконец, скомпилируйте сообщения:

./manage.py compilemessages

Есть много чего еще, чтобы узнать с переводами иинтернационализация тесно связана с этой темой, так что проверьте документы для него тоже. Я также рекомендую проверить некоторые из пакетов интернационализации, доступных для Django, таких как django-rosetta и django-linguo. Они помогают переводить содержимое модели, django-rosetta не создает новых записей для этого в вашей базе данных, в то время как django-linguo делает.

Я также была создана демонстрационная версия переводаdjango для тех, кто заинтересован посмотреть на полное рабочее решение.

Если вы следовали этому, вы должны быть в хорошем начале. Я считаю, что это самый стандартизированный способ заставить ваш сайт работать на нескольких языках. Ура!

Вы можете использовать переводимые шаблоны URL, которые доступны начиная с версии 1.4.

Https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

Вы должны перейти к приложению django-localeurl, Если вам нужно указать язык страницы в URL. То есть конкретно то, что вы делаете в своем примере. Механизм перевода Djangoпо умолчанию просто префиксирует ваши URL-адреса, которые могут быть неэффективны в вашей SEO-стратегии. django-localeurl просто исправляет часть обработки URL, в то же время играя хорошо с остальной частью механизма перевода Django по умолчанию.