BabelResolver

Share your advanced PureBasic knowledge/code with the community.
zapman*
Enthusiast
Enthusiast
Posts: 115
Joined: Wed Jun 02, 2004 10:17 pm
Location: New Caledonia (South Pacific)
Contact:

BabelResolver

Post by zapman* »

Code updated For 5.20+

Here is the language manager that will be used in SoundEditor. It's designed to be usable in any kind of programs.

You can forget all your problems for multilanguage support. The only thing you have to do now is to replace "MyString" by BRTranslate("MyString") each time you have a string in your code.

If you create dictionnaries, you could reuse them in all your codes. You can also exchange them with other coders using the "Absorb a dictionnary" function.

Because this code uses himself, you've just to take a look inside to get an exemple.

Because I'm not english native, there is probably incorrect translations in this. Please inform me !

You can find BabelResolver at http://www.freesoundeditor.com/DownloadSrceseng.htm

Code: Select all

; BabelResolver by Zapman
;
; Gestion des langues pour la diffusion internationale de vos programmes PureBasic
; Réalisé avec PureBasic 3.90
; Pas de bibliothèque nécessaires
;
; L'intérêt principal de ce programme est de simplifier considérablement le support multilangue
;
; Il comprend une toute petite notice
;
;
;
If FileSize(GetCurrentDirectory()+"MonPianoDatas")=-1
CreateDirectory(GetCurrentDirectory()+"MonPianoDatas"):EndIf
If FileSize(GetCurrentDirectory()+"MonPianoDatas\Dictionnaries")=-1
CreateDirectory(GetCurrentDirectory()+"MonPianoDatas\Dictionnaries"):EndIf 

#DataFolder = "MonPianoDatas\Dictionnaries"
#MaxTexts = 500
#IncludedLanguages="Français|English|Deutsch|" ; you can add more if you put
; more languages datas in datasection, but an easyest way to give more language
; possibility to your software is to give the "Dictionnary" folder to the user.
; (this folder will be automatically created by BabelResolver when you'll use it)
;
; Vous pouvez ajouter d'avantage de langues incluses si vous renseignez correctement
; la datasection, mais il y a une façon plus simple de transmettre des nouvelles langues
; à vos utilisateur : copiez simplement le contenu du dossier "Dictionnary"
; (ce dossier est créé automatiquement par BabelResolver quand vous l'utilisez)
; Vous pouvez démarrer avec une datasection vide.
;
#VK_ENTER = 13
Global SELanguage.s , mDictionnary$, mlanguage$
Global Dim LocalTexts$(#MaxTexts)
LocalTexts$(1)="EndText"
;
Declare.s BRTranslate (EnglishText$)
;Declare SetStringManipulationBufferSize(Bytes)
Declare.s ChooseLanguageWindow()
Declare LanguageWindow()
;
;
;
; Mettez les 5 lignes de programmes qui suivent sous forme de commentaires pour pouvoir
; utiliser ce fichier en tant que "IncludeFile" dans votre programme
;
; Comment the 5 following program lines to be able to use this file as an "IncludeFile"
; in your program.
;
;
;*  ------------ FROM HERE - A PARTIR d'ICI ---------------
;
;
;SetStringManipulationBufferSize(500000)
; 
SELanguage = ChooseLanguageWindow()

MessageRequester(BRTranslate("Introduction"),BRTranslate("IntroBabel"),0)
LanguageWindow()

End
;
;*  ---------------- TO HERE - JUSQUE LA ------------------
;
;
; Ajoutez dans votre programme un appel à LanguageWindow() pour
; donner à l'utilisateur la possibilité de modifier les dictionnaires
;
; Add in your program a call to LanguageWindow() to allow users to
; modify dictionnaries.
;
; LA PROCEDURE SUIVANTE N'EST PLUS NECESSAIRE
; Procedure SetStringManipulationBufferSize(Bytes)
; ;Le truc de Fred pour augmenter la taille du buffer texte
; ;et éviter les plantage quand on manipule des grandes
; ;chaines de caractères.                               
; ;Fred tip to increase text buffer size and avoid problem
; ;when using big size strings
;   PBStringBase.l = 0
;   PBMemoryBase.l = 0
;   !MOV eax, dword [PB_StringBase]
;   !MOV [esp+4],eax
;   !MOV eax, dword [PB_MemoryBase]
;   !MOV [esp+8],eax
;   HeapReAlloc_(PBMemoryBase, #GMEM_ZEROINIT, PBStringBase, Bytes)
;   !MOV dword [_PB_StringBase],eax
; EndProcedure
;
Procedure.s GetAvailableLanguages ()
  Languages$ = #IncludedLanguages
  ExamineDirectory(0, #DataFolder, "")
  While NextDirectoryEntry(0)
    FName$ = DirectoryEntryName(0)
    If FName$
      If FindString(FName$,".",1)
        FName$=Left(FName$,FindString(FName$,".",1)-1)
      EndIf
      If FName$
        FName$+"|"
        If FindString("|"+Languages$,"|"+FName$,1)=0
          Languages$ + FName$
        EndIf
      EndIf
    EndIf
  Wend
  ProcedureReturn Languages$
EndProcedure
;
Enumeration
  #CChoose = 1000
  #BCOK
EndEnumeration
;
Procedure.s ChooseLanguageWindow()
  #LChoose = 30
  Result$ = "Error"
  If OpenWindow(#LChoose, 216, 0, 192, 71, "Choose your language",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    ;     If CreateGadgetList(WindowID(#LChoose))
    ComboBoxGadget(#CChoose, 8, 8, 176, 100)
    Languages$ = GetAvailableLanguages ()
    ct = 1
    Repeat
      LName$ = StringField(Languages$, ct, "|")
      If LName$
        AddGadgetItem(#CChoose,-1,LName$)
      EndIf
      ct + 1
    Until LName$=""
    SetGadgetState(#CChoose,0)
    ButtonGadget(#BCOK, 104, 40, 80, 23, "OK")
    QuitC = 0
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = #BCOK
          QuitC = 1
        EndIf
      ElseIf Event = #PB_Event_CloseWindow
        QuitC = 1
      EndIf
    Until QuitC
  EndIf
  Result$ = GetGadgetText(#CChoose)
  CloseWindow(#LChoose)
  ;   EndIf
  ProcedureReturn Result$
EndProcedure
;
Procedure.s GetDictionnary(Language.s)
  
  ; lit un dictionnaire enregistré sous forme de fichier
  If Language=mlanguage$
    Dictionnary$=mDictionnary$ ; To save time - Pour gagner du temps
  Else
    Dictionnary$ = "Error"
    If Language
      If FileSize(#DataFolder+"\"+Language+".txt")<1
        If ReadFile(0,#DataFolder+"\English.txt") And FindString(#IncludedLanguages,Language,1)=0
          Dictionnary$ =""
          Repeat
            RText$ = ReadString(0)
            If RText$
              Dictionnary$ + RText$ + Chr(13)+ Chr(10)
            EndIf
          Until RText$="" Or FindString(RText$,"EndText",1)
          pos=FindString(Dictionnary$,"EndText[EOT]",pos)
          If Pos
            Dictionnary$=Left(Dictionnary$,pos-1)
          EndIf
          Dictionnary$ + "EndText[EOT]"
          CloseFile(0)
        Else
          If Language = "Français"
            Restore FraTexts
          ElseIf Language = "Deutsch"
            Restore DeuTexts
          Else
            Restore EngTexts
          EndIf
          Dictionnary$=""
          Repeat
            Read.s TTranslation$
            Dictionnary$=Dictionnary$+TTranslation$+"[EOT]"
          Until TTranslation$="EndText" Or TTranslation$=""
          pos=FindString(Dictionnary$,"EndText[EOT]",pos)
          If TTranslation$=""
            Dictionnary$ + "EndText[EOT]"
          EndIf
        EndIf
        If ExamineDirectory(0, #DataFolder, "") = 0
          CreateDirectory(#DataFolder)
        EndIf
        If OpenFile(0,#DataFolder+"\"+Language+".txt")
          WriteString(0,Dictionnary$)
          CloseFile(0)
        EndIf
      Else
        If ReadFile(0,#DataFolder+"\"+Language+".txt")
          Dictionnary$ =""
          Repeat
            RText$ = ReadString(0)
            If RText$
              Dictionnary$ + RText$ + Chr(13)+ Chr(10)
            EndIf
          Until RText$="" Or FindString(RText$,"EndText[EOT]",1)
          pos=FindString(Dictionnary$,"EndText[EOT]",pos)
          If Pos
            Dictionnary$=Left(Dictionnary$,pos-1)
          EndIf
          Dictionnary$ + "EndText[EOT]"
          CloseFile(0)
        EndIf
      EndIf
    EndIf
  EndIf
  mlanguage$=Language
  mDictionnary$=Dictionnary$
  ProcedureReturn Dictionnary$
EndProcedure
;
Procedure PutTextInOneDictionnary(Language.s,EnglishText$,LocalText$,InRef)
  Result = 0
  If Language And EnglishText$
    Dictionnary$ = GetDictionnary(Language)
    pos = FindString(LCase(Dictionnary$),"[eot]"+LCase(EnglishText$)+"|",1)
    If pos = 0
      If Left(LCase(Dictionnary$),Len("[eot]"+LCase(EnglishText$)+"|"))="[eot]"+LCase(EnglishText$)+"|"
        pos = 1
      EndIf
    Else
      pos+5
    EndIf
    If pos
      If InRef = 0
        pos2=FindString(Dictionnary$,"[EOT]",pos)
        If pos2
          Dictionnary$=Left(Dictionnary$,pos-1)+EnglishText$+"|"+LocalText$+"[EOT]"+Right(Dictionnary$,Len(Dictionnary$)-pos2-4)
        EndIf
      EndIf
    Else
      Result = 1
      pos=FindString(Dictionnary$,"EndText[EOT]",pos)
      If Pos
        Dictionnary$=Left(Dictionnary$,pos-1)
      EndIf
      Dictionnary$ = Dictionnary$ + EnglishText$+"|"+LocalText$+"[EOT]EndText[EOT]"
    EndIf
    If OpenFile(0,#DataFolder+"\"+Language+".txt")
      WriteString(0,Dictionnary$)
      CloseFile(0)
    EndIf
  EndIf
  mlanguage$=Language
  mDictionnary$=Dictionnary$
  ProcedureReturn Result
EndProcedure
;
Procedure PutTextInDictionnary(Language.s,EnglishText$,LocalText$)
  If Language And EnglishText$
    If LocalText$=""
      LocalText$ = EnglishText$
    EndIf
    If PutTextInOneDictionnary(Language.s,EnglishText$,LocalText$,0)
      ExamineDirectory(0, #DataFolder, "")
      DirList$=""
      While NextDirectoryEntry(0)
        FName$ = GetFilePart(DirectoryEntryName(0))
        If FName$<>Language+".txt"
          If LCase(Right(FName$,4))=".txt"
            FName$=Left(FName$,Len(FName$)-4)
            DirList$=DirList$+FName$+"|"
          EndIf
        EndIf
      Wend
      ct = 1
      Repeat
        LName$ = StringField(#IncludedLanguages, ct, "|")
        If LName$ And FindString(DirList$,LName$+"|",1)=0 And LName$<>Language
          DirList$ + LName$+"|"
        EndIf
        ct + 1
      Until LName$=""
      ct = 1
      While DirList$
        pos=FindString(DirList$,"|",1)
        FName$=Left(DirList$,pos-1)
        DirList$=Right(DirList$,Len(DirList$)-pos)
        PutTextInOneDictionnary(FName$,EnglishText$,EnglishText$,1)
      Wend
    EndIf
  EndIf
EndProcedure
;
Procedure DelTextFromOneDictionnary(Language.s,EnglishText$)
  Result = 0
  If Language And EnglishText$
    Dictionnary$ = GetDictionnary(Language)
    pos = FindString(LCase(Dictionnary$),"[eot]"+LCase(EnglishText$)+"|",1)
    If pos = 0
      If Left(LCase(Dictionnary$),Len("[eot]"+LCase(EnglishText$)+"|"))="[eot]"+LCase(EnglishText$)+"|"
        pos = 1
      EndIf
    Else
      pos+5
    EndIf
    If pos
      pos2=FindString(Dictionnary$,"[EOT]",pos)
      If pos2
        Dictionnary$=Left(Dictionnary$,pos-1)+Right(Dictionnary$,Len(Dictionnary$)-pos2-4)
      EndIf
    EndIf
    If OpenFile(0,#DataFolder+"\"+Language+".txt")
      WriteString(0,Dictionnary$)
      CloseFile(0)
    EndIf
  EndIf
  mlanguage$=Language
  mDictionnary$=Dictionnary$
  ProcedureReturn Result
EndProcedure
;
Procedure DelTextFromDictionnaries(EnglishText$)
  If EnglishText$
    ExamineDirectory(0, #DataFolder, "")
    DirList$=""
    While NextDirectoryEntry(0)
      FName$ = GetFilePart(DirectoryEntryName(0))
      If LCase(Right(FName$,4))=".txt"
        FName$=Left(FName$,Len(FName$)-4)
        DirList$=DirList$+FName$+"|"
      EndIf
    Wend
    ct = 1
    While DirList$
      pos=FindString(DirList$,"|",1)
      FName$=Left(DirList$,pos-1)
      DirList$=Right(DirList$,Len(DirList$)-pos)
      DelTextFromOneDictionnary(FName$,EnglishText$)
    Wend
  EndIf
EndProcedure
;
Procedure.s BRTranslate(EnglishText$)
  EnglishText$ = ReplaceString(EnglishText$,Chr(10),"")
  EnglishText$ = ReplaceString(EnglishText$,Chr(13),"[EOL]")
  Localtext$ = EnglishText$
  If EnglishText$
    Dictionnary$ = GetDictionnary(SELanguage)
    pos = FindString("]"+LCase(Dictionnary$),"]"+LCase(EnglishText$)+"|",1)
    If pos
      pos + Len(EnglishText$+"|")
      pos2=FindString(Dictionnary$,"[EOT]",pos)
      If pos2
        Localtext$=Mid(Dictionnary$,pos,pos2-pos)
      EndIf
    Else
      PutTextInDictionnary("English",EnglishText$,EnglishText$)
      PutTextInDictionnary(SELanguage,EnglishText$,EnglishText$)
    EndIf
  EndIf
  LocalText$ = ReplaceString(LocalText$,"[EOL]",Chr(13))
  ProcedureReturn(LocalText$)
EndProcedure
;
Declare SetListFromDictionnary (Language.s)
Declare SaveBiText (Language.s)


Procedure LanguageWindow()
  #LanguageWindow = 30
  ;
  Structure BiText
    EnglishText.s
    LocalText.s
  EndStructure
  Global Dim BiText.BiText(#MaxTexts)
  ;
  Enumeration
    #LLList = 1002
    #TLEnglish
    #SLLocal
    #CLLanguage
    #TLLanguage
    #BLSave
    #BLNew
    #BLDelete
    #FLLook
    #SLLook
    #BLLook
    #BLNext
    #BLAbsorb
    #BLHidden
    #BLWebT
    #BLQuit
  EndEnumeration
  ;
  hw = OpenWindow(#LanguageWindow, 216, 0, 515, 448, BRTranslate("Modify languages"),  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  If hw
    ;     If CreateGadgetList(WindowID(#LanguageWindow))
    ListViewGadget(#LLList, 10, 39, 493, 247)
    TextGadget(#TLEnglish, 10, 288, 493, 17, "")
    
    TextGadget(#TLLanguage, 10, 12, 63, 20, BRTranslate("Language:"), #PB_Text_Right)
    ComboBoxGadget(#CLLanguage, 80, 9, 133, 100)
    
    Languages$ = GetAvailableLanguages ()
    ct = 1
    Repeat
      LName$ = StringField(Languages$, ct, "|")
      If LName$
        AddGadgetItem(#CLLanguage,-1,LName$)
      EndIf
      ct + 1
    Until LName$=""
    ;
    noi = CountGadgetItems(#CLLanguage)
    ct = 0
    While ct<noi And SELanguage.s<>GetGadgetItemText(#CLLanguage,ct,0) : ct + 1 : Wend
    If SELanguage.s=GetGadgetItemText(#CLLanguage,ct,0)
      SetGadgetState(#CLLanguage,ct)
    Else
      SetGadgetState(#CLLanguage,0)
    EndIf
    
    ButtonGadget(#BLSave, 439, 10, 64, 20, BRTranslate("Save"))
    ButtonGadget(#BLNew, 220, 10, 64, 20, BRTranslate("New"))
    ButtonGadget(#BLDelete, 292, 10, 64, 20, BRTranslate("Delete"))
    FrameGadget3D(#FLLook, 10, 368, 493, 44, BRTranslate("Look for"))
    StringGadget(#SLLook, 18, 385, 272, 20, "")
    ButtonGadget(#BLLook, 304, 385, 91, 20, BRTranslate("Look"))
    ButtonGadget(#BLNext, 402, 385, 91, 20, BRTranslate("Next"))
    ButtonGadget(#BLAbsorb, 10, 420, 140, 20, BRTranslate("Absorb a dictionnary"))
    ButtonGadget(#BLHidden, 157, 420, 127, 20, BRTranslate("Hidden commands"))
    ButtonGadget(#BLWebT, 291, 420, 120, 20, BRTranslate("Web Translation"))
    ButtonGadget(#BLQuit, 442, 420, 61, 20, BRTranslate("Quit"))
    ;StringGadget(#SLLocal, 10, 305, 493, 60, "",#PB_String_Multiline|#WS_VSCROLL)
    EditorGadget(#SLLocal, 10, 305, 493, 60)
    SendMessage_(GadgetID(#SLLocal), #EM_SETTARGETDEVICE, #Null, 0)
    SetListFromDictionnary(GetGadgetText(#CLLanguage))
    CurrentLanguage$ = GetGadgetText(#CLLanguage)
    ;
    QuitL = 0
    ;
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget       
        GadgetID = EventGadget()
        ;
        If GadgetID = #LLList
          ct = GetGadgetState(#LLList)
          LName$ = BiText(ct)\EnglishText
          GetAsyncKeyState_(#VK_CONTROL) ; Empty Buffer
          GetAsyncKeyState_(#VK_CONTROL) ; Empty Buffer
          GetAsyncKeyState_(#VK_CONTROL) ; Empty Buffer
          GetAsyncKeyState_(#VK_MENU) ; Empty Buffer
          GetAsyncKeyState_(#VK_MENU) ; Empty Buffer
          GetAsyncKeyState_(#VK_MENU) ; Empty Buffer
          ;
          If GetAsyncKeyState_(#VK_CONTROL)
            Result = MessageRequester(BRTranslate("Caution!"),BRTranslate("Do you really want to delete this text from all dictionnaries ?"),#PB_MessageRequester_YesNo)
            If Result = 6
              If Right(GetGadgetText(#CLLanguage),1)="*"
                ct = GetGadgetState(#CLLanguage)
                CurrentLanguage$ = GetGadgetText(#CLLanguage)
                CurrentLanguage$ = Left(CurrentLanguage$,Len(CurrentLanguage$)-1)
                SetGadgetItemText(#CLLanguage,ct,CurrentLanguage$,0)
                SetGadgetState(#CLLanguage,ct)
                SaveBiText(CurrentLanguage$)
              EndIf
              DelTextFromDictionnaries(LName$)
              SetListFromDictionnary(GetGadgetText(#CLLanguage))
              If GetGadgetItemText(#LLList,ct,0)=""
                ct-1
              EndIf
              SetGadgetState(#LLList,ct)
            EndIf
          ElseIf GetAsyncKeyState_(#VK_MENU)
            NewText$ = InputRequester(BRTranslate("New Text"), BRTranslate("Enter the english version of your new text:"), "")
            If NewText$
              If Right(GetGadgetText(#CLLanguage),1)="*"
                ct = GetGadgetState(#CLLanguage)
                CurrentLanguage$ = GetGadgetText(#CLLanguage)
                CurrentLanguage$ = Left(CurrentLanguage$,Len(CurrentLanguage$)-1)
                SetGadgetItemText(#CLLanguage,ct,CurrentLanguage$,0)
                SetGadgetState(#CLLanguage,ct)
                SaveBiText (CurrentLanguage$)
              EndIf
              PutTextInDictionnary(CurrentLanguage$,NewText$,NewText$)
              SetListFromDictionnary(CurrentLanguage$)
              ct = 0
              While BiText(ct)\EnglishText And BiText(ct)\EnglishText<>NewText$ : ct + 1 : Wend
              SetGadgetState(#LLList,ct)
            EndIf
          EndIf
          If GetGadgetState(#LLList)<0
            SetGadgetState(#LLList,0)
          EndIf
          tx$ = ReplaceString(GetGadgetText(#LLList),"[EOL]",Chr(13)+Chr(10))
          SetGadgetText(#SLLocal,tx$)
          SetGadgetText(#TLEnglish,BiText(GetGadgetState(#LLList))\EnglishText)
          ;
        ElseIf GadgetID = #SLLocal
          If BiText(GetGadgetState(#LLList))\LocalText <> GetGadgetText(#SLLocal)
            tx$ = ReplaceString(GetGadgetText(#SLLocal),Chr(10),"")
            tx$ = ReplaceString(tx$,Chr(13),"[EOL]")
            BiText(GetGadgetState(#LLList))\LocalText = tx$
            ct = GetGadgetState(#LLList)
            SetGadgetItemText(#LLList,ct,tx$,0)
            SetGadgetState(#LLList,ct)
            ct = GetGadgetState(#CLLanguage)
            If Right(GetGadgetText(#CLLanguage),1)<>"*"
              SetGadgetItemText(#CLLanguage,ct,GetGadgetText(#CLLanguage)+"*",0)
              SetGadgetState(#CLLanguage,ct)
              CurrentLanguage$ = GetGadgetText(#CLLanguage)
            EndIf
          EndIf
          ;
        ElseIf GadgetID = #CLLanguage
          If GetGadgetState(#CLLanguage)>=0
            If CurrentLanguage$<>GetGadgetText(#CLLanguage)
              If Right(CurrentLanguage$,1)="*"
                CurrentLanguage$ = Left(CurrentLanguage$,Len(CurrentLanguage$)-1)
                Result = MessageRequester(BRTranslate("Caution!"),CurrentLanguage$+BRTranslate(" has been modified. Do you want to save it before seeing another language ?"),#PB_MessageRequester_YesNo)
                If Result = 6
                  SaveBiText (CurrentLanguage$)
                  BRTranslate("Caution!")  ; to be sure to include those messages in the language
                  BRTranslate(" has been modified. Do you want to save it before seeing another language ?")
                EndIf
              EndIf
              CurrentLanguage$ = GetGadgetText(#CLLanguage)
              ct = 0
              Repeat
                LText$ = GetGadgetItemText(#CLLanguage,ct,0)
                If Right(LText$,1)="*"
                  SetGadgetItemText(#CLLanguage,ct,Left(LText$,Len(LText$)-1),0)
                EndIf
                ct + 1
              Until LText$=""
              SetListFromDictionnary(GetGadgetText(#CLLanguage))
            EndIf
          EndIf
          ;
        ElseIf GadgetID = #BLNew
          Language.s = InputRequester(BRTranslate("New language"), BRTranslate("Enter the new language name"), "")
          If Language
            AddGadgetItem(#CLLanguage,-1,Language)
            ct = 0
            While GetGadgetItemText(#CLLanguage,ct,0)<>Language : ct + 1 : Wend
            SetGadgetState(#CLLanguage,ct)
            SetListFromDictionnary(GetGadgetText(#CLLanguage))
          EndIf
          
        ElseIf GadgetID = #BLDelete
          DName$ = GetGadgetText(#CLLanguage)
          If DName$
            If Right(DName$,1)="*"
              DName$ = Left(DName$,Len(DName$)-1)
            EndIf
            Result = MessageRequester(BRTranslate("Caution!"),BRTranslate("Do you really want to delete this language (")+DName$+BRTranslate(") and all the associated texts ?"),#PB_MessageRequester_YesNo)
            If Result = 6
              If FileSize(#DataFolder+"\"+DName$+".txt")
                DeleteFile(#DataFolder+"\"+DName$+".txt")
              EndIf
              ct = GetGadgetState(#CLLanguage)
              If FindString(#IncludedLanguages,DName$,1)=0
                RemoveGadgetItem(#CLLanguage, ct)
                If GetGadgetItemText(#CLLanguage,ct,0)=""
                  ct-1
                EndIf
                SetGadgetState(#CLLanguage,ct)
              Else
                SetGadgetItemText(#CLLanguage,ct,DName$,0)
                SetGadgetState(#CLLanguage,ct)
                MessageRequester(BRTranslate("Caution!"),BRTranslate("This language can't be deleted."),0)
              EndIf
              SetListFromDictionnary(GetGadgetText(#CLLanguage))
            EndIf
          EndIf
          ;
        ElseIf GadgetID = #BLLook
          Find = 1
          SFind = -1
          ;
        ElseIf GadgetID = #BLNext
          Find = 1
          SFind = GetGadgetState(#LLList)
          ;
        ElseIf GadgetID = #BLSave
          If Right(GetGadgetText(#CLLanguage),1)="*"
            ct = GetGadgetState(#CLLanguage)
            CurrentLanguage$ = GetGadgetText(#CLLanguage)
            CurrentLanguage$ = Left(CurrentLanguage$,Len(CurrentLanguage$)-1)
            SetGadgetItemText(#CLLanguage,ct,CurrentLanguage$,0)
            SetGadgetState(#CLLanguage,ct)
            SaveBiText (CurrentLanguage$)
          EndIf
          GetAsyncKeyState_(#VK_CONTROL) ; Empty Buffer
          GetAsyncKeyState_(#VK_CONTROL) ; Empty Buffer
          GetAsyncKeyState_(#VK_CONTROL) ; Empty Buffer
          If GetAsyncKeyState_(#VK_CONTROL)
            suffixe$ = ".pb"
            Title$ = "PureBasic Datas"
            PNF$ = SaveFileRequester(Title$,"LanguageSet" , suffixe$,0)
            If PNF$
              If Right(PNF$,Len(suffixe$))<>suffixe$
                PNF$ + suffixe$
              EndIf
              If OpenFile(1,PNF$)
                WriteString(1,"DataSection"+Chr(13)+Chr(10))
                ct = 0
                Repeat
                  Language=GetGadgetItemText(#CLLanguage,ct,0)
                  If Language
                    WriteString(1,Left(Language,3)+"Texts:"+Chr(13)+Chr(10))
                    Dictionnary$ = GetDictionnary(Language)
                    IsFile(1)
                    Repeat
                      pos = FindString(Dictionnary$,"|",1)
                      If pos
                        EnglishText$=Left(Dictionnary$,pos-1)
                        EnglishText$=ReplaceString(EnglishText$,Chr(34),"$guillemets$")
                        EnglishText$=ReplaceString(EnglishText$,"$guillemets$",Chr(34)+"+Chr(34)+"+Chr(34))
                        EnglishText$=ReplaceString(EnglishText$,Chr(13)+Chr(10),Chr(34)+"+Chr(13)+Chr(10)+"+Chr(34))
                        EnglishText$=ReplaceString(EnglishText$,Chr(13),Chr(34)+"+Chr(13)+"+Chr(34))
                        EnglishText$=Chr(34)+EnglishText$+Chr(34)
                        Dictionnary$=Right(Dictionnary$,Len(Dictionnary$)-pos)
                        pos=FindString(Dictionnary$,"[EOT]",1)
                        If pos
                          LocalText$=Left(Dictionnary$,pos-1)
                          LocalText$=Left(Dictionnary$,pos-1)
                          LocalText$=ReplaceString(LocalText$,Chr(34),"$guillemets$")
                          LocalText$=ReplaceString(LocalText$,"$guillemets$",Chr(34)+"+Chr(34)+"+Chr(34))
                          LocalText$=ReplaceString(LocalText$,Chr(13)+Chr(10),Chr(34)+"+Chr(13)+Chr(10)+"+Chr(34))
                          LocalText$=ReplaceString(LocalText$,Chr(13),Chr(34)+"+Chr(13)+"+Chr(34))
                          LocalText$=Chr(34)+LocalText$+Chr(34)
                          WriteString(1,"  Data$ "+EnglishText$+"+"+Chr(34)+"|"+Chr(34)+"+"+LocalText$+Chr(13)+Chr(10))                                             
                          Dictionnary$=Right(Dictionnary$,Len(Dictionnary$)-pos-4)
                        EndIf
                      EndIf
                    Until pos = 0
                    WriteString(1,"  Data$ "+Chr(34)+"EndText"+Chr(34)+Chr(13)+Chr(10)+Chr(13)+Chr(10))
                    ct + 1
                  EndIf
                Until Language=""
                WriteString(1,"EndDataSection")
                CloseFile(1)
              EndIf
            EndIf
          EndIf
          ;
        ElseIf GadgetID = #BLAbsorb
          If Right(CurrentLanguage$,1)="*"
            ct = GetGadgetState(#CLLanguage)
            CurrentLanguage$ = GetGadgetText(#CLLanguage)
            CurrentLanguage$ = Left(CurrentLanguage$,Len(CurrentLanguage$)-1)
            SetGadgetItemText(#CLLanguage,ct,CurrentLanguage$,0)
            SetGadgetState(#CLLanguage,ct)
            SaveBiText (CurrentLanguage$)
          EndIf
          Result = MessageRequester(BRTranslate("Absorb a dictionnary"),BRTranslate("You will be asked to open an external file named ")+CurrentLanguage$+".txt"+Chr(13)+BRTranslate("All words found in this file will be added to the actual dictionnary.")+Chr(13)+BRTranslate("Continue?"),#PB_MessageRequester_YesNo)
          If Result = 6
            PNF$ = OpenFileRequester(BRTranslate("Open a file named ")+CurrentLanguage$+".txt",CurrentLanguage$+".txt" , CurrentLanguage$+".txt|"+CurrentLanguage$+".txt",0)
            If GetFilePart(PNF$)=CurrentLanguage$+".txt"
              If ReadFile(0,PNF$)
                Dictionnary$ =""
                Repeat
                  RText$ = ReadString(0)
                  If RText$
                    Dictionnary$ + RText$ + Chr(13)+ Chr(10)
                  EndIf
                Until RText$="" Or FindString(RText$,"EndText",1)
                CloseFile(0)
                Repeat
                  pos = FindString(Dictionnary$,"|",1)
                  If pos
                    EnglishText$=Left(Dictionnary$,pos-1)
                    Dictionnary$=Right(Dictionnary$,Len(Dictionnary$)-pos)
                    pos=FindString(Dictionnary$,"[EOT]",1)
                    If pos
                      LocalText$=Left(Dictionnary$,pos-1)
                      Dictionnary$=Right(Dictionnary$,Len(Dictionnary$)-pos-4)
                      PutTextInDictionnary(CurrentLanguage$,EnglishText$,LocalText$)
                    EndIf
                  EndIf
                Until pos = 0
                SetListFromDictionnary(GetGadgetText(#CLLanguage))
              EndIf
            EndIf
          EndIf
          ;
        ElseIf GadgetID = #BLHidden
          MessageRequester(BRTranslate("Hidden Commands"),BRTranslate("This commands are for programmers only:"+Chr(13)+Chr(13)+"- Ctrl + Save : create a PureBasic data file with all the datas"+Chr(13)+"- Ctrl + clic on the list : delete a text"+Chr(13)+"- Alt + Clic on the list : add a text"),0)
          ;
        ElseIf GadgetID = #BLWebT
          ShellExecute_(hw,"open","http://www.foreignword.com/Tools/transnow.htm","","",#SW_SHOWNORMAL)
          ;
        ElseIf GadgetID = #BLQuit
          If Right(CurrentLanguage$,1)="*"
            CurrentLanguage$ = Left(CurrentLanguage$,Len(CurrentLanguage$)-1)
            Result = MessageRequester(BRTranslate("Caution!"),CurrentLanguage$+BRTranslate(" has been modified. Do you want to save it before quitting?"),#PB_MessageRequester_YesNo)
            If Result = 6
              SaveBiText (CurrentLanguage$)
              BRTranslate("Caution!")  ; to be sure to include those messages in the language
              BRTranslate(" has been modified. Do you want to save it before quitting?")
            EndIf
          EndIf
          QuitL = 1
          ;
        EndIf
        ;
      ElseIf Event = #WM_KEYDOWN
        SendMessage_(GadgetID(#SLLocal),#EM_GETSEL,@StartS,@EndS)
        If StartS=mStartS And EndS=mEndS
          If GetFocus_()=GadgetID(#SLLocal) And GetAsyncKeyState_(#VK_DOWN)
            ct = GetGadgetState(#LLList)
            If GetGadgetItemText(#LLList,ct+1,0)
              SetGadgetState(#LLList,ct+1)
              SetGadgetText(#SLLocal,GetGadgetText(#LLList))
              SetGadgetText(#TLEnglish,BiText(GetGadgetState(#LLList))\EnglishText)
            EndIf
          EndIf
        EndIf
        ;
        If StartS=mStartS And EndS=mEndS
          If GetFocus_()=GadgetID(#SLLocal) And GetAsyncKeyState_(#VK_UP)
            ct = GetGadgetState(#LLList)
            If ct
              SetGadgetState(#LLList,ct-1)
              SetGadgetText(#SLLocal,GetGadgetText(#LLList))
              SetGadgetText(#TLEnglish,BiText(GetGadgetState(#LLList))\EnglishText)
            EndIf
          EndIf
        EndIf
        ;
        If GetFocus_()=GadgetID(#SLLook) And GetAsyncKeyState_(#VK_ENTER)
          Find = 1
          SFind = GetGadgetState(#LLList)
        EndIf
        ;
      ElseIf Event = #PB_Event_CloseWindow
        QuitL = 1
        ;
      EndIf
      If Find
        Find = 0
        ct = SFind +1
        While BiText(ct)\EnglishText And FindString(LCase(BiText(ct)\EnglishText),LCase(GetGadgetText(#SLLook)),1)=0 : ct + 1 : Wend
        If FindString(LCase(BiText(ct)\EnglishText),LCase(GetGadgetText(#SLLook)),1)=0
          ct = SFind +1
          While BiText(ct)\EnglishText And FindString(LCase(BiText(ct)\LocalText),LCase(GetGadgetText(#SLLook)),1)=0 : ct + 1 : Wend
        EndIf
        If BiText(ct)\EnglishText
          SetGadgetState(#LLList,ct)
          SetGadgetText(#SLLocal,GetGadgetText(#LLList))
          SetGadgetText(#TLEnglish,BiText(GetGadgetState(#LLList))\EnglishText)
        EndIf
      EndIf
      SetWindowPos_(hw,#HWND_TOP,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE) ; keep the window over the main window - maintient
      If Right(GetGadgetText(#CLLanguage),1)="*"
        DisableGadget(#BLSave,0)
      Else
        DisableGadget(#BLSave,1)
      EndIf
      SendMessage_(GadgetID(#SLLocal),#EM_GETSEL,@mStartS,@mEndS)
    Until QuitL
    ;     EndIf
  EndIf
  Dim BiText.BiText(1)
  CloseWindow(#LanguageWindow)
  mlanguage$="" ; to update mDictionnary$
EndProcedure
;
Procedure SetListFromDictionnary (Language.s)
  If Language
    Dictionnary$ = GetDictionnary(Language)
    ct = 0
    ;     ClearGadgetItemList(#LLList)
    Repeat
      pos = FindString(Dictionnary$,"|",1)
      If pos
        BiText(ct)\EnglishText=Left(Dictionnary$,pos-1)
        Dictionnary$=Right(Dictionnary$,Len(Dictionnary$)-pos)
        pos=FindString(Dictionnary$,"[EOT]",1)
        If pos
          BiText(ct)\LocalText=Left(Dictionnary$,pos-1)
          AddGadgetItem(#LLList,-1,Left(Dictionnary$,pos-1))
          Dictionnary$=Right(Dictionnary$,Len(Dictionnary$)-pos-4)
          ct + 1
        EndIf
      EndIf
    Until pos = 0
    BiText(ct)\EnglishText=""
    SetGadgetState(#LLLIst,0)
    SetGadgetText(#SLLocal,GetGadgetText(#LLList))
    SetGadgetText(#TLEnglish,BiText(GetGadgetState(#LLList))\EnglishText)
  EndIf
EndProcedure
;
Procedure SaveBiText (Language.s)
  If Language
    Dictionnary$ = ""
    ct = 0
    Repeat
      If BiText(ct)\EnglishText
        Dictionnary$=Dictionnary$+BiText(ct)\EnglishText+"|"+BiText(ct)\LocalText+"[EOT]"
      EndIf
      ct + 1
    Until BiText(ct)\EnglishText=""
    Dictionnary$ + "EndText[EOT]"
    If OpenFile(0,#DataFolder+"\"+Language+".txt")
      WriteString(0,Dictionnary$)
      CloseFile(0)
    Else
      MessageRequester(BRTranslate("Error"),BRTranslate("Error while saving the dictionnary!"),0)
    EndIf
  EndIf
EndProcedure
;



; This type of datas can be generated by this program itselfs !!!
; -> Start the program and press Ctrl while clicking on "Save"
;
; Ce type de datas peut être généré par ce programme lui-même !!!
; -> démarrez le programme et maintenez la touche Ctrl appuyée
; tout en cliquant sur "Enregistrer"
;
DataSection
  FraTexts:
  Data$ "OK"+"|"+"OK"
  Data$ "Cancel"+"|"+"Annuler"
  Data$ "Error"+"|"+"Erreur"
  Data$ "New"+"|"+"Nouveau"
  Data$ "Modify languages"+"|"+"Modifier les langues"
  Data$ "Language:"+"|"+"Langue :"
  Data$ "Save"+"|"+"Enregistrer"
  Data$ "Delete"+"|"+"Supprimer"
  Data$ "Look for"+"|"+"Rechercher"
  Data$ "Look"+"|"+"Chercher"
  Data$ "Next"+"|"+"Suivant"
  Data$ "Absorb a dictionnary"+"|"+"Absorber un dictionnaire"
  Data$ "Hidden commands"+"|"+"Commandes cachées"
  Data$ "Quit"+"|"+"Quitter"
  Data$ "Do you really want to delete this text from all dictionnaries ?"+"|"+"Voulez-vous réellement effacer ce texte de tous les dictionnaires ?"
  Data$ "Caution!"+"|"+"Attention !"
  Data$ "Enter the new language name"+"|"+"Entrez le nom de la nouvelle langue"
  Data$ "Enter the english version of your new text:"+"|"+"Entrez la version anglaise de votre nouveau texte :"
  Data$ "New Text"+"|"+"Nouveau texte"
  Data$ "New language"+"|"+"Nouvelle langue"
  Data$ " has been modified. Do you want to save it before seeing another language ?"+"|"+" a été modifiée. Voulez-vous l'enregistrer avant d'examiner une autre langue ?"
  Data$ "Do you really want to delete this language ("+"|"+"Voulez-vous réellement supprimer cette langue ("
  Data$ ") and all the associated texts ?"+"|"+") et tous les textes associés ?"
  Data$ " has been modified. Do you want to save it before quitting?"+"|"+" a été modifiée. Voulez-vous enregistrer avant de quitter ?"
  Data$ "You will be asked to open an external file named "+"|"+"Vous allez devoir ouvrir un fichier externe nommé "
  Data$ "All words found in this file will be added to the actual dictionnary."+"|"+"Tous les textes qu'il contient seront ajoutés au dictionnaire actuel."
  Data$ "Continue?"+"|"+"Continuer ?"
  Data$ "Open a file named "+"|"+"Ouvrir un fichier nommé "
  Data$ "Introduction"+"|"+"Introduction"
  Data$ "IntroBabel"+"|"+"Ce programme a pour objectif de régler le problème des langues dans vos programmes."+Chr(13)+Chr(10)+"Pour l'utiliser, ajouter simplement IncludeFile "+Chr(34)+"BabelResolver.pb"+Chr(34)+" dans vos programmes, ajoutez une commande menu qui exécutera la commande "+Chr(34)+"ChooseLanguageWindow()"+Chr(34)+" et remplacez chaque instruction du type 'MessageResquester("+Chr(34)+"Error"+Chr(34)+","+Chr(34)+"Message"+Chr(34)+",0)' par : 'MessageResquester(BRTranslate("+Chr(34)+"Error"+Chr(34)+"),BRTranslate("+Chr(34)+"Message"+Chr(34)+"),0)'"+Chr(13)+Chr(10)+"Son principe à l'avantage de permettre une traduction des textes par l'utilisateur lui-même, ce qui ouvre votre programme à l'international même si vous ne parlez que l'anglais et le français."+Chr(13)+Chr(13)+"Si vous créez des dictionnaires, vous pourrez les ré-utiliser dans tous vos programmes !!"
  Data$ "Web Translation|Traduction Web"
  Data$ "Error While saving the dictionnary!|Erreur pendant l'enregistrement du dictionnaire !"
  Data$ "EndText"
  
  EngTexts:
  Data$ "OK"+"|"+"OK"
  Data$ "Cancel"+"|"+"Cancel"
  Data$ "Error"+"|"+"Error"
  Data$ "New"+"|"+"New"
  Data$ "Modify languages"+"|"+"Modify languages"
  Data$ "Language:"+"|"+"Language:"
  Data$ "Save"+"|"+"Save"
  Data$ "Delete"+"|"+"Delete"
  Data$ "Look for"+"|"+"Look for"
  Data$ "Look"+"|"+"Look"
  Data$ "Next"+"|"+"Next"
  Data$ "Absorb a dictionnary"+"|"+"Absorb a dictionnary"
  Data$ "Hidden commands"+"|"+"Hidden commands"
  Data$ "Quit"+"|"+"Quit"
  Data$ "Enter the english version of your new text:"+"|"+"Enter the english version of your new text:"
  Data$ "New Text"+"|"+"New Text"
  Data$ "Do you really want to delete this text from all dictionnaries ?"+"|"+"Do you really want to delete this text from all dictionnaries ?"
  Data$ "Caution!"+"|"+"Caution!"
  Data$ "Enter the new language name"+"|"+"Enter the new language name"
  Data$ "New language"+"|"+"New language"
  Data$ " has been modified. Do you want to save it before seeing another language ?"+"|"+" has been modified. Do you want to save it before seeing another language ?"
  Data$ "Do you really want to delete this language ("+"|"+"Do you really want to delete this language ("
  Data$ ") and all the associated texts ?"+"|"+") and all the associated texts ?"
  Data$ " has been modified. Do you want to save it before quitting?"+"|"+" has been modified. Do you want to save it before quitting?"
  Data$ "You will be asked to open an external file named "+"|"+"You will be asked to open an external file named "
  Data$ "All words found in this file will be added to the actual dictionnary."+"|"+"All words found in this file will be added to the actual dictionnary."
  Data$ "Continue?"+"|"+"Continue ?"
  Data$ "Open a file named "+"|"+"Open a file named "
  Data$ "Introduction"+"|"+"Introduction"
  Data$ "IntroBabel"+"|"+"This sofware tries to solve the language problems in your software."+Chr(13)+Chr(10)+"To use it, simply put IncludeFile "+Chr(34)+"BabelResolver.pb"+Chr(34)+" in your code, add a menu command which will execute "+Chr(34)+"ChooseLanguageWindow()"+Chr(34)+" and replace each relevant instruction. For example, 'MessageResquester("+Chr(34)+"Error"+Chr(34)+","+Chr(34)+"Message"+Chr(34)+",0)' would become: 'MessageResquester(BRTranslate("+Chr(34)+"Error"+Chr(34)+"),BRTranslate("+Chr(34)+"Message"+Chr(34)+"),0)'"+Chr(13)+Chr(10)+"It will allow a translation by the user and then you can distribute your software internationally even if you only speack english!"+Chr(13)+Chr(13)+"If you create dictionnaries, you could use them in all your codes !!"
  Data$ "Web Translation|Web Translation"
  Data$ "Error While saving the dictionnary!|Error While saving the dictionnary!"
  Data$ "EndText"
  
  DeuTexts:
  Data$ "OK"+"|"+"Ok"
  Data$ "Cancel"+"|"+"Abbrechen"
  Data$ "Error"+"|"+"Fehler"
  Data$ "New"+"|"+"Neu"
  Data$ "Modify languages"+"|"+"Modify languages"
  Data$ "Language:"+"|"+"Sprache:"
  Data$ "Save"+"|"+"Speichern"
  Data$ "Delete"+"|"+"Löschen"
  Data$ "Look for"+"|"+"Suchen"
  Data$ "Look"+"|"+"Suche"
  Data$ "Next"+"|"+"Nächster"
  Data$ "Absorb a dictionnary"+"|"+"Absorb a dictionnary"
  Data$ "Hidden commands"+"|"+"Hidden commands"
  Data$ "Quit"+"|"+"Schließen"
  Data$ "Enter the english version of your new text:"+"|"+"Enter the english version of your new text:"
  Data$ "New Text"+"|"+"New Text"
  Data$ "New language"+"|"+"New language"
  Data$ "Do you really want to delete this text from all dictionnaries ?"+"|"+"Do you really want to delete this text from all dictionnaries ?"
  Data$ "Caution!"+"|"+"Achtung!"
  Data$ "Enter the new language name"+"|"+"Enter the new language name"
  Data$ " has been modified. Do you want to save it before seeing another language ?"+"|"+" has been modified. Do you want to save it before seeing another language ?"
  Data$ "Do you really want to delete this language ("+"|"+"Do you really want to delete this language ("
  Data$ ") and all the associated texts ?"+"|"+") and all the associated texts ?"
  Data$ " has been modified. Do you want to save it before quitting?"+"|"+" has been modified. Do you want to save it before quitting?"
  Data$ "You will be asked to open an external file named "+"|"+"You will be asked to open an external file named "
  Data$ "All words found in this file will be added to the actual dictionnary."+"|"+"All words found in this file will be added to the actual dictionnary."
  Data$ "Continue?"+"|"+"Continue ?"
  Data$ "Open a file named "+"|"+"Open a file named "
  Data$ "Introduction"+"|"+"Introduction"
  Data$ "IntroBabel"+"|"+"This sofware tries to solve the language problems in your software."+Chr(13)+Chr(10)+"To use it, simply put IncludeFile "+Chr(34)+"BabelResolver.pb"+Chr(34)+" in your code, add a menu command which will execute "+Chr(34)+"ChooseLanguageWindow()"+Chr(34)+" and replace each relevant instruction. For example, 'MessageResquester("+Chr(34)+"Error"+Chr(34)+","+Chr(34)+"Message"+Chr(34)+",0)' would become: 'MessageResquester(BRTranslate("+Chr(34)+"Error"+Chr(34)+"),BRTranslate("+Chr(34)+"Message"+Chr(34)+"),0)'"+Chr(13)+Chr(10)+"It will allow a translation by the user and then you can distribute your software internationally even if you only speack english!"+Chr(13)+Chr(13)+"If you create dictionnaries, you could use them in all your codes !!"
  Data$ "Web Translation|Web Translation"
  Data$ "Error While saving the dictionnary!|Error While saving the dictionnary!"
  Data$ "EndText"
  
EndDataSection 
Last edited by zapman* on Mon Nov 08, 2004 2:23 pm, edited 3 times in total.
Don't try - DO it !
dell_jockey
Enthusiast
Enthusiast
Posts: 767
Joined: Sat Jan 24, 2004 6:56 pm

Post by dell_jockey »

Hi,

are you really really relying on Babel for your language translation needs?
cheers,
dell_jockey
________
http://blog.forex-trading-ideas.com
zapman*
Enthusiast
Enthusiast
Posts: 115
Joined: Wed Jun 02, 2004 10:17 pm
Location: New Caledonia (South Pacific)
Contact:

Post by zapman* »

What do you mean ?? BabelTerminator would perhaps be a better name but it seems a bit heavy.
Don't try - DO it !
GreenGiant
Enthusiast
Enthusiast
Posts: 252
Joined: Fri Feb 20, 2004 5:43 pm

Post by GreenGiant »

Okay, a few of the english ones seem a bit sketchy. I'd say change
" has been modified. Do you want to save it before quit ?"
to
" has been modified. Do you want to save it before quitting ?"
and
"You will asked to open an external file named " doesn't make much sense, but I'm not sure what you're trying to say there.
Maybe "All texts found in this file will be added to the actual dictionnary." should be
"All words found in this file will be added to the actual dictionnary." ?
And finally I think
This sofware try to solve the language problem in your softwares.
To use it, simply add IncludeFile "BabelResolver.pb" in your sofwares, add a menu command wich will execute "ChooseLanguageWindow()" and replace each instruction like 'MessageResquester("Error","Message",0)' by: 'MessageResquester(BRTranslate("Error"),BRTranslate("Message"),0)'
It will allow a translation by the user himself and then you can hope international diffusion even if you only speack english !
Web Translation|Web Translation
should maybe be
This sofware tries to solve the language problems in your software.
To use it, simply put IncludeFile "BabelResolver.pb" in your code, add a menu command which will execute "ChooseLanguageWindow()" and replace each relevant instruction. For example, 'MessageResquester("Error","Message",0)' would become 'MessageResquester(BRTranslate("Error"),BRTranslate("Message"),0)'
It will allow a translation by the user and then you can distribute your software internationally even if you only speak english!
Web Translation|Web Translation
Hope this was some help (and hope I got it right :oops: )
zapman*
Enthusiast
Enthusiast
Posts: 115
Joined: Wed Jun 02, 2004 10:17 pm
Location: New Caledonia (South Pacific)
Contact:

Post by zapman* »

Thanks a lot, green man, you're a real Giant. I modified the code above.
Don't try - DO it !
Dare2
Moderator
Moderator
Posts: 3321
Joined: Sat Dec 27, 2003 3:55 am
Location: Great Southern Land

Post by Dare2 »

Hi zapman*

This is great. (Your code and mini-apps are always good.) Thanks.
@}--`--,-- A rose by any other name ..
Post Reply