2009-08-25 16 views
5

De Django Documentación:Uso settings.LANGUAGES con nombres correctamente traducidos utilizando gettext()

Si define una costumbre LANGUAGES ajuste, que está bien para marcar los idiomas como cadenas de traducción (como en el defecto valor mostrado arriba) - pero utiliza una función "ficticia" gettext(), no la de django.utils.translation. Nunca se debe importar django.utils.translation desde dentro su archivo de configuración, ya que el módulo en sí mismo depende de los ajustes , y que podría causar una importación circular . La solución es utilizar una función "ficticia" gettext(). Aquí hay un archivo de configuración de muestra:

gettext = lambda s: s LANGUAGES = ( ('de', gettext('German')), ('en', gettext('English')), )

Con esta disposición, django-admin.py makemessages seguirá siendo encontrar y marcar estas cadenas para la traducción, pero la traducción no sucederá en tiempo de ejecución - - Así que tendrá que recordar para envolver los idiomas en el gettext() real en cualquier código que use LANGUAGES en tiempo de ejecución.

¿Qué significa exactamente para ajustar los idiomas en real gettext()? ¿Cómo debería llamarse en el código?

Respuesta

3

exactamente lo que dice: llamar gettext() en los nombres de los idiomas cuando realmente se utilicen o les muestra al usuario:

from django.utils.translation import ugettext 

for lang_code, lang_name in settings.LANGUAGES: 
    translated_name = ugettext(lang_name) 
    ... 

(usted debe utilizar generalmente ugettext en lugar de gettext, ya que todo el texto Django es unicode)

para hacer el equivalente en una plantilla, sólo tiene que utilizar el {%}% blocktrans etiqueta, que sólo llama ugettext detrás de las escenas:.

{% for lang in LANGUAGES %} 
    {% blocktrans %}{{ lang.1 }}{% endblocktrans %} 
{% endfor %} 
+0

Este método es bastante stright adelante y comprensible. Pero en este caso, ¿de qué sirve usar un envoltorio ficticio en la configuración.LANGUAGES? Como de todos modos debe envolver cada línea en el código, cuál es el punto de la función de envoltura que sugiere el tutorial. –

+2

Porque cuando ejecuta la herramienta de línea de comandos gettext sobre su árbol de código fuente (probablemente a través de ./manage.py makemessages), quiere que reconozca esas cadenas como "que necesitan traducción" para que las agreguen a su archivo PO. –

0

Ésta es re ally un comentario y una explicación más detallada sobre el anterior Q & A. No pude hacer que mis traducciones funcionaran, leí y volví a leer los documentos, busqué horas en línea, y después de leer esta publicación me di cuenta de que se trataba de esto:

yo tenía originalmente:

LANGUAGES = (
    ('en', 'English'), 
    ('nl', 'Dutch'), 
    ) 

que no funcionaba, a continuación, después de leer este trataron

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ) 

que hizo que todo el trabajo ... y yo sólo buscaba esto y es en el doc en https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference, hacia el botto m de esta sección ...

0

en la plantilla que sólo podría hacer lo siguiente:

{% for lang in LANGUAGES %} 
     {% trans lang.1 %} 
{% endfor %} 
2

De acuerdo con la latest docs puede utilizar ugettext_lazy en entornos sin causar importaciones circulares:

from django.utils.translation import ugettext_lazy as _ 

LANGUAGES = [ 
    ('de', _('German')), 
    ('en', _('English')), 
] 
Cuestiones relacionadas