TRADUCTEUR DE CONTROL, INPUTBOX ET MSGBOX

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 28 sept. 2006 à 20:01
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 7 oct. 2006 à 13:40
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39717-traducteur-de-control-inputbox-et-msgbox

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 oct. 2006 à 13:40
Un oubli, la traduction ne marche pas sur un userform crée avec Excel et exporté en .frm. La procédure ExtraireCtrl envoie une erreur ("Argument ou appel de procédure incorrecte") à la ligne CtrlName = Trim(Mid(OneControl, PosX1 + 1, PosX2 - PosX1 - 1)). En fait posX1=264 et posX2=56

A+
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 oct. 2006 à 13:27
Je ne sais par où j'avais la tête la première fois mais il suffit de définir CheminIni sur le bon dossier (n'importe lequel) et ça marche.

Ton programme est interessant, j'ai noté 9/10.

J'ai également une structure propriétaire de traduction pour toutes mes applications. C'est une architecture qui permet de rendre mes applications multilangues, le tien a l'avantage qu'il permet de traduire n'importe quel projet vb, même sans architecture de traduction prévue à l'avance.

Néanmoins il a quelques restrictions inutiles qui peuvent être éviter et permettre plus de souplesse.
1- Au lieu de demander le repertoire des fichiers sources (*.frm), ce serait plus interessant de demander le chemin du projet (*.vbp) ==> Reconnaissance automatique des fichiers *.frm quelque soit leur emplacement.
2- Du fait que ton programme n'intègre pas un dictionnaire et qu'il peut servir à traduire dans d'autres langues que le français et l'anglais (ce n'est que du texte), à mon avis le but de ton logiciel serait de générer un fichier qui à chaque texte de propriété de contrôle attribut un code ==> création d'une table (Ascii avec délimiteur par exemple) qui contient les champs suivant <Nom Form>, <Nom Controle>, <Nom Propriété>, <Texte>, <Code Texte>. Une telle structure serait lourde avec les fichiers ini.
Ainsi il pourra exister pour chaque developpeur un fichier dictionnaire de traduction pour toutes ses applis. ce fichier est également une table (Acii avec délimiteur par exemple) qui a les champs <Code texte>, <Texte Original>, <Texte Francais>, <Texte Anglais>, <Texte espagnol>, ....
Le but de <Texte Original> est de permettre de rendre le fichier dictionnaire non figé à une langue, de faire la reconnaissance en ajout des textes déjà existant,de partager le dictionnaire avec d'autres developpeurs, de se faire aider par des traducteurs professionnels en exportant la table vers excel par exemple.

Pour ce qui est de MsgBox et InputBox il suffira de remplacer le texte par FuncMSG(<Code Texte>)


Comment se fera la traduction?
Au chargement du form comme tu le fais déjà, ta procédure LoadAllName aura un paramètre supplémentaire, la langue, et pour chaque control du form il suffit de reconnaitre le code du texte et le libellé de la propriété sera traduite dans la langue souhaitée.

En gros ton programme generera seulement 2 fichiers qui constitueront de façon exhaustive les bases de données de traduction.

J'espère que tu reconnaitras de la pertinence dans ce commentaire afin d'améliorer ton soft.
FrankyPotvin Messages postés 1 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 6 octobre 2006
6 oct. 2006 à 20:51
Bon?.
Je m?excuse de donner un code source gratuitement sans les détails de mise en marche?

La mise en marche est simple. Ajoute un répertoire dans C:\Program Files\GAT\
Dans se répertoire ajoute 3 répertoires : C:\Program Files\GAT\Francais, C:\Program Files\GAT\Anglais et C:\Program Files\GAT\Ressource. Ajoute le programme GAT dans C:\Program Files\GAT\. Place tous les formulaire que tu aimerais pouvoir traduire dans le répertoire C:\Program Files\GAT\Francais. Exécute GAT et tu devrais voir les formulaires en question dans la listFile « Répertoire des fichiers Sources ». Coche la case Tous sous cette liste et clique sur le bouton GO. Le programme vas copier tous les Captions et les ToolTipText des contrôles dans un fichier CtrlCTfr.lng, tous les Msgbox dans un fichier MsgBoxfr.lng et tous les InputBox dans le fichier InpBoxfr.lng provenant de tes formulaires et placera ces fichiers dans le répertoire C:\Program Files\GAT\Ressource. Il copiera aussi tous tes formulaires dans le répertoire C:\Program Files\GAT\Anglais en les modifiant. Ce sera ta nouvelle version de Programme universelle. Ensuite tu ajoutes dans cette version une Classe qui contient ceci
Public StrLangageFileMsg As String
Public StrLangageFileInp As String
Public StrLangageFileCtr As String

Public Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long


Public Sub LoadAllName(aForm As Form, ByVal Filename As String)
On Error Resume Next
gstrFileLNG = Filename
If aForm.Caption <> "" Then
aForm.Caption = ReadIniFile(Filename, aForm.Name, aForm.Caption, aForm.Caption)
End If
For Each Obj In aForm
Err.Clear
ObjIndex = Obj.Index
'if the objet is indexed
If Err.Number = 0 Then
' change caption of object
Obj.Caption = ReadIniFile(Filename, aForm.Name, Obj.Name & "(" & Obj.Index & ").Caption", Obj.Caption)
' change tooltiptext of object
Obj.ToolTipText = ReadIniFile(Filename, aForm.Name, Obj.Name & "(" & Obj.Index & ").ToolTipText", Obj.ToolTipText)
Else
' change caption of object
Obj.Caption = ReadIniFile(Filename, aForm.Name, Obj.Name & ".Caption", Obj.Caption)
' change tooltiptext of object
Obj.ToolTipText = ReadIniFile(Filename, aForm.Name, Obj.Name & ".ToolTipText", Obj.ToolTipText)
End If
Next
End Sub

Function ReadIniFile(ByVal strIniFile As String, ByVal strSection As String, _
ByVal StrKey As String, Optional ByVal strDefault As String) As String
Dim szBuffer As String
Dim iLen As Double
szBuffer = String(500, Chr(0))
iLen = GetPrivateProfileString(strSection, StrKey, strDefault, szBuffer, Len(szBuffer), strIniFile)
ReadIniFile = Left$(szBuffer, iLen)
End Function

Public Function FuncMSG(NomFormMsg As Form, StrKeyMsg As String) As String
If Len(StrKeyMsg) > 40 Then StrKeyMsg = Left(StrKeyMsg, 40)
FuncMSG = ReadIniFile(StrLangageFileMsg, NomFormMsg.Name, StrKeyMsg, StrKeyMsg)
End Function

Public Function FuncINP(NomFormInp As Form, StrKeyInp As String) As String
If Len(StrKeyInp) > 40 Then StrKeyInp = Left(StrKeyInp, 40)
FuncINP = ReadIniFile(StrLangageFileInp, NomFormInp.Name, StrKeyInp, StrKeyInp)
End Function


Fin de la classe
Traduit tes trois fichiers en Anglais Espagnol Italien comme tu veux
Établi dans le formulaire principal Form_Load la langue que tu veux utiliser pour ton programme exemple
If langue = francais Then
StrLangageFileMsg = CheminIni & " MsgBoxfr.lng"
StrLangageFileInp = CheminIni & " InpBoxfr.lng"
StrLangageFileCtr = CheminIni & " CtrlCTfr.lng"
Else ?= anglais
StrLangageFileMsg = CheminIni & " MsgBoxan.lng"
StrLangageFileInp = CheminIni & " InpBoxan.lng"
StrLangageFileCtr = CheminIni & " CtrlCTan.lng"
End If

Ajoute cette ligne dans le Form_Load de chacun de tes formulaires
LoadAllName Me, StrLangageFileCtr
Et Bingo
Tu as une seule version pour un multi langue
Est-ce encore difficile ?
Et si la ça ne marche pas Appelle moi 418-487-6335
FrankyPotvin
Note ; ? je ne le fais pas pour la pub mais bien pour aider. merci
Bonsoir
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
28 sept. 2006 à 20:01
ça ne sert à rien une source sur CodesSources qu'on ne peut tester si c juste par sa pub.
Rejoignez-nous