Kleines Multilanguage GUI für PB Formdesigner
Verfasst: 21.04.2013 21:57
wer ein mehrsprachiges Programm schreiben möchte, kommt um Gadget Textvariablen nicht herum. Der neue, im PB integrierte, Formdesigner unterstützt diese Funktion. Mithilfe dieses kleinen Tools kann die Mehrsprachigkeit recht einfach verwaltet werden.
Hier der Code:
Das dieses kleine Programm selbst auch Mehrsprachfähig ist, hier die passende automatisch generierte include Datei "Lingua.lng.pbi". Diese wird nach Laden der Lingua.lng Sprachverwaltungsdatei durch Druck auf die Taste "Export" automatisch generiert.
Zu guter letzt noch die "Lingua.lng" Sprachverwaltung für das Programm
Wer Bugs findet, kann sie gerne hier posten
Wer Verbesserungsvorschläge hat, gerne auch hier posten.
Viel Spass
Hier der Code:
Code: Alles auswählen
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Small aid for multilingual variable administration
; Based on Preference file which can hold free definable qty of languages
; and up to "never used quantity of" variables
; I wrote this program especially to extend the new Formdesigner included in PB IDE
; written by Polo (many thanks for his efforts at this place)
;
; Advantage: includes a frontend for administration
; gives an overview over all languages
; generates procedures for each language
;
; Disadvantage: does not use mnemonic variable expressions
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; PB Version : 5.11
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Lase modified : 21.04.2013
; add: Return Key for all string fields and its corresponding functions
; add: + Key for adding a new line
;
; straighten: constants renamed for better readability
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; first release: 16.04.2013
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Author: menschmarkus
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
;
EnableExplicit
;{- Enumerations / DataSections
;{ Windows
Enumeration
#Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
#ListIcon
#String_TextContent
#Text_2
#Button_Confirm
#Button_NewLanguage
#String_NewLanguage
#Combo_6
#Button_NewLine
#String_SearchString
#Button_Search
#Button_Export
#File
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, MEvent
Global.s lngFile, strTMP, strTMP1, strTMP2
Global.i i, j, TMP, TMP1
;}
;{ Macros
;******************************************
Macro ListIcon_Width
(WindowWidth(#Window_0)-20)
EndMacro
Macro ListIcon_Height
(WindowHeight(#Window_0)-190)
EndMacro
Macro ListIcon_X
10
EndMacro
Macro ListIcon_Y
15
EndMacro
;******************************************
Macro StringGadget1_Width
(WindowWidth(#Window_0)-20)
EndMacro
Macro StingGadget1_Height
20
EndMacro
Macro StringGadget1_X
10
EndMacro
Macro StringGadget1_Y
(WindowHeight(#Window_0)-87)
EndMacro
;******************************************
Macro TextGadget1_Width
(WindowWidth(#Window_0)-20)
EndMacro
Macro TextGadget1_Height
20
EndMacro
Macro TextGadget1_X
10
EndMacro
Macro TextGadget1_Y
(WindowHeight(#Window_0)-110);120
EndMacro
;******************************************
Macro StringGadget2_Width
(WindowWidth(#Window_0)-20)
EndMacro
Macro StingGadget2_Height
25
EndMacro
Macro StringGadget2_X
Buttongadget2_Width+20
EndMacro
Macro StringGadget2_Y
(WindowHeight(#Window_0)-35);202
EndMacro
;******************************************
Macro ButtonGadget1_Width
(WindowWidth(#Window_0)-345)
EndMacro
Macro ButtonGadget1_Height
25
EndMacro
Macro ButtonGadget1_X
10
EndMacro
Macro ButtonGadget1_Y
(WindowHeight(#Window_0)-65);170
EndMacro
;******************************************
Macro ButtonGadget2_Width
(WindowWidth(#Window_0)-345)
EndMacro
Macro ButtonGadget2_Height
25
EndMacro
Macro ButtonGadget2_X
10
EndMacro
Macro ButtonGadget2_Y
(WindowHeight(#Window_0)-35);200
EndMacro
;******************************************
Macro ComboBox1_Width
(WindowWidth(#Window_0)-20)
EndMacro
Macro ComboBox1_Height
25
EndMacro
Macro ComboBox1_X
Buttongadget1_Width+20 ;10
EndMacro
Macro ComboBox1_Y
(WindowHeight(#Window_0)-63);200
EndMacro
;******************************************
Macro ButtonGadget3_Width
(WindowWidth(#Window_0)-220)
EndMacro
Macro ButtonGadget3_Height
25
EndMacro
Macro ButtonGadget3_X
10
EndMacro
Macro ButtonGadget3_Y
(WindowHeight(#Window_0)-140);170
EndMacro
;******************************************
Macro ButtonGadgetExport_Width
(WindowWidth(#Window_0)-325)
EndMacro
Macro ButtonGadgetExport_Height
25
EndMacro
Macro ButtonGadgetExport_X
Buttongadget3_X + ButtonGadget3_Width + 10
EndMacro
Macro ButtonGadgetExport_Y
(WindowHeight(#Window_0)-140);170
EndMacro
;******************************************
Macro ButtonGadget9_Width
(WindowWidth(#Window_0)-220)
EndMacro
Macro ButtonGadget9_Height
25
EndMacro
Macro ButtonGadget9_X
10
EndMacro
Macro ButtonGadget9_Y
(WindowHeight(#Window_0)-170)
EndMacro
;******************************************
Macro StringGadget8_Width
190
EndMacro
Macro StingGadget8_Height
20
EndMacro
Macro StringGadget8_X
ButtonGadget9_Width+20
EndMacro
Macro StringGadget8_Y
(WindowHeight(#Window_0)-167)
EndMacro
;}
XIncludeFile "Lingua.lng.pbi"
;DeutschLng()
EnglishLng()
Procedure OpenWindow_Window_0()
If OpenWindow(#Window_0, #PB_Ignore, #PB_Ignore, 515, 355, L00000000 + " " + Str(#pb_editor_CreateExecutable) + "." + Str(#PB_editor_BuildCount) + "." + Str(#PB_Editor_CompileCount), #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
AddKeyboardShortcut(#Window_0,#PB_Shortcut_Return,13)
AddKeyboardShortcut(#Window_0,#PB_Shortcut_Add,107)
WindowBounds(#Window_0,515,345,#PB_Ignore,#PB_Ignore)
ListIconGadget(#ListIcon, ListIcon_X, ListIcon_Y, ListIcon_Width, ListIcon_Height, L00000001, 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_HeaderDragDrop) ; Variable
ButtonGadget(#Button_Search,ButtonGadget9_X,Buttongadget9_Y,ButtonGadget9_Width,ButtonGadget9_Height,L00000002) ; Suchbegriff
StringGadget(#String_SearchString,150,(WindowHeight(#Window_0)-160),StringGadget8_Width,20,"")
ButtonGadget(#Button_NewLine,ButtonGadget3_X,ButtonGadget3_Y,ButtonGadget3_Width,ButtonGadget3_Height,L00000003) ; Neue Zeile
ButtonGadget(#Button_Export,ButtonGadgetExport_X,ButtonGadgetExport_Y,ButtonGadgetExport_Width,ButtonGadgetExport_Height,L00000004) ;Export
StringGadget(#String_TextContent, 10, (WindowHeight(#Window_0)-35), WindowWidth(#Window_0)-20, 20, "")
TextGadget(#Text_2, TextGadget1_X, TextGadget1_Y, TextGadget1_Width, TextGadget1_Height, "", #PB_Text_Border)
ButtonGadget(#Button_Confirm, ButtonGadget1_X, ButtonGadget1_Y, ButtonGadget1_Width, ButtonGadget1_Height, L00000005) ; Bestätigen
ComboBoxGadget(#Combo_6,10,WindowHeight(#Window_0)-85,WindowWidth(#Window_0)-200,20)
ButtonGadget(#Button_NewLanguage, ButtonGadget2_X, ButtonGadget2_Y, Buttongadget2_Width, Buttongadget2_Height, L00000006) ; Neue Sprache
StringGadget(#String_NewLanguage, 10, WindowHeight(#Window_0)-95, WindowWidth(#Window_0)-200, 25, "")
EndIf
EndProcedure
OpenWindow_Window_0()
;{ Load language file
strTMP.s = OpenFileRequester(L0000000B,"*.*", L0000000B + " (*.lng)|*.lng",0)
If strTMP.s = "" ;finalized If : EndIf condition to surely use new created lng file in next if condition
strTMP.s = "NewLingua.lng"
If CreatePreferences(strTMP.s)
PreferenceGroup("Deutsch") ; Enter your domestic language as your first languages
WritePreferenceString("00000000"," ")
ClosePreferences()
EndIf
EndIf
If strTMP.s <> "" ;This if statement should be always true
lngFile.s = strTMP.s
OpenPreferences(strTMP.s)
ExaminePreferenceGroups()
i=1
Repeat
TMP.i = NextPreferenceGroup()
If TMP.i = 0 : Break : EndIf ; exit if no more language exists
strTMP.s = PreferenceGroupName()
AddGadgetColumn(#ListIcon,i,strTMP.s,200)
AddGadgetItem(#Combo_6,-1,strTMP.s)
ExaminePreferenceKeys()
j=0
Repeat
TMP1.i = NextPreferenceKey()
If TMP1.i = 0 : Break : EndIf
If i = 1
strTMP1.s = PreferenceKeyName()
strTMP2.s = PreferenceKeyValue()
AddGadgetItem(#ListIcon,-1,strTMP1 + Chr(10) + strTMP2.s)
Else
strTMP2.s = PreferenceKeyValue()
SetGadgetItemText(#ListIcon,j,strTMP2.s,i)
j+1
EndIf
ForEver
i+1
ForEver
ClosePreferences()
SetGadgetState(#Combo_6,0)
SetGadgetState(#ListIcon,0)
EndIf
;}
Procedure GetLngField()
TMP = GetGadgetState(#ListIcon)
TMP1 = GetGadgetState(#Combo_6)
SetGadgetText(#Text_2,GetGadgetItemText(#ListIcon,TMP.i,1))
SetGadgetText(#String_TextContent,GetGadgetItemText(#ListIcon,TMP.i,TMP1.i+1))
EndProcedure
Procedure SetLngField()
TMP.i = GetGadgetState(#ListIcon)
TMP1.i = GetGadgetState(#Combo_6)
SetGadgetItemText(#ListIcon,TMP.i,GetGadgetText(#String_TextContent),TMP1.i+1)
OpenPreferences(lngFile.s)
strTMP.s = GetGadgetText(#Combo_6)
PreferenceGroup(strTMP.s)
strTMP.s = GetGadgetText(#String_TextContent)
strTMP1.s = GetGadgetItemText(#ListIcon,TMP.i,0)
WritePreferenceString(GetGadgetItemText(#ListIcon,TMP.i,0),strTMP.s)
ClosePreferences()
EndProcedure
Procedure AddLanguage()
If GetGadgetText(#String_NewLanguage) <> ""
OpenPreferences(lngFile.s)
ExaminePreferenceGroups()
i=0
Repeat
TMP.i = NextPreferenceGroup()
If TMP.i = 0 : Break : EndIf
i+1
ForEver
strTMP.s = GetGadgetText(#String_NewLanguage)
If strTMP.s <> ""
AddGadgetColumn(#ListIcon,i+1,strTMP.s,200)
EndIf
PreferenceGroup(strTMP.s)
WritePreferenceString("00000000"," ")
ClosePreferences()
AddGadgetItem(#Combo_6,-1,strTMP.s)
Else
MessageRequester(L00000008,L00000009,#MB_ICONINFORMATION) ; Info / enter new language name first
EndIf
EndProcedure
Procedure AddNewLine()
OpenPreferences(lngFile.s)
ExaminePreferenceGroups()
NextPreferenceGroup()
ExaminePreferenceKeys()
Repeat
TMP = NextPreferenceKey()
If TMP = 0
TMP1 = Val("$"+strTMP.s)
TMP1+1
AddGadgetItem(#ListIcon,-1,RSet(Hex(TMP1),8,"0"))
WritePreferenceString(RSet(Hex(TMP1),8,"0"),"")
Break
EndIf
strTMP.s = PreferenceKeyName()
ForEver
ClosePreferences()
SetGadgetState(#ListIcon,CountGadgetItems(#ListIcon)-1)
SetActiveGadget(#String_TextContent)
EndProcedure
Procedure SearchIt()
strTMP1.s = GetGadgetText(#String_SearchString)
If strTMP.s <> ""
TMP.i = CountGadgetItems(#ListIcon)
For i = 0 To TMP.i-1
If strTMP1.s = ""
SetGadgetItemColor(#ListIcon,i,#PB_Gadget_FrontColor,$000000,1)
Else
strTMP.s = GetGadgetItemText(#ListIcon,i,1)
TMP1.i = FindString(UCase(strTMP.s),UCase(strTMP1.s),1)
If TMP1.i > 0
SetGadgetItemColor(#ListIcon,i,#PB_Gadget_FrontColor,$0000ff,1)
Else
SetGadgetItemColor(#ListIcon,i,#PB_Gadget_FrontColor,$000000,1)
EndIf
EndIf
Next
Else
MessageRequester(L00000008,L0000000A,#MB_ICONINFORMATION)
EndIf
EndProcedure
Procedure ExportLng()
Protected exTMP1.s, exTMP2.s, exTMP3.s, exInt1.i, exInt2.i, ItemCounter.l, exGlobal.s = "Global.s "
CreateFile(0,lngFile.s + ".pbi")
CloseFile(0)
OpenFile(0,lngFile.s + ".pbi")
ItemCounter.l = CountGadgetItems(#ListIcon)
j=0
For i = 0 To ItemCounter-1
j+1
exGlobal + " L" + GetGadgetItemText(#ListIcon,i,0) + ", "
If j>0 And j/16 = 1
exInt1.i = Len(exGlobal.s)
WriteStringN(0,Left(exGlobal.s,exInt1.i-2))
exGlobal = "Global.s "
j=0
EndIf
Next
exInt1.i = Len(exGlobal.s)
WriteStringN(0,Left(exGlobal.s,exInt1.i-2))
WriteStringN(0,"",#PB_UTF8)
OpenPreferences(lngFile.s)
ExaminePreferenceGroups()
exInt1.i = NextPreferenceGroup()
While exInt1.i = 1
exTMP1.s = PreferenceGroupName()
WriteStringN(0,"Procedure " + exTMP1.s + "Lng()")
ExaminePreferenceKeys()
exInt2.i = NextPreferenceKey()
While exInt2.i = 1
exTMP2.s = PreferenceKeyName()
exTMP3.s = ReadPreferenceString(exTMP2.s,"")
WriteStringN(0,"L" + exTMP2.s + " = " + Chr(34) + exTMP3.s + Chr(34))
exInt2.i = NextPreferenceKey()
Wend
WriteStringN(0,"Endprocedure" + Chr(13))
exInt1.i = NextPreferenceGroup()
Wend
ClosePreferences()
CloseFile(0)
MessageRequester("Export",L00000007 + lngFile.s + ".pb") ; Export in File:
EndProcedure
;{- Event loop
Repeat
Event = WaitWindowEvent()
Select Event
; ///////////////////
Case #PB_Event_Menu
MEvent = EventMenu()
Select MEvent
Case #PB_Shortcut_Return
If GetActiveGadget() = #String_TextContent
SetLngField()
ElseIf GetActiveGadget() = #String_SearchString
SearchIt()
ElseIf GetActiveGadget() = #String_NewLanguage
AddLanguage()
EndIf
Case #PB_Shortcut_Add
AddNewLine()
EndSelect
; ////////////////////////
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
If EventGadget = #ListIcon
GetLngField()
ElseIf EventGadget = #Button_Confirm
SetLngField()
ElseIf EventGadget = #Button_NewLanguage
AddLanguage()
ElseIf EventGadget = #Button_NewLine
AddNewLine()
ElseIf EventGadget = #Button_Search
SearchIt()
ElseIf EventGadget = #Button_Export
ExportLng()
EndIf
; ////////////////////////
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window_0
CloseWindow(#Window_0)
Break
EndIf
Case #PB_Event_SizeWindow
ResizeGadget(#ListIcon,#PB_Ignore,#PB_Ignore,ListIcon_Width,ListIcon_Height)
ResizeGadget(#String_TextContent,#PB_Ignore,StringGadget1_Y,StringGadget1_Width,#PB_Ignore)
ResizeGadget(#Text_2,#PB_Ignore,TextGadget1_Y,TextGadget1_Width,#PB_Ignore)
ResizeGadget(#Button_Confirm,#PB_Ignore,ButtonGadget1_Y,ButtonGadget1_Width,#PB_Ignore)
ResizeGadget(#Button_Export,ButtonGadgetExport_X,ButtongadgetExport_Y,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Combo_6,ComboBox1_X,ComboBox1_Y,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Button_NewLanguage,#PB_Ignore,ButtonGadget2_Y,Buttongadget2_Width,#PB_Ignore)
ResizeGadget(#String_NewLanguage,StringGadget2_X,StringGadget2_Y,#PB_Ignore,#PB_Ignore)
ResizeGadget(#Button_NewLine,#PB_Ignore,ButtonGadget3_Y,ButtonGadget3_Width,#PB_Ignore)
ResizeGadget(#Button_Search,#PB_Ignore,ButtonGadget9_Y,ButtonGadget9_Width,#PB_Ignore)
ResizeGadget(#String_SearchString,StringGadget8_X,StringGadget8_Y,#PB_Ignore,#PB_Ignore)
EndSelect
ForEver
End
;
;}
Code: Alles auswählen
Global.s L00000000, L00000001, L00000002, L00000003, L00000004, L00000005, L00000006, L00000007, L00000008, L00000009, L0000000A, L0000000B
Procedure DeutschLng()
L00000000 = "Lingua"
L00000001 = "Variable"
L00000002 = "Suchbegriff"
L00000003 = "Neue Zeile"
L00000004 = "Export"
L00000005 = "Bestätigen"
L00000006 = "Neue Sprache"
L00000007 = "Export in Datei:"
L00000008 = "Info"
L00000009 = "Bitte zuerst den Namen der neuen Sprache eingeben"
L0000000A = "Bitte zuerste einen Suchbegriff eingeben"
L0000000B = "Sprachdatei"
EndProcedure
Procedure EnglishLng()
L00000000 = "Lingua"
L00000001 = "variable"
L00000002 = "Search string"
L00000003 = "New line"
L00000004 = "Export"
L00000005 = "Confirm"
L00000006 = "New language"
L00000007 = "Export to file:"
L00000008 = "Info"
L00000009 = "Please enter new language name first"
L0000000A = "Please enter search term first"
L0000000B = "Language file"
EndProcedure
Code: Alles auswählen
[Deutsch]
00000000 = Lingua
00000001 = Variable
00000002 = Suchbegriff
00000003 = Neue Zeile
00000004 = Export
00000005 = Bestätigen
00000006 = Neue Sprache
00000007 = Export IN Datei:
00000008 = Info
00000009 = Bitte zuerst den Namen der neuen Sprache eingeben
0000000A = Bitte zuerste einen Suchbegriff eingeben
0000000B = Sprachdatei
[English]
00000000 = Lingua
00000001 = variable
00000002 = Search string
00000003 = New line
00000004 = Export
00000005 = Confirm
00000006 = New language
00000007 = Export To file:
00000008 = Info
00000009 = Please enter new language name first
0000000A = Please enter search term first
0000000B = Language file
Wer Verbesserungsvorschläge hat, gerne auch hier posten.
Viel Spass