I messed around with some way to make a multi-language application without the need to restart the application.
I used that method in this application:
http://sascha.loeffler.gs/downloads/webcamget20.php
so here are the functions:
this is to create the dynamic popup menu of all languages found in the language.xml
Code: Select all
Procedure createLanguagePopupMenu(Menu, countFrom, countTo, languageListString$ = "german")
Define i, singleLanguage$, langcount
;langcount = CountString(languageListString$, ",")
langcount = 1
If IsMenu(Menu)
FreeMenu(Menu)
EndIf
If CreatePopupMenu(Menu)
If countFrom < countTo
For i = countFrom To countTo
singleLanguage$ = LCase( StringField(languageListString$, langcount, ",") )
MenuItem(i, singleLanguage$)
If languageSet$ = singleLanguage$
DisableMenuItem(Menu, i, 1)
EndIf
langcount = langcount + 1
Next
Else
MenuItem( countFrom, LCase(languageListString$) )
If languageSet$ = LCase(languageListString$)
DisableMenuItem(Menu, countFrom, 1)
EndIf
EndIf
EndIf
EndProcedure
Code: Select all
Procedure.s loadLanguageFile ( xmlNode, elementPfad$, attributName$ )
Define *MainNode, *ChildNode
If XMLStatus(#XML) = #PB_XML_Success
*MainNode = MainXMLNode(xmlNode)
If XMLNodeType(*MainNode) = #PB_XML_Normal
;Debug GetXMLNodeName(*MainNode)
*ChildNode = XMLNodeFromPath(*MainNode, elementPfad$)
;Debug GetXMLNodeName(*ChildNode)
If *ChildNode <> 0
ProcedureReturn GetXMLAttribute(*ChildNode, attributName$)
Else
ProcedureReturn ""
EndIf
EndIf
EndIf
EndProcedure
All variables that are set there are for all strings where no setgatgettext can be used.
Code: Select all
Macro setLanguageFull(filename)
If LoadXML(#XML, filename, #PB_UTF8)
languageListing$ = setLanguage ( languageSet$ )
languageAnzahl = CountString(languageListing$, ",")
createLanguagePopupMenu(#langMenu, startLanguageMenuEventID, startLanguageMenuEventID+languageAnzahl, languageListing$)
startButtonImageText_add$ = loadLanguageFile ( #XML, languageSet$+"/textAddSaveCam", "textAdd" )
startButtonImageText_save$ = loadLanguageFile ( #XML, languageSet$+"/textAddSaveCam", "textSave" )
messageWrongContent_title$ = loadLanguageFile ( #XML, languageSet$+"/messageWrongContent", "title" )
messageWrongContent_text$ = loadLanguageFile ( #XML, languageSet$+"/messageWrongContent", "text" )
messageNoValidPath_title$ = loadLanguageFile ( #XML, languageSet$+"/messageNoValidPath", "title" )
messageNoValidPath_text$ = loadLanguageFile ( #XML, languageSet$+"/messageNoValidPath", "text" )
messageRemoveAllItems_title$ = loadLanguageFile ( #XML, languageSet$+"/messageRemoveAllItems", "title" )
messageRemoveAllItems_text$ = loadLanguageFile ( #XML, languageSet$+"/messageRemoveAllItems", "text" )
messageNoHelpFile_title$ = loadLanguageFile ( #XML, languageSet$+"/messageNoHelpFile", "title" )
messageNoHelpFile_text$ = loadLanguageFile ( #XML, languageSet$+"/messageNoHelpFile", "text" )
messageError_title$ = loadLanguageFile ( #XML, languageSet$+"/messageError", "title" )
messagePathNotCreated_text$ = loadLanguageFile ( #XML, languageSet$+"/messagePathNotCreated", "text" )
messageSetValidPath_text$ = loadLanguageFile ( #XML, languageSet$+"/messageSetValidPath", "text" )
pathRequesterSetPath_title$ = loadLanguageFile ( #XML, languageSet$+"/pathRequesterSetPath", "title" )
windowImageList_title$ = loadLanguageFile ( #XML, languageSet$+"/windowImageList", "title" )
Else
MessageRequester("Information", "No Language File found. Please make sure you extracted the full archive or redownload it from http://sascha.loeffler.gs/", #PB_MessageRequester_Ok)
quit = 1
EndIf
EndMacro
Code: Select all
Procedure.s setLanguage ( language$ )
Define languagelist$, langcount, i
Define translation$
languagelist$ = LCase(loadLanguageFile ( #XML, "languages", "list" ))
langcount = CountString(languagelist$, ",") + 1
For i = 1 To langcount
If ( LCase( StringField(languagelist$, i, ",") ) = language$ ) Or ( langcount = 1 And languagelist$ = LCase(language$) )
;set translations
translation$ = loadLanguageFile ( #XML, language$+"/popupDelete", "text" )
SetMenuItemText(#popupMenu, 1, translation$)
translation$ = loadLanguageFile ( #XML, language$+"/popupDeActivate", "text" )
SetMenuItemText(#popupMenu, 3, translation$)
translation$ = loadLanguageFile ( #XML, language$+"/popupDeleteAll", "text" )
SetMenuItemText(#popupMenu, 5, translation$)
translation$ = loadLanguageFile ( #XML, language$+"/popupLanguage", "text" )
SetMenuItemText(#popupMenu, 7, translation$)
translation$ = loadLanguageFile ( #XML, language$+"/popupHelp", "text" )
SetMenuItemText(#popupMenu, 9, translation$)
;... (removed a bit here because it would be too long)
;translation$ = loadLanguageFile ( #XML, language$+"/textSaveCam", "text" )
;SetGadgetText(#previewCheckBox, translation$)
;endset translations
EndIf
Next
ProcedureReturn languagelist$
EndProcedure
at the #PB_Event_Menu you only need to do
Code: Select all
For i = startLanguageMenuEventID To startLanguageMenuEventID+languageAnzahl
If EventMenu() = i
If GetMenuItemText(#langMenu, i) <> languageSet$
languageSet$ = GetMenuItemText(#langMenu, i)
setLanguageFull("webcam_lang.xml")
EndIf
EndIf
Next
Code: Select all
#XML = 100 ; Language XML Constant
Global startLanguageMenuEventID
startLanguageMenuEventID = 11
Code: Select all
<translation>
<languages list="english,german" />
<english>
<popupDelete text="Delete	Entf" />
<popupDeActivate text="de/activate all	Strg+A" />
<popupDeleteAll text="delete all	Strg+D" />
<popupLanguage text="choose language	Strg+L" />
<popupHelp text="Help	F1" />
<listWebcamUrl text="Webcam URL" />
<listSavepath text="Savepath" />
<listFilename text="Filename" />
<listIntervall text="Intervall" />
<listTime text="Time" />
<listBeginEnd text="Begin / End" />
<listCounter text="Counter" />
<listDeleteDoubles text="no doubles" />
<listImageNr text="Image No." />
</english>
<german>
<popupDelete text="Löschen	Entf" />
<popupDeActivate text="Alle de/aktivieren	Strg+A" />
<popupDeleteAll text="Alle löschen	Strg+D" />
<popupLanguage text="Sprache wählen	Strg+L" />
<popupHelp text="Hilfe	F1" />
<listWebcamUrl text="Webcam URL" />
<listSavepath text="Speicherpfad" />
<listFilename text="Dateiname" />
<listIntervall text="Intervall" />
<listTime text="Zeit" />
<listBeginEnd text="Beginn / Ende" />
<listCounter text="Zähler" />
<listDeleteDoubles text="keine Doppelten" />
<listImageNr text="Bild Nr." />
</german>
</translation>
But maybe someone have a better idea and i am just too stupid.

i hope i have not forgotten something important for this to work.
If someone is still unsure how to implement i could release the full source code of the application.