python - examples - django template variable
¿Cómo configurar la traducción de Django de la manera correcta? (5)
Tengo un problema con las traducciones que no funcionan en Django 1.6 !. He añadido a mi configuración.py
LANGUAGE_CODE = ''en-us''
ugettext = lambda s: s
LANGUAGES = (
(''en'', ugettext(''English'')),
(''de'', ugettext(''German'')),
)
También se ha añadido middlewares:
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'',
)
así como a mis archivos * .py siempre que esté usando una cadena que será l10nd:
from django.utils.translation import ugettext_lazy as _
Mis plantillas comenzando con
{% extends "base.html" %}
{% load i18n %}
y dentro de la plantilla que usé el marcador de posición trans. P.ej
<h1>{% trans "Register a tank" %}</h1>
De hecho, la cadena aparece dentro de locale / de / LC_MESSAGES / django.po cuando se ejecuta también los he traducido. P.ej
msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"
Mi navegador está configurado para solicitar contenido alemán primero: configuración del navegador
¿Qué me perdí?
PS El proyecto en el que estoy fuzzying actualmente se encuentra en github: https://github.com/frlan/blankspot
Agregue LOCALE_PATHS
a settings.py
y LOCALE_PATHS
como a continuación:
Tenga en cuenta que LOCALE_PATHS
debe ser una tupla (mire la coma al final de la ruta)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
LOCALE_PATHS = (
os.path.join(BASE_DIR, ''locale''),
)
Ahora basado en LOCALE_PATHS
, la carpeta de locale
debe estar en la raíz de su proyecto.
Y asegúrese de ejecutar django-admin.py makemessages -l de
y django-admin.py compilemessages
cmds desde la raíz de su proyecto.
djPrj
|
+---> djPrj
|
+---> djApp
|
+---> locale
|
+---> templates
También reorganice su MIDDLEWARE_CLASSES
para que sea LocaleMiddleware
después de SessionMiddleware
y antes de CommonMiddleware
que se menciona 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'',
)
Reinicie su servicio ( python manage.py runserver
) y verifique nuevamente.
Solo para asegurarse de que su localización se aplique a su página de administración de django con el archivo django.mo
predeterminado de django, haga la siguiente prueba:
Primero en urls.py
principal del proyecto reemplazar patterns
con i18n_patterns
:
from django.conf.urls.i18n import i18n_patterns
urlpatterns = i18n_patterns('''',
url(r''^admin/'', include(admin.site.urls)),
# ...
)
Ahora vaya a la página de Admin
con el prefijo, como: http://127.0.0.1:8000/de/admin/
Y la página de Admin
debe mostrar en idioma German
.
Ok, ¿puedes ver la página de Admin
de django en el idioma?
También revise su vista con prefijo también.
De acuerdo con su código de https://github.com/frlan/blankspot , algunas oraciones no están en bloque trans. ponerlos como
{% trans "your sentence" %}
También debe usar ugettext_lazy
lugar de ugettext en su código para vistas y modelos, ( read here )
reemplace esto:
from django.utils.translation import ugettext as _
con:
from django.utils.translation import ugettext_lazy as _
Y ahora todo funcionará.
En mi caso, usé en-gb como el parámetro para ejecutar
django-admin.py makemessages -l en-gb
En su lugar, debería ser en_GB.
django-admin.py makemessages -l en_GB
Verifique las cookies y la sesión. De acuerdo con here , el proceso es el siguiente:
- prefijo de idioma en la URL, cuando se utiliza i18n_patterns en URLconf
- Clave _language en la sesión del usuario actual
- cookie django_language (o según lo especificado por settings.LANGUAGE_COOKIE_NAME)
- Aceptar el encabezado HTTP (esto es lo que envía la configuración de su navegador)
- settings.LANGUAGE_CODE
Dado que la configuración de su navegador está configurada para preferir ''de'', sospecho que LocaleMiddleware debe decidir lo contrario en uno de los pasos anteriores 1. - 3.
LocaleMiddleware
habilitar LocaleMiddleware
en su configuración, para decirle a Django que realice la detección de idioma según la configuración del navegador. Cambiar sus preferencias de idioma establece efectivamente el encabezado Accept-Language
. Es posible que deba registrar una ventana de incógnito, ya que otros medios de detección de idioma tienen una prioridad más alta, como la sesión del usuario y la cookie django_language
.
django.po
translated string
en django.po
y luego use los python manage.py compilemessages
for e.g
#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr "put appropriate translated string here"
Sugerencia: puede usar el paquete django-rosetta
para agregar una translated string
desde la interfaz de la interfaz de usuario. Es fácil agregar T-string desde django-admin. https://github.com/mbi/django-rosetta