2012-01-07 10 views
6

Posiblemente se me escapa una solución obvia o pensando por el camino equivocado ...Obtener texto traducible de una fuente externa en el catálogo

tengo una cantidad limitada de texto, palabras en una base de datos, que desea mostrar traducida a los usuarios en una aplicación web matraz/jinja/babel. p.ej. "ejecutar" es un valor posible de una columna de "actividad" y debería ser "laufen" para mis usuarios alemanes.

Las palabras de las plantillas y el código se extraen y se colocan en el catálogo, pero ¿cómo obtengo palabras adicionales en el catálogo? ¿Hay un extractor de archivos de texto simple?

Lo único que se me ocurre es crear un archivo .py y poner muchas _ ('...') líneas en ellas, pero eso parece estar mal ... ¿o sí?

+0

¿Están estas palabras en la base de datos definidas como enums? – plaes

+0

Sí, pero no se limite a enumeraciones o bases de datos para ese asunto. Otro escenario podría ser un sistema externo, tal vez enviando JSON a mi sistema, con ciertas palabras, que necesito traducir, que * nunca * aparece en * mi * código, pero solo en los mensajes entrantes. I * sé * esas palabras de, digamos, las especificaciones API, pero quiero evitar ponerlas en mi código como '_ ('palabra')', solo para ser recogido por gettext. Supongo que usaré un archivo de texto con una palabra por línea y escribiré mi propia función de extracción. – Florian

Respuesta

3

he creado un messages.txt con mis "palabras" como función gettext llama:

_('cycling') 
_('running') 

y ha añadido que a mi babel.cfg como fuente de Python:

[python: messages.txt] 

sencillo, simple, estúpido, pero funciona.

1

Primero, comience con http://flask.pocoo.org/snippets/4/.

En segundo lugar, es necesario almacenar estos valores 'limitados' como números enteros o enumeraciones en la base de datos y luego crear la tabla de consulta para todas estas enumeraciones de código (por lo Babel sabe acerca de ellos):

i18n_val = {0: _('running'), ...} 
# Or multi-level dict with different categories: 
i18n_all = { 
    'activity': { 
    0: _('running'), ... 
    'foo': { 
    0: _('bar..'), ... 
    } 
} 

y acceder la traducción de la cadena de la plantilla es ahora tan simple como:

{{ i18n_val[obj.activity] }} 
{{ i18n_all['activity'][obj.activity] }} 

con el fin de hacer que las variables i18n_vali18n_all y disponible para todas las plantillas, sólo les registra en context processors.

+0

Esa segunda parte es con la que tengo un problema. No quiero tomar todo el texto de la base de datos y copiarlo en algún lugar del código a mano. Lo último, en realidad lo resolví usando un filtro "| trans", que busca traducciones. – Florian

Cuestiones relacionadas