2013-12-09 8 views
18

У меня проблема с переводами, не работающими на Django 1.6 !. Я добавил к моему settings.pyКак правильно настроить перевод Django?

LANGUAGE_CODE = 'en-us' 
ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('de', ugettext('German')), 
) 

Также добавлено:

промежуточного программного
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

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

from django.utils.translation import ugettext_lazy as _ 

Мои шаблоны, начиная с

{% extends "base.html" %} 
{% load i18n %} 

и внутри шаблона, чем я использовал trans placeholder. Например.

<h1>{% trans "Register a tank" %}</h1> 

На самом деле эта строка появляется в локали/де/LC_MESSAGES/django.po, когда работает, а я перевел их. Например.

msgid "Register a tank" 
msgstr "Einen neuen Tank anmelden" 

Мой браузер настроен просить немецкое содержание первого: Browser settings

Что я пропустил?

P.S. Проект я в настоящее время fuzzying вокруг размещается на GitHub: https://github.com/frlan/blankspot

+0

Что на самом деле происходит? Английский показ? Не отображаются переводы? –

+0

Перевод не отображается. – frlan

+0

У вас есть 'USE_I18N = True'? – Seitaridis

ответ

33

Добавьте LOCALE_PATHS к settings.py и установить его как ниже:

Обратите внимание, что LOCALE_PATHS должен быть кортеж (смотреть на запятую в конце пути)

import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

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

Теперь на основе LOCALE_PATHS, Папка locale должна быть в корне вашего проекта.

И убедитесь, что вы запустили django-admin.py makemessages -l de и django-admin.py compilemessages cmds из корня вашего проекта.

djPrj 
    | 
    +---> djPrj 
    | 
    +---> djApp 
    | 
    +---> locale 
    | 
    +---> templates 

Также переставить MIDDLEWARE_CLASSES быть LocaleMiddleware после SessionMiddleware и до CommonMiddleware, что упомянутый here:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

Перезапустите службу (python manage.py runserver) и проверьте еще раз.


Просто чтобы убедиться, что локализация применяется к странице администратора Джанго с присвоенными django.mo файлом Джанго, сделай следующий тест:

Во-первых, в главном urls.py проекта заменить patterns с i18n_patterns:

from django.conf.urls.i18n import i18n_patterns 

urlpatterns = i18n_patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    # ... 
) 

Теперь перейдите на страницу Admin с префиксом de, например: http://127.0.0.1:8000/de/admin/ И Admin страница должна быть показана на языке German.

Хорошо, вы можете видеть Admin страница django в de Язык?

Также проверьте свой префикс de.


В соответствии с вашим кодом project, некоторые фразы не в транс-блоке. положить их как:

{% trans "your sentence" %} 

Также вы должны использовать ugettext_lazy вместо ugettext в код для представлений и моделей (readhere)

заменить это:

from django.utils.translation import ugettext as _ 

с:

from django.utils.translation import ugettext_lazy as _ 

И теперь все будет работать.

+1

Все еще не работает. :( – frlan

+0

@frlan, вы можете видеть страницу администратора django на языке? (Я обновляю свой ответ для этого) –

+0

Да, я могу видеть. – frlan

2

Пожалуйста, установите translated string в django.po, а затем использовать python manage.py compilemessages

for e.g 

#: path/to/python/module.py:23 
msgid "Welcome to my site." 
msgstr "put appropriate translated string here" 

Suggestion-: Вы можете использовать django-rosetta пакет, чтобы добавить translated string из интерфейса UI. Легко добавить T-строку из django-admin. https://github.com/mbi/django-rosetta

+0

Я уже сделал это (и обновил вопрос прямо сейчас - пропустил taht. Sry.) – frlan

+0

Вы добавили django-view для заданного языка и HTML-кода для перехода к этому представлению? – Nilesh

+0

Только сделал то, что Я думал, что Django определил сам язык (в границах) – frlan

0

В ваших настройках необходимо указать enable the LocaleMiddleware, чтобы сообщить Django об обнаружении языка на основе настроек браузера. Изменение языковых настроек эффективно устанавливает заголовок Accept-Language. Возможно, вам потребуется проверить окно инкогнито, потому что другие средства определения языка имеют более высокий приоритет, например сеанс пользователя и куки-файл django_language.

+0

Это активировано. Я только что обновил сообщение, но спасибо за подсказку. – frlan

2

Проверьте печенье и сеанс - в соответствии с How Django Discovers Language Preference, процесс заключается в следующем:

  1. префикс языка в URL, при использовании i18n_patterns в URLconf
  2. _language ключ сеанса текущего пользователя
  3. django_language печенья (или как указано settings.LANGUAGE_COOKIE_NAME)
  4. заголовок HTTP Accept-Language (это то, что ваши настройки браузера посылает)
  5. Setti ngs.LANGUAGE_CODE

Поскольку настройки вашего браузера имеют предпочтение «de», я подозреваю, что LocaleMiddleware должен решить иначе на одном из предыдущих шагов 1. - 3.

4

В моем случае, я использовал ан-гб в качестве параметра для запуска

django-admin.py makemessages -l en-gb

Вместо этого, он должен быть en_GB.

django-admin.py makemessages -l en_GB

Смежные вопросы