Сайт Django с 2 языками - программирование
Подтвердить что ты не робот

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

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

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

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

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

Спасибо

4b9b3361

Ответ 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 для тех, кто заинтересован в том, чтобы взглянуть на полностью рабочее решение.

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

Ответ 4

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