Я хочу создать сайт с двумя языками, по умолчанию, мой родной язык и необязательный английский. Я планирую иметь свои домены как таковые:
По умолчанию, когда пользователь вводит mydomain.com. они будут перенаправлены на версию /tr/
и выберите, чтобы перейти в /en/, если они захотят через верхнее меню. И вот мой вопрос.
Каков наилучший способ Django поддерживать оба языка, обратите внимание, что я не хочу автоматического перевода, но я хочу поддерживать тексты для обоих языков самостоятельно.
Ответ 1
Как я вижу, у вас есть два основных варианта:
(1) Вы можете сохранить две отдельные копии сайта в качестве разных приложений Django и просто указать urlconf на эти приложения - так url(r'^/en/', include(myproject.en))
будет в вашем urlconf указывать на ваше английское приложение, а другое - на другой язык. Это потребует поддержки различных наборов urlconfs и разных html-шаблонов и т.д. Для двух приложений, что может быть полезно, если вы заинтересованы в том, чтобы сами URL-адреса также отображали разные языки (например, испанский язык /pagina/uno "vs English" /Главная/один ").
(2) Вы записываете предпочтение языка в файле cookie (что вы действительно должны делать в любом случае), используя сеансы Django, а затем создайте шаблон поставьте соответствующую версию текста, как вам нравится, из этого файла 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>
Ответ 2
Так что вот длинная версия на ваш вопрос. Проверено на Django 1.4 - 1.7.1:
В settings.py…
Добавьте к MIDDLEWARE_CLASSES
языковой стандарт, он позволяет выбирать язык по запросу:
'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 & lt; 1.8 укажите это здесь:
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 (как указано выше) и оберните каждую строку им, как _ (текст), вы даже можете перейти к другим файлам 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 отлично подходит для этого!
В ваших 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 для тех, кто заинтересован в том, чтобы взглянуть на полностью рабочее решение.
Если вы следовали этому, вы должны начать хорошо. Я считаю, что это самый стандартизированный способ запустить ваш сайт на нескольких языках. Ура!