Seite 1 von 1

Kleines Multilanguage GUI für PB Formdesigner

Verfasst: 21.04.2013 21:57
von MenschMarkus
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:

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
;
;}
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.

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

Zu guter letzt noch die "Lingua.lng" Sprachverwaltung für das Programm

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 Bugs findet, kann sie gerne hier posten
Wer Verbesserungsvorschläge hat, gerne auch hier posten.

Viel Spass

Re: Kleines Multilanguage GUI für PB Formdesigner

Verfasst: 11.08.2013 12:20
von maupa
hi,
ich bekomme ein fehler: Zeile 209 Konstante nicht gefunden #pb_editor_CreateExecutable

gruß
maupa

Re: Kleines Multilanguage GUI für PB Formdesigner

Verfasst: 11.08.2013 12:29
von ts-soft
maupa hat geschrieben:hi,
ich bekomme ein fehler: Zeile 209 Konstante nicht gefunden #pb_editor_CreateExecutable

gruß
maupa
Compiler-Optionen/Konstanten/#PB_Editor_CreateExecutable haken setzen.

Re: Kleines Multilanguage GUI für PB Formdesigner

Verfasst: 11.08.2013 12:52
von maupa
ohm wie Plöd..

Sry verpeit dachte ist gesetzt..

DANKE sehr für Hilfe

Re: Kleines Multilanguage GUI für PB Formdesigner

Verfasst: 11.08.2013 15:04
von STARGÅTE
Ich verstehe nicht ganz den Sinn solcher Macro-Definitionen:

Code: Alles auswählen

Macro ButtonGadget9_X
    10
EndMacro
Es gibt keinerlei bezug, zu welchen Gadget das Gehört (hier scheinbar #Button_Search) und normalerweise werden dafür Konstanten genutzt, wie zB. #Button_Search_X = 10

Das nächste sind die Sprachvariablen (L0000000B), die du hier einzeln als Strings definierst, die wiederung keinerlei bezug zum Inhalt geben.
Tut mir leid, aber das ist ein ganz schlechter Stil, für den Aufbau einer Mehrsprachigen Anwendung.

Eine Map wäre hier geeigneter, dort gibt der Key gleich Aufschluss über den Inhalt.

Code: Alles auswählen

Global NewMap Translate.s()

Translate("Apply") = "Übernehmen"
Translate("Cancel") = "Abbrechen"

Debug Translate("Apply")
Die Map kann dabei einfach mit einer Preferenzdatei gefüllt werden:
Apply = Übernehmen
Cancel = Abbrechen

Code: Alles auswählen

If ExaminePreferenceKeys()
	While NextPreferenceKey()
		Translate(PreferenceKeyName()) = PreferenceKeyValue()
	Wend
EndIf