Hola a todos , despues de mucho googlear , preguntar e investigar pude lograr un reporte Multi-idioma , usando Crystal Reports para VS2005 , sobre .NET 2.0 Ahora recuerdan el post donde Listo Objetos de NHibernate con Crystal Reports. Bueno , continuando, ese mismo reporte lo hare multi-idioma 1.- Para Cualquier Tipo de Aplicación Multi-idioma , ya se una pagina web o un Reporte en nuestro caso , es buena practica , tener un archivo de recursos. Insertar un Archivo de Recursos:
Una vez insertado el Archivo de Recursos. agregamos claves , sabemos que para cada clave tiene un valor:
Cuando diseñamos un reporte , en Crystal Reports , automaticamente se agrega una Etiqueta en la Parte Superior de cada columna que vamos a Reportar , borramos estas etiquetas. Insertamos "Campos de Formula", es muy importa que el Nombre de los Campos de Formula tengan el mismo nombre del Valor en nuestro Archivo de Recursos.
Despues usar Asistente, "NO AGREGAR NADA MAS" , Guardar y Cerrar. Los Campos de Formula se identifican por la "@" Por delante. Vamos a usar un "Combo" (DropDownList) para cambiar de Idioma dinamicamente en tiempo de ejecución.
En el Evento del ComboBox: protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { if (this.DropDownList1.SelectedValue == "Ingles") { CargarReporte("Ingles"); } else { CargarReporte("Español"); } } | En el Metodo CargarReporte: public void CargarReporte(string idioma) { Comun<Entidades.Ordenes> listaOrden = new Comun<Entidades.Ordenes>(); Ordenes.DS.OrdenDS ordenDS = new Ordenes.DS.OrdenDS(); foreach (Entidades.Ordenes ord in listaOrden.ListarObjeto()) { DataRow filaOrden = ordenDS.Tables["Ordenes"].NewRow(); filaOrden["IdOrden"] = ord.IDOrden; filaOrden["NumeroOrden"] = ord.NumeroOrden; filaOrden["Fecha"] = ord.Fecha; filaOrden["Total"] = ord.Total; filaOrden["Cliente"] = ord.Cliente; filaOrden["Descuento"] = ord.Descuento; ordenDS.Tables["Ordenes"].Rows.Add(filaOrden); } ordenDS.Tables["Ordenes"].AcceptChanges(); CrystalReport1 reporte = new CrystalReport1(); reporte.SetDataSource(ordenDS); CrystalReportViewer1.ReportSource = reporte; CambiarIdioma(reporte,idioma); CrystalReportViewer1.RefreshReport(); } | En el Metodo CambiarIdioma() private void CambiarIdioma(CrystalDecisions.CrystalReports.Engine.ReportClass crReport,string idioma) { FormulaFieldDefinitions crReportFields = crReport.DataDefinition.FormulaFields; GetFormula(crReportFields,idioma); } | En el Metodo GetFormula() void GetFormula(FormulaFieldDefinitions crFormulaFields,string idioma) { if (idioma == "Ingles") { for (int intFieldCount = 0; intFieldCount < crFormulaFields.Count; intFieldCount++) { FormulaFieldDefinition crFormulaField = crFormulaFields[intFieldCount]; ResourceManager srcMan = Ordenes.Ingles.ResourceManager; if (crFormulaField.Name != srcMan.GetString(crFormulaField.Name)) { crFormulaField.Text = "'"+srcMan.GetString(crFormulaField.Name).ToString()+"'"; } } } else { for (int intFieldCount = 0; intFieldCount < crFormulaFields.Count; intFieldCount++) { FormulaFieldDefinition crFormulaField = crFormulaFields[intFieldCount]; //crFormulaField.Text = "'" + srcMan.GetString("Cantidad").ToString() + "'"; ResourceManager srcMan = Ordenes.Espaniol.ResourceManager; if (crFormulaField.Name == srcMan.GetString(crFormulaField.Name)) { crFormulaField.Text = "'" + srcMan.GetString(crFormulaField.Name).ToString() + "'"; } } } } | Observemos que las Etiquetas Aqui: estan en Español: 
Despues de Cambiar el Indice del Combo: Las Etiquetas estan en Ingles: 
Es Importante Mencionar que hay que importar los espacios de Nombre: using CrystalDecisions.CrystalReports.Engine; using System.Resources; Bueno espero les haya ayudado, Muchas Gracias. Jose Fabricio Rojas |
0 post:
Publicar un comentario en la entrada