begin process at 2010 03 22 13:01:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > CREER UNE APPLICATION MULTILINGUE VRAIMENT TRES FACILEMENT (+ EDITEUR DE LANGUE)

CREER UNE APPLICATION MULTILINGUE VRAIMENT TRES FACILEMENT (+ EDITEUR DE LANGUE)


 Information sur la source

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :traduction, langue, multilingue, multilangue, translation Niveau :Initié Date de création :16/01/2007 Date de mise à jour :06/04/2007 18:00:22 Vu / téléchargé :8 655 / 1 469

Auteur : violent_ken

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (38)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Salut, alors voilà un UserControl (+ un éditeur de langue dans le zip) qui permet de gérer plusieurs langues dans un projet. Son utilisation est vraiment ULTRA simple.


POUR COMPRENDRE LE FONCTIONNEMENT, MERCI DE TOUT LIRE. DE PLUS, UN EXEMPLE TRES DETAILLE EST DONNE DANS LE FICHIER *.ZIP.

Tout d'abord, pourquoi ce code ?
==> parce que j'ai déjà un projet assez lourd, c'est à dire beaucoup de form, de controles, de menus (là c'est affreux !), de listbox pleines de string rentrée directelebt dans l'IDE...etc
Donc créer un fichier *.ini (moi même) qui contient les Captions, Text, Item, Tooltip... de tous mes controles/form/menus aurait été du suicide ! D'où l'idée de créer un code qui permettrait d'automatiser cela. Peut être que çà existe déjà, aucune idée, mais de toutes façons je voulais tout coder moi même ;)
Le principe du code est bien sur basé sur les fichiers *.ini.


Le but ?
==> Ce code permet de changer automatiquement toutes les propriétés Caption, Text, ToolTipText des composants standarts (label, commandbutton, textbox, optionbutton, checkbox, form, menus, frame, mais aussi combobox et listbox ==> sauvegarde des items si l'on le souhaite, voir exemple dans zip pour comprendre). De plus, les composants indexés sont supportés.
Donc en gros, un appel au usercontrol se charge d'accéder au fichier *.ini et de changer toutes les propriétés.
Evidemment, il est également aussi possible de stocker des string dans le fichier *.ini, et de les rappeler par la suite (traduites), par exemple pour afficher un msgbox.


Ensuite, comment s'en servir ?
==> c'est un usercontrol à placer dans votre form.
Ses propriétés sont :
-LangFolder (c'est le dossier qui contiendra les fichiers de langue)
-Language , c'est une string qui conient le nom de la langue (si Usercontrol.Language="French", il faut qu'il existe un fichier French.ini dans le dossier LangFolder)
Ses méthodes sont :
-AddSimpleStringToFile : permet d'ajouter une string (désignée par un ID string) au fichier *.ini
-GetString : permet de récupérer une string à partir de son ID (string)
-LoadControlsCaption : permet d'appliquer à la form qui contient le UserControl la traduction ; affecte à chacun des composants supportés les traductions des propriétés supportées
-WriteIniFileFormIDEform : voilà ce qui fait gagner du temps, cette fonction créé le fichier *.ini de la langue dans laquelle la form est conçue.
Donc si vous avez une form déjà pleine de controles/menus..., alors vous avez juste à appeler cette fonction pour créer automatiquement le fichier *.ini avec toutes les sections nécessaires.



Rien compris ? ==> ok, c'est pour çà qu'il y a un exemple ultra-commenté dans le fichier *.zip ;)






EDITEUR DE LANGUE

Ce projet inclut également un éditeur de langue pour permettre de créer tranquillement des fichiers de langue sans mettre la main dans les fichiers *.ini ;)

Cet éditeur est en 2 langues (anglais + français) pour être distribué tel quel et être compris par le plus grand nombre.

Cet éditeur inclut une fonctionnalité qui permet de créer un fichier de langue A PARTIR DE LA TRADUCTION GOOGLE, en 3 coups de souris (mais ne marche pas avec l'espagnol à cause du '&').
Si google est capricieux avec la traduction (si le résultat de la traduction est identique au texte à traduire), relancez là plusieurs fois en rechoisissant le type de traduction (par ex. de Eng --> Ita) il çà finira par marcher.

Fonctionnement :
1) Choisir un modèle, c'est à dire un fichier de langue déjà existant
2) Créer votre fichier de langue en traduisant dans la colonne de gauche les textes de droite (ou alors ouvrez un fichier de langue existant à modifier)
3) Sauvegarder votre nouveau fichier de langue
4) Vous pouvez 'Copier le modèle dans le presse papier', coller dans google traduction, copier le résultat traduit, et 'Insérer depuis le presse papier' pour récupérer une version traduite par google.

Il est (très fortement) conseillé de faire une traduction depuis le modèle anglais (meilleurs résultats sous google).





-------------------------------
CONT ROLES SUPPORTES
-------------------------------
Label (caption), TextBox (text), OptionButton (caption), CheckBox (caption), CommandButton (Capion), Frame (caption), ListBox (les items contenus dans la listbox), Combobox (idem que listbox), Menu (caption), Form (caption), TabStrip (Caption des Tabs), ListView (ColumnHeader).
Et aussi, la propriété ToolTipText de chaque controle.
Egalement, sont supportés tous les composants indexés.


-------------------------------
FONCTIO NNEMENT DU CODE
-------------------------------
APIs de lecture/écriture dans les fichiers *.ini, et TypeOf [controle] pour tester chaque type de controle.
On error resume next barbare, je sais, mais c'est beaucoup plus simple comme çà (sinon énooooormément d'erreurs à gérer).


-------------------------------
COMMENTA IRES
-------------------------------
Je suis assez content du résultat (je ne me prononce pas sur le code, mais sur le résultat final) ==> je trouve que c'est très très simple de faire une traduction de son programme avec mon usercontrol ! ;)




Bugs, commentaires, n'héistez pas ! Et notez aussi (çà prend 2s ^^).

Source

  • 'ajout d'une string en brut dans le fichier *.ini
  • Lang.AddSimpleStringToFile "MonMotCle", "Salut tout le monde !"
  • 'switch basique de langue
  • If Lang.Language = "French" Then
  • Lang.Language = "English"
  • Else
  • Lang.Language = "French"
  • End If
  • 'récupéraion d'une valeur traduite
  • 'MonMotCle désigne un identifiant unique qui détermine ma string.
  • MsgBox Lang.GetString("MonMotCle")
  • 'création automatique de la version francaise (ou du moins de la version de l'IDE)
  • Lang.WriteIniFileFormIDEform
'ajout d'une string en brut dans le fichier *.ini
Lang.AddSimpleStringToFile "MonMotCle", "Salut tout le monde !"


'switch basique de langue
If Lang.Language = "French" Then
    Lang.Language = "English"
Else
    Lang.Language = "French"
End If


'récupéraion d'une valeur traduite
'MonMotCle désigne un identifiant unique qui détermine ma string.
MsgBox Lang.GetString("MonMotCle")


'création automatique de la version francaise (ou du moins de la version de l'IDE)
Lang.WriteIniFileFormIDEform

 Conclusion

Commentaires et note svp !


J'ai implanté cet UserControl dans mon projet, et le résultat est bon : j'ai 41 forms, des fichiers *.ini de 60Ko chacun, et le temps mis pour ouvrir une langue (à chaque Form_Load) est négligeable (passe inaperçu) ==> c'est cool !

 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


 Historique

06 avril 2007 14:32:02 :
Support de nouveaux controles + ajout d'un éditeur de langue optimisé pour la traduction google
06 avril 2007 16:58:20 :
Fixed little bug
06 avril 2007 18:00:22 :
-

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLE SHUTDOWN SCHEDULER : ARRÊTS PLANIFIÉS (LOCAL OU REMOT...
Source avec Zip Source .NET (Dotnet) COMMENT DÉMARRER UN PROCESSUS SUR PC DISTANT DE MANIÈRE CACH...
Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER (REMOTE) PROCESS MONITOR
Source avec Zip Source avec une capture Source .NET (Dotnet) COMMENT DÉTECTER LES PROCESSUS CACHÉS (VIRUS, ROOTKITS...) +...
Source avec Zip Source avec une capture Source .NET (Dotnet) COMMENT CONTRÔLER TOTALEMENT LES PROCESSUS D'UN PC DISTANT (...

 Sources de la même categorie

Source avec Zip Source avec une capture TRAITEMENT DES NOMS DE FICHIERS. par artgile
Source avec Zip Source .NET (Dotnet) GESTION DE PARC AUTOMOBILE AVEC SÉRIALISATION par guyr07
Source avec Zip Source avec une capture Source .NET (Dotnet) FICHIERS_CACHÉS_LECTURE_SEULE par Le Pivert
Source avec Zip Source avec une capture CHANGEUR D'ICONES par djgab21
Source .NET (Dotnet) DIRECTDISKACCESS par XelectroX

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSE DE TRADUCTION SIMPLIFIÉE/ TRADUCTION AUTOMATIQUE D'UN... par mafieulemouton
Source avec Zip Source avec une capture CREER UNE APPLICATION MULTILINGUE TRES FACILEMENT + EDITEUR ... par violent_ken
Source avec Zip Source avec une capture LANGUAGE EDITOR : EDITEUR DE FICHIERS LANGUES (*.LNG) POUR A... par VBGenesis
Source avec Zip TRADUCTEUR DE CONTROL, INPUTBOX ET MSGBOX par FrankyPotvin
Source avec Zip OUTILS DE TRADUCTION DES SOURCES À POSTÉRIORI. par VinceVG

Commentaires et avis

Commentaire de ghuysmans99 le 16/01/2007 22:22:37

alors là, 10/10 !
à côté de ca, ma source ne vaut RIEN ...

bravo !

Commentaire de DARKSIDIOUS le 16/01/2007 22:29:23 administrateur CS

J'ai pas regardé dans le détail, mais ca me semble pas trop mal, cependant quelques remarques :
1/ je pense qu'il aurait mieux vallu gérer plusieurs langues dans un fichier : ton exemple est bien pour passer d'une langue native dans le prog à une autre, mais il n'y a pas de lien entre la langue native et celle du fichier.
Je m'explique : il aurait été mieux de faire un fichier contenant le texte en français, et la traduction en anglais/espagnol/italien/allemand, etc. Ainsi, il est plus facile de faire le fichier de traduction (c'est plus parlant et plus rapide : plutôt que Command1|Index|Text de faire : "Command1|Index|French="Texte"|English="Text"|Deutsch="Text")
Car là, ca nécessite de faire 1 fichier par langue. C'est bien pour rajouter facilement des langues, mais c'est plus long à faire je trouve !
2/ Il me semble que les fichiers de ressources permettent de faire cà directement : dans un fichier de ressource (il me semble, j'ai jamais essayé) que tu peux rajouter plusieurs langues, avec des textes pour toutes les langues avec le même ID partagé, et au lancement du prog, tu choisit telle ou telle langue à utiliser.
3/ Si ta méthode fonctionne sur de petits programmes, elle risque d'être relativement longue à effectuer pour des programmes avec des centaines de feuilles ! Peut-être qu'à la place d'un simple fichier ini, il vaudrait mieux une base de données à ce moment là (accès plus rapide aux données avec des requêtes et des index nottament).

DarK Sidious

Commentaire de DARKSIDIOUS le 16/01/2007 22:32:00 administrateur CS

A oui aussi, tant que j'y pense : une petite idée qui en vaut une autre certainement : pour les contrôles non implémentées, ca pourrait être sympa d'avoir une fonction pour spécifier :
Nom du contrôle/Propriété à changer.

Exemple : addControl("reyTextBox", "Text")

Et tu stocke cà dans un autre fichier ini (vu que tu as l'air d'aimer les fichiers ini) afin de faire une sorte de base de données de propriétés de contrôles modifiables... là ca permettrait d'avoir un contrôle extensible très simplement !

DarK Sidious

Commentaire de violent_ken le 16/01/2007 23:14:16

ghuysmans99 ==> merci pour le commentaire !

DARKSIDIOUS ==>
1) oui, c'est une solution. Mais disons que je n'avais prévu pour mon programme de faire qu'une traduction en anglais (et peut être en allemand... qui sait...).
Donc implanter nativement plusieurs langues me semblait lourd, mais bon pourquoi pas.
2) ah, je veux bien le croire, je n'utilise jamais de fichiers de ressource donc je suis pas vraiment au courant ;)
3) oui, avec des centaines de feuilles, c'est sur ! Quoique 100,200 ou 300 feuilles c'est identique en l'état (avec un fichier par feuille). Mais si on met tout dans un seul *.ini, là oui, faut changer de méthode. Mais comme je ne maitrise pas les bases de données... ;)
4) Ah oui, c'est une bonne idée, çà. Alors certes ce ne sera pas très optimisé (si il faut charger les nouvelles propriétés à chaque fois), mais c'est sur que ce serait vraiment très pratique.
Je vais essayer d'y réfléchir demain si j'ai le temps.

@+, et merci encore pour les commentaires

Commentaire de violent_ken le 16/01/2007 23:19:07

3) j'ai dit n'importe quoi, je créé une SECTION et pas un fichier par form... donc oui, problème si on a beaucoup de form. Je vais y réfléchir.

@+

Commentaire de Renfield le 17/01/2007 07:00:23 administrateur CS

bonne idée....

If IsMissing(Language) Then sLang = Me.Language Else sLang = Me.Language
????


Commentaire de Mayzz le 17/01/2007 07:30:33

Salut violent_ken!

Tu as fais du beau boulot, c'est très utile ça, ça évite pas mal de galère.

Par contre dommage que ce ne soit sous la forme d'un éditeur de propriétés (un peu comme pour les éditeurs de skin), la tu es obligé de changer les propriétés de tes contrôles en mode conception, c'est un peu galère si ta form comporte beaucoup de contrôles.

Sinon pour ce qui est des fichiers de ressources, je les utilises et il est vrais que l'on peut y insérer plusieurs langages par ID mais on la sélection du langage se fait automatiquement selon les paramètres linguistiques de windows. Puis cela oblige à taper beaucoup de code (une ligne par propriété de contrôle), on peur tout aussi bien se servir d’un groupe d'ID différent pour chaque langue mais le résultat reste le même; trop de code à taper !

Pour finir je voulais juste dire qu'il est dommage que sur ce site, quasi aucun tutos sur les bases de données ne parlent des Data Environments et Data Reports car cela facilite bien l'apprentissage et l’usage des bases de données sous vb.

Bonne Prog @++

Commentaire de moustachu le 17/01/2007 08:58:45

Bonjour,

C'est très courageux de s'attaquer à ce genre de problème :o)
Je suis plutôt partisan d'un fichier par langue, c'est peut être plus long mais c'est plus souple (à mon goût).

Une base de données ça ne me semble pas être du luxe, non plus...

++
Moustachu

Commentaire de guilleto le 17/01/2007 10:13:44

Bonjour Violent_Ken,

J'ai moi aussi réalisé un programme (au boulot) traitant le multilangue !
J'ai travaillé avec des fichiers .txt à accès direct, des fichiers .xls et des fichiers .ini !

Ton programme fonctionne car les langues utilisées ne sont pas cyrillique (je pense au Russe et autres).

Pour résoudre ce problème j'ai opté pour une BdD sous Access.

Pour une utilisation avec des langues (non cyrilliques) ton programme est très bien. Mais dans le cas contraire tu auras des soucis d'affichage !

Olivier

Je mets 8/10 (-2 pour l'éventuel soucis dû au cyrillique)
Bonne continuation et encore bravo !

Commentaire de Renfield le 17/01/2007 10:20:47 administrateur CS

les controles VB le gèrent mal de toutes facon :p

Commentaire de guilleto le 17/01/2007 12:17:47

Renfield,

Pour les applications que je développe il suffit de changer la Police du contrôle (MS Sans Serif) !

Il est toutefois exact (dire le contraire serait mentir) que ces applications ne fonctionnent pas très bien sur un PC français, anglais ou autres (affichage de '?' en lieu et place des caractères voulus), donc cela ne fonctionne uniquement si le PC gère les caractères cyrilliques !

Dans mon cas les programmes et donc l'affichage fonctionnent correctement en Russie, Tchéquie etc.

En espèrant que ces remarques pourront aider !

Olivier

Commentaire de violent_ken le 17/01/2007 17:12:42

Salut à tous,

Renfield ==> oui, c'est une erreur de ma part. Il faut en fait lire :
    'récupère le nom de la langue
    If IsMissing(Language) Then sLang = Me.Language Else sLang = Language
J'avoue que l'utilité du paramètre n'est pas forcément évidente non plus (récuperer une string d'une autre langue que celle du programme, pas très utile). Je changerais lors de la MAJ à venir ce petit bug.


Mayzz ==> c'est à dire un "éditeur de propriétés" ? Je ne cerne pas trop ce que tu veux dire par "changer les propriétés de tes contrôles en mode conception" ? Si tu veux parler d'un programme pour éditer de manière plus intuitive son fichier de langue, c'est pas un problème, j'essayerais de le faire.
Pour les fichiers de ressource, je ne connais pas vraiment, mais ce n'est peut être pas la meilleure idée si effectivement il y a beaucoup de lignes à tapper (c'est pour çà que j'ai codé çà, je me retrouve avec une form bourrée de controles et de menus (fichier ini généré qui fait quand même 15Ko) et je n'avais encore rien prévu pour la traduction, donc çà permet de minimiser le travail que je vais devoir faire.)
Pour les bases de donnée, c'est pas le sujet qui me passione le plus, mais j'avoue que c'est aussi parce que je n'y connais rien... mais c'est sûr qu'un bon tuto change tout ;)


moustachu ==> Un fichier par langue me semble aussi intéressant (plus simple d'implémenter une nouvelle langue ainsi). Et pour la base de donnée, oui, c'est presque obligatoire je pense pour les gros projets. A moins de faire un fichier ini par form... mais là c'est beaucoup moins intéressant niveau simplicité. A moins, encore une fois, de fournir un executable qui rend l'édition des fichiers très intuitive, et à ce moment inutile de trop regarder le dossier "Lang" (et les dizaines de fichier ini qui sont dedans).


guilleto ==> Effectivement, je n'ai pas du tout pensé à ce problème là... donc cela confirme l'emploi d'une base de donnée...



Donc : va falloir que je me renseigne sur les bases de données.... Erf, ce sera pas pour tout de suite je pense (bcp de boulot dans le mois à venir) mais je vais y réfléchir. De toutes manière, cette source sera ammenée à évoluer quand je rencontrerais des problèmes quant à son implémentation dans mon projet.


Merci beaucoup pour tous les commentaires ^^
@+

Commentaire de DARKSIDIOUS le 17/01/2007 17:50:20 administrateur CS

les bases de données, ce n'est pas ce qui est de plus compliqué, crois moi ! Et ca apporterai certainement un peu plus de rapidité à ta source.

Commentaire de violent_ken le 17/01/2007 17:53:13

Oui, je veux bien te croire. Donc faut que je trouve du temps (et un tuto) pour commencer à toucher aux bases de données ;)

@+

Commentaire de asimengo le 17/01/2007 18:35:19

super,

J'ajoute à contribution une idée sur le multilingue que j'ai déjà implementée dans une appli.

Le principe est le même, parcourir les objets et rechercher les propriétés de type texte. Par contre (chez moi c'est une gestion BD) au lieu d'avoir control.propriete=valeur francais ==> valeur anglais.

J'ai plutot controle.propriete= [id texte]
avec [id texte] la cle d'une table qui a en plus les champs [version francaise], [version anglaise], [Version allemande], ...

Ceci dit au moment de l'implentation de la bd des traductions tu devra specifier la langue de reference qui permet d'identifier si le texte existe deja et par consequent le grand avantage d'avoir une table commune des textes traduits partageable avec d'autres applis ou d'autres personnes, il suffit d'exporter vers excel pour se faire aider pour la traduction.

Je suis presse je dois partir s'il ya des commentaires on en reparle demain.

A+

Commentaire de pit1 le 17/01/2007 21:18:35

"changer les propriétés de tes contrôles en mode conception" -> utilise un addin-VB, c'est assez simple, voir sous

http://www.vbfrance.com/codes/GESTION-AUTOMATIQUE-FICHIER-INI-ADDIN-VB_40151.aspx

Dans l'IDE, tu pourrais demander la traduction pour un contrôle particulier ou sous forme de tableau pour tous les contrôles du form. Cela te permetterais aussi de changer les textes en mode run-time, avec l'avantage de voir si les contrôles sont suffisament dimensionnés pour afficher tout le texte (Certaines langues ont besoin de plus de place que d'autres).

Sans avoir regardé le code, cela me semble bien fait! Bravo pour l'idée!

Commentaire de poldere le 17/01/2007 21:39:22

Bonjour,
Je démarre en français , je change en anglais, je ferme le prog, je ré ouvre et il est en français ! ! ?.
Un fichier init devrait aider à initialiser le programme comme on l'a laissé . . . . . ou je fais une fausse manip ?
Quand on écrit un text dans les textbox il n'est pas prid en compte :
test avec " bonjour " , créer le fichier , en anglais j'ai autre chose. quand on écrit quelque chose dans un textbox c'est pour le garder malgré la traduction.Pareil dans les listbox à mon humble avis . . . A méditer . .
Merci

Commentaire de violent_ken le 17/01/2007 23:02:04

salut,

pit1 ==> merci pour le lien, et effectivement je vois l'intérêt de pouvoir sauver ses strings traduites dans l'IDE

poldere ==>
"Je démarre en français , je change en anglais, je ferme le prog, je ré ouvre et il est en français" ==> évidemment, ce code n'a pas pour but de sauvegarder la dernière langue utilisée. A toi de mettre une valeur dans le registre (string qui contient la langue) et de charger la langue correspondante au démarrage.
"Un fichier init devrait aider à initialiser le programme comme on l'a laissé . . . . . ou je fais une fausse manip ?" ==> ah non, pas nécessairement. En tout cas, pas les fichiers ini de langues. C'est à toi de créer un fichier ini qui contiendra les préférences (dont la langue)
"Quand on écrit un text dans les textbox il n'est pas prid en compte :
test avec " bonjour " , créer le fichier , en anglais j'ai autre chose. quand on écrit quelque chose dans un textbox c'est pour le garder malgré la traduction" ==> A toi de gérer le tag "lang_ok" (c'est à dire à l'ajouter comme condition sur tes textboxes (voir code, se calquer sur ce qui est fait avec les listboxes)). Idem pour les listboxes, (mais là c'est déjà codé) : il FAUT mettre le tag "lang_ok" pour permettre la sauvegarde de la traduction. Sinon, pas de sauvegarde est c'est alors une listbox dont les valeurs seront rentrées par l'user.

Bref, tu n'as pas vraiment compris la subtilité du tag (as tu lu la description en entier ?).

@+ et merci pour les commentaires

Commentaire de poldere le 17/01/2007 23:16:35

L'erreur est juste, je n'ai pas dû comprendre le programme en tant que programmeur mais en tant qu'utilisateur.Ma recherche se portant sur une option de configuration de langue pour un UTILISATEUR FINAL; distribuer gratuitement un programme .exe et que l'utilisateur choisisse sa langue à l'installation.Désolé alors je vais mettre 9/10

Commentaire de violent_ken le 17/01/2007 23:51:42

Y a pas de soucis ;)

Il suffit donc pour le programmeur de gérer le tag des composants en fonction de leur utilisation (par exemple modifiable ou non pour une listbox), d'ajouter la gestion du tag dans le code si désiré (par exemple pour les textboxes) et de sauvegarder la langue (un SaveSettings suffit) pour la charger au démarrage si désiré.

@+ et merci.

Commentaire de Malkuth le 22/01/2007 13:11:31

Dsl je prend le métro en route,

A mon avis parler de base de donnée est un abération, plusieurs problème dont le plus important est le déploiement.

lors du déploement, on oblige l'utilisateur a avoir Access, SQL serveur express ou même Excell(Je sais c'est pas de la BDD) tout ca pour avoir son programme en francais???

Je crois que quelque classe toute simple devrait pas poser de problème et être suffisament rapide. si les fichiers de langue ne sont pas trop gros, on peu les laisser en mémoire

ensuite on utilse une béte HaschTable (prototype de la classe :

Class MesRessources
      Private Ressources As new HaschTable ()

      Public Sub LoadRessource(Fichier_Ressource as string)
           'Chargement du fichier dans la hashtable
      End Sub

      Public Function GetString(StringName As string)
           return Ressources(StringName)
      End Function
End Class

Les base de donnée c'est super mais il faut pas les sortirs a tout bout de champ car elle sont rapide mais au pris de ressources utilisé, et y'a-t-il vraiment besoin d'un moteur de base de donnée pour les quelques opérations requise?.

Ca me rapelle un petit probléme dans un programme je devais trier des lignes de basse de donnée(2000000) avec des critères trés complex et de maniére la plus rapide possible. la base de donnée ne pouvait pas marché car certain des critères n'était pas exprimable en TSQL(RegEx Complexes...). j'ai commencé mon algo et je suis arrivé trés vite a un algo de trie qui métait ~54s puis le restant de la journée je me suis battut pour obtimiser l'algo et le soir le trie se faisait en 4 dixième de secondes!!!

Donc les Base de donnée ne sont pas la réponse à tous les mots. il faut aussi se retroussé les manches.

Commentaire de DARKSIDIOUS le 22/01/2007 13:49:56 administrateur CS

malkuth : tu as déjà déployé une application utilisant une base access ?
Il n'est nullement besoin qu'un client possède access pour utiliser un logiciel avec une base access (et encore heureux !).

Et c'est là où c'est abhérant : sur un petit programme avec une dizaine de texte à traduire, c'est sûr que tu ne va pas y voir grande optimisation à utiliser une bdd, par contre sur une logiciel qui utilise des centaines et des centaines de ressources textes qu'il faut traduire, va stocker cà dans un fichier avec des temps de chargement raisonnable, je te souhaite bon courage ! Ton idée de hashtable c'est bien, mais ca t'oblige à faire un algorithme rapide de lecture des données (et leur parsing donc), et de stocker efficacement les données afin de pas occuper trop de mémoire.

La bdd permet justement de ne pas se prendre la tête niveau performance : elles sont déjà optimisées pour un accès rapide aux données, avec des structures de données assez efficace pour ne charger que ce dont on lui demande.

Si tu arrive à trier 2 millions de lignes avec des critères très complexes en 4 dixièmes de secondes qui comprend : la lecture des données, le parsing de celles-ci, plus l'application de l'algo, là tu m'intéresse ! On peut fonder une boîte encemble car oracle peut fermer boutique !

Commentaire de Malkuth le 22/01/2007 14:43:03

Non c''était uniquement sur le selection et le trie en lui même, pas sur le chargement et le parse. et bien évidement se n'était que pour tester un algo qui devait gérer au plus 50000 lignes au final le test tourné sur une bonne machine( mais pas un serveur) et pour 2000000 de ligne j'avais environs 1.5Go de mémoire utilisé (Chaque ligne utilisait une 40aine de champs text.

C'est sur le faite que les BDD sont optimiser que tu te trompe. les BDD ne sont optimiser que dans la mesure ou leur administrateur les optimises. et pour des volumes de donnée moyen sans system relationnelc'est comme d'utiliser une masse d'arme à la place d'un marteau tout con pour planté un clou. je le répette, a mon avis la base de donnée n'est pas utile.

Pour info, fais quelque tests sur les objets de System Collection, tu trouvera Hashtable et HybridDictionary qui sont des objets perfomants, et ne néscéssite pas la création d'un code de hashage.

comme je l'ai indiquer, cette méthode convient pour des fichier qui peuvent êtres stocké en mémoire(donc pas trop gros,~100ko par langue sans soucie ce qui fais déjà un paquet de texte).

compare les temps pour recupérer la ligne depuis access et depuis la hashtable (déjà charger, on considére qu'elle est charger au démarrage du prog ou lors du changement de langue) a mon avis tu vas vite te rendre compte que c'est bcp plus rapide.

Commentaire de DARKSIDIOUS le 22/01/2007 14:51:54 administrateur CS

désolé d'être têtu moi aussi, mais pour lire 100 Ko de texte, je préfère amplement utiliser une bdd qu'un fichier texte !

Surtout que tu n'as pas besoin de lire les 100 Ko, vu que ce sera (en théorie, à moins de faire un fichier par feuille, mais là cà devient vite ingérable) une lecture de quelques Ko par feuille.

=> avec une bdd, pas besoin de lire tout le fichier texte afin de construire une hashtable, on a uniquement besoin de lire les enregistrements pour la feuille courante => une simple requete SQL pour récupèrer les enregistrements de la feuille à charger, une lecture de chaque enregistrement et hop, c'est chargé.

Petite remarque : là on parle vb6 et non vb.net : en vb6, il n'existe pas (à ma connaissance) de hashtable implémentée de base, donc à moins d'en trouver des implémentations libres de droits (cà doit exister quand même) et très efficace (ca c'est déjà plus dur), il faut se faire l'algorithme de la hashtable (et là, c'est pas donné à tout le monde, perso, je ne sais pas faire).

Commentaire de Mayzz le 22/01/2007 15:55:21

violent_ken

Je me suis mal exprimé, ce que j'entend par éditeur de propriétés ce serait une fenêtre ou une interface avec une liste des contrôles présents sur la feuille (listés par un combo par ex) et des zones de saisie pour paramètrer les propriétes (caption, text, tooltip, etc...) selont le language choisi. En gros ajouter une interface graphique à ta source.

Bonne prog @ts

Commentaire de Malkuth le 22/01/2007 18:07:49

Entre tétu nous nous comprenons ;) alors on continue...

1 point pour toi C'est vrai que VB6 gére pas les haschTable et c'est vrai aussi que se retaper tout a la main c'est long et pas forcement facile.

mais si chiant que ca puisse paraitre une fois réaliser, les perf seront bien meileurs.

Pour un system demandant vraiment bcp de texte localisé pour ma part je passerai pas par un fichier ini, mais par un fichier binaire :construit comme ca :

int nombre_de_clef
{
  string Clef
  int OffsetFichier
}* nombre de clef
{
  string Valeur
}* nombre de clef

avec ca on ouvre le fichier, on charge les clefs
et quand on veut une valeur, on se place sur le bon octet du fichier (OffsetFichier) et on lit la chaine.
Comme ca la totalité du fichier est pas en mémoire.

et on ferme le fichier a la fin du programme.
Le problème c'est que le fichier n'est pas human readeable mais il suffit de faire un petit prog qui converti INI-->Bin et Bin-->INI

Enfin on pourat amméliorer en faisant une indexation type B-TREE sur les clef.

Tous ca c'est un peu long a codée mais toujours plus rapide que la BDD. il ne faut pas oublier qu'entre le programme et une BDD il y'a plusieurs couchee logiciel et chacune ralentie le process de récupération.

C'est vrai, l'utilisation de base de donnée permet de s'affranchir de tous ces problèmes.
Mais je crois que créer un system comme celui énoncer(ou meilleur) apporte une meilleur réponse.
SAUF si le programme utilise déjà une base de donnée biensur.

A Toi...

Commentaire de DARKSIDIOUS le 22/01/2007 18:37:46 administrateur CS

mouais, une hashtable niveau perf, y'a sûrement pas mieux, mais je reste sceptique tout de même, car pour la construire faut quand même lire le fichier un jour ou un autre.

Quand à ta solution du fichier binaire, oui excellente idée, MAIS cela veut aussi dire que tout les textes soient de la même longueur... car sinon ton astuce de positionner l'offset du fichier au bon endroit pour lire uniquement la string voulue ne tient plus la route (du coup, perte énorme de place), ou alors faire une table des chaînes, cà aussi, ok, mais ca oblige quand même de coder dans l'ocx la liaison component<->key, et le stocker quelque part, donc on tourne en rond !

Pour le fichier ini, là encore ce sera bien trop lont pour un fichier assez volumineux : les recherches dans un fichier ini sont très loin de valoir les recherches dans une bdd !

Non franchement, une bdd permet un accès rapide aux données (il suffit d'indexer les quelques champs de recherches), une extension à l'infini du nombre de chaîne stockable sans trop ralentir l'exécution (chargement des données à la demande avec une requête SQL), et pas de prise de tête avec un algorithme compliqué à implémenter.

Après, on peut bénéficier de tout les apports de la BDD : index, clés primaires, procédures stockées, possibilité de stocker des images (bien que pas très recommandé) pour une interface qui contient des images textuelles, etc.

Quant au déploiement de l'application, si c'est une base access, l'installation du MDAC suffit pour accèder à la base.

Commentaire de Malkuth le 22/01/2007 19:46:26

/*MAIS cela veut aussi dire que tout les textes soient de la même longueur... */

non :

/*le fichier binaire*/

int(2) 'Nombre de clef (4 Octets)

int(7) 'Nombre de caractére de la clef 1 (4 Octets)
string("MaClef1") 'Clef 1 (7 Octets)
int(34) 'Offset fichier de la clef 1 (4 Octets)

int(7) 'Nombre de caractére de la clef 2 (4 Octets)
string("MaClef2") 'Clef 2 (7 Octets)
int(46) 'Offset fichier de la clef 2 (4 Octets)

int(8) 'Nombre de caractére de la Valeur 1 (4 Octets)
string("MaValeur") 'Valeur de la clef 1 (9 Octets)

int(9) 'Nombre de caractére de la Valeur 2 (4 Octets)
string("MaValeur2") 'Valeur de la clef 2 (9 Octets)

/*Fin du fichier*/

Au démarage :

Ouverture du fichier
DerniereClef=LireInt
Pour CompteurClef = 0 à DerniereClef-1
    Lire Paire Clef + Offset et la charger dans un tableau
Fin Pour

Pour obtenir une valeur:

Rechercher la clef dans le tableau,et récupérer l'offset associé
Placer le pointeur de fichier sur l'offset trouver
Lire la chaine et la retourner.

Il n'ya pas d'octets mort dans le fichier.

/*Pour le fichier ini, là encore ce sera bien trop lont pour un fichier assez volumineux : les recherches dans un fichier ini sont très loin de valoir les recherches dans une bdd !*/
On a pas du se comprendre car effectivement c'est la moin bonne solution niveau perf.
Je parlait juste d'un petit programme qui générerai le Bin a partir du INI (a lancer une seule fois par le dévelloppeur, bien évidement seul le Bin est déployer, le ini est juste là pour faciliter le travaille en ammont. Pas facile d'écrire direct un fichier binaire!!!)

Je vais essayer de trouver un peu de temps pour faire une source pour illustrer ce que je t'ai dis et on pourat Comparer les perfs si tu fais une ch'tite version BDD.

Commentaire de DARKSIDIOUS le 22/01/2007 21:30:55 administrateur CS

Ok, mais comment tu relis la clé9 au textbox "toto" ?

Commentaire de Malkuth le 22/01/2007 22:53:48

comme avec la classe de l'article c'est juste le support  d'enregistrement qui change.

Commentaire de marshall007 le 27/03/2007 13:15:40

trés b1 communté .........té un génie d'avoir pencer a sa bravo  

Commentaire de violent_ken le 27/03/2007 14:35:48

Merci ;)

@+

Commentaire de violent_ken le 05/04/2007 23:26:57

Salut !

Je viens juste dire que j'ai implanté cet UserControl dans mon projet qui possède tout de même 41 forms.

Résultat : le fichier de langue fait 51Ko, et le temps mis pour faire la traduction (c'est à dire dans chaque Form_Load) est négligeable !
Donc pas besoin à priori de base de donnée pour des projets de cette taille et inférieure ! Le résultat est très satisfaisant.



J'ai également créé un éditeur de fichier de langue. Si vous en avez besoin, demandez moi et je l'uploaderais avec cette source...

@+

Commentaire de violent_ken le 05/04/2007 23:31:41

Tout de même, en reparcourant les posts précédents : même s'il s'avère quand l'état les performances sont satisfaisantes même pour d'assez gros projets, je ne gère toujours pas le cyrillique.

Enfin bon, j'ai aujourd'hui plus que jamais la flemme de me lancer dans les bases de données ;)

Mais je note que ce serait à faire.

@+

Commentaire de violent_ken le 06/04/2007 14:33:42

Bon, j'ai mis à jour ==> j'ai ajouté l'éditeur de fichier de langue, avec une option pour faciliter la traduction google (voir source pour comprendre).

J'ai aussi ajouté le support des ListView (ColumnHeader) et des TabStrip (Tabs.Caption)

@+

Commentaire de violent_ken le 30/04/2007 16:28:57

Euh, je sais pas vraiment pourquoi, mais mon UserControl m'a changé les propriétés de mes controles DANS l'IDE...

Je pense que je vais en faire une classe pour éviter ce genre de bug -___-

@+

Commentaire de m2rtech le 27/11/2007 10:39:58

Bonjour,

Désolé j'ai pas lu tous les posts, mais ton ocx peut il supporter plus de 2 langues?

Commentaire de violent_ken le 27/11/2007 13:48:36

Bonjour, oui, mon OCX peut supporter autant de langues que souhaité.
@+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Modification du Caption de plusieurs controls (CommandButton) dans une boucle en VBA [ par Lfigureau ] Bonjour à tous,J'ai inséré plusieurs boutons (que j'ai liés à différentes macros) sur une feuille Excel (Excel2003 sous Windows XP). Ces boutons ont é Boîtes de dialogue standards multilingues [ par LaNono ] Bonjour à tous Voilà je suis devant un petit problème sur mon application multilingue. j'utilise des fichiers de ressources pour gérer mon changement Publier une application multilingue [ par LaNono ] Bonjour tout le monde! J'ai réalisé une application VB 2005 et je voudrais maintenant la publier pour réaliser un fichier d'installation. J'ai déjà VB6 et l'arabe [ par yassinea3 ] Slt tous le monde.J'ai une application de gestion avec VB6 et access.Cette application gere la langue francaise et langue arabe.mon problème est : J'a tri alphabétique [ par hjsnapo ] Bonjour,Existe-t-il un software dans le commerce ou online permettant dans des fichiers Access volumineux d'obtenirun tri alphabétique effectif comme traduction du c# en vb.net [ par beet2che ] Bonsoir comment traduire en vb.net cette ligne de code : byte [] Vect = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, changer la langue d'un texte dans le presse papier [ par totocatepelt ] Bonjour,je réitère ma question :je tourne sous windows Vistaje copie un texte sous format rtf dont le codage indique que la langue est anglaise (mais Probleme de langue arabe [ par essam2hd83 ] salut j'ai un programme sous vb6 qui transfére les données d'un fichier XML vers une base de données SQL, le probleme c'est que ce fichier XMl contie Exception Langue Francais (Try Catch) [ par Myke ] Je ne sais pas ce qui cause l'affichage des exceptions en langue anglais. Je travaille avec VS2008 en anglais et XP en francais et j'aimerais dans un Pointer un label de manière dynamique [ par kamagap ] Bonjour à tous,J'ai une petite question, ça ne doit pas être bien compliqué mais je cherche depuis un moment et je ne trouve pas. Voilà, j'ai une user


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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,045 sec (4)

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