Création d'une base de données de traduction de chaînes pour plusieurs projets (en interne)

9

Dans notre entreprise, nous avons une table de traduction ms-sql existante qui stocke des chaînes comme celle-ci:

Id |     Key     | Language | Value 
 1 | hello-world |  nl-BE   | Hallo Wereld
 2 | hello-world |  en-GB   | Hello World

Il y a 3 langues dans le système et je m'attends à ce que cela atteigne un maximum d'environ 10 à l'avenir

Ce tableau est lu par plusieurs projets très différents (environ 60 projets, principalement des sites Web / applications Web et certains services Web), qui ouvrent chacun une connexion à la base de données de traduction, mettent en cache les traductions

Les commentaires des développeurs frontaux sont que notre interface utilisateur pour saisir ou modifier le plus gros inconvénient des traductions est qu'ils ne peuvent pas savoir quel projet utilise quelles chaînes.

Ils modifient parfois des chaînes sans savoir qu'ils cassent 7 projets avec.

Maintenant, il leur suffit de taper quelque chose comme this.Translate("Hello World")et le système s'occupe du reste.

Je pourrais bien sûr les forcer à quelque chose comme, this.Translate("Hello World","AwesomeApplication1")mais cela semble nécessiter beaucoup de refactoring à travers les nombreux projets.

Comment feriez-vous pour fournir cette solution? Comment, en tant que développeur, fourniriez-vous le "nom du projet" à la traduction? Comment stockeriez-vous cela dans la base de données?

Remarque importante: la réutilisation de la traduction est tout l'intérêt de la base de données centralisée, donc délimiter les traductions vers un projet en allant

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2

n'est pas vraiment une option recherchée.

Je préfère quelque chose comme:

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2

ou un équivalent de clé étrangère de simplement mettre les noms dans la table.

MISE À JOUR

Sur la base du conseil de normaliser la base de données, j'ai trouvé quelque chose comme ceci jusqu'à présent:

//this allows me to distinquish if translations where added by developer or by translator

UPDATE2: ajout d'edmx au lieu du texte. Si les gens sont intéressés, je pourrais utiliser le projet WCF dans lequel j'enveloppe ce concept pour que d'autres personnes puissent le tester et l'utiliser.

Mvision
la source
Ty pour la normalisation. voté q et a. Je crois, un github java de printemps aiderait.
tgkprog

Réponses:

5

Note préliminaire # 1: Vous ne nous dites pas comment les traductions sont maintenues en ce moment

Remarque préliminaire n ° 2: votre base de données n'est pas normalisée. Quelle que soit la solution que vous allez prendre, normalisez d' abord votre base de données . Vous rencontrez de terribles problèmes de maintenance plus tard si vous ne le faites pas maintenant

Voilà ce que je ferais.

  1. Réécrivez votre appel de traduction pour qu'il renvoie un ID de programme au serveur

  2. Le traducteur principal placera la chaîne dans la table de base de données si elle n'existe pas encore et la marquera avec l'ID du programme

  3. Si la chaîne existe déjà, elle ne sera mise à jour que si l'ID de programme correspond à l'ID de programme d'origine avec lequel la chaîne a été créée. Sinon, renvoyez une notification de conflit.

Variations:

  • Vous pouvez utiliser un «ID développeur / ID traducteur» au lieu d'un ID programme. Je considère cela mieux parce qu'il y a des gens qui connaissent une langue étrangère et ceux qui pensent le savoir. Seul le premier groupe a des droits de modification.

  • Vous souhaiterez peut-être stocker les ID de tous les programmes qui utilisent la chaîne dans la base de données, afin de savoir quels programmes sont en conflit.

  • Vous pouvez étendre cette réflexion sur la «propriété» à chaque langue: une personne peut parler anglais, l'autre néerlandais.

  • Une fois que votre base de données est normalisée, vous ajoutez une complexité de construction comme "Le programme A est dans les langues 1,2,3; B est dans 3 et 5"

Je vous suggère également d'écrire un programme séparé de «maintenance de la traduction» qui vous montrera les traductions manquantes, etc. J'ai déjà fait cela avec une autorisation à 2 niveaux: chaque traduction doit être vérifiée par une deuxième personne (généralement un locuteur natif).

Jan Doggen
la source
1
J'ai mis à jour ma question en fonction de vos idées
Mvision
5

Puisqu'ils font référence à un «ceci» ... vous pouvez attribuer une fois le nom du projet à «ceci» (via le constructeur, par exemple) et l'interface avec les fonctions de traduction ne changerait pas pour les codeurs. Sous le capot, il ajoute simplement le nom du projet à la requête de base de données. Alternativement, vous pouvez fournir à «this» un moyen de connaître le nom du projet par lui-même. Cela dépendra vraiment de la façon dont vous aurez structuré vos cours.

Pour le stockage, vous pouvez faire quelque chose comme:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

Utilisez un caractère générique pour appliquer une traduction générale à toutes les applications, mais le nom de l'application spécifique lorsque vous souhaitez remplacer une traduction pour une application particulière. Cela réduira les duplications au minimum.

Pour voir quel programme utilise quelles traductions, vous le savez maintenant - si vous ne souhaitez pas parcourir et collecter manuellement ces informations, vous pouvez enregistrer les demandes de traduction.

GrandmasterB
la source
L'idée de le déplacer vers la classe 'this' me semble bonne, je pense que je vais déplacer le nom du projet vers le fichier web / app.config et le lire à partir de là. Pensez-vous que l'idée générique / noms de projet est évolutive à quelque chose comme 4000 traductions?
Mvision
3
En tant qu'amélioration, un déclencheur pourrait être ajouté à la base de données ou à la base de données DBAL qui met à jour la colonne "programmes souscrits" chaque fois qu'un mot traduit est lu.
Comment le déclencheur de la base de données a-t-il pu connaître le nom du projet? (Nous utilisons l'entité framework 4)
Mvision
@Mvision Je ne vois pas pourquoi - le volume ne devrait pas être un gros problème. Si de nombreuses traductions spécifiques à l'application insèrent simplement le nom de l'application, vous pouvez également utiliser des constantes pour réduire les doublons.
GrandmasterB
nvm j'ai mal compris. ouais un déclencheur pourrait faire, et accélérerait les choses par rapport à la vérification et la mise à jour de ces trucs via EF en lecture .... bon appel
Mvision
1

Si tous vos projets sont écrits en C # et que tous les appels du traducteur ressemblent à ceci

this.Translate("hello-world")

où "hello-world" est la clé de votre table de traduction, il ne devrait pas être trop difficile d'écrire un petit scanner de code source à l'aide d'expressions régulières pour trouver tous les appels du traducteur et attribuer aux mots clés les noms de projet correspondants. De cette façon, vous n'avez pas besoin de modifier votre code existant ou vos interfaces de traduction.

Selon la structure réelle de votre programme, il peut également être plus facile d'extraire ces informations du code IL de vos assemblys. J'ai fait quelque chose de très similaire il y a quelque temps, également à des fins de traduction, en utilisant cet exemple de code pour analyser les assemblys.

Doc Brown
la source
J'aimais ce genre de solution. Mais il faudrait que les 60 projets (certains pas même le mien) soient entièrement testés avant de passer en production avec ce nouveau système. La solution suggérée pour déplacer le nom du projet dans le code appelant fonctionne très bien et causera beaucoup moins de tracas, merci quand même!
Mvision
1
@Mvision: Je pense que le contraire est vrai. Si vous déterminez le nom du projet pour les traductions au moment de l'exécution, vous devez vous assurer que chaque page Web avec chaque traduction pour tous vos 60 projets doit être appelée une fois pour vous assurer que vous les avez toutes enregistrées. L'analyse statique de la source ou des assemblages, cependant, vous donne une liste complète sans avoir besoin de tests ou d'exécuter l'ensemble du système.
Doc Brown