2009-12-14 6 views
0

J'ai besoin d'une structure de base de données pour stocker des versions du contenu du site dans différentes langues. En ce moment je fais comme ceci:Structure de la base de données d'un site multilingue

[Item] 
Id 
SomeColumn 

[ItemStrings] 
ItemId 
LanguageId 
Title 
Description 
... 

[Languages] 
Id 
Culture 

Bien, il est un moyen assez propre à faire de la traduction, il nécessite beaucoup de codage de singe lors de l'ajout de nouvelles entités dans le système.
L'autre solution, à laquelle j'ai pensé, était une table globale pour TOUTES les chaînes qui ont besoin d'être traduites, avec un id unique et un id de langue comme clé primaire.
J'aime beaucoup plus la deuxième façon parce que c'est plus SEC. Maintenant, la vraie question est: puis-je utiliser nvarchar (MAX) pour tous mes enregistrements? Cela consomme-t-il beaucoup plus de mémoire, alors, disons que seulement 20% des valeurs vontudront varchar (max) et que d'autres entreront facilement dans nvarchar (50-quelque chose)?

J'utilise SQL Server 2008.

Répondre

1

La seconde approche est plus proche de la façon dont la localisation est généralement fait (chaque chaîne a une carte d'identité d'une sorte et peut être regardé pour différentes langues.)

En ce qui concerne l'utilisation de nvarchar (MAX), ça devrait aller. Les types varchar n'utilisent que l'espace dont ils ont besoin.

+0

Je pense que je m'en tiendrai à cette solution dans les prochaines versions. Merci pour la confirmation. – user231481

2

Dernier projet sur lequel j'ai travaillé, la clé était l'expression anglaise plutôt qu'un ID. Il a rendu le code plus facile à écrire. Vous appelez une méthode GetTranslationFor ("Phrase anglaise", culture); par opposition à GetTranslationFor (123, culture); Ensuite, vos devs écrivent juste du code, et ne perdent pas de temps à chercher les identifiants de la phrase qu'ils veulent, ou à les ajouter. Avoir la méthode GetTranslationFor envoyer une notification par courrier électronique à un administrateur s'il ne trouve pas une traduction pour la phrase dans la base de données, de sorte qu'il peut être ajouté, mais revenez à la phrase entrée en conséquence.

Il est préférable de montrer une phrase en anglais sur un site français, plutôt qu'une erreur ou rien.

Et nvarchar max devrait être bien. Ce que je disais, c'est que votre deuxième méthode semble bonne, je voudrais juste ajouter une touche/index supplémentaire en utilisant la phrase anglaise comme clé.

+0

gettext (http://www.gnu.org/software/gettext/) utilise cette technique. –

+0

Mais il n'y a aucune raison pour que vous ne puissiez pas utiliser l'anglais par défaut, même en utilisant des ID numériques. –

+0

Non, il n'y a aucune raison que vous ne puissiez pas par défaut à l'anglais par ID, ce n'était pas le point. Le point était que vos programmeurs perdent du temps à vérifier ce que l'ID est pour l'expression "Menu principal" et si cela n'existe pas, ils perdent du temps à le créer.Je ne vais pas me souvenir des identifiants pour des centaines de phrases, et je ne veux pas passer du temps à les chercher dans la base de données. Je préfère écrire le code avec la phrase en anglais, et laisser les traducteurs/admin les ajouter avec leurs traductions appropriées à la base de données. – CaffGeek

0

Je voudrais avoir une colonne clé (entités nommées, par exemple, "OKAY", "SaveAs" etc. - nvarchar (32) devrait suffire) et une colonne de langue (j'utiliserais un code, comme EN-UK pour Anglais britannique, donc char (5)) car ceux-ci sont standardisés. Ces deux colonnes seraient un index unique/clé primaire. J'ai alors une colonne pour le texte actuel - autant de longueur nvarchar que vous le souhaitez. Je suppose que la colonne/table/base de données devrait être dans utf8?

Vous n'avez alors qu'une seule requête non jointe à la base de données pour une chaîne.

J'aurais aussi une solution de repli pour quand une traduction n'est pas disponible, alors faites votre demande obtenir EN-US si la langue demandée n'a pas de valeur. Mieux vaut avoir quelque chose que rien.

Questions connexes