Creazione di un database di traduzione delle stringhe per più progetti (interni)


9

Nella nostra azienda esiste una tabella ms-sql di traduzione esistente che memorizza stringhe come questa:

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

Ci sono 3 lingue nel sistema e mi aspetto che cresca fino a un massimo di circa 10 in futuro

Questa tabella viene letta da più progetti molto diversi (circa 60 progetti, principalmente siti Web / applicazioni Web e alcuni servizi Web), che ciascuno apre una connessione al database di traduzione, memorizza nella cache le traduzioni

Il feedback degli sviluppatori front-end è che la nostra interfaccia utente per inserire o modificare il principale svantaggio delle traduzioni è che non possono sapere quale progetto utilizza quali stringhe.

A volte modificano le stringhe non sapendo che stanno rompendo 7 progetti con esso.

Ora devono solo digitare qualcosa di simile this.Translate("Hello World")e il sistema si occupa di tutto il resto.

Potrei ovviamente costringerli a qualcosa del genere, this.Translate("Hello World","AwesomeApplication1")ma sembra che ci vorrà un sacco di refactoring in molti molti progetti.

Come vorresti fornire questa soluzione? Come forniresti il ​​"nome del progetto" alla traduzione come sviluppatore? Come lo memorizzereste nel database?

Nota importante: il riutilizzo della traduzione è il punto centrale del database centralizzato, quindi andando a cercare le traduzioni in un progetto

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

non è davvero un'opzione desiderata.

Preferirei qualcosa del tipo:

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

o una chiave esterna equivalente al solo mettere i nomi nella tabella.

AGGIORNARE

Sulla base del consiglio di normalizzare il database, ho trovato qualcosa di simile finora:

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

AGGIORNAMENTO2: aggiunto edmx invece del testo. Se le persone sono interessate, potrei cercare il progetto WCF, sto avvolgendo questo concetto in modo che altre persone possano testarlo e usarlo.


Ty per la normalizzazione. votato q e a. Credo che un jith github di primavera sarebbe di aiuto.
tgkprog,

Risposte:


5

Nota preliminare n. 1: non ci stai dicendo come vengono mantenute le traduzioni al momento

Nota preliminare n. 2: il database non è normalizzato. Qualunque sia la soluzione che prenderai, per prima cosa normalizza il tuo database . In seguito si verificano problemi di manutenzione terribili se non lo si fa ora

Questo è quello che vorrei fare.

  1. Riscrivi la chiamata di traduzione in modo che riporti sul server un ID programma

  2. Il traduttore back-end inserirà la stringa nella tabella del database se non esiste ancora e la taggerà con l'id del programma

  3. Se la stringa esiste già, verrà aggiornata solo se l'id del programma corrisponde all'ID del programma originale con cui è stata creata la stringa. In caso contrario, restituire una notifica di conflitto.

variazioni:

  • È possibile utilizzare un "ID sviluppatore / ID traduttore" anziché un ID programma. Lo considero migliore perché ci sono persone che conoscono una lingua straniera e quelle che pensano di sapere. Solo il primo gruppo ha diritti di modifica.

  • È possibile che si desideri memorizzare gli ID di tutti i programmi che utilizzano la stringa nel DB, in modo da sapere quali programmi sono in conflitto.

  • Potresti estendere questa "proprietà" a ogni singola lingua: una persona può fare l'inglese, l'altra olandese.

  • Una volta normalizzato il database, aggiungi una complessità di compilazione come "Il programma A è in Lingue 1,2,3; B è in 3 e 5"

Ti suggerisco anche di scrivere un programma separato di "manutenzione della traduzione" che ti mostrerà le traduzioni mancanti ecc. Una volta l'ho fatto con un'autorizzazione a 2 livelli: ogni traduzione deve essere controllata da una seconda persona (di solito un madrelingua).


1
Ho aggiornato la mia domanda in base alle tue idee
Mvision,

5

Dato che fanno riferimento a "questo" ... è possibile assegnare una volta il nome del progetto a "questo" (tramite il costruttore, ad esempio) e l'interfaccia delle funzioni di traduzione non cambierebbe per i programmatori. Sotto il cofano, aggiunge semplicemente il nome del progetto alla query del database. In alternativa, puoi fornire "questo" un mezzo per conoscere da solo il nome del progetto. Dipenderà davvero da come sono strutturate le lezioni.

Per l'archiviazione, puoi fare qualcosa come:

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

Utilizzare un carattere jolly per applicare una traduzione generale a tutte le app, ma il nome specifico dell'app quando si desidera sovrascrivere una traduzione per una particolare app. Ciò consentirà di ridurre al minimo le duplicazioni.

Per vedere quale programma sta usando quali traduzioni, ora lo sai: se non vuoi passare attraverso e raccogliere manualmente queste informazioni, puoi registrare le richieste di traduzione.


L'idea di spostarlo nella classe 'this' mi sembra buona, penso che ho intenzione di spostare il nome del progetto nel file web / app.config e leggerlo da lì. Pensi che l'idea di jolly / nomi di progetti sia scalabile a qualcosa come 4000 traduzioni?
Mvision,

3
Come miglioramento, è possibile aggiungere un trigger al database o al DBAL che aggiorna la colonna "programmi sottoscritti" ogni volta che viene letta una parola tradotta.

Come può il trigger del database conoscere il nome del progetto? (Stiamo usando il framework di entità 4)
Mvision,

@Mvision Non vedo perché no - il volume non dovrebbe essere un grosso problema. Se molte delle traduzioni specifiche dell'app stanno semplicemente inserendo il nome dell'app, è possibile utilizzare anche le costanti per ridurre i duplicati.
GrandmasterB,

nvm ho frainteso. sì, un grilletto potrebbe fare, e accelererebbe le cose rispetto al controllo e all'aggiornamento di quelle cose tramite EF in lettura ... buona chiamata
Mvision

1

Se tutti i tuoi progetti sono scritti in C # e tutte le chiamate del traduttore sembrano così

this.Translate("hello-world")

dove "ciao-mondo" è la chiave nella tua tabella di traduzione, non dovrebbe essere troppo difficile scrivere un piccolo scanner di codice sorgente usando espressioni regolari per trovare tutte le chiamate del traduttore e assegnare alle parole chiave i nomi di progetto corrispondenti. In questo modo, non è necessario modificare nessuna delle interfacce di codice o traduttore esistenti.

A seconda della struttura reale del programma, in alternativa potrebbe essere più semplice estrarre tali informazioni dal codice IL dei tuoi assiemi. Qualche tempo fa ho fatto qualcosa di molto simile, anche a scopo di traduzione, usando questo codice di esempio per analizzare gli assiemi.


Mi piaceva questo tipo di soluzione. Ma occorrerebbe testare tutti e 60 i progetti (alcuni nemmeno i miei) prima di passare alla produzione con questo nuovo sistema. La soluzione suggerita per spostare il nome del progetto nel codice chiamante funziona bene e causerà molta meno seccatura, grazie comunque!
Mvision,

1
@Mvision: penso che sia vero il contrario. Se si determina il nome del progetto per le traduzioni in fase di esecuzione, è necessario assicurarsi che ogni pagina Web con ogni traduzione per tutti i 60 progetti debba essere chiamata una volta per assicurarsi di averli registrati tutti. La scansione statica della sorgente o degli assiemi, tuttavia, fornisce un elenco completo senza la necessità di test o l'esecuzione dell'intero sistema.
Doc Brown,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.