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

Django-admin.py makemessages не работает

Я пытаюсь перевести строку.

{% load i18n %}
{% trans "Well, Hello there, how are you?" %}

чтобы...

Hola amigo, ¿que tal?

Мой файл settings.py имеет следующее:

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'translations'),
)

И я получаю это:

(env)glitch:translations nathann$ django-admin.py compilemessages
CommandError: Can't find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.

Я также не понимаю это сообщение об ошибке.

(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError:
This script should be run from the Django Git tree or your project or
app tree. If you did indeed run it from the Git checkout or your project
or application, maybe you are just missing the conf / locale(in the
django tree) or locale(for project and application) directory? It is not
created automatically, you have to create it by hand if you want to
enable i18n for your project or application.

Документы: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-makemessages

И для бонуса upvotes, связанный вопрос: gettext не был связан, когда я его установил... Любая помощь с этим? Должен ли я заставить его?

glitch:translations nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.

Спасибо!


ОБНОВЛЕНИЕ:

С тех пор я изменил название переводов на локаль и обновил мои settings.py соответственно. затем я снова запустил его, и он все еще жалуется на gettext:

(env)glitch:ipals nathann$ mv translations/ locale
(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError: Can't find xgettext. Make sure you have GNU gettext tools 0.15 or newer installed.

Я также нашел это:

Понимать зависимости только от доморощенного и кега

после прочтения этого:

(env)glitch:ipals nathann$ brew install gettext
Warning: gettext-0.18.3.2 already installed
(env)glitch:ipals nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
4b9b3361

Ответ 1

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

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
print(LOCALE_PATHS)

Я дважды проверял, что у меня был каталог locale в нужном месте с правильным именем.

В итоге я связал gettext (после того, как спросил о нем superuser):

brew link gettext --force

manage.py compilemessages

django-admin.py makemessages -l es

И БАМ. У меня есть файл po.

Но врач говорит:

Warning: Some keg-only formula are linked into the Cellar.
Linking a keg-only formula, such as gettext, into the cellar with
`brew link <formula>` will cause other formulae to detect them during
the `./configure` step. This may cause problems when compiling those
other formulae.

Binaries provided by keg-only formulae may override system binaries
with other strange results.

You may wish to `brew unlink` these brews:

    gettext

Ответ 2

Попробуйте это в Ubuntu

sudo apt-get install gettext

И используйте brew установить gettext в OSX

Также не забудьте установить локальный путь в файле settings.py.

Ответ 3

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

В settings.py...

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

'django.middleware.locale.LocaleMiddleware',

Добавьте LOCALE_PATHS, там будут сохранены ваши файлы перевода, также включите i18N:

USE_I18N = True

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

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

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

Добавьте обработчик контекста шаблона i18n, теперь запросы будут включать ЯЗЫКИ и LANGUAGE_CODE:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n', # this one
    'django.core.context_processors.request',
    'django.core.context_processors.static',
    'django.contrib.messages.context_processors.messages',  
)

Гнездо, в 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 и оберните каждую строку таким образом _ ('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"))

Документы для перевода Django отлично подходят для этого!

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

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

Ответ 4

Для пользователей Mac brew link gettext --force может быть риск, как советует Brew. Лучшая работа - установить новую PATH variable для вашей виртуальной среды. Итак, в файле postactivate, который находится в папке bin вашей папки виртуальной среды, введите:

export TEMP_PATH=$PATH
export PATH=$PATH:/usr/local/Cellar/gettext/0.19.7/bin

Обратите внимание, что вам нужно заменить 0.19.7 на версию, установленную на вашем компьютере.

И в вашем файле predeactivate, который находится в той же папке файла postactivate, введите:

export PATH=$TEMP_PATH
unset TEMP_PATH

Теперь вы можете использовать python manage.py makemessages -l <desired_language> без забот.:)

Приветствия.

Ответ 5

Добавили ли вы {% load i18n %} в начало шаблона?

Бонус: вам не нужно связывать gettext, какой результат из brew doctor?

Ответ 6

Установите gettext в свою ОС ubuntu используя команду sudo apt-get

Или в Mac

с помощью команды brew

Ответ 7

Если вы не хотите связывать gettext (что вам не нужно, потому что беспорядок в среде OS X плох), вы можете установить PATH для команды makemessages. Следующее должно работать (но вам нужно настроить номер версии gettext):

PATH=/usr/local/Cellar/gettext/<installed version>/bin/:$PATH && \
django-admin makemessages -l <language>

Если вы сделаете так, ваш установленный gettext останется только кег, и django-admin будет счастлив и найдет все необходимые ему программы.