Подтвердить что ты не робот

Django - как сделать перевод?

Я пытаюсь отобразить шаблон на другом языке с помощью 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',
)
4b9b3361

Ответ 1

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

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

Ответ 2

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

LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)

Ответ 3

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

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

Но скорее это:

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

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

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

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

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

Ответ 4

Это полное решение, которое я использовал из 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    

Установите LANGUAGES, чтобы вы переводили сайт на:

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

Добавьте обработчик контекста шаблона i18n в TEMPLATE_CONTEXT_PROCESSORS, теперь запросы будут включать ЯЗЫКИ и 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 и оберните каждую строку таким образом _ ('text'), вы даже можете перейти к другим файлам urls.py и сделать перевод URL следующим образом:

url(_(r'^dual_language/$'), landing, name='duallang_landing'),

Вы можете переносить текст, который вы хотите перевести в другие файлы, например models.py, views.py и т.д. Вот примерное поле модели с переводами для метки и help_text:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))

В ваших html-шаблонах...

Сделайте то же самое для своих шаблонов и загрузите templatetag 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 делает.

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

Ответ 5

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

"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"

он работает для меня

Ответ 6

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

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
)

Ответ 7

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

python manage.py compilemessages

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

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

django.middleware.locale.LocaleMiddleware

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

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

Ответ 8

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

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

Ответ 9

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

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

sudo /etc/init.d/uwsgi reload

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