Сайт 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 по умолчанию.