Pour permettre la possibilité de choix à l'usager et rendre les mises à niveaux facile, if faut utiliser un ficher type CSV L'extension n'a pas d'importance car ce fichier sera lu comme un bloc binaire. Mais avoir un fichier CSV permettra l'ouverture dand un tableur pour modifications ultérieures.
Voici un exemple du contenu d'un tel ficher:
ctrlID,Francais;Anglais[vbCRLF]
btnOK,Accepter;OK[vbCRLF]
btnCancel,Canceller;Cancel[vbCRLF]
btnSuivant,Suivant;Next (fin de fichier, pas de vbCRLF)
Pour en extraire la structure (parsing) il faut ouvrir le ficher en binaire.
' ' ============================================ ' Idéalement mettre ce block dans une fonction... ' ============================================ Dim nFh As Integer, lngLen As Long Dim strBuffer As String nFh = FreeFile lngLen = FileLen("lang.dat") Open "lang.dat" For Binary As #nFh strBuffer = String$(lngLen, "0") ' remplir avec des zéros. Get #nFh, , strBuffer ' le paramètre vide veut dire commencer au début. ' lire en un coup: rapide. Close #nFh ' important Dim strLines() As String ' définir comme un array dynamique strLines = Split(strBuffer, vbCrLf) 'Cet array contiendra autant de string distinctes qu'il y avait de lignes dans le CSV. Dim i As Integer, k As Integer Dim nLo As Integer Dim nHi As Integer Dim strOneLile() As String On Error Resume Next ' au cas out strLines ne serait pas initialisé nLo = LBound(strLines) ' toujours vérifier les index possibles. nHi = UBound(strLines) If Err.Number <> 0 Then Exit Sub Dim blnFound As Boolean ' Mettre ceci dans un module au cas ou il y aurait plusieurs formes. Public arrGlobal() As String Public nIndex As Integer ' Index unique pour indiquer laquelle colonne sélectionner Public nNumLanguage As Integer strOneLine = Split(strLines(0), ";") ' il faut détecter combien il y a de langues. ' et pour fixer les limites des index d'array...sinon runtime Error: index out of bound nNumLanguage = UBound(strOneLine) - LBound(strOneLine) + 1 ' Ceci donnera un nouvel array contenant la structure suivante: ' "ctrlID" = strOneLine(0) ' "Francais" = strOneLine(1) ' "Anglais" = strOneLine(2) ' "Autre langue dans le futur ' Détecter et fixer ici l'index de la langue à utiliser For k = LBound(strOneLine) To UBound(strOneLine) Step 1 If strOneLine(k) = "Francais" Then '- selon le choix de l'usager. nIndex = k ' Ex.: Francais serais l'index 1 blnFound = True Exit For ' Inutile de continuer End If Next k ' il serait prudent de mettre ici un langage par défaut si le choix sélectionné dans le INI file n'est pas trouvé. If Not blnFound Then nIndex = 1 ' celui du langage original par défaut. End If ' ============================================ ' Fin de fonction ' ============================================ ' Nous avons maintenant l'index du langage à utiliser. ' Il faut maintenant remplir l'array qui donnera les mots exacts pour tous les contrôles ReDim arrGlobal(nLo To nHi) ReDim arrID(nLo To nHi) For i = nLo To nHi Step 1 strOneLine = Split(strLines(i), ",") arrGlobal(i) = strOneLine(nIndex) arrID(i) = strOneLine(0) ' L'ID du control permet de mettre ceux-ci en vrac et facilite les modifications ultérieures. ' Pour traduire, ouvrir le dossier CSV dans Excel: chaque langue aura sa propre colonne. Next i ' L'index des nIDs des controls et de leur "captions" étant toujours les mêmes, il suffit d'orienter correctement la propriété Sub Form_Load() Dim i As Integer, nLo As Integer, nHi As Integer ' fonction regroupant tout le code ci-dessus. GetAllCorrectLanguages(valeur_sauvée_dans_un_Ini_file) nLo = LBound(arrGlobal) nHi = UBound(arrGlobal) For i = nLo To nHi Step 1 Select Case arrID(i) Case "btnOK" buttonOK.Caption = arrGlobal(i) Case "btnCancel" buttonCancel.Caption = arrGlobal(i) Case "btnSuivant" buttonNext.Caption = arrGlobal(i) Case Else ' ne rien faire End Select Next i End Sub
Voila.
Bonne chance !