4

J'ai une application qui doit prendre en charge une interface multilingue, cinq langues pour être exact. Pour la partie principale de l'interface, l'approche ResourceBundle standard peut être utilisée pour gérer cela.Champs multilingues dans les tables DB

Cependant, la base de données contient de nombreux tableaux dont les éléments contiennent des noms lisibles, des descriptions, des résumés, etc. Il doit être possible d'entrer chacun d'entre eux dans les cinq langues.

Bien que je suppose que je ne pouvais tout simplement avoir des champs sur chaque table comme

NameLang1 
NameLang2 
... 

Je pense que cela conduit à une grande partie du code en grande partie identique lors de l'écriture des grains chaque table la représentent. D'un point de vue purement orienté objet, la solution est cependant simple. Chaque classe a simplement un objet Text qui contient le texte correspondant dans chacune des langues. Ceci est d'autant plus utile qu'un seul langage est obligatoire, les autres ont des règles de repli (par exemple, si la langue 4 est manquante, retourner la langue 2 qui revient à la langue 1 qui est obligatoire).

Malheureusement, en mappant ceci à une base de données relationnelle, cela signifie que je finis avec une seule table que 10 à 12 autres tables FK (certaines tables ont en fait plus d'un FK).

Cette approche semble fonctionner et j'ai été en mesure de mapper les données aux POJO avec Hibernate. A propos de la seule chose que vous ne pouvez pas faire est de mapper d'un objet texte à son parent (puisque vous n'avez aucun moyen de savoir à quelle table vous devez vous lier), mais alors il n'y a pratiquement pas besoin de le faire. Donc, dans l'ensemble, cela semble fonctionner, mais il est juste d'avoir tort que plusieurs tables référencent une table comme celle-ci. Quelqu'un a une meilleure idée?

S'il importe que je utilise MySQL ...

+0

Est-ce que l'utilisateur d'entrer les données dans la base de données en plusieurs langues? Ou est-ce strictement pour l'affichage? – Yishai

Répondre

2

je devais faire qu'une fois ... texte multilingue pour quelques tables ... Je ne sais pas si j'ai trouvé la meilleure solution, mais ce que je A fait a eu la table avec l'information agnostique de langue et puis une table d'enfant avec tous les champs multilingues. Au moins un enregistrement était requis dans la table enfant, pour la langue par défaut; plus de langues pourraient être ajoutées plus tard.

Sur Hibernate, vous pouvez mapper les informations des tables enfants en tant que carte, et obtenir les informations pour la langue que vous souhaitez, en implémentant le repli sur votre POJO comme vous l'avez dit. Vous pouvez avoir différents getters pour les champs multilingues, qui appellent en interne la méthode fallback pour obtenir l'objet enfant approprié pour la langue requise, puis retourner simplement le champ requis.

Cette approche utilise plus la table (une table supplémentaire pour chaque table qui a besoin d'information multilingue) mais la performance est bien meilleure, ainsi que l'entretien ... Je pense

+0

Cela semble être le meilleur compromis, mais je ne suis toujours pas satisfait à 100%. Il semble que vous ayez besoin de beaucoup de code supplémentaire pour gérer les tables multilang supplémentaires. – Kris

2

L'approche de traduction standard utilisée pour Par exemple, dans gettext est d'utiliser une seule chaîne pour décrire le concept et faire un appel à une méthode de traduction qui traduit à la langue de destination. De cette façon, il vous suffit de stocker dans la base de données une seule chaîne (la représentation canonique), puis de passer un appel dans votre application à la méthode translate pour obtenir la chaîne traduite. Pas de FK et une flexibilité totale au prix d'un peu de performances d'exécution (et peut-être un peu plus de problèmes de maintenance, mais avec un peu de réflexion, il n'est pas nécessaire de faire de maintenance un problème dans ce scénario).

+0

Ce ne sont pas seulement des «concepts», ils comprennent des descriptions textuelles plus détaillées des éléments que les entrées de la table signifient. – Kris

+0

Pas de problème, c'est quand même un concept, plus complexe ou long, comme DescriptionOfCombobox2 correspondant à "Sélectionner le nom de l'utilisateur pour le crédit" ou beaucoup plus de texte. –

0

L'approche que j'ai vu dans une application avec un problème similaire est que nous utilisons une colonne "text id" pour stocker une référence, et nous avons une seule table avec toutes les traductions. Cela permet également de réutiliser les mêmes clés pour réduire le nombre de traductions requises, ce qui constitue une partie coûteuse du projet.

Il fournit également une bonne séparation entre les données, et les traductions qui, à mon avis, est plus une chose de l'interface utilisateur. Si les chaînes dont vous avez besoin ne sont pas très nombreuses après tout, vous pouvez simplement les charger toutes en mémoire une fois et utiliser une méthode pour fournir des traductions en vérifiant une structure de données en mémoire.

Avec cette approche, vos haricots ne pas avoir getters pour chaque langue, mais vous utiliseraient un autre objet traducteur:

MyTranslator.translate(myBean.getNameTextId()); 
0

En fonction de vos besoins, il peut être préférable d'avoir une table d'étiquette séparée pour chaque table qui doit être multilingue. Par exemple: vous avez une table XYZ avec une colonne xyz_id, et une table XYZ_Label avec un xyz_id, language_code, label, other_label, etc

L'avantage de ceci, au lieu d'avoir une seule grande table d'étiquettes, est que vous pouvez faire unique contraintes sur la table XYZ_labels (ex: le nom anglais pour XYZ doit être unique), et vous pouvez faire des recherches indexées beaucoup plus efficacement, puisque l'index ne couvrira qu'une seule table à la fois (par exemple: si vous avez besoin de chercher Entités XYZ par nom anglais).

Questions connexes