Re: [SOLUCIONADO]Varios idiomas en una aplicación
Publicado: 08 Nov 2011, 09:35
Lo de la velocidad es cosa de probarlo, a menos que estés sacando texto en un TextEdit, por ejemplo, puede que no se note la diferencia.
El ejemplo del diccionario no lo puse sólo por lo del multilenguaje, en realidad me interesaba más mostraros el asunto del diccionario, porque en otras circunstancias también podría ser muy útil.
En el caso del multilenguaje (¿quién dijo que estaba "solucionado"? ) se me ocurre otra posibilidad bastante eficiente:
Crear directamente variables AutoIt.
Es la idea de usar nombres clave para las cadenas, el nombre se usa para el nombre de la variable, y la cadena obviamente es su valor.
Así si en el archivo de idioma nos encontramos por ejemplo:
txtTabSheet1=Archivo
En código haremos:
Assign("txtTabSheet1", "Archivo", 2)
(el 2 es para que cree la variable con ámbito global)
Notad que he cambiado el nombre de la cadena para que no coincida con la variable del tabsheet. Lógicamente al estar usando variables tenemos que asegurarnos de que no usamos claves que ya sean variables en nuestro programa.
Luego a la hora de usar la variable hay dos opciones. La normal no nos interesa demasiado porque es casi lo que tenemos:
$TabSheet1 = GUICtrlCreateTabItem(Eval("txtTabSheet1"))
Bueno, sí que nos interesa porque es MEGARÁPIDO, en lo que no se gana mucho es a la hora de usar las cadenas, pues en este caso en vez de la función _bpi() o el acceso al diccionario usamos Eval().
Pero el código aún se puede hacer más simple usando directamente la variable. En principio no se puede hacer porque como la variable no está declarada (se crea en tiempo de ejecución con Assign, no en la compilación) el compilador da error cuando intentas usar esas variables.
Así que para solucionarlo lo mejor es: crearlas, naturalmente
No es problema porque sabemos qué cadenas usamos en el programa, y encima la declaración explícita nos da la opción de dar ya los valores del idioma por defecto.
Así hacemos:
Global $txtTabSheet1="Archivo" ;valor por defecto
Assign("txtTabSheet1", "File") ;se ha leído el idioma inglés
$TabSheet1 = GUICtrlCreateTabItem($txtTabSheet1) ; ¡se usa la variable directamente!
(ya no hace falta el tercer parámetro en Assign(), pues ya hemos creado la variable como global)
Naturalmente el Assign no se hace directamente, sino que como estamos leyendo el archivo de idioma estaremos usando variables en un bucle:
Assign($clave, $valor)
Si alguna clave no existe en el archivo de idioma no será reasignada, con lo que se usará el valor por defecto.
Por supuesto para las cadenas multilínea o con textos insertados sigue haciendo falta usar StringFormat(), si a nadie se le ocurre una manera mejor.
El ejemplo del diccionario no lo puse sólo por lo del multilenguaje, en realidad me interesaba más mostraros el asunto del diccionario, porque en otras circunstancias también podría ser muy útil.
En el caso del multilenguaje (¿quién dijo que estaba "solucionado"? ) se me ocurre otra posibilidad bastante eficiente:
Crear directamente variables AutoIt.
Es la idea de usar nombres clave para las cadenas, el nombre se usa para el nombre de la variable, y la cadena obviamente es su valor.
Así si en el archivo de idioma nos encontramos por ejemplo:
txtTabSheet1=Archivo
En código haremos:
Assign("txtTabSheet1", "Archivo", 2)
(el 2 es para que cree la variable con ámbito global)
Notad que he cambiado el nombre de la cadena para que no coincida con la variable del tabsheet. Lógicamente al estar usando variables tenemos que asegurarnos de que no usamos claves que ya sean variables en nuestro programa.
Luego a la hora de usar la variable hay dos opciones. La normal no nos interesa demasiado porque es casi lo que tenemos:
$TabSheet1 = GUICtrlCreateTabItem(Eval("txtTabSheet1"))
Bueno, sí que nos interesa porque es MEGARÁPIDO, en lo que no se gana mucho es a la hora de usar las cadenas, pues en este caso en vez de la función _bpi() o el acceso al diccionario usamos Eval().
Pero el código aún se puede hacer más simple usando directamente la variable. En principio no se puede hacer porque como la variable no está declarada (se crea en tiempo de ejecución con Assign, no en la compilación) el compilador da error cuando intentas usar esas variables.
Así que para solucionarlo lo mejor es: crearlas, naturalmente
No es problema porque sabemos qué cadenas usamos en el programa, y encima la declaración explícita nos da la opción de dar ya los valores del idioma por defecto.
Así hacemos:
Global $txtTabSheet1="Archivo" ;valor por defecto
Assign("txtTabSheet1", "File") ;se ha leído el idioma inglés
$TabSheet1 = GUICtrlCreateTabItem($txtTabSheet1) ; ¡se usa la variable directamente!
(ya no hace falta el tercer parámetro en Assign(), pues ya hemos creado la variable como global)
Naturalmente el Assign no se hace directamente, sino que como estamos leyendo el archivo de idioma estaremos usando variables en un bucle:
Assign($clave, $valor)
Si alguna clave no existe en el archivo de idioma no será reasignada, con lo que se usará el valor por defecto.
Por supuesto para las cadenas multilínea o con textos insertados sigue haciendo falta usar StringFormat(), si a nadie se le ocurre una manera mejor.