Джанго - как заставить работать перевод? - PullRequest
30 голосов
/ 02 декабря 2009

Я пытаюсь сделать шаблон на другом языке, используя i18n. Я сделал все, что мог прочитать, от установки языкового кода до создания и компиляции файлов перевода, включая теги перевода в шаблоне и все такое, и мой шаблон по-прежнему отображается на английском языке, даже через переменную {{LANGUAGE_CODE}} правильный (и другой) код, который я намеревался представить. Чего мне не хватает?

шаблон:

{% extends "base.html" %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
{% block title %}{% trans "translation test" %}{% endblock %}
{% block content %}
<div id="some-text">
  {% trans "some translated text goes here" %}
  {% blocktrans %}
  <ol>
    <li>here are some</li>
    <li>items that should be</li>
    <li>translated as well</li>
  </ol>
  {% endblocktrans %}
  <ul>
      <li>The current language is <b>{{ LANGUAGE_CODE }}</b></li>
      {% if LANGUAGE_BIDI %}
        <li>The current language is bidirectional</li>
      {% else %}
        <li>The current language is <b>not</b> bidirectional</li>
      {% endif %}
      <li>Available languages are:
        <ul>
        {% for lang in LANGUAGES %}
          <li>{{ lang.1}}</li>
        {% endfor %}
        </ul>
      </li>
  </ul>
</div>
{% endblock %}

вид:

from django.shortcuts import render_to_response
from django.template import RequestContext
from pdb import set_trace as debugger
def check(request):
    return render_to_response('index.html', context_instance=RequestContext(request)

командная строка (я правильно заполнил переводы в .po файлах):

$ django-admin.py makemessages -l he-il -e html
$ django-admin.py compilemessages

settings.py:

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'he-il'

gettext = lambda s: s
LANGUAGES = (
    ('he-il', gettext('Hebrew')),
    ('en-us', gettext('English')),
)

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.i18n",
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

Ответы [ 9 ]

65 голосов
/ 03 октября 2011

Просто добавьте пути к файлам локали, сгенерированным в файл settings.py, как показано ниже:

LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
21 голосов
/ 23 октября 2014

Это полное решение, которое я использовал с Django 1.4 и до сих пор в 1.7.1:

В settings.py…

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

'django.middleware.locale.LocaleMiddleware',

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

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

Включить I18N:

USE_I18N = True    

Установите ЯЗЫКИ, на которые вы будете переводить сайт:

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('fr', ugettext('French')),
    ('pl', ugettext('Polish')),
)

Добавьте процессор контекста шаблона i18n в TEMPLATE_CONTEXT_PROCESSORS, теперь запросы будут включать LANGUAGES и LANGUAGE_CODE:

'django.core.context_processors.i18n',

В 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')),
)

Теперь, где бы вы ни использовали текст и хотите его преобразовать, импортировать 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"))

В ваших 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 делает.

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

20 голосов
/ 02 декабря 2009

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

$ django-admin.py makemessages -l he-il -e html

А вот так:

$ django-admin.py makemessages -l he_il -e html

Обратите внимание на подчеркивание в he_il.

У меня тоже были проблемы с pt-BR, пока я не создал файл сообщений с pt_br. Тогда все стало работать ...

Да, это не очевидно, и я нигде не смог найти документацию по этому поводу.

Надеюсь, это поможет.

15 голосов
/ 10 октября 2012

У меня такая же проблема. Но я решаю это, помещая «Язык:» в файл .po. В моем случае .po файл не содержит атрибут «Language:», он выглядит как ...

"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"

но когда я ставлю код языка (в моем случае 'ru' или 'en')

"Language-Team: LANGUAGE \n"
"Language: ru\n"
"MIME-Version: 1.0\n"

у меня работает

5 голосов
/ 16 января 2014

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

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
)
2 голосов
/ 24 декабря 2009

Я пошел по этому пути, используя точный код языка, который django использует в своих собственных файлах перевода (а не по ссылке, приведенной в settings.py), предполагая, что этот язык поддерживается (если не все усложняется, так как Вы также должны предоставить свои собственные файлы перевода для django).

Я нашел этот код, перейдя в $ DJANGO_DIR / conf / locale и посмотрев имя папки (для меня это было в /usr/local/lib/python2.6/dist-packages/django/conf/locale, но может отличаться в зависимости от ОС и т. д.)

1 голос
/ 23 декабря 2009

У меня была та же проблема, я пытался сменить язык, и Джанго сказал, что нет. Нет ошибок, нет предупреждений, но django переключил язык на pl-pl (в моем случае). Однако, удалив все папки из локали и выполнив команду: django-admin.py makemessages -l pl_PL (подчеркивание вместо тире и заглавной буквы для второго PL, решило эту проблему).

Я надеюсь, что это поможет некоторым парням там.

1 голос
/ 02 декабря 2009

Да, вам нужно создать файлы сообщений, как подсказывает целопес, и затем скомпилировать их

python manage.py compilemessages

Но у вас все еще будет проблема.

Немного отключите LocaleMiddleware, т.е. удалите это

django.middleware.locale.LocaleMiddleware

из вашего списка промежуточного программного обеспечения. Не используйте его, если вам не нужно переключать язык во время выполнения, но если вам это нужно, тогда существует решение . У меня была та же самая проблема прежде, и кто-то объяснил мне это.

Также у меня была эта странная проблема раньше. Команда makemessages может подавить строки, заключенные в обратную косую черту в файлах .py.

0 голосов
/ 24 июля 2016

У меня была такая же проблема. Я объяснил это подробностями в этой ссылке под другим похожим вопросом .

Вкратце, моя проблема была решена путем перезагрузки сервера с таким кодом:

sudo /etc/init.d/uwsgi reload

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

...