¿Cómo configurar la traducción de Django de la manera correcta?

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

     

    {% trans "Register a tank" %}

    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 está alojado en github: https://github.com/frlan/blankspot

    Agregue LOCALE_PATHS a settings.py y LOCALE_PATHS la LOCALE_PATHS :

    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 aquí :

     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.


    Según su código de proyecto , 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, ( lea aquí )

    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

    django.po translated string en django.po y luego use los python manage.py compilemessages

     for eg #: 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

    Verifique las cookies y la sesión. De acuerdo con Cómo Django descubre las preferencias de idioma , el proceso es el siguiente:

    1. prefijo de idioma en la URL, cuando se utiliza i18n_patterns en URLconf
    2. _la clave del lenguaje en la sesión del usuario actual
    3. cookie django_language (o según lo especificado por settings.LANGUAGE_COOKIE_NAME)
    4. Aceptar el encabezado HTTP del idioma (esto es lo que envía la configuración de su navegador)
    5. 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. Al cambiar sus preferencias de idioma, se 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 .