begin process at 2012 02 10 01:53:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Modules

 > CRÉER UNE APPLICATION MULTILANGUE (.INI) V 1.1.5

CRÉER UNE APPLICATION MULTILANGUE (.INI) V 1.1.5


 Information sur la source

Note :
9,75 / 10 - par 4 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Modules Niveau :Initié Date de création :02/04/2002 Date de mise à jour :14/05/2002 10:11:37 Vu / téléchargé :7 827 / 894

Auteur : Icem@n

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Permets de faire une application multi-langue fort simplement ... ;-)
Grâce à des fichiers de type .ini
Votre application est donc très ouverte pour les changements de langues, n'importe qui peut traduire l'application dans son language      

Source

  • ' Dans les versions à venir :
  • ' Support de parametre multiple genre %param% dans une phrase
  • ' pour pouvoir faire des phrases personnalisable
  • '
  • '
  • Option Explicit
  • ' Extension que vous donnerez à vos fichiers de langue (de type INI)
  • Const EXTENSION = ".ini" ' peut etre par exemple : ".lng" ou ".lang", ...
  • ' sous répertoire qui contient les fichiers de langues
  • ' eg : "lang\ ou "", ...
  • Const PATHOFLANG = "lang\"
  • ' nom du fichier actuellement utilisé
  • ' si vide alors pas de langue choisie !!!
  • Dim mstrFileLang As String
  • ' **************************************
  • ' * Permets de crée le fichier default *
  • ' * sur base d'une Form *
  • ' **************************************
  • Public Sub SaveFormLanguage(frmForSave As Form)
  • On Error Resume Next
  • Dim cntEach As Control
  • Dim strValue As String
  • Dim strIndexMult As String
  • Dim strFileName As String
  • strFileName = PathAddBackslash(App.Path) & PATHOFLANG & "default" & EXTENSION
  • ' sauve la caption de la feuille
  • strValue = frmForSave.Caption
  • INIProfileWrite "Caption", StringEscape(strValue), frmForSave.Name, strFileName
  • ' sauve la caption et le nom de chaque feuille
  • For Each cntEach In frmForSave
  • strIndexMult = ""
  • ' pour les Instances multiple d'un controle ...
  • strIndexMult = IIf(cntEach.Index <> 0, "_" & cntEach.Index, "")
  • strValue = ""
  • strValue = cntEach.Caption
  • If strValue <> "" Then INIProfileWrite cntEach.Name & "_Caption" & strIndexMult, StringEscape(strValue), frmForSave.Name, strFileName
  • strValue = ""
  • strValue = cntEach.Text
  • If strValue <> "" Then INIProfileWrite cntEach.Name & "_Text" & strIndexMult, StringEscape(strValue), frmForSave.Name, strFileName
  • Next
  • End Sub
  • Public Sub SaveMsgLanguage(strMsgId As String, strMsg As String)
  • On Error Resume Next
  • Dim strFileName As String
  • strFileName = PathAddBackslash(App.Path) & PATHOFLANG & "default" & EXTENSION
  • INIProfileWrite strMsgId, StringEscape(strMsg), "other", strFileName
  • End Sub
  • ' **********************
  • ' * Choix de la langue *
  • ' **********************
  • Public Function SetLanguage(strLang As String) As Boolean
  • SetLanguage = False
  • ' vérifie l'existence du fichier
  • If Dir(PathAddBackslash(App.Path) & PATHOFLANG & strLang & EXTENSION) <> "" Then
  • mstrFileLang = PathAddBackslash(App.Path) & PATHOFLANG & strLang & EXTENSION
  • SetLanguage = True
  • ElseIf strLang = "" Then
  • mstrFileLang = ""
  • End If
  • End Function
  • Public Sub LoadFormLanguage(frmForSave As Form)
  • If mstrFileLang = "" Then Exit Sub
  • On Error Resume Next
  • Dim cntEach As Control
  • Dim strValue As String
  • Dim strIndexMult As String
  • ' récupere le nom de la fenetre Principale
  • strValue = ""
  • strValue = INIProfileRead("Caption", "", frmForSave.Name, mstrFileLang)
  • If strValue <> "" Then
  • frmForSave.Caption = StringUnEscape(strValue)
  • End If
  • ' pour chaque controle de la feuille
  • For Each cntEach In frmForSave
  • strIndexMult = ""
  • ' pour les Instances multiple d'un controle ...
  • strIndexMult = IIf(cntEach.Index <> 0, "_" & cntEach.Index, "")
  • strValue = ""
  • strValue = cntEach.Caption
  • If strValue <> "" Then
  • strValue = INIProfileRead(cntEach.Name & "_Caption" & strIndexMult, "", frmForSave.Name, mstrFileLang)
  • If strValue <> "" Then
  • cntEach.Caption = StringUnEscape(strValue)
  • End If
  • End If
  • strValue = ""
  • strValue = cntEach.Text
  • If strValue <> "" Then
  • strValue = INIProfileRead(cntEach.Name & "_Text" & strIndexMult, "", frmForSave.Name, mstrFileLang)
  • If strValue <> "" Then
  • cntEach.Text = StringUnEscape(strValue)
  • End If
  • End If
  • Next
  • End Sub
  • ' reprend un Msg qui est sauvegarder dans la Section [other]
  • Public Function LoadMsgLanguage(strMsgId As String, Optional strDefault As String = "") As String
  • On Error Resume Next
  • ' récupere le nom de la fenetre Principale
  • LoadMsgLanguage = StringUnEscape(INIProfileRead(strMsgId, "", "other", mstrFileLang))
  • If LoadMsgLanguage = "" Then
  • SaveMsgLanguage strMsgId, strDefault
  • LoadMsgLanguage = strDefault
  • End If
  • End Function
  • ' ***************************************
  • ' * Renvoie un tableau de string *
  • ' * qui contient les langues disponible *
  • ' ***************************************
  • Public Function GetChangeLang() As String()
  • Dim strLang() As String
  • Dim strTemp As String
  • Dim i As Integer
  • i = 0
  • strTemp = Dir(PathAddBackslash(App.Path) & PATHOFLANG & "*" & EXTENSION)
  • Do While strTemp <> ""
  • ReDim Preserve strLang(i)
  • strLang(i) = Left(strTemp, Len(strTemp) - 4)
  • strTemp = Dir
  • i = i + 1
  • Loop
  • GetChangeLang = strLang
  • End Function
  • Public Function StringEscape(strMsg As String) As String
  • StringEscape = strMsg
  • StringEscape = Replace(StringEscape, "\", "\\")
  • StringEscape = Replace(StringEscape, vbCr, "\r")
  • StringEscape = Replace(StringEscape, vbLf, "\f")
  • End Function
  • Public Function StringUnEscape(strMsg As String) As String
  • StringUnEscape = strMsg
  • StringUnEscape = Replace(StringUnEscape, "\r", vbCr)
  • StringUnEscape = Replace(StringUnEscape, "\f", vbLf)
  • StringUnEscape = Replace(StringUnEscape, "\\", "\")
  • End Function
  • Public Function PathAddBackslash(strPath As String) As String
  • PathAddBackslash = strPath & IIf(Right(strPath, 1) = "\", "", "\")
  • End Function
' Dans les versions à venir :
'  Support de parametre multiple genre %param% dans une phrase
'   pour pouvoir faire des phrases personnalisable
'
'


Option Explicit
' Extension que vous donnerez à vos fichiers de langue (de type INI)
Const EXTENSION = ".ini" ' peut etre par exemple : ".lng" ou ".lang", ...

' sous répertoire qui contient les fichiers de langues
'  eg : "lang\ ou "", ...
Const PATHOFLANG = "lang\"

' nom du fichier actuellement utilisé
' si vide alors pas de langue choisie !!!
Dim mstrFileLang As String


' **************************************
' * Permets de crée le fichier default *
' *  sur base d'une Form               *
' **************************************
Public Sub SaveFormLanguage(frmForSave As Form)
    On Error Resume Next
    Dim cntEach As Control
    Dim strValue As String
    Dim strIndexMult As String
    Dim strFileName As String

    strFileName = PathAddBackslash(App.Path) & PATHOFLANG & "default" & EXTENSION

    ' sauve la caption de la feuille
    strValue = frmForSave.Caption
    INIProfileWrite "Caption", StringEscape(strValue), frmForSave.Name, strFileName

    ' sauve la caption et le nom de chaque feuille
    For Each cntEach In frmForSave
        strIndexMult = ""
        ' pour les Instances multiple d'un controle ...
        strIndexMult = IIf(cntEach.Index <> 0, "_" & cntEach.Index, "")
        
        strValue = ""
        strValue = cntEach.Caption
        If strValue <> "" Then INIProfileWrite cntEach.Name & "_Caption" & strIndexMult, StringEscape(strValue), frmForSave.Name, strFileName

        strValue = ""
        strValue = cntEach.Text
        If strValue <> "" Then INIProfileWrite cntEach.Name & "_Text" & strIndexMult, StringEscape(strValue), frmForSave.Name, strFileName
    Next
End Sub

Public Sub SaveMsgLanguage(strMsgId As String, strMsg As String)
    On Error Resume Next
    Dim strFileName As String
    
    strFileName = PathAddBackslash(App.Path) & PATHOFLANG & "default" & EXTENSION

    INIProfileWrite strMsgId, StringEscape(strMsg), "other", strFileName
End Sub


' **********************
' * Choix de la langue *
' **********************
Public Function SetLanguage(strLang As String) As Boolean
    SetLanguage = False

    ' vérifie l'existence du fichier
    If Dir(PathAddBackslash(App.Path) & PATHOFLANG & strLang & EXTENSION) <> "" Then
        mstrFileLang = PathAddBackslash(App.Path) & PATHOFLANG & strLang & EXTENSION
        SetLanguage = True
    ElseIf strLang = "" Then
        mstrFileLang = ""
    End If
End Function

Public Sub LoadFormLanguage(frmForSave As Form)
    If mstrFileLang = "" Then Exit Sub
    On Error Resume Next
    Dim cntEach As Control
    Dim strValue As String
    Dim strIndexMult As String

    ' récupere le nom de la fenetre Principale
    strValue = ""
    strValue = INIProfileRead("Caption", "", frmForSave.Name, mstrFileLang)
    If strValue <> "" Then
        frmForSave.Caption = StringUnEscape(strValue)
    End If

    ' pour chaque controle de la feuille
    For Each cntEach In frmForSave
        strIndexMult = ""
        ' pour les Instances multiple d'un controle ...
        strIndexMult = IIf(cntEach.Index <> 0, "_" & cntEach.Index, "")

        strValue = ""
        strValue = cntEach.Caption
        If strValue <> "" Then
            strValue = INIProfileRead(cntEach.Name & "_Caption" & strIndexMult, "", frmForSave.Name, mstrFileLang)
            If strValue <> "" Then
                cntEach.Caption = StringUnEscape(strValue)
            End If
        End If
        
        strValue = ""
        strValue = cntEach.Text
        If strValue <> "" Then
            strValue = INIProfileRead(cntEach.Name & "_Text" & strIndexMult, "", frmForSave.Name, mstrFileLang)
            If strValue <> "" Then
                cntEach.Text = StringUnEscape(strValue)
            End If
        End If
    Next
End Sub

' reprend un Msg qui est sauvegarder dans la Section [other]
Public Function LoadMsgLanguage(strMsgId As String, Optional strDefault As String = "") As String
    On Error Resume Next

    ' récupere le nom de la fenetre Principale
    LoadMsgLanguage = StringUnEscape(INIProfileRead(strMsgId, "", "other", mstrFileLang))
    If LoadMsgLanguage = "" Then
        SaveMsgLanguage strMsgId, strDefault
        LoadMsgLanguage = strDefault
    End If
End Function


' ***************************************
' * Renvoie un tableau de string        *
' * qui contient les langues disponible *
' ***************************************
Public Function GetChangeLang() As String()
    Dim strLang() As String
    Dim strTemp As String
    Dim i As Integer

    i = 0
    strTemp = Dir(PathAddBackslash(App.Path) & PATHOFLANG & "*" & EXTENSION)
    
    Do While strTemp <> ""
        ReDim Preserve strLang(i)
        strLang(i) = Left(strTemp, Len(strTemp) - 4)
        strTemp = Dir
        i = i + 1
    Loop
    
    GetChangeLang = strLang
End Function

Public Function StringEscape(strMsg As String) As String
    StringEscape = strMsg
    StringEscape = Replace(StringEscape, "\", "\\")
    StringEscape = Replace(StringEscape, vbCr, "\r")
    StringEscape = Replace(StringEscape, vbLf, "\f")
End Function

Public Function StringUnEscape(strMsg As String) As String
    StringUnEscape = strMsg
    StringUnEscape = Replace(StringUnEscape, "\r", vbCr)
    StringUnEscape = Replace(StringUnEscape, "\f", vbLf)
    StringUnEscape = Replace(StringUnEscape, "\\", "\")
End Function

Public Function PathAddBackslash(strPath As String) As String
    PathAddBackslash = strPath & IIf(Right(strPath, 1) = "\", "", "\")
End Function

 Conclusion

Une Version un peu plus intelligente est en projet.
mais hélas le temps me manque ;-)

Historique Version :
Version 1.1.1 :
  Ajout de la reconnaisait des contrôles multi-instance ;-) (ayant un index)
Version 1.1.5 :
  Ajout support des textes multi-ligne grâce au caractère d'escape.
  Ajout de CONSTANTE Pour personnalisé plus facilement le module.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source .NET (Dotnet) GETSPECIALFOLDER : RETOUVER LES RÉPERTOIRES SPÉCIAUX DE WIND...
Source .NET (Dotnet) SAVE & RECUPERATION DES SETTINGS DANS UN FICHIER XML
Source avec Zip Source avec une capture REND TRANSPARENT N'IMPORTE QU'ELLE FENÊTRE DANS WINDOWS 2000...
Source avec Zip Source avec une capture GESTION PILE FILE (LIFO FIFO) PAR RECORDSET OU COLLECTION
Source avec Zip Source avec une capture GÉNÉRATEUR DE PASSWORD

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) CRYPTAGE ET DECRYPTAGE par jerichez
Source avec Zip Source avec une capture Source .NET (Dotnet) EXEMPLE MODBUS POUR MODULES ADAM, BECKHOFF, WAGO par mnmsjaune
Source avec Zip Source .NET (Dotnet) CRÉER SON PROPRE DESIGNER COMME CELUI DE VISUAL STUDIO par ShareVB
Source avec Zip Source .NET (Dotnet) CONVERSION UTM VERS LAT/LONG par BarresLTD
Source avec Zip CPROPGROUP : COLLECTION FAITE MAISON par Flocreate

Commentaires et avis

Commentaire de fbrt le 15/04/2002 13:45:56

Je ne l'ai pas encore testé mais c'est exactement ce dont j'avais besoin. Bravo.

Commentaire de fbrt le 16/04/2002 10:02:09

Je l'ai essayé : tout simplement génial. Pour rajouter une langue, il y a juste un fichier a rajouter.

Commentaire de daddam le 17/06/2002 17:39:31

Bonjour,
peux-tu m'envoyer un projet Vb comme exemple
Merci

Commentaire de Icem@n le 18/06/2002 08:40:14

Regarde dans le zip de la source, il y a un petit exemple qui montre l'utilisation ... ;-) (que tu peux d'ailleurs voir à l'oeuvre dans la "Capture")
Bonne Prog ;-)

Commentaire de LuTo le 20/02/2004 05:54:53

Excellent. Et super efficace.

Commentaire de liquide le 31/08/2004 22:16:13

franchement, c'est bien.
je viens de me mettre a regarder les api utilisées car je n'avais pas eu trop le temps avant.

bien sur il ya d'autres sources, mais bon j'ai téléchargé la tienne, va savoir pourquoi.

j'ai une seule chose qui m'a dérangée dans le code, c'est tout a fait bénin mais bon.
J'explique:
- dans la function INIProfileRead tu mets:
n = GetPrivateProfileString(lpKeyName, strNomCle, strDonneeDefault, lpReturnedString, nSize, lpFileName)

- n renvois le nombre de caracteres du buffer
- ensuite dans la meme procédure il y a la condition de "calcul" de la chaine réelle, puisque ca longueur est a 128 avec :
If n <> 0 Then
        lpReturnedString = Left$(lpReturnedString, InStr(lpReturnedString, Chr$(0)) - 1)
    Else

----- Hors si n <> 0 , c'est qu'il renvoit la longueur réelle de la chaine. c'est pour cela que j'ai l'impression que le retour "lpReturnedString " possede une formule bien compliquée.
j'aurais plutot mis : lpReturnedString =Mid$(lpReturnedString, 1, n)

En espérant que je ne me trompe pas, car je n'ai pas fais le tour complet des ces API

Commentaire de Icem@n le 01/09/2004 08:08:21

En effet, judicieuse remarque ;)
A l'époque cette partie du programme a été récupérée sur le net et vu qu'elle marchait je ne me suis pas posé de question..
Mais si le temps me le permet, je vérifierais et ferrais les modifications adéquates.

BaT,
Icem@n

Commentaire de C17 le 01/05/2005 14:33:26

C'est génial, mais si je me trompe, on est limité en espace avec un fichier INI?

ça risque pas de poser problèmes avec des grosses applications?

Commentaire de greffierjc le 06/06/2006 11:55:30

Bonjour,

Tout le monde vous félicite, mois aussi, c'est un papy qui vous le dit. Mais j'aimerais que vous me disiez si votre programmation peut s'appliquer à un programme access en séquence VBA, et si vous l'aviez déjà fait.
Dans le cas contraire comment adapter votre programmation aux formulaires d'access.

Merci, pour votre réponse.

Greffier.

Commentaire de Icem@n le 06/06/2006 12:05:40

Bonjour,
déjà merci pour vos nombreux commentaires ;)

C17 >
Je ne sais ce qu'il est des limites des Fichiers INI je ne les ai pas encore atteinte ;), mais une solution serais alors de splitter en plusieurs fichiers ini, par exemple par Formulaire ... ;)

greffierjc >
Je n'ai jamais reporté ça en VBA, et je doute que ce soit utilisable sans de nombreuse modification ...

BàV,
Icem@n

Commentaire de greffierjc le 06/06/2006 12:46:19

Bonjour,

Merci, quand même de votre réponse.

Amicalement.

Greffier.

Commentaire de mickei le 05/04/2007 15:45:19

Vraiment super comme code, j'ai mis 9 car perso j'ai un petit soucis quand danss mon code je modifie les captions de mes contrôles.
Je me sers de LoadMsgLanguage avec : XXX.caption = LoadMsgLanguage("dsd")
sauf que lors de la création du fichier il se passe une couille, dsd est égale à vide ds le fichier même si j'ai fait la sauvegarde avec une valeur par défaut.
En gros ton code ne différencie pas une attribution du caption par défaut et quand on fait la modification de façon dynamique dans le programme.
Pour contourner le problème j'ai utilisé une variable.

Commentaire de mickei le 05/04/2007 15:55:22

En fait ca ne ferait cela (suppression des champs ds le fichier default) que quand je n'ai aucune langue de choisie.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,810 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales