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

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

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

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

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

спасибо

4 ответов


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

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

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

# 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:

In settings.py ...

добавить MIDDLEWEAR_CLASSES, локаль, она включает выбор языка основанный на запросе:

'django.middleware.locale.LocaleMiddleware',

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

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

включить названием i18n

USE_I18N = True

Set 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
)

для 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 (как указано выше) и оберните каждую строку так _('text'), вы даже можете перейти к другому urls.py файлы и сделать перевод url, как так:

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

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

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

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

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

теперь вы можете войти в свои шаблоны и загрузить i18n templatetag и использовать 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 и отредактируйте каждый из них .файлы по. Заполните данные для каждого сайта. Вот один из таких примеров:

msgid "English"
msgstr "Angielski"

и, наконец, скомпилировать сообщения:

./manage.py compilemessages

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

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

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


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

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


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