Esta es mi soluci贸n. Seguro que se puede mejorar.
Se debe tener en cuenta que el par谩metro que recibe la funci贸n GetTrad() es el literal escrito en el idioma original de la aplicaci贸n.
Esto vale para GET, MENU, MSGAlert(),... y cualquier funci贸n u objeto que tenga un texto a traducir.
/* C贸mo se usa:
聽 聽- Se asume que en la definici贸n de los WINDOW/DIALOG/SAY/... estaran los literales en
聽 聽 聽el idioma por defecto, los cuales no seran traducidos por esta utilidad.
聽 聽- En este c贸digo debemos substituir "CAT" por el c贸digo de nuestro idioma escogido
聽 聽 聽como de la aplicaci贸n.
A tener en cuenta:
聽 聽-El idioma asumido de la aplicaci贸n 茅s el CAT, buscar "CAT" i cambiar por el deseado.
聽 聽-En las condiciones de la licencia de nuestra aplicaci贸n debemos especificar que garantizamos
聽 聽su buen funcionamiento en este idioma, dado que el usuario podr铆a crear el suyo propio y en
聽 聽ese caso ser铆a su resonsabilidad.
聽 聽-Para su uso en nuestra aplicaci贸n, en sus primeras instrucciones debemos especificar en que
聽 聽fichero estan las traducciones ( SetFileIdioma( cFileIdioma ) ), y en que idioma estaremos
聽 聽trabajando ( SetIdioma( cIdioma ) ).
聽 聽--------------------------------------------------------------------------------------------- */
#include "FiveWin.ch"
/* Idioma de l'aplicaci贸.
聽 聽------------------- */
STATIC ScIdioma 聽 聽 := ""
/* ******************* */
/* Fitxer de l'Idioma de l'aplicaci贸.
聽 聽------------------------------- */
STATIC ScFileidioma := ""
/* ******************************* */
/* ******************************* */
/* Array d'arrays de 3 elements.
聽 聽 1er. literal que es tornar脿 a l'aplicaci贸; si no t茅 contingut per defecte el del CAT precedit de "_".
聽 聽 2on. literal original llegit del fitxer (cont茅 "|").
聽 聽 3er. literal natiu (en aquest cas en catal脿).
聽 聽El seu 煤s t茅 dues finalitats:
聽 聽- Guardar el literal per si es torna a usar i evitar aix铆
聽 聽 聽l'acc茅s a disc.
聽 聽- Permetre l'enregistrament a fitxer dels literals usats.
聽 聽--------------------------------------------------------------------------------------------------- */
STATIC aTextes := {}
/* *************************************************************************************************** */
/* *************************************************************************************************** */
/* *************************************** */
/* *************************************** */
FUNCTION SetFileIdioma( cFileIdioma )
// Debe comenzar con el nombre de una carpeta o el nombre del fichero.
// No debe comenzar en '\' ni con la letra de la unidad.
// cFileIdioma -->> micarpetita\chiquitita\elficherito.ini
// 贸 cFileIdioma -->> elficherito.ini
Local cDummy := ScFileIdioma
If .Not. Empty( cFileIdioma )
聽 聽 ScFileidioma := cFileidioma
EndIf
Return cDummy
/* *************************************** */
/* *************************************** */
FUNCTION SetIdioma( cIdioma )
// cIdioma -->> ESP, CAS, CAT, LAT, VAL, GAL, EUS, ELMIO, ELTUYO, ELMASGUAY, etc.
Local cDummy := ScIdioma
Local oIni 聽 := Nil
//Traza( 1, "cIdioma=", cIdioma )
If .Not. Empty( cIdioma )
聽 聽 If ScIdioma <> cIdioma
聽 聽 聽 聽 aSize( aTextes, 0 )
聽 聽 聽 聽 ScIdioma := cIdioma
聽 聽 聽 聽 If Empty( ScFileidioma )
聽 聽 聽 聽 聽 聽 SetFileIdioma( cIdioma )
聽 聽 聽 聽 EndIf
聽 聽 聽 聽 INI oIni FILE cfilepath( Arg( 0 ) ) + ScFileidioma
聽 聽 聽 聽 SaveIdiomaDescrip( oIni )
聽 聽 聽 聽 ENDINI
聽 聽 EndIf
EndIf
Return cDummy
/* *************************************** */
/* *************************************** */
STATIC FUNCTION SaveIdiomaDescrip( oIni )
Local cDummy := ""
// Els idiomes ARA, CAT, ESP, EUS, GAL, LAT i VAL tenen descriptiu ESPEC脥FIC.
GET cDummy SECTION ScIdioma ENTRY "DESCRIP" OF oIni
If ScIdioma = "ARA" .and. cDummy <> "Aran猫s" 聽 聽// A
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Aran猫s" OF oIni
ElseIf ScIdioma = "CAT" .and. cDummy <> "Catal脿" 聽// C
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Catal脿" OF oIni
ElseIf ScIdioma = "ESP" .and. cDummy <> "Espa帽ol" 聽// E
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Espa帽ol" OF oIni
ElseIf ScIdioma = "EUS" .and. cDummy <> "Euskera" 聽// U
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Euskera" OF oIni
ElseIf ScIdioma = "GAL" .and. cDummy <> "Galego" 聽// G
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Galego" OF oIni
ElseIf ScIdioma = "LAT" .and. cDummy <> "Latium" 聽// L
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Latium" OF oIni
ElseIf ScIdioma = "VAL" .and. cDummy <> "Valenci脿" 聽// V
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Valenci脿" OF oIni
/* La resta d'idiomes tenen el descriptiu per defecte o el que hagi
聽 聽enregistrat l'usuari. Per aquest motiu es fa un GET amb DEFAULT.
聽 聽------------------------------------------------------------- */
ElseIf .Not. (ScIdioma $ "/ARA/CAT/ESP/EUS/GAL/LAT/VAL/")
聽 聽 GET cDummy SECTION ScIdioma ENTRY "DESCRIP" OF oIni DEFAULT "*" + ScIdioma + "*"
EndIf
/*
// Els idiomes CAT, ESP, VAL, GAL, EUS i ARA tenen descriptiu ESPEC脥FIC.
If ScIdioma = "ARA" 聽 // A
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Aran猫s" OF oIni
ElseIf ScIdioma = "CAT" 聽// C
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Catal脿" OF oIni
ElseIf ScIdioma = "ESP" 聽// E
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Espa帽ol" OF oIni
ElseIf ScIdioma = "EUS" 聽// U
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Euskera" OF oIni
ElseIf ScIdioma = "GAL" 聽// G
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Galego" OF oIni
ElseIf ScIdioma = "LAT" 聽// L
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Latium" OF oIni
ElseIf ScIdioma = "VAL" 聽// V
聽 聽 SET SECTION ScIdioma ENTRY "DESCRIP" TO "Valenci脿" OF oIni
聽La resta d'idiomes tenen el descriptiu per defecte o el que hagi
聽 聽enregistrat l'usuari. Per aquest motiu es fa un GET amb DEFAULT.
聽 聽-------------------------------------------------------------
Else
聽 聽 GET cDummy SECTION ScIdioma ENTRY "DESCRIP" OF oIni DEFAULT "*" + ScIdioma + "*"
EndIf
*/
Return Nil
/* ***************************************** */
/* Per compatibilitat amb versions anteriors */
FUNCTION GetText( nElemento, ccText )
Return GetTrad( nElemento, ccText )
/* *************************************** */
FUNCTION GetTrad( nElemento, ccText )
Local cText := ""
Local nText := 0
cText := nElemento
/* Per compatibilitat amb desenvolupament anterior.
聽 聽--------------------------------------------- */
If ValType( nElemento ) = "N"
聽 聽 cText := ccText
EndIf
/* Si l'idioma 茅s el de l'aplicaci贸 (en aquest cas CAT), es
聽 聽pren com a literal el rebut a cText.
聽 聽----------------------------------------------------- */
If ScIdioma = "CAT"
聽 聽 If AScan( aTextes, { |eTextes| eTextes[3] = cText } ) = 0
聽 聽 聽 聽 ////AADD( aTextes, { cText, "|" + cText + "|", "|" + StrTran(cText, "=", chr(126) + "#") + "|" } )
聽 聽 聽 聽 //AADD( aTextes, { cText, "|" + cText + "|", ConvertCadena( cText ) } )
聽 聽 聽 聽 AADD( aTextes, { cText, "|" + cText + "|", cText 聽} )
聽 聽 EndIf
聽 聽 Return cText
ElseIf ScIdioma <> "" // Altres idiomes.
聽 聽 ////If ( nText := AScan( aTextes, { |eTextes| eTextes[3] = ("|" + StrTran(cText, "=", chr(126) + "#") + "|") } ) ) = 0
聽 聽 //If ( nText := AScan( aTextes, { |eTextes| eTextes[3] = ( ConvertCadena( cText ) ) } ) ) = 0
聽 聽 If ( nText := AScan( aTextes, { |eTextes| eTextes[3] = cText } ) ) = 0
聽 聽 聽 聽 LoadTexto( cText )
聽 聽 聽 聽 nText := Len(aTextes)
聽 聽 EndIf
聽 聽 Return aTextes[ nText ][1]
EndIf
Return "_" + cText
/* *************************************** */
/* *************************************** */
STATIC FUNCTION LoadTexto( cText )
Local oIni 聽 聽 聽:= Nil
Local cDummy 聽 聽:= ""
////AADD( aTextes, { "", "", "|" + StrTran( cText, "=", Chr(126) + "#" ) + "|" } )
// 聽AADD( aTextes, { "", "", ConvertCadena( cText ) } )
聽 AADD( aTextes, { "", "", cText } )
/* Inicio del objeto oIni utilizado para la captura de los valores de LGAMPA32.INI.
聽 聽----------------------------------------------------------------------------- */
INI oIni FILE cfilepath( Arg( 0 ) ) + ScFileidioma
//GET cDummy SECTION ScIdioma ENTRY ("|" + StrTran( cText, "=", Chr(126) + "#" ) + "|") OF oIni DEFAULT ( "|_" + cText + "|" )
聽 GET cDummy SECTION ScIdioma ENTRY ( ConvertCadena( cText ) ) OF oIni DEFAULT ( "|_" + cText + "|" )
ENDINI
// Es guarda la captura original.
aTextes[ Len(aTextes) ][ 2 ] := cDummy
If LefT( cDummy, 1 ) = "|"
聽 聽 cDummy := SubStr( cDummy, 2 )
EndIf
If Right( cDummy, 1 ) = "|"
聽 聽 cDummy := Left( cDummy, Len(cDummy) -1 )
EndIf
// Es guarda el text que utilitzar脿 la aplicaci贸.
aTextes[ Len(aTextes) ][ 1 ] := cDummy
Return Nil
/* *************************************** */
/* *************************************** */
FUNCTION SaveIdiomaTextos()
Local nDummy 聽 聽:= 0
Local nContador := 0
Local oIni 聽 聽 聽:= Nil
nDummy 聽 聽:= Len( aTextes )
INI oIni FILE cfilepath( Arg( 0 ) ) + ScFileidioma
For nContador := 1 To nDummy
聽 聽 SET SECTION ScIdioma ENTRY ConvertCadena( aTextes[ nContador ][3] ) TO aTextes[ nContador ][2] OF oIni
Next
ENDINI
Return Nil
/* *************************************** */
/* *************************************** */
FUNCTION ConvertCadena( cText )
Local nContador := 0
Local cDummy 聽 聽:= ""
Local lUpper 聽 聽:= .F.
//Traza( 1, "a-cText=", cText )
cText := " " + cText + " "
For nContador := 1 To Len( cText )
聽 聽 If IsUpper( SubStr( cText, nContador, 1 ) ) .and. .Not. lUpper
聽 聽 聽 聽 lUpper := .T.
聽 聽 聽 聽 cDummy := cDummy + "|" + Chr(126) + SubStr( cText, nContador, 1 )
聽 聽 ElseIf IsLower( SubStr( cText, nContador, 1 ) ) .and. lUpper
聽 聽 聽 聽 lUpper := .F.
聽 聽 聽 聽 cDummy := cDummy + Chr(126) + "|" + SubStr( cText, nContador, 1 )
聽 聽 Else
聽 聽 聽 聽 cDummy := cDummy + SubStr( cText, nContador, 1 )
聽 聽 EndIf
Next
cDummy := SubStr( cDummy, 2 )
cDummy := Left( cDummy, Len( cDummy) - 1 )
cDummy := StrTran( cDummy, "=", Chr(126) + "#" )
cDummy := "|" +cDummy + "|"
//Traza( 1, "b-cDummy=", cDummy )
Return cDummy
/* *************************************** */
/* *************************************** */
FUNCTION CreaMenuIdioma( AMPAARRA )
Local oIni 聽 聽 聽:= Nil
Local aIdiomas 聽:= {}
Local nContador := 0
Local cDummy 聽 聽:= ""
Local cIdioma 聽 := ""
INI oIni FILE cfilepath( Arg( 0 ) ) + ScFileidioma
aIdiomas := oIni:Sections()
For nContador := 1 To Len( aIdiomas )
聽 聽 cIdioma 聽 := aIdiomas[nContador]
聽 聽 // L'idioma CAT no s'afegeix al men煤 per que ho ha estat directament des de codi.
聽 聽 If cIdioma <> "CAT"
聽 聽 聽 聽 GET cDummy SECTION aIdiomas[nContador] ENTRY "DESCRIP" OF oIni
聽 聽 聽 聽 CreaMenuIdioma2( AMPAARRA, cDummy, cIdioma )
聽 聽 EndIf
Next
ENDINI
Return Nil
/* *************************************** */
/* *************************************** */
STATIC FUNCTION CreaMenuIdioma2( AMPAARRA, cDummy, cIdioma )
Local oElMenu := Nil
MENUITEM oElMenu PROMPT cDummy + " <-> " + cIdioma ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MESSAGE cIdioma ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ACTION ( AMPAarra[1][2][ 11 ][ 3 ] := cIdioma, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽SetIdioma( AMPAarra[1][2][ 11 ][ 3 ] ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AMPAArra[1][1][2][1][1]:SetMenu( MenuMain( AMPAarra ) ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 WHEN ( oElMenu:SetCheck(SetIdioma() == cIdioma), .T. )
// 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AMPAArra[1][1][2][1][1]:SetMenu( MenuMain( AMPAarra ) ) ) ;
/*
oElMenu := MenuAddItem( cDummy + " <-> " + cIdioma, cIdioma, .F.,, {|oMenuItem|( AMPAarra[1][2][ 11 ][ 3 ] := cIdioma, 聽SetIdioma( AMPAarra[1][2][ 11 ][ 3 ] ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AMPAArra[1][1][2][1][1]:SetMenu( MenuMain( AMPAarra ) ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ,,,,,, .F.,, {|| ( oElMenu:SetCheck(SetIdioma() == cIdioma), .T. )}, .F. )
*/
/*
聽 聽 聽 聽 聽 聽MenuAddItem( cDummy + " <-> " + cIdioma, cIdioma, .F.,, {|oMenuItem|( AMPAarra[1][2][ 11 ][ 3 ] := cIdioma, 聽SetIdioma( AMPAarra[1][2][ 11 ][ 3 ] ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AMPAArra[1][1][2][1][1]:SetMenu( MenuMain( AMPAarra ) ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ,,,,,, .F.,, {|| ( SetIdioma() <> cIdioma)}, .F. )
*/
Return Nil
/* *************************************** */
/* *************************************** */