20 de abril de 2011

Flash. Cambiar tipografía para mostrar caracteres chinos

Un pequeño problema que me he encontrado al desarrollar una aplicación que puede mostrar mensajes en español, en rumano o en chino, dependiendo de los textos que se le incorporen, es cómo conseguir que los textos se muestren correctamente sin importar el idioma.

La solución pasa por emplear dos fuentes diferentes, una que incorpore los caracteres habituales españoles y los de europa central y otra fuente diferente para los caracteres chinos. La incrustación para que estén disponibles para su uso con Actionscript es sencilla, se realiza con facilidad desde el panel Biblioteca.

Lo más complicado ha sido ver cómo podemos cambiar de una fuente a otra dependiendo de si en la cadena de texto hay o no caracteres chinos. Para ello se puede emplear el método hasGlyphs de la clase Font, que nos devuelve un valor verdadero si la fuente en cuestión tiene todos los glifos necesarios (los caracteres, vaya) para representar un texto determinado.

Así, en la clase que empleo defino dos propiedades con las fuentes incrurstadas:

  private var myFont:mydejavusans = new mydejavusans();
  private var myAltFont:mysungtil = new mysungtil();

y posteriormente, antes de mostrar la cadena hago esta pequeña comprobación:

if (myFont.hasGlyphs(miMensajedeTexto)) formatotxt.font =  myFont.fontName; 
  else formatotxt.font = myAltFont.fontName;

y muestro el texto, ya con la tipografía correcta.

  txtMini.text = miMensajedeTexto;
  txtMini.setTextFormat (formatotxt);

Es decir, si la variable miMensajedeTexto no se puede mostrar con los caracteres de la fuente myFont, se cambiará automáticamente a la fuente myAltFont, que es la que contiene los caracteres chinos.

Espero que le sea de utilidad a alguien, lo cierto es que me costó un ratito encontrarlo.

¿Y en Python?

En Python he tenido que hacerlo también, y con la magia habitual de este lenguaje la cosa resulta también muy sencilla. Teniendo ya una fuente seleccionada, buscamos un rango concreto de caracteres. Si se encuentran cambiamos la fuente, en este caso para generar una imagen

if re.findall(ur'[\u4e00-\u9fff]+',os.path.splitext(os.path.basename(filename))[0]):
        font = ImageFont.truetype("fuenteconcaractereschinos.ttf", 20)

Foto: Flickr de Sinospice.