Programmes Multi-Langues

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Programmes Multi-Langues

Message par Chris »

Voici le code de mon exemple. Les instructions pour l'utiliser sont au début du code.

Testez le, et dites moi ce que vous en pensez :roll:

Code : Tout sélectionner

;- Utilisation :
;-
;- Le Fichier s'appelle MultiLangue.pb
;-
;- Créer un dossier pour les tests. Y mettre le fichier MultiLangue.pb
;- Dans ce dossier, créer un dossier "Lang". Dans le dossier "Lang",
;- créer trois dossiers au nom de la langue, par ex. "Français", "English",
;- "Deutch" et y mettre les fichiers "Test.catalog"
;-
;- La traduction en Anglais doit être à peu près correcte, par contre, la
;- traduction en Allemand à été faite sur un site Internet. Donc, pas la peine
;- de vous moquer de moi si elle n'est pas bonne, je ne parle pas un mot d'allemand ;o)
;- 
;- Si vous connaissez une autre langue, il suffit d'ajouter un dossier avec un
;- fichier .catalog, et il apparaitra dans le menu.
;-
;- Si il n'y a pas de dossier "Lang", l'exemple démarre sur les datas, et donc,
;- il est uniquement en français

;- Declarations
Declare GetFolders(Chemin.s)
Declare Open_Main_Window()
Declare Update()
Declare ReadCatalog(Filename$)
Declare DefaultLanguage()

;- Constantes fenêtre
Enumeration
  #Main_Window
EndEnumeration

;- Constantes Menu
Enumeration
  #M_Options
EndEnumeration
Enumeration
  ;#M_French
  #M_Quit = 100
EndEnumeration

;- Constantes Gadgets
Enumeration
  #ListIcon
  #Text
  #Radio_0
  #Radio_1
  #Bouton
  #Chk_0
  #F3D_0
EndEnumeration

NewList Menu.s()
Dim Language$(12)

;- Variables globales
Global AppPath.s, hList, hwnd

;- Recherche du dossier de l'application
AppPath = Space(#MAX_PATH)
GetCurrentDirectory_(#MAX_PATH,@AppPath)
If Right(AppPath,1)<>"\" : AppPath + "\" : EndIf
AppPath + "Lang\"

;- Procedures
Procedure GetFolders(Chemin.s)
  If ExamineDirectory(0,Chemin,"*.*") = 0
    ;DefaultLanguage()
    ProcedureReturn #False
  Else
    Repeat
      Type = NextDirectoryEntry()
      If  Type = 2
        Nom.s = DirectoryEntryName()
        If  Nom <> "." And Nom <> ".."
          AddElement(Menu())
          Menu() = Nom
        EndIf
      EndIf
    Until Type = 0
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure Open_Main_Window()
  If OpenWindow(#Main_Window, 384, 214, 310, 365,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , Language$(0))
    hwnd = WindowID()
    If CreateGadgetList(hwnd)
      hList = ListIconGadget(#ListIcon, 5, 5, 300, 200, Language$(4), 145, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      AddGadgetColumn(#ListIcon, 2, Language$(5), 145)
      TextGadget(#Text, 5, 215, 300, 20, Language$(6), #PB_Text_Center | #PB_Text_Border)
      OptionGadget(#Radio_0, 10, 265, 120, 20, Language$(7))
      OptionGadget(#Radio_1, 10, 285, 120, 20, Language$(8))
      ButtonGadget(#Bouton, 5, 315, 300, 25, Language$(9))
      CheckBoxGadget(#Chk_0, 140, 290, 160, 15, Language$(10))
      Frame3DGadget(#F3D_0, 5, 240, 120, 70, Language$(11))
    EndIf
    AddGadgetItem(#ListIcon,-1,"Premiere colonne"+Chr(10)+"Seconde colonne")
  EndIf
EndProcedure

Procedure UpdateGadget()
  Titre.LV_COLUMN
  SetWindowText_(hwnd, Language$(0))
  FreeMenu(#M_Options)
  If CreateMenu(#M_Options, hwnd)
    MenuTitle(Language$(1))
    OpenSubMenu(Language$(2))
    For i = 0 To CountList(Menu())-1
      SelectElement(Menu(),i)
      MenuItem(i + 3,Menu())
    Next
    CloseSubMenu()
    MenuBar()
    MenuItem(#M_Quit, Language$(3))
  EndIf

  Titre\mask    = #LVCF_TEXT
  Titre\pszText = @Language$(4)
  SendMessage_(hList,#LVM_SETCOLUMN,0,@Titre)
  Titre\pszText = @Language$(5)
  SendMessage_(hList,#LVM_SETCOLUMN,1,@Titre)
  SetGadgetText(#Text, Language$(6))
  SetGadgetText(#Radio_0, Language$(7))
  SetGadgetText(#Radio_1, Language$(8))
  SetGadgetText(#Bouton,Language$(9))
  SetGadgetText(#Chk_0, Language$(10))
  SetGadgetText(#F3D_0, Language$(11))
EndProcedure

Procedure ReadCatalog(Fichier.s)
  If ReadFile(0, Fichier)
    If ReadString() = "Catalog"
      For k=0 To 12
        Language$(k) = ReadString()
      Next
    EndIf
    CloseFile(0)
  EndIf
EndProcedure

Procedure DefaultLanguage()
  Restore BaseLanguage
  For k=0 To 12
    Read Language$(k)
  Next
EndProcedure

If GetFolders(AppPath) = #True
  SelectElement(Menu(), 2)
  Path.s = AppPath + Menu()+"\Test.catalog"
  ReadCatalog(Path)
Else
  DefaultLanguage()
EndIf

Open_Main_Window()
UpdateGadget()

;- Boucle principale
Repeat
  Select WaitWindowEvent()

    Case #PB_EventMenu
      If EventMenuID() <> 100
        ResetList(Menu())
        SelectElement(Menu(), EventMenuID() -3)
        Path.s = AppPath + Menu()+"\Test.catalog"
        ReadCatalog(Path)
        UpdateGadget()
      EndIf

      Select EventMenuID()
        Case #M_Quit
          quit = 1
      EndSelect

    Case #PB_EventGadget
      Select EventGadgetID()
        Case #Bouton
          quit = 1
      EndSelect

    Case #PB_EventCloseWindow
      quit = 1
  EndSelect

Until quit = 1
End
;
;- Datas par défaut
DataSection
BaseLanguage:
Data$ "Exemple d'un Logiciel Multi-Langue"
Data$ "Options"
Data$ "Changer la langue"
Data$ "Quitter"
Data$ "Colonne 1"
Data$ "Colonne 2"
Data$ "Texte dans un TextGadget()"
Data$ "Premier choix"
Data$ "Second choix"
Data$ "Cliquez pour Quitter"
Data$ "Selectionner une option"
Data$ "Groupe"
EndDataSection
et voilà les trois fichiers à enregistrer sous le nom de Test.catalog

Fichier Anglais:

Code : Tout sélectionner

Catalog
Example of a Multi-language software
Options
Change language
Quit
Column 1
Column 2
Text in a TextGadget()
First choice
Second choice
Click for quit
Select an option
Group
Fichier Allemand: (Si on peut appeler ça de l'allemand :lol: )

Code : Tout sélectionner

Catalog
Beispiel einer Software Multi- Sprache
Optionen 
Die Sprache ändern 
Verlassen 
Spalte 1 
Spalte 2 
Text in einem TextGadget() 
Erste Wahl 
Zweite Wahl 
Klicken Sie für verlassen 
Wählen Sie eine Auswahl aus
Gruppe 
Fichier Français: (Le seul dont je soit sûr, en fait...)

Code : Tout sélectionner

Catalog
Exemple d'un Logiciel Multi-Langue
Options
Changer la langue
Quitter
Colonne 1
Colonne 2
Texte dans un TextGadget()
Premier choix
Second choix
Cliquez pour Quitter
Selectionner une option
Groupe
Chris :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

pour l'instant , ça ne fonctionne pas , je n'ai pas de texte sur les options , le bouton , et le checkbox , je vais regarder le code de plus près dès que je serai bien réveillé :)


ça peut m'intéresser car je commence à y réfléchir pour sokoban3D .
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

il faudrait un utilitaire comme celui de jabe pour générer les fichiers .
est-ce qu'un utilitaire universel est possible ? ou il faut se le cogner pour chaque appli ?
Je n'ai pas trop réfléchi à ça . Ce qui est sûr c'est qu'il faut fixer la taille des champs pour éviter qu'une traduction soit tronquée dans un gadget , et finalement illisible .
En connaissant d'avance la longueur du champ ça permet au traducteur de faire les abréviations nécessaires pour que le texte reste compréhensible.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Comtois a écrit :pour l'instant , ça ne fonctionne pas...
Normalement, ça fonctionne! Il y a quelque chose que tu n'as pas du faire comme il faut. :?

Quand tu fais le copier/coller des fichier .catalog, il ne doit pas y avoir de ligne vide au dessus de "Catalog"

Le dossier contenant les dossier de langue doit s'appeler "Lang"

Code : Tout sélectionner

[Dossier de l'application]
           |
           |____ "Multi-Langue.pb"
           |
           |____ [Lang]
                    |
                    |__ [Français]
                    |       |
                    |       |__ "Test.catalog" en français
                    |
                    |__ [English]
                    |       |
                    |       |__ "Test.catalog" en anglais
                    |
                    |__ [Deutsch]
                             |
                             |__ "Test.catalog" en allemand
 
Chris :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai la bonne structure , et pas de ligne vide au début du fichier test.catalog

pour tester l'affichage par défaut ,j'ai renommé le répertoire "lang" en "langue" , et il y a un bug dans les datas , il manque une ligne
j'ai ajouté
Data$ "Catalog"

et l'affichage par défaut se fait bien .
si je remets lang , il n'y a plus rien qui s'affiche
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai trouvé l'erreur

j'ai ajouté

Code : Tout sélectionner

If  Trim(ReadString()) = "Catalog" 
dans

Code : Tout sélectionner

Procedure ReadCatalog(Fichier.s) 
ça doit venir de la façon dont j'ai enregistré, je devais avoir des espaces en trop .
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Je trouve, quand même, que ça fait beaucoup de code, pour finalement pas grand-chose.

Il doit certainement y avoir un moyen de simplifier tout ça.

Chris :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je ne sais pas si ça peut se simplifier ,mais ça demande de l'organisation !
va falloir que je reprenne l'ensemble du code pour lister tous les textes , y compris ceux des Requester !

Enfin , ça va rester comme ça pour l'instant , j'ai fait le menu, c'est déjà pas mal , c'était un bout d'essai :)

Je le saurai pour la prochaine fois , si je veux faire du multilingue , il y a intérêt à le prévoir dès le début et faire un tableau de correspondance , avec excel, ça peut se gérer facilement , et une petite macro pour générer les fichiers pour chaque langue.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Regardez moi je fais ça avec les commandes Preferences :

Code : Tout sélectionner

If OpenPreferences("Language.pref") = 0
     
     CreatePreferences("Language.pref")
     WritePreferenceString("Program name", "Petites Notes")
     WritePreferenceString("Menu txt 01", "Couper")
     WritePreferenceString("Menu txt 02", "Copier")
     WritePreferenceString("Menu txt 03", "Coller")
     WritePreferenceString("Menu txt 04", "Annuler")
     WritePreferenceString("Menu txt 05", "Rétablir")     
     WritePreferenceString("Menu txt 06", "Selectioner tout")
     WritePreferenceString("Menu txt 07", "Nouveau")
     WritePreferenceString("Menu txt 08", "Ouvrir")
     WritePreferenceString("Menu txt 09", "Enregistrer")
     WritePreferenceString("Menu txt 10", "Enregistrer sous")
     WritePreferenceString("Menu txt 11", "Choix de la Police")
     WritePreferenceString("Menu txt 12", "Retour à la ligne automatique")
     WritePreferenceString("Menu txt 13", "Position dans l'écran")
     WritePreferenceString("Menu txt 14", "Au centre")
     WritePreferenceString("Menu txt 15", "En bas à droite")
     WritePreferenceString("Menu txt 16", "En haut à droite")
     WritePreferenceString("Menu txt 17", "Accroché au bord de l'écran")
     WritePreferenceString("Menu txt 18", "Libre")
     WritePreferenceString("Menu txt 19", "Toujours visible")
     WritePreferenceString("Menu txt 20", "Quitter")
     WritePreferenceString("Save File txt 01", "Enregistrer sous")
     WritePreferenceString("Save File txt 02", "Fichier texte")
     WritePreferenceString("Save File txt 03", "Tout les fichiers")
     WritePreferenceString("Warning txt 01", "Ce fichier existe déja. Voulez-vous remplacer le fichier ?")
     WritePreferenceString("Warning txt 02", "Le contenu des petites notes n'a pas été sauvegardé.")
     WritePreferenceString("Warning txt 03", "Le contenu des petites notes a été modifié.")
     WritePreferenceString("Warning txt 04", "Voulez-vous sauvegarder maintenant ?")
     WritePreferenceString("Error txt 01", "Erreur ! Impossible d'ouvrir le fichier.")
     ClosePreferences()
     ; Le fichier Language.pref en français est créé. On relance le programme.
     RunProgram("Petites notes.exe")
     ; Puis on ferme le programme qui à généré le fichier Language.pref en français
     ; afin de ne pas avoir 2 programmes qui tournent en même temps.
     End
     
Else
     
     Programmenom$ = ReadPreferenceString("Program name", "Petites Notes")
     Menutxt01$ = ReadPreferenceString("Menu txt 01", "Couper")
     Menutxt02$ = ReadPreferenceString("Menu txt 02", "Copier")
     Menutxt03$ = ReadPreferenceString("Menu txt 03", "Coller")
     Menutxt04$ = ReadPreferenceString("Menu txt 04", "Annuler")
     Menutxt05$ = ReadPreferenceString("Menu txt 05", "Rétablir")
     Menutxt06$ = ReadPreferenceString("Menu txt 06", "Selectioner tout")
     Menutxt07$ = ReadPreferenceString("Menu txt 07", "Nouveau")
     Menutxt08$ = ReadPreferenceString("Menu txt 08", "Ouvrir")
     Menutxt09$ = ReadPreferenceString("Menu txt 09", "Enregistrer")
     Menutxt10$ = ReadPreferenceString("Menu txt 10", "Enregistrer sous")
     Menutxt11$ = ReadPreferenceString("Menu txt 11", "Choix de la Police")
     Menutxt12$ = ReadPreferenceString("Menu txt 12", "Retour à la ligne automatique")
     Menutxt13$ = ReadPreferenceString("Menu txt 13", "Position dans l'écran")
     Menutxt14$ = ReadPreferenceString("Menu txt 14", "Au centre")
     Menutxt15$ = ReadPreferenceString("Menu txt 15", "En bas à droite")
     Menutxt16$ = ReadPreferenceString("Menu txt 16", "En haut à droite")
     Menutxt17$ = ReadPreferenceString("Menu txt 17", "Accroché au bord de l'écran")
     Menutxt18$ = ReadPreferenceString("Menu txt 18", "Libre")
     Menutxt19$ = ReadPreferenceString("Menu txt 19", "Toujours visible")
     Menutxt20$ = ReadPreferenceString("Menu txt 20", "Quitter") 
     Savefiletxt01$ = ReadPreferenceString("Save File txt 01", "Enregistrer sous")
     Savefiletxt02$ = ReadPreferenceString("Save File txt 02", "Fichier texte")
     Savefiletxt03$ = ReadPreferenceString("Save File txt 03", "Tout les fichiers")
     Warningtxt01$ = ReadPreferenceString("Warning txt 01", "Ce fichier existe déja. Voulez-vous remplacer le fichier ?")
     Warningtxt02$ = ReadPreferenceString("Warning txt 02", "Les petites notes n'ont pas été sauvegardé.")
     Warningtxt03$ = ReadPreferenceString("Warning txt 03", "Les petites notes ont été modifié.")
     Warningtxt04$ = ReadPreferenceString("Warning txt 04", "Voulez-vous sauvegarder maintenant ?")
     Errortxt01$ = ReadPreferenceString("Error txt 01", "Erreur ! Impossible d'ouvrir le fichier.")
     ClosePreferences()
     
EndIf 
Les variables de type Chaîne de caractère se doivent d'être global pour charger tout les textes en une seule opération de lecture.

Ça fonctionne mais pour le moment je dois changer le fichier pour les texte du programme manuellement. Je suis à l'étude pour voir si je ne pourrais pas programmer le tout à partir de 2 fichiers de préférences. Dans le premier on indique simplement quel fichier langue utiliser pour les textes du programme.

A+
Guimauve
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Oui, mais est-ce que ça fonctionne comme dans mon exemple??

Quand je choisis la langue, elle est modifiée en temps reel sur l'interface
Et il suffit d'ajouter un dossier portant le nom de la langue, et un simple fichier texte pour qu'un nouveau choix de langue apparaisse dans le menu. (Après redémarrage, pour le moment, mais je vais m'arranger pour que ça change ;))

Chris :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu pourrais aussi faire comme Jabe, un seul répertoire , tu listes les fichiers qu'il contient , ça te donne les langues existantes , et tu utilises la racine du fichier pour faire le choix de la langue dans un comboBoxgadget.
enfin , je suppose que ça fonctionne ainsi , je n'ai pas regardé le code source.

j'ai commencé à faire comme ça , un seul répertoire ,les fichiers francais et anglais dans le répertoire ,et j'utilise un fichier de préférence pour mémoriser la langue choisie , pour qu'à la prochaine ouverture du prog ,ce soit cette langue qui s'affiche.

il devrait suffire de compter les fichiers valides dans ce répertoire lang , pour adapter le menu.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

tu pourrais aussi faire comme Jabe, un seul répertoire , tu listes les fichiers qu'il contient , ça te donne les langues existantes , et tu utilises la racine du fichier pour faire le choix de la langue dans un comboBoxgadget.
Oui, bien sûr, c'est aussi un bon systeme.
Sauf, dans mon cas, pour le combo, parce que ce qui m'interessait, au départ, c'était d'ajouter les choix dans le menu, en direct.

Pour ce qui est du fichier de préférences, c'est ce que j'utilise dans les utilitaires que j'ai déjà fait, (si tu les avait téléchargés, tu l'aurais remarqué :roll:), mais je n'ai pas jugé utile de le mettre dans l'exemple.

Chris :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui en fait , ça revient exactement au même , que tu listes les répertoires ou les fichiers dans un répertoire pour les afficher ensuite dans un menu , c'est du pareil au même , c'est une question de goût :)
c'est ce que j'utilise dans les utilitaires que j'ai déjà fait, (si tu les avait téléchargés, tu l'aurais remarqué
Ah bon ? et on les trouve où ces utilitaires ? :lol:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Visualiseur de fichiers "Include" pour jaPBe
http://purebasic.hmt-forum.com/viewtopic.php?t=151

Chaine de paramètres pour les Gadgets
http://purebasic.hmt-forum.com/viewtopic.php?t=169

Chris :)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Pour que ça marche, le programme se relance de lui-même. Au changement de langue, je sauvegarde toute les données, dans mon cas le texte d'un EditorGadget, dans un fichier temporaire dans le répertoire du programme.

Au démarrage suivant, le programme s'affiche avec la nouvelle langue et s'il y a la présence d'un fichier temporaire le programme ouvre le fichier dans l'éditeur. Dès que c'est fait le fichier temporaire est supprimé.

Parcontre, il est possible de faire comme ça à condition que les constantes se suivent dans l'énumération.

Code : Tout sélectionner

Dim Texte(5000)

If OpenFile(0, "Texte.txt")
     n = 0
     Repeat
          n + 1
          Texte(n) = ReadString()
     Until Eof(0)
     CloseFile(0)
EndIf

For gadget = #Bouton_ouvrir To #Bouton_quitter
     SetGadgetText(gadget, Dim Texte(gadget)) 
Next
Il aussi possible modifier la boucle for comme ceci pour inclure toutes les langues dans 1 seul fichier txt externe au programme.

Code : Tout sélectionner


; langue = 0 (Français); langue = 1 (Anglais); langue = 2 (Allemand)
If langue = 0
     no_texte = 0 ; Les textes de 0 à 19 sont en Français
ElseIf langue = 1
     no_texte = 20 ; Les textes de 20 à 39 sont en Anglais 
Else
     no_texte = 40 ; Les textes de 40 à 59 sont en Allemand
EndIf

For gadget = #Bouton_ouvrir To #Bouton_quitter
     SetGadgetText(gadget, Dim Texte(no_texte))
     ; On incrémente no_texte pour le prochain gadget
     no_texte = no_texte +1
Next
A+
Guimauve
Dernière modification par Guimauve le lun. 22/mars/2004 2:49, modifié 1 fois.
Répondre