Méthode d'internationalisation

Méthode d'internationalisation - SQL/NoSQL - Programmation

Marsh Posté le 27-08-2010 à 16:45:50    

Bonjour,
 
Je souhaite internationaliser un site web vitrine.
Je ne souhaite pas utiliser de bibli type gettext.
Je compte passer par une solution simple en mysql basique.
 
J'ai imaginé 2 méthodes sensiblement différentes dans le stockage des données, et je ne sais pas laquelle est la meilleure.
A vous donc de juger.
 
Tout d'abord, très important, la méthode doit m'éviter de devoir imaginer des noms pour chaque zone de texte.
Donc chaque élément de texte est nommé par un id numérique, incrémenté automatiquement lors de l'ajout.
 
Voici les deux méthodes de stockage :
 

1ère méthode :
 
- Une seule table mysql :
 
langue |    1     |           2              |              3             |    ......
--------------------------------------------------------------------------------
  fr      coucou     où est mon parapluie ?      Brian est dans cuisine
  en        hi       where is my umbrella ?      Brian is in the kitchen
  es       hola      donde esta my paraguas ?    Brian esta en la cocina
 
J'ajoute donc un champ à chaque ajout d'un élement de texte.
 
Avantage : Une seule table => Simplicité
Inconvénient : Données supplémentaires quand au type du champ répété pour chacun


2ème méthode :
 
Une table de langues
 
id  |     nom     |  indicatif
------------------------------
1       Français      fr
2       English       en
3       Español       es
 
Une table de traduction
 
id   |  langue    |  valeur
------------------------------
42        1          coucou
42        2          hello
..      ....          ....
 
Avantage : Nombre de champs fini
Inconvenient : Plus lent à exploiter ?


 
Actuellement, j'ai mis en oeuvre la 2ème solution, mais j'ai des doutes.
 
Pouvez-vous m'ôter ces doutes ?
 
Merci d'avance ;)


Message édité par Pascal le nain le 27-08-2010 à 16:46:35
Reply

Marsh Posté le 27-08-2010 à 16:45:50   

Reply

Marsh Posté le 27-08-2010 à 22:58:00    

Reply

Marsh Posté le 30-08-2010 à 09:09:16    

La deuxieme m'a l'air la meilleure solution aussi.
 
La perte de performance ne sera pas vraiment significative pour toi car le server va d'abord chercher l'id et puis n'aura plus qu'a choisir entre quelques langues.
Ca ne deviendra problematique que si tu as des centaines de langues differentes.

Reply

Marsh Posté le 30-08-2010 à 09:46:08    

forcément la 2ième, les tables MySQL sont limitées à 1000 colonnes. Donc si t'as plus de 1000 libellés, t'es mort avec la 1ère solution. :/
 
Cela dit, pour la 2ième solution, je ne suis pas convaincu de l'utilité de la 1ère table de langues. Tu mets un char(2) pour le champ langue dans la 2ième table et la clé primaire est portée par les champs "id" + "langue".


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-08-2010 à 10:58:48    

Laisser le label de la langue dans la deuxieme table serai redondant (avec tout les problemes qui en decoulent), pour que le schema soit normalisé il faut avoir les deux tables.

Reply

Marsh Posté le 30-08-2010 à 13:06:27    

Je pensais plus à mettre uniquement l'indicatif (fr, es...) et l'appli se charge de mettre le libellé. En effet, faire une table juste pour ça, on m'a dit que c'était pas terrible. L'autre solution est d'utiliser un enum pour la langue.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-08-2010 à 13:38:14    

C'est ce que je pensais aussi. Merci pour votre aide ;)

Reply

Marsh Posté le 30-08-2010 à 16:26:49    

Pour la 1ere méthode pourquoi tu n'as pas inversé lignes/colonnes ? C'est-à-dire mettre les langues en colonnes ?

Reply

Marsh Posté le 01-09-2010 à 10:25:26    

La première solution me parait particulièrement stupide, même en mettant à part les limitations de mysql...tu rajoutes des colonnes à chaque fois que t'as un nouveau bout de texte sur le site?[:pingouino]

 

...bon après je ne mettrais pas ça dans une base de données, de toute manière, c'est se compliquer la vie pour rien. L'avantage de gettext par exemple c'est d'avoir des éditeurs spécifiques pour les fichiers de traduction. En mettant ça en base tu vas soit devoir te faire chier à les rentrer toi-même à la main, soit te faire chier à faire une interface perso pour les saisir...


Message édité par skeye le 01-09-2010 à 10:25:32

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 01-09-2010 à 11:19:26    

Moi je voyais plutot la premiere table comme une table normale mais ecrite avec colonne et ligne inversée pour plus de lisiblité dans le forum ...
 
Comme quoi ... on voit ce qu'on veut bien voire :)

Reply

Marsh Posté le 01-09-2010 à 11:19:26   

Reply

Marsh Posté le 01-09-2010 à 16:59:57    

Perso, je gère aussi mes traductions dans des fichiers texte.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-09-2010 à 20:20:22    

Je trouve l'idée de Daemon excellente.
 

rufo a écrit :

Perso, je gère aussi mes traductions dans des fichiers texte.


 
Comment fais-tu pour chercher uniquement certains textes ?


Message édité par Pascal le nain le 01-09-2010 à 20:21:01
Reply

Marsh Posté le 02-09-2010 à 15:07:13    

Je fais un fichier par langue, après 2 solutions : des constantes, une par texte, ou un tableau associatif, une clé par texte.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed