lunes, 20 de abril de 2009

Internacionalización con Infopath

La internacionalización en Infopath nos permite diseñar formularios para distintos idiomas y formatos. El problema lo tenemos cuando trabajamos con campos de fecha, decimales o campos moneda. Infopath nos permite definir como se visualizarán estos campos en tiempo de diseño y en ejecución. No es lo mismo “100.2” que “100,2”, tampoco es lo mismo “30/03/2009” que “03/30"/2009”.

Cuando diseñamos nuestra plantilla podemos definir el idioma para todos los controles, esto hará que aquellos controles que hereden de las propiedades definidas en la plantilla se comportarán en función del idioma indicado.

El idioma de la plantilla lo establecemos desde Opciones del formulario > Examinar > Idioma del formulario. Si no especificamos ninguno, por defecto aplicará el definido regionalmente en el equipo sobre el que se ejecute.

Sobre cada control además podemos definir en que formato queremos que se visualice.

Para los campos del tipo fecha podemos mostrar directamente el valor almacenado en xml, indicar un formato específico o que el formato sea el indicado por la cultura regional.

Para los campos de tipo decimal o doble, podemos definir el número de dígitos decimales y el separador de millares.

Para verlo con más claridad he diseñado una plantilla que muestra un campo de tipo fecha y numérico en distintos formatos:

  • El 1º muestra el valor xml
  • El 2º muestra la fecha en función de la zona definida
  • La 3º muestra la fecha en formato DD/MM/YYYY
  • El 4º y 5º muestran un control fecha asociado a un campo del tipo texto.
  • El 6º muestra el valor decimal almacenado en el xml.
  • El 7º muestra con separadores
  • El último muestra sin separadores de millares

En Español:

En Inglés:

Y cómo afecta la internacionalización al xml generado?, si abrimos el xml generado en los dos casos veremos que tenemos un xml similar:

Español:

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.5" productVersion="12.0.0" PIVersion="1.0.0.0" href="file:///C:\Users\Administrador\AppData\Local\Microsoft\InfoPath\Designer2\e706af73eab64283\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?><my:misCampos my:Fecha2="2009-04-24" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-04-20T21:11:49" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="">
<my:Fecha1>2009-04-11</my:Fecha1>
<my:Decimal1>1234567.89</my:Decimal1>
</my:misCampos>


Inglés:

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.5" productVersion="12.0.0" PIVersion="1.0.0.0" href="file:///C:\Users\Administrador\AppData\Local\Microsoft\InfoPath\Designer2\e706af73eab64283\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?><my:misCampos my:Fecha2="2009-04-09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-04-20T21:11:49" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="">
<my:Fecha1>2009-04-15</my:Fecha1>
<my:Decimal1>12345678.67</my:Decimal1>
</my:misCampos>

De modo que si queremos manejar estos valores en los tipos nativos de .NET podemos hacer lo siguiente:

Para las fechas podemos utilizar directamente “DateTime.parse”.

Para los decimales o dobles tendremos que utilizar “double.parse” pero especificando el idioma ingles. Si quisiéramos realizar una validación desde infopath podríamos hacer algo como esto:


public void Decimal1_Validating(object sender, XmlValidatingEventArgs e)
{
if (!string.IsNullOrEmpty(e.NewValue))
{
System.Globalization.CultureInfo en = new System.Globalization.CultureInfo(1033);
double valor = double.Parse(e.NewValue, en);
}
}


Y qué pasa si abrimos un fichero xml generado con una plantilla en un idioma y lo abrimos en otro idioma?, pues que infopath convertirá automáticamente los valores sin lanzar ninguna excepción.

No hay comentarios: