** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - BBDD Varios idiomas (ESP/ENG)
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

BBDD Varios idiomas (ESP/ENG)

 Responder Responder
Autor
Mensaje
majete Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita majete Cita  ResponderRespuesta Enlace directo a este mensaje Tema: BBDD Varios idiomas (ESP/ENG)
    Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 11055
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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 .... Evil Smile


P.D. el sistema obviamente también te vale para formularios, caption de botones de comando, textos de ayuda de los mismos, ....



Editado por Mihura - 24/Julio/2019 a las 14:08
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
ximo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 1925
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita ximo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Binghamton
Estado: Sin conexión
Puntos: 3379
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Estos son mis principios. Si no le gustan... tengo otros
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4308
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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


 



Editado por javier.mil - 24/Julio/2019 a las 20:25
Arriba
majete Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita majete Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Abuelo FELIZ

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11317
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita buho Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 25/Julio/2019 a las 17:20
Publicado originalmente por lbauluz lbauluz escribió:

En mi época... :)

Usted perdone: En su época (Siglo XIX) no existía Access  Evil Smile
Expulsado de la cárcel por robar los barrotes
Arriba
ximo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 1925
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita ximo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.


Saludos, ximo

La incansable busqueda de información abre nuestras mentes

Saludos desde Burriana
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4308
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 28/Julio/2019 a las 19:23
Publicado originalmente por ximo 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  ?


 



Editado por javier.mil - 28/Julio/2019 a las 19:23
Arriba
majete Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita majete Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
guarracuco Ver desplegable
Moderador
Moderador
Avatar

Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3016
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita guarracuco Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.



Editado por guarracuco - 31/Julio/2019 a las 13:35
https://tucondominioaldia.net
Arriba
majete Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Marzo/2006
Localización: España
Estado: Sin conexión
Puntos: 670
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita majete Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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!
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable