Dans mon projet actuel (un CMS personnalisé écrit en django), notre solution pour les modèles I18N est basée sur cet exemple: http://www.djangosnippets.org/snippets/855/, que j'ai étendu pour être plus utilisable dans les templates et intégré dans l'interface d'administration. Fondamentalement, chaque contenu aimable a deux tables: une avec les champs communs (comme la catégorie des articles) et une avec le contenu traduisible (titre, corps, slug - étiquette unique utilisée dans l'URL - etc.). De toute évidence, il existe une relation ony-to-many entre le modèle commun et le modèle de traduction. Voici l'exemple l'auteur donne:
class Article(models.Model):
author = models.CharField(max_length = 40)
class ArticleI18N(I18NModel):
title = models.CharField(max_length = 120)
body = models.TextField()
Je pense que cette façon, la mise en page de base de données est très proche du concept d'avoir contenu avec des attributs communs et des champs traduisibles. Mais alors, la partie la plus délicate est de rester SEC dans votre code, ou vous vous retrouverez avec un tas de messages à chaque fois que vous aurez besoin de gérer du contenu traduisible. Heureusement, la flexibilité de Python a été d'une grande aide.
Si votre langage de programmation et votre environnement ne permettent pas de trucs similaires (comme la création dynamique de sous-classes, une sorte de hook d'héritage, etc.), je suppose que ce type de base de données va être plus qu'une malédiction. une bénédiction.
Gardez donc le principe YAGNI à l'esprit. Si vous avez besoin de traductions à l'intérieur de vos modèles avec moins de complications, je l'ai vu d'autres moyens efficaces, qui sont bien aussi longtemps que vous pouvez vous permettre la flexibilité limitée et le manque d'intégrité conceptuelle de ces alternatives:
- 1) utilisent colonnes supplémentaires pour chaque colonne traduisible et chaque langue: title_en, title_fr, title_de, content_en, content_fr, content_de, ...
- 2) sérialiser plusieurs langues dans une colonne.
Par exemple: title = "| FR | Bienvenue | FR | Bienvenue | DE | Willkommen"
Je n'aime pas particulièrement celui-ci, mais ce qui compte vraiment ici, c'est de savoir s'il s'intègre bien dans un environnement existant, ce qui était le cas.
- 3) Parfois, le lien entre le même contenu dans différentes langues n'a pas besoin d'être strict. Je pense que c'est le cas des articles en wikipedia - les traductions sont juste des hyperliens définis manuellement par les auteurs. En conséquence, ces liens sont moins exploitables par le logiciel, mais ce qui compte ici, c'est d'être consultable par un utilisateur.