langues et traduction
Publié : mer. 01/déc./2021 12:18
salut
Sur la plupart de mes logiciels, j'utilise ce système pour changer facilement de langue.
ça fonctionne pas mal (mais je pense modifier la map pour utiliser 2 list()).
mise à jour 4.12.2021 (optimisation et amélioration)
Le code :
Explication : le code doit faire les choses suivantes
- ajouter dans un fichier les mots-clef dans l'ordre dans lequel ils sont ajoutés dans notre programme. Cela permet de conserver les groupes de mots-clef (menu principal, toolbar, panel1, panel2, sous-menu1, etc...) et donc d'avoir un fichier de langue facile à modifier
- si on ajoute un menuitem ou un gadget plus tard, le mot est ajouté dans le fichier dans le groupe dans lequel on l'a mis dans notre code, et PAS à la fin du fichier texte
- possibilité d'ajouter des commentaires pour bien différencier chaque "groupe" de mot-clef (menu principale, toolbar, gadgets, menu fenêtre 2).
- on lit le fichier et on sauvegarde les lignes, pour pouvoir les enregistrer quand on ferme le programme, si on le souhaite.
et voilà
Sur la plupart de mes logiciels, j'utilise ce système pour changer facilement de langue.
ça fonctionne pas mal (mais je pense modifier la map pour utiliser 2 list()).
mise à jour 4.12.2021 (optimisation et amélioration)
Le code :
Code : Tout sélectionner
; by blendman 2021
; Create the list() for the langage file // on créé la list() pour le fichier de lang
Structure sLang
Key$
Value$
type.a ; le type de ligne à ajouter dans le fichier préférence : 0 = clef, 1 = commentaire
EndStructure
Global NewList LangOk.sLang()
; je crée une map pour stocker le fichier pref d'origine
Global NewMap CopyLangOk$()
; ça c'est pour savoir quelle langue on a choisi (vous pouvez bien sûr utiliser une structure ou autre pour stocker vos options, c'est mieux)
Global OptionsLang$="fr", LangExt$=".ini"
Procedure LoadLang()
; je charge la langue, pour conserver tous les mots-clefs et commentaire de mon programme.
If OpenFile(0,OptionsLang$+LangExt$)
s_$ = " = " ; attention, j'utilise les + avec espace lorsque je crée le fichier pref, donc je dois aussi les utiliser icic
While Eof(0)=0
line$ = ReadString(0)
If line$ <> ""
If FindString(line$,s_$)=0
; comment
AddMapElement(CopyLangOk$(), line$)
CopyLangOk$() = line$
Else
; clef et valeur
key$ = StringField(line$,1,s_$)
value$ = StringField(line$,2,s_$)
AddMapElement(CopyLangOk$(), key$)
CopyLangOk$() = value$
EndIf
EndIf
Wend
CloseFile(0)
EndIf
EndProcedure
Procedure SaveLang()
; pour enregistrer le mot ou la phrase dans le dossier de langue
file$ = OptionsLang$+LangExt$
If CreatePreferences(file$)
ForEach LangOk()
If LangOk()\type = 0
WritePreferenceString(LangOk()\Key$, LangOk()\Value$)
Else
PreferenceComment(LangOk()\Value$)
EndIf
Next
ClosePreferences()
EndIf
; puis, j'enregistre le reste de la map CopyLangOk$()
If OpenFile(0,file$,#PB_File_Append)
ForEach CopyLangOk$()
key$ = MapKey(CopyLangOk$())
value$ = CopyLangOk$()
If key$ <> ""
If key$ <> value$
; c'est une clef
txt$ = key$+ " = "+value$
Else
; commentaire
txt$ = value$
EndIf
WriteStringN(0, txt$)
EndIf
Next
CloseFile(0)
EndIf
EndProcedure
Procedure AddLangComment(comment$)
If comment$<>""
AddElement(LangOk())
LangOk()\type = 1
LangOk()\Value$ = comment$
LangOk()\Key$ = comment$
; je vérifie dans la map si on a le commentaire, et je le supprime si je le trouve (pour ne pas le réécrire 2 fois si je fais savelang())
If FindMapElement(CopyLangOk$(), "; "+comment$)
; Debug "on a trouvé le comment on va le supprimer : "+comment$
DeleteMapElement(CopyLangOk$(), "; "+comment$)
EndIf
EndIf
EndProcedure
Procedure.s Lang(keyword$, comment$="")
Protected word$
; TO define the word by default, if the ini file does'nt have it
; pour définir le mot par défaut, si le fichier ini de langue ne le contient pas.
AddLangComment(comment$)
; d'abord, on va vérifier s'il n'y a pas des charactère interdits :
While Mid(keyword$, Len(keyword$)) = Chr(32) Or Mid(keyword$, Len(keyword$)) = "="
keyword$ = Left(keyword$, Len(keyword$)-1)
Wend
; on vérifie si on le mot dans notre fichier
file$ = OptionsLang$+LangExt$
; puis, on vérifie si on a déjà le mot dans notre fichier
If OpenPreferences(file$)
word$ = ReadPreferenceString(keyword$,"")
ClosePreferences()
; To change char # by chr(13)
If word$ <> #Empty$
; then read the word$ with the keyword$ ok
word$ = ReplaceString(word$,"#",Chr(13))
EndIf
EndIf
; puis, on ajoute le mot à notre liste
ForEach LangOk()
If LangOk()\Key$ = keyword$
LangOk()\Value$ = word$
find = 1
Break
EndIf
Next
; on ne l'a pas trouvé, on l'ajoute
If find=0
AddElement(LangOk())
LangOk()\key$ = keyword$
LangOk()\Value$ = word$
EndIf
; je vérifie dans la map si on a le commentaire, et je le supprime si je le trouve (pour ne pas le réécrire 2 fois si je fais savelang())
If FindMapElement(CopyLangOk$(), keyword$)
DeleteMapElement(CopyLangOk$(), keyword$)
EndIf
If word$ <> ""
ProcedureReturn word$
EndIf
ProcedureReturn keyword$
EndProcedure
;{ programme exemple :
LoadLang()
AddLangComment("Language File for the application")
If OpenWindow(0,0,0, 600, 400, lang("Application"),#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
AddLangComment("Main menu")
CreateMenu(0,WindowID(0))
MenuTitle(lang("File"))
MenuItem(0,lang("New"))
MenuItem(1,lang("Open"))
MenuItem(2,lang("Save"))
MenuTitle(lang("Edit"))
MenuItem(6,lang("Copy"))
MenuItem(7,lang("Paste"))
MenuTitle(lang("View"))
MenuItem(3,lang("Menu view1"))
MenuItem(4,lang("Menu view2"))
MenuTitle(lang("Help"))
MenuItem(5,lang("About"))
AddLangComment("Main Gadgets")
ButtonGadget(0,10,10,100,20,lang("Add object "))
ButtonGadget(1,10,30,100,20,lang("Del object"))
Repeat
event = WaitWindowEvent(1)
Select event
Case #PB_Event_CloseWindow
quit =1
Case #PB_Event_Gadget
Case #PB_Event_Menu
Select EventMenu()
Case 5
AddLangComment("Menu help - about")
MessageRequester(lang("info"),lang("This is an example of message about"))
EndSelect
EndSelect
Until quit =1
SaveLang()
EndIf
;}
- ajouter dans un fichier les mots-clef dans l'ordre dans lequel ils sont ajoutés dans notre programme. Cela permet de conserver les groupes de mots-clef (menu principal, toolbar, panel1, panel2, sous-menu1, etc...) et donc d'avoir un fichier de langue facile à modifier
- si on ajoute un menuitem ou un gadget plus tard, le mot est ajouté dans le fichier dans le groupe dans lequel on l'a mis dans notre code, et PAS à la fin du fichier texte
- possibilité d'ajouter des commentaires pour bien différencier chaque "groupe" de mot-clef (menu principale, toolbar, gadgets, menu fenêtre 2).
- on lit le fichier et on sauvegarde les lignes, pour pouvoir les enregistrer quand on ferme le programme, si on le souhaite.
et voilà
