FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Multi Language Menu?
Posts: 1598
Joined: Fri Oct 07, 2005 05:56 PM

Multi Language Menu?

Posted: Tue Nov 29, 2011 11:21 AM

Dear All,

I would like to put the menu language in text file (maybe INI or TXT).

Any idea most welcome.

Regards,
Dutch

Regards,

Dutch



FWH 2304 / xHarbour Simplex 1.2.3 / BCC73 / Pelles C / UEStudio

FWPPC 10.02 / Harbour for PPC (FTDN)

ADS V.9 / MySql / MariaDB

R&R 12 Infinity / Crystal Report XI R2

(Thailand)
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM

Re: Multi Language Menu?

Posted: Tue Nov 29, 2011 04:22 PM

Hello Dutch,

A INI-file will do the Job.
I will create a Sample for this.
Do You want to change the Language at Runtime or with a Setup at Start ?

Best Regards
Uwe :lol:

Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 417
Joined: Tue Feb 23, 2010 03:09 PM

Re: Multi Language Menu?

Posted: Tue Nov 29, 2011 05:01 PM
FWH 11.11, Harbour 3.1 and Borland C++ 5.82
Posts: 1446
Joined: Mon Oct 10, 2005 02:38 PM

Re: Multi Language Menu?

Posted: Tue Nov 29, 2011 05:11 PM
dutch wrote:Dear All,

I would like to put the menu language in text file (maybe INI or TXT).

Any idea most welcome.

Regards,
Dutch


Yes,
Hola,

Esta es mi soluci贸n. Seguro que se puede mejorar.

Al principio de la ejecuci贸n de la aplicaci贸n se debe realizar:

SetFileIdioma( "C:\yourfolder\yourlenguages\spanishforexemple.ini" )
SetIdioma( "SPA" )

Durante la ejecuci贸n de la aplicaci贸n se puede realizar en cualquier momento:

SetFileIdioma( "C:\yourfolder\yourotherlenguages\inFrenchforexemple.ini" )
SetIdioma( "FRE" )


Y en los literales que se deseen traducir se debe usar:

GetTrad( "Esto es un Texto de EJEMPLO!" )

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.


Y adem谩s no es lo mismo:

"Esto es un Texto de EJEMPLO!"

que:

"ESTO ES UN TEXTO DE ejemplo!"


Saludos
Carlos G.

Code (fw): Select all Collapse
/* 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
/* *************************************** */
/* *************************************** */

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1598
Joined: Fri Oct 07, 2005 05:56 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 03:19 AM
Dear Uwe,

I just need on start-up program.

ukoenig wrote:Hello Dutch,

A INI-file will do the Job.
I will create a Sample for this.
Do You want to change the Language at Runtime or with a Setup at Start ?

Best Regards
Uwe :-)

Thanks,
Dutch
Regards,

Dutch



FWH 2304 / xHarbour Simplex 1.2.3 / BCC73 / Pelles C / UEStudio

FWPPC 10.02 / Harbour for PPC (FTDN)

ADS V.9 / MySql / MariaDB

R&R 12 Infinity / Crystal Report XI R2

(Thailand)
Posts: 1598
Joined: Fri Oct 07, 2005 05:56 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 04:08 AM
Dear All,

Can I use this INI file to contain the menu language?
How can I get all the menu language in 1 array without loop? Because I need to read all the menu language in array variable on start up program.
In this way, I think other people can add more language without change any program.
Code (fw): Select all Collapse
[MAIN]
LANGAUGE=English,Spanish,German
[MENU]
1001=Reservation,Reserva,Reservierung
1002=Search,B煤squeda,Suche


Any idea are most appreciated.
Regards,

Dutch



FWH 2304 / xHarbour Simplex 1.2.3 / BCC73 / Pelles C / UEStudio

FWPPC 10.02 / Harbour for PPC (FTDN)

ADS V.9 / MySql / MariaDB

R&R 12 Infinity / Crystal Report XI R2

(Thailand)
Posts: 1387
Joined: Fri May 23, 2008 01:33 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 09:29 AM
Another way.

Code (fw): Select all Collapse
[MAIN]
LANGAUGE=English,Spanish,German
[English]
1001=Reservation
1002=Search
[Spanish]
1001=Reserva
1002=B煤squeda
[German]
1001=Reservierung
1002=Suche
Regards,



Hakan ONEMLI



Harbour & MSVC 2022 & FWH 23.06
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 12:44 PM

Hello Hakan,

that is the Structure I`m working on. The logic workes fine ( tested ).
I will add a complete Sample.

Best Regards
Uwe :?:

Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 03:28 PM

Dutch,

look at the new errorsys, there you have one way, to get more than one language. You can also use several dll files, for every language another, like it麓s done with preview.dll.

kind regards

Stefan
Posts: 1598
Joined: Fri Oct 07, 2005 05:56 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 03:59 PM
Hi Hakan,

Do you get the menu language at runtime or read all to array on start-up?
How did you do?
Horizon wrote:Another way.

Code (fw): Select all Collapse
[MAIN]
LANGAUGE=English,Spanish,German
[English]
1001=Reservation
1002=Search
[Spanish]
1001=Reserva
1002=B煤squeda
[German]
1001=Reservierung
1002=Suche
Regards,

Dutch



FWH 2304 / xHarbour Simplex 1.2.3 / BCC73 / Pelles C / UEStudio

FWPPC 10.02 / Harbour for PPC (FTDN)

ADS V.9 / MySql / MariaDB

R&R 12 Infinity / Crystal Report XI R2

(Thailand)
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 04:30 PM
Hello Dutch,
the promised sample :

Code (fw): Select all Collapse
#INCLUDE "FIVEWIN.CH"

STATIC cLanguage := "ENG"
STATIC aMenu

FUNCTION Main()
LOCAL oWnd

aMenu := { { "" }, { "" } }

GET_INI()

DEFINE WINDOW oWnd FROM 50, 200 TO 300, 700 TITLE "Testing Menus" ;
MENU BuildMenu() PIXEL

oWnd:bMenuSelect = { || MsgBeep() }   // Do whatever on each menuitem
                                         // selection!

SET MESSAGE OF oWnd TO FWVERSION + " Multi-Language-Menu"

ACTIVATE WINDOW oWnd

RETURN NIl

//----------------------------------------------------------------------------//

FUNCTION BUILDMENU()
local oMenu
local oFirst, oSecond
local oItHelp

MENU oMenu
    MENUITEM "&1. Menu"
    MENU
        MENUITEM oFirst PROMPT aMenu[1] MESSAGE "First option" ;
        ACTION If( oFirst:lActive, oFirst:Disable(), oFirst:Enable() ) ;
        ACCELERATOR ACC_ALT, VK_F2

        MENUITEM oSecond PROMPT aMenu[2] MESSAGE "Second option" ;
        ACTION oSecond:SetCheck( ! oSecond:lChecked ) ;
        ACCELERATOR ACC_CONTROL, VK_F2
      ENDMENU

      MENUITEM "& 2. Menu"
      MENU
        MENUITEM "&Enable" ACTION oFirst:Enable() ;
        MESSAGE "Ok, let's start again"
      ENDMENU

ENDMENU

RETURN OMENU

// --------- INI - Read -------------

FUNCTION GET_INI()
Local oInifile
Local cMen1S := "", cMen2S := ""
Local cMen1E := "", cMen2E := ""
Local cMen1G := "", cMen2G := ""

IF !FILE ( c_path + "\MENU.ini" )
    SAVE_INI()
ELSE
    INI oInifile FILE c_path + "\MENU.ini"
        GET  cLanguage  SECTION  "Select"       ENTRY   "Language"  OF oInifile 
        
        GET  cMen1S     SECTION  "1001"     ENTRY   "Spanish"       OF oInifile 
        GET  cMen2S     SECTION  "1002"     ENTRY   "Spanish"       OF oInifile 

        GET  cMen1E     SECTION  "1001"     ENTRY   "English"       OF oInifile 
        GET  cMen2E     SECTION  "1002"     ENTRY   "English"       OF oInifile         

        GET  cMen1G     SECTION  "1001"     ENTRY   "German"        OF oInifile 
        GET  cMen2G     SECTION  "1002"     ENTRY   "German"        OF oInifile 

        lSysini := .F.
    ENDINI
ENDIF
IF cLanguage = "SPA"
    aMenu[1] := cMen1S
    aMenu[2] := cMen2S
ENDIF
IF cLanguage = "ENG"
    aMenu[1] := cMen1E
    aMenu[2] := cMen2E
ENDIF
IF cLanguage = "GER"
    aMenu[1] := cMen1G
    aMenu[2] := cMen2G
ENDIF

// MsgAlert( aMenu[1], "Menu 1" )
// MsgAlert( aMenu[2], "Menu 2" )

RETURN( NIL )

// ---------  INI Write------------------------

FUNCTION SAVE_INI()
LOCAL lSysini := .T., cIniFile := c_path + "\MENU.INI"

Local cMen1S := "&Reserva", cMen2S := "&B煤squeda"
Local cMen1E := "&Reservation", cMen2E := "&Search"
Local cMen1G := "&Reservierung", cMen2G := "&Suche"

IF cLanguage = "SPA"
    cMen1S := aMenu[1]
    cMen2S := aMenu[2]
ENDIF
IF cLanguage = "ENG"
    cMen1E := aMenu[1]
    cMen2E := aMenu[2]
ENDIF
IF cLanguage = "GER"
    cMen1G := aMenu[1]
    cMen2G := aMenu[2]
ENDIF

IF WritePProString( "Select", "Language", cLanguage,  cIniFile ) = .F.
        lSysini := .F.
ENDIF
// --------------
IF WritePProString( "Spanish", "1001", cMen1S,  cIniFile ) = .F.
        lSysini := .F.
ENDIF
IF WritePProString( "Spanish", "1002", cMen2S,  cIniFile ) = .F.
        lSysini := .F.
ENDIF
// --------------
IF WritePProString( "English", "1001", cMen1E ) = .F.
        lSysini := .F.
ENDIF
IF WritePProString( "English", "1002", cMen2E ) = .F.
        lSysini := .F.
ENDIF
// --------------
IF WritePProString( "German", "1001", cMen1G,  cIniFile ) = .F.
        lSysini := .F.
ENDIF
IF WritePProString( "German", "1002", cMen2G,  cIniFile ) = .F.
        lSysini := .F.
ENDIF
// ---------------
IF lSysini = .F. .or. !FILE( cInifile )
    MsgAlert("Not possible, to write in  INI-File", "INI-File")
ENDIF

RETURN( NIL )


Best Regards
Uwe :-)
Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 389
Joined: Mon Oct 13, 2008 11:26 AM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 04:56 PM
Code (fw): Select all Collapse
****************************************************************************
function Get4Ini(pcSecao, pcVar, pcFileName)
****************************************************************************

local Result := ""

   oIni   := TIni():New( (pcFileName) )
   Result := oIni:Get( pcSecao, pcVar,, Result )
   oIni   := Nil

   if Right(Result,3) == "{N}"
      Result := Val( Left( Result , Len(Result)-3 ) )
   elseif Right(Result,3) == "{D}"
          Result := CToD( Left( Result , Len(Result)-3 ) )
   elseif Right(Result,3) == "{L}"
          Result := If("True" $ Result, .t. , .f. )
   end

return Result

/*------------------------------------------------------------------------*/

****************************************************************************
procedure Set4Ini(pcSecao, pcVar, puValor, pcFileName, lTag)
****************************************************************************

local oIni

   Default lTag := .t.

   if ValType(puValor) = "N"
      puValor := AllTrim(Str(puValor)) + if(lTag,"{N}","")
   elseif ValType(pcVar) = "D"
          puValor := AllTrim(DToC(puValor)) + if(lTag,"{D}","")
   elseif ValType(puValor) = "L"
          puValor := if(puValor,"True","False") + if(lTag,"{L}","")
   elseif ValType(puValor) = "C"
          puValor := AllTrim(puValor)
   end

   oIni := TIni():New( (pcFileName) )
   oIni:Set( pcSecao , pcVar , puValor )
   oIni := Nil

return nil

/*------------------------------------------------------------------------*/


cFileIni := "C:\MySystem.INI"
cLang := Get4Ini("GENERAL","LANG",cFileIni)

    menu Result 2007

        menuitem Get4Ini(cLang,"MENU100",cFileIni)
            menu
 
                menuitem    Get4Ini(cLang,"MENU1001",cFileIni);
            message     Get4Ini(cLang,"MENU1001A",cFileIni);
            accelerator ACC_NORMAL,VK_F10;
            resource    "Product16";
            action      DlgProd()
            
            separator
  
            menuitem    Get4Ini(cLang,"MENU1002",cFileIni);
            message     Get4Ini(cLang,"MENU1002A",cFileIni);
            accelerator ACC_NORMAL,VK_F10;
            resource    "Client16";
            action      DlgClient()
            
            endmenu
            
            menuitem    Get4Ini(cLang,"MENU1003",cFileIni);
            message     Get4Ini(cLang,"MENU1003A",cFileIni);
            accelerator ACC_NORMAL,VK_F9;
            resource    "Report16";
            action      Reports()               
            
        endmenu
    
        menuitem    Get4Ini(cLang,"MENU200",cFileIni);;
        message     Get4Ini(cLang,"MENU200A",cFileIni);;
        accelerator ACC_NORMAL, VK_ESCAPE;
        action      oWnd:End()

   endmenu
    
    
MySystem.INI    

[GENERAL]
LANG=ENUS
[ENUS]
MENU100="Manage"
MENU1001="Product"
MENU1001A="Open dialog to manage product"
MENU1002="Client"
MENU1002A="Open dialog to manage client"
MENU1003="Report"
MENU1003A="Open dialog to create reports"
MENU200="Exit"
MENU200A="Exit the system"
[PTBR]
MENU100="Gerenciar"
MENU1001="Produtos"
MENU1001A="Abrir dialogo para gerenciar produtos"
MENU1002="Clientes"
MENU1002A="Abrir dialogo para gerenciar clientes"
MENU1003="Relat贸rios"
MENU1003A="Abrir dialogo para gerar relat贸rios"
MENU200="Sair"
MENU200A="Sair do sistema"
Email: SamirSSabreu@gmail.com
xHarbour 1.2.3 + Fwhh 20.2
Posts: 1598
Joined: Fri Oct 07, 2005 05:56 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 05:27 PM
Dear All,

Thanks for all kind help. I would like to know one more question.
Which is the best way for memory consumption and program speed.
1. read all menu language to array. (Uwe and Hakan idea)
2. read from ini file each time while building each menu. (Sambomb idea)

Regards,
Dutch
Regards,

Dutch



FWH 2304 / xHarbour Simplex 1.2.3 / BCC73 / Pelles C / UEStudio

FWPPC 10.02 / Harbour for PPC (FTDN)

ADS V.9 / MySql / MariaDB

R&R 12 Infinity / Crystal Report XI R2

(Thailand)
Posts: 1387
Joined: Fri May 23, 2008 01:33 PM

Re: Multi Language Menu?

Posted: Wed Nov 30, 2011 10:14 PM
dutch wrote:Hi Hakan,

Do you get the menu language at runtime or read all to array on start-up?
How did you do?
Horizon wrote:Another way.

Code (fw): Select all Collapse
[MAIN]
LANGAUGE=English,Spanish,German
[English]
1001=Reservation
1002=Search
[Spanish]
1001=Reserva
1002=B煤squeda
[German]
1001=Reservierung
1002=Suche


Hi dutch,

I prefer read only the selected language texts on startup of application. I think the language selection can not be done very often. I dont read all language texts to memory.
Regards,



Hakan ONEMLI



Harbour & MSVC 2022 & FWH 23.06
Posts: 1598
Joined: Fri Oct 07, 2005 05:56 PM

Re: Multi Language Menu?

Posted: Thu Dec 01, 2011 04:38 AM
Dear Hakan,
Horizon wrote:
Hi dutch,

I prefer read only the selected language texts on startup of application. I think the language selection can not be done very often. I dont read all language texts to memory.

I mean all menu text of chosen language, not only menu but say, msginfo and etc. also. I will read to array and use in all program by choose in array.

Thanks
Regards,

Dutch



FWH 2304 / xHarbour Simplex 1.2.3 / BCC73 / Pelles C / UEStudio

FWPPC 10.02 / Harbour for PPC (FTDN)

ADS V.9 / MySql / MariaDB

R&R 12 Infinity / Crystal Report XI R2

(Thailand)