Сайт Django с 2 языками
Я хочу разработать сайт с 2 языками, один из которых по умолчанию, мой родной язык и дополнительный английский. Я планирую иметь свои домены как таковые:
www.mydomain.com/tr/
www.mydomain.com/en/
По умолчанию, как только пользователь вводит mydomain.com они будут перенаправлены на версию /tr/
и выберут, чтобы перейти к /en/, если они хотят через верхнее меню. И вот мой вопрос.
Какой лучший способ Django поддерживать оба языка, пожалуйста, обратите внимание, что я не хочу автоматического перевода, но я хочу поддерживать тексты для обоих языков себя.
Спасибо
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 по умолчанию.