2012-07-18 45 views
5

Tengo un sitio web django. Estoy agregando traducciones a con un selector de idioma que enumera los idiomas disponibles en el idioma del usuario. Me gustaría que el menú desplegable incluya la ortografía nativa también.Django Language Selector en el idioma local y nativo

Actualmente se tiene el siguiente aspecto:
Inglés
holandesa
Chino simplificado

Cuando cambio a china que parece:
英语
荷兰语
简体 中文

soy tratando de que se vea como:
Inglés/Inglés
holandesa/Nederlands
chino simplificado/简体 中文

settings.py incluye:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ('zh-cn', ugettext('Simplified Chinese')), 
) 

base.html:

{% load i18n %} 
    {% get_available_languages as LANGUAGES %} 
    <form action="/i18n/setlang/" method="post">{% csrf_token %} 
     <input name="next" type="hidden" value="/" /> 
     {% csrf_token %} 
     <select name="language"> 
      {% for lang in LANGUAGES %} 
      <option value="{{ lang.0 }}">{{ lang.1 }}</option> 
      {% endfor %} 
     </select> 
     <input type="submit" value="Go" /> 
    </form> 

Mi idea era añadir otro elemento a idiomas que es el idioma nativo, como:

LANGUAGES = (
    ('en', ugettext('English'), 'English'), 
    ('nl', ugettext('Dutch'), 'Nederlands'), 
    ('zh-ch', ugettext('Simplified Chinese'), '简体中文'),) 

Pero Django parece esperar una tupla de 2 elementos para IDIOMAS. ¿Alguna otra idea?

EDITAR por el comentario de Alexander: pensé que podría ser una solución más simple, pero después de cambiar el código:

 <form action="/i18n/setlang/" method="post">{% csrf_token %} 
     <input name="next" type="hidden" value="/" /> 
     <select name="language"> 
      <option value="en">English</option> 
      <option value="nl">Dutch\Nederlands</option> 
      <option value="ru">Russian\Русский</option> 
      <option value="zh-cn">Simplified Chinese-简体中文</option> 
     </select> 
     <input type="submit" value="Go" /> 
    </form> 

Las secuencias de comandos rusos y chinos se están presentando como signos de interrogación - \ rusa ?? ?????, chino - ????

Tengo <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> en el html, otro texto en ruso y chino (fuera de este formulario) parece estar bien.

+0

No nos molestamos con un problema así: una parte codificada en la plantilla y eso es todo. –

+0

Tendría que cambiar/establecer idiomas y enumerarlos a través de todos ellos para generar todas las traducciones nativas posibles de cada nombre de idioma. Es mucho más fácil incluir un dict de nombres predefinido con ortografía nativa para cada idioma que desee y pasarlo a la plantilla. – astevanovic

Respuesta

5

Prueba esto:

LANGUAGES = (
    ('en', '{}/{}'.format(ugettext('English'), 'English')), 
    ('nl', '{}/{}'.format(ugettext('Dutch'), 'Nederlands')), 
    ('zh-cn', '{}/{}'.format(ugettext('Simplified Chinese'), '简体中文')), 
) 

entonces usted puede utilizar esto en sus plantillas:

{% for lang in LANGUAGES %} 
    <option value="{{ lang.0 }}">{{ lang.1 }}</option> 
{% endfor %} 
+0

Que los códigos me dan un UnicodeDecodeError at/ 'codec ascii' no puede decodificar el byte 0xd0 en la posición 8: ordinal no en el rango (128) cuando la plantilla llama {% get_available_languages ​​como LANGUAGES%}. Si cambio a u '简体 中文' entonces obtengo un UnicodeEncodeError: el códec 'ascii' no puede codificar caracteres en la posición 0-6: ordinal no está dentro del rango (128) al importar settings.py – Steve

+0

Lo siento, no sé cómo formatear bien los comentarios ... tuve que configurar la codificación de settings.py a utf-8 y algunos otros ajustes. ¡Esta codificación de idioma tiene muchas bases que cubrir para que funcione bien! – Steve

+0

no necesita usar {% get_available_languages ​​como LANGUAGES%}. Si no ha cambiado 'TEMPLATE_CONTEXT_PROCESSORS',' {{LANGUAGES}} 'ya está disponible para sus plantillas de manera predeterminada. {% get_available_languages%} causa el UnicodeDecodeError que está obteniendo. –

1

Tomando la sugerencia de Alexander, yo era capaz de obtener el código en el texto de arriba para que funcione correctamente. No tenía la línea <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> dentro del área 'cabeza', que es obligatoria, ¿y eso me daba el ???? donde los caracteres chinos deberían haber estado

Después de verlo en acción, puedo tener 2 selectores de idioma, uno que se traduce al idioma actual, y otro con los caracteres inglés/nativo si no está demasiado ocupado.

También pondré la lista de idiomas en un módulo y la pasaré a la plantilla similar a obtener los IDIOMAS.