BBDD Varios idiomas (ESP/ENG)
Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84615
Fecha de impresión: 27/Marzo/2026 a las 00:34
Tema: BBDD Varios idiomas (ESP/ENG)
Publicado por: majete
Asunto: BBDD Varios idiomas (ESP/ENG)
Fecha de publicación: 24/Julio/2019 a las 12:56
|
Buenos días, Quería pediros consejo con una BBDD que llevo utilizando unos meses y que tengo la necesidad de reconvertirla a multiidioma (Español e Inglés). Realmente, sólo necesito poder extraer la información de los Reports tanto en Español (como está ahora, como en inglés), ya que nadie más que yo trabaja con ella. Cada mes añado datos nuevos que me pasan en un fichero Excel a una de las tablas. Yo tengo montado bastantes consultas que calculan una serie de ratios y de las que van a a parar a unos informes de cuadros de mando con resultados. Esa salida (en PDF) es la que necesito extraer ahora en un segundo idioma. Los Reports tienen tanto información dinámica (en tablas de datos, gráficas, títulos, etc.) como información estática (mediante el uso de etiquetas para rótulos, subtítulos, etc.).
SOLUCIÓN1: Duplicar cada Report y cambiar los datos a mano. Problemas: Tener que cambiar por duplicado cualquier cambio que aplique a los Report. Los datos dinámicos string vienen de la fuente original, y para que aparezcan en otro idioma tengo que hacer una tabla de conversión.
SOLUCIÓN2: Duplicar la BBDD completa y tratarla como otra independiente. Problemas: Cualquier cambio a cualquier nivel se tendrá que hacer por duplicado. Puede generar mucho trabajo si hay cambios de gran alcance a futuro.
SOLUCIÓN3: Crear una variable global que valide antes de abrir cada Report cuál es el idioma que va a imprimir. En función de ese valor, buscará en una tabla de conversión los textos que correspondan. Problemas: Tengo que cambiar todas las etiquetas por cuadros de texto para poder rellenarlos dinámicamente. Necesito una tabla de conversión de TODOS los textos que aparezcan en: títulos, subtitulos, gráficos, etc.
¿Qué opináis? Recordar que es una BBDD que ya tengo montada y que no puedo plantearme hacer un nuevo diseño para cubrir esta necesidad.
Muchas gracias a todos! JC
|
Respuestas:
Publicado por: Mihura
Fecha de publicación: 24/Julio/2019 a las 14:07
|
Puedes seguir usando etiquetas. Basta con que cambies la propiedad Caption.
Yo haría un proceso al abrir el report que recorra las etiquetas y les cambie el caption basándome en esa variable global que citas y en una tabla que contenga la información.
La tabla tendría los siguientes campos:
NombreReport - String NombreEtiqueta - String Idioma01 - string Idioma02 - string Idioma03 - string . . .
Y así hasta los que necesites.
Para obtener el valor que necesitas basta con leer el registro correspondiente y buscar en: Mitabla.Fields("Idioma" & format(VariableIdioma, "00")
Así el mantenimiento será muuuu fácil, e incorporar un idioma nuevo también, bastará con que crees el nuevo campo Idiomaxx correspondiente y rellenes sus valores.
Se que el diseño de la tabla es una herejía, pero los informáticos no vamos al infierno .... 
P.D. el sistema obviamente también te vale para formularios, caption de botones de comando, textos de ayuda de los mismos, ....
------------- Jesús Mansilla Castells. Saludos desde Móstoles.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: ximo
Fecha de publicación: 24/Julio/2019 a las 17:13
|
Hola,
Mira el ejemplo 89 de Emilio Sancha, yo lo uso para traducir una aplicación y es genial.
http://www.mvp-access.es/emilio/Access/Descargas.asp
Saludos, ximo
------------- La incansable busqueda de información abre nuestras mentes
Saludos desde Burriana
|
Publicado por: lbauluz
Fecha de publicación: 24/Julio/2019 a las 19:35
|
En mi época... :)
Solíamos hacer una tabla con mensajes, un código de mensaje, un código de idioma y el texto.
Todos los mensajes se leían de la tabla y se ponían en los "caption".
Al abrir la ventana se lanzba una query a la base de datos para que devuelva todos los textos, se cambiaban los captions y luego se mostraba la ventana.
Eso si, no es un trabajo de un par de horas el cambiar la forma de hacer todos los reports y añadir todos los mensajess a la tabla para que funcione... ni de dos días probablemente ampoco.
Luis
------------- El Búho es un pajarraco
|
Publicado por: javier.mil
Fecha de publicación: 24/Julio/2019 a las 20:09
|
Puesto a opinar y por experiencia propia diría que
- Si la BBDD es pequeña o mediana cualquier solución de las propuestas es buena
- Si Tu BBDD es grande o muy grande creo que lo mejor tu SOLUCIÓN2 es decir Duplicar la BBDD completa y tratarla como otra independiente ya que deberías cambiar todo la info visible y también deberías cambiar toda los mensajes No visibles como MsgBox , InputBox etc etc..
Si tu BBDD esta en fase testing y No esta 100% terminada lo mejor es No empezar con la traducción
------------- https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info
|
Publicado por: majete
Fecha de publicación: 25/Julio/2019 a las 11:51
|
UAU! Muchas gracias por vuestros consejos y opiniones, son muy útiles para seguir avanzando en el proyecto.
@Mihura gracias que no había pensado que se puede cambiar el contenido de las etiquetas dinámicamente. Me viene bien además la estructura de tabla para el contenido de texto de los idiomas que había pensado en una distinta menos eficiente la verdad...
@ximo voy a ver si puedo aprovechar algo del ejemplo que me comentas
@Ibauluz madre mía que currada jajaja... no sé si tendría paciencia para tal "fregao"
@javier.mil la base de datos tiene muchas consultas y en total como unos 50 reports (que se unen para generar 8 PDFs distintos) que es lo que más tiempo me ha llevado. No me puedo plantear rehacerla de nuevo.
Os contaré avances! Muchas gracias a todos.
|
Publicado por: buho
Fecha de publicación: 25/Julio/2019 a las 17:20
lbauluz escribió:
En mi época... :)
|
Usted perdone: En su época (Siglo XIX) no existía Access 
------------- El búho es un pajarraco
|
Publicado por: ximo
Fecha de publicación: 26/Julio/2019 a las 17:38
|
Hola,
Aquí tienes la versión retocada que hice en su día algo más rapída y con los mensages incluidos. Tan solo tienes que crear una tabla con las diferentes palabras teniendo en cuenta que muchas de ellas se repetiran a lo largo de los formularios/reports, de esta manera.
ID Español Inglés 1 Gracias|damos las gracias Than you|We thank
Option Compare Database Option Explicit Private rst As DAO.Recordset, HayVars As Boolean, MDb As DAO.Database
'*********************************************************************************** '* CambiaIdioma '* cambia el idioma de las etiquetas, titulos o cuadros combinados en el objeto '* formulario o informe indicado, el truco está en la propiedad tag (información '* adicional de cada control, que contiene, cuando sea necesario y separados por '* "|" la etiqueta y ToolTip en el caso de etiquetas o la tabla en el caso de '* cuadros combinados '* Argumentos: Objeto----> Formulario/Informe al que aplicar los cambios '* uso: CambiaIdioma Me '* ESH 31/03/07 13:12 '* Modificado y adaptado para trabajar con Seek y servirse de una variable pública '* (strIdioma)la cual le podemos dar el valor mediante un cuadro combinado. '* Ximo Pascual 25/07/2012 17:21 ' respeta la autoría y los creditos '*********************************************************************************** Public Function CambiaIdioma(Objeto As Object) Dim ctrl As Object Dim intPosicion As Integer 'Abrimos un recordset de la tabla Idiomas If Not HayVars Then CreaVars2
If Not (rst.EOF And rst.BOF) Then 'asignamos el nombre del formulario rst.Seek "=", Objeto.Tag If Not rst.NoMatch Then intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then Objeto.Caption = Mid(rst.Fields(strIdioma), 1, intPosicion - 1) Else Objeto.Caption = rst.Fields(strIdioma) End If End If 'recorremos los controles For Each ctrl In Objeto.Controls 'le damos a Seek el número de ID almacenado en la propiedad Tag rst.Seek "=", ctrl.Tag ' busco la descripción correspondiente en el tag de cada control en el recordset ' y aplico (si los hubiera) la parte que está por delante del separador "|" ' al Caption y la que está por detrás al ToolTipText
If Not rst.NoMatch Then Select Case ctrl.ControlType Case acLabel intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then ctrl.Caption = Mid(rst.Fields(strIdioma), 1, intPosicion - 1) End If Case acCommandButton intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then ctrl.Caption = Mid(rst.Fields(strIdioma), 1, intPosicion - 1) ctrl.ControlTipText = Mid(rst.Fields(strIdioma), intPosicion + 1) End If Case acToggleButton intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then ctrl.Caption = Mid(rst.Fields(strIdioma), 1, intPosicion - 1) End If Case acPage intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then ctrl.Caption = Mid(rst.Fields(strIdioma), 1, intPosicion - 1) End If Case acComboBox intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then ctrl.ControlTipText = Mid(rst.Fields(strIdioma), intPosicion + 1) End If Case acTextBox intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then ctrl.ControlTipText = Mid(rst.Fields(strIdioma), intPosicion + 1) End If End Select End If Next ctrl End If End Function 'sub que abre el recordset en modo lectura 'no hace falta cerrarlo ya que si no se hace no 'pasa nada. Private Sub CreaVars2() If HayVars Then Exit Sub Set MDb = CurrentDb Set rst = MDb.OpenRecordset("Idiomas", , dbReadOnly) rst.Index = "id" HayVars = True End Sub '******************************************************************************* ' DaMsg ' Nos muestra los mensajes predefinidos y guardados en una tabla (Idiomas) ' según el ID y el idioma de trabajo, la tabla deberá constar del ID ' y tantos campos como idiomas deseemos con un máximo de 254. ' A cada ID le corresponde un mensaje en varios idiomas ' Este mismo procedimiento nos sirve para cambiar el caption del formulario abierto ' Argumentos: num ------> número de ID buscado ' Uso Mensage: DaMsg (x) ' MsgBox DaMsg(X) ' Ximo Pascual 25/07/2012 17:00 ' respeta la autoría y los creditos '******************************************************************************* Public Function DaMsg(Item&) As String Dim intPosicion As Integer If Not HayVars Then CreaVars2 rst.Seek "=", Item If Not rst.NoMatch Then intPosicion = InStr(rst.Fields(strIdioma), "|") If intPosicion > 0 Then DaMsg = Mid(rst.Fields(strIdioma), 1, intPosicion - 1) Else DaMsg = rst(strIdioma) End If End If End Function 'Para cerrar el recordset si así lo deseamos 'aunque en verdad no hace falta Public Sub BorraVars() rst.Close Set MDb = Nothing HayVars = False End Sub
|
Al final no es tanto trabajo y si lo necesitas vale la pena.
------------- La incansable busqueda de información abre nuestras mentes
Saludos desde Burriana
|
Publicado por: javier.mil
Fecha de publicación: 28/Julio/2019 a las 19:23
ximo escribió:
../...
Al final no es tanto trabajo y si lo necesitas vale la pena.
.../...
|
Por curiosidad y como haces con los MsgBox , Inputbox y otras funciones internas que requieren de traducción ?
------------- https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info
|
Publicado por: majete
Fecha de publicación: 31/Julio/2019 a las 10:52
|
Hola a todos, Estoy en la fase de análisis porque tiene bastante traca el asunto. Ahora estoy metido con las gráficas, y la verdad no se me ocurre una forma práctica con la que pueda hacer el cambio de forma dinámica. Imaginaros que tengo 4 gráficas de barras con países tipo esto en un mismo Report:
Si quiero seguir utilizando el mismo Report (que es lo ideal) y que al abrirlo me cambie las etiquetas/cuadros de texto al idioma correcto, ¿Cómo puedo hacer para que me cambie los textos de la gráfica que saca de la consulta? Puedo hacer una tabla de conversión para que la Consulta tenga los dos campos, el de los países en inglés y el de los países en castellano, pero claro, tengo que cambiar la consulta en tiempo de ejecución para que en función del idioma que está mostrando, me haga una consulta y otra. Si esto fuera para un par de Reports bien, pero en mi caso son decenas de reports. La verdad no se me ocurre cómo modificar esos datos de forma dinámica.
Gracias! Juan Carlos
|
Publicado por: guarracuco
Fecha de publicación: 31/Julio/2019 a las 13:34
|
Podrías utilizar una tabla temporal. La desventaja es que aumenta el tamaño de la bd. Si el entorno es multiusuario, la tabla se crea en local.
|
Publicado por: majete
Fecha de publicación: 20/Agosto/2019 a las 15:15
|
Gracias @guarracuco por la idea. La BD sólo la utilizo yo, aunque hay un par de personas que también la conocen y que esporádicamente me dan apoyo. Nunca he creado esas "tablas temporales" y menos en modo ejecución. Voy a buscar en Internet a ver qué me cuenta.
Saludos!
|
Publicado por: majete
Fecha de publicación: 29/Octubre/2019 a las 12:09
|
Hola a todos, Bueno pues tras analizar mucho diferentes escenarios, finalmente he tenido que sucumbir a la opción más "manual" y duplicar los objetos report con los textos en inglés. He añadido en las consultas una tabla de equivalencias de idioma, por lo que no tengo que replicar las consultas y selecciono el campo en Español o en Inglés en función del report que vaya a ejecutar. Me hubiera gustado automatizar los informes para no tener que duplicarlos, pero en las gráficas me ha sido imposible poder evaluar un valor y cambiar el origen de los datos para un mismo objeto gráfico.
Muchísimas gracias a todos por la ayuda. Cerramos tema.
Saludos, Juan Carlos
|
|