2012-06-28 19 views
7

Estoy intentando activar diferentes idiomas para mi proyecto. Inglés y español en este momento.Django i18n no funciona

voy a describir todos los pasos seguir a:

En primer lugar, me sitúo en el directorio que desea traducir. O mejor dicho, donde todos {% trans%} etiquetas son:

$ cd media/templates/landing/ 
$ mkdir locale 
$ django-admin.py makemessages --locale=en 

último comando crea el directorio/archivo /locale/en/LC_MESSAGES/django.po

abro django.po y procedo para completar todos los campos de msgstr en idioma inglés. la etiqueta msgid está en español. Respeto los consejos sobre el caso de mensajes largos. Después de relleno en este archivo, que hago:

$ django-admin.py compilemessages 

Este django.po proceso y crea django.mo.

Así que modifico settings.py. líneas importantes:

TEMPLATE_CONTEXT_PROCESSORS = (
    'ism.context_processor.user_vars', 
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'django.core.context_processors.static', 
    'django.contrib.messages.context_processors.messages', 
    'django.core.context_processors.request', 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'pipeline.middleware.MinifyHTMLMiddleware', 
} 

TIME_ZONE = 'Atlantic/Canary' 

LANGUAGE_CODE = 'es' 

USE_I18N = True 

_ = lambda s: s 

LANGUAGES = (
    ('es', _('Espanol')), 
    ('en', _('English')), 
) 

USE_L10N = True 

USE_TZ = True 

Por último, añado esta línea para URLS.py:

(r'^i18n/', include('django.conf.urls.i18n')), 

I reiniciar mi servidor de desarrollo, puedo configurar mi navegador Firefox para elegir Inglés primero como primer idioma y no lo hace trabajo. Todos los textos aún se muestran en español en lugar de inglés.

Me aseguro de que Firefox esté configurado en inglés porque en la función Django view (que representa el archivo .html) hago una impresión con request.LANGUAGE_CODE, que imprime "en".

¿Qué estoy haciendo mal?

+0

Qué te makemessages django-admin.py --locale = es? – Efazati

+0

cómo el usuario cambia entre en y es? – Efazati

+0

@Efazati El idioma principal de mi proyecto es ES, no EN. Así que entiendo que debo hacer 'django-admin.py makemessages --locale = en', ¿no? De esta forma, el archivo django.po creado tiene campos de msgid en español y tengo que completar los campos msgstr en inglés. –

Respuesta

3

En primer lugar, me coloco en el directorio que quiero traducir. O mejor dicho , donde todos {% trans%} etiquetas son:

$ cd multimedia/templates/aterrizaje/$ mkdir $ locale django-admin.py makemessages --locale = es

Este no es como se supone que debes hacer las traducciones.

crear archivos de mensajes para el idioma que desea traducir a no el que usted desea traducir de, que es el idioma base. En este caso, eso es inglés.

También es necesario ejecutar el comando desde su directorio de proyecto; no el directorio de la plantilla.

Por lo tanto, te mando debe ser:

$ django-admin.py makemessages --locale=es

debería ejecutar desde el directorio raíz de su proyecto no el directorio de plantillas. Tampoco crea el directorio locale, el comando lo creará por usted.

A continuación, agregue sus traducciones en español al archivo. El archivo tendrá las etiquetas en inglés. Esto le dice a django que cargue el equivalente español para la versión en inglés.

Una vez que tienes eso, se compila el archivo de mensajes (de nuevo desde la raíz)

$ django-admin.py compilemessages

Ahora traducciones están listas para su aplicación. Necesitas decirle a django qué idioma quieres. Dado que está utilizando la vista integrada para cambiar de idioma, debe llamar a esa vista con el idioma que desee.

hay una plantilla proporcionada en la documentación que se puede utilizar:

<form action="/i18n/setlang/" method="post"> 
{% csrf_token %} 
<input name="next" type="hidden" value="{{ redirect_to }}" /> 
<select name="language"> 
{% get_language_info_list for LANGUAGES as languages %} 
{% for language in languages %} 
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option> 
{% endfor %} 
</select> 
<input type="submit" value="Go" /> 
</form> 

Seleccione el idioma en este formulario para que Django sabe qué traducciones a cargar.

También debe leer how django discovers language preference para sus vistas y plantillas.

+1

Supongo que estás entendiendo mal. Mi lengua materna en el proyecto es ES (español), así que quiero traducir de ES a EN (inglés). Si visita este enlace (http://www.djangobook.com/es/1.0/chapter18/), puede ver en su ejemplo que nos dicen sobre el uso de 'django-admin.py hacer que los mensajes -l de' sean DE el idioma al que quieren traducir Ahora, traté de hacer todo el proceso desde el directorio raíz de mi proyecto. En teoría, LocaleMiddleware debe hacer la traducción detectando automáticamente el idioma del navegador del usuario, sin ninguna selección previa. Pero no es así –

3

Nota del editor: Esta respuesta se migró de una edición a la pregunta. Fue escrito por el Cartel original.

Hubo un problema al tomar la ruta de configuración regional. Django estaba ignorando (o simplemente no encontró) mi directorio de configuración regional en la ruta raíz, por lo que django.po/mo no estaba disponible. Todas estas cosas de mierda pueden resolverse agregando LOCALE_PATHS en settings.py.

Más información ->https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations