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

9

Nella nostra azienda abbiamo 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 questo cresca fino a un massimo di circa 10 in futuro

Questa tabella viene letta da più progetti molto diversi (circa 60 progetti, per lo più siti web / applicazioni web e alcuni servizi web), che aprono ciascuna una connessione al database di traduzione, nascondono le traduzioni

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

Talvolta modificano le stringhe senza sapere che stanno rompendo 7 progetti con esso.

Ora devono solo digitare qualcosa come this.Translate("Hello World") e il sistema si occupa del resto.

Potrei naturalmente costringerli a qualcosa di simile a this.Translate("Hello World","AwesomeApplication1") ma sembra che richieda un sacco di refactoring in tutti i molti progetti.

Come andresti a fornire questa soluzione? Come vorresti, come dev, fornire il "nome del progetto" alla traduzione? Come memorizzeresti questo nel database?

Nota importante: il riutilizzo della traduzione è l'intero punto del database centralizzato, quindi scoprite le traduzioni in un progetto andando

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

non è davvero un'opzione ricercata.

Preferirei qualcosa del tipo:

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

o un equivalente di chiave esterna semplicemente mettendo i nomi nella tabella.

Aggiorna

Sulla base del consiglio di normalizzare il database, ho trovato una cosa del genere finora:

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

UPDATE2: aggiunto edmx anziché il testo. Se le persone sono interessate potrei github il progetto WCF sto avvolgendo questo concetto in modo che altre persone possano testarlo e usarlo.

    
posta Mvision 28.02.2013 - 17:26
fonte

3 risposte

5

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

Nota preliminare n. 2: il tuo database non è normalizzato. Qualunque sia la soluzione che stai per intraprendere, prima normalizza il tuo database . In seguito ti imbatti in terribili problemi di manutenzione se non lo fai ora

Questo è quello che farei.

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

  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, restituisci una notifica di conflitto.

Variazioni:

  • Potresti usare un 'ID sviluppatore / ID traduttore' invece di 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 i diritti di modifica.

  • Potresti voler memorizzare gli ID di tutti i programmi che usano la stringa nel DB, in modo da sapere quali programmi sono in conflitto.

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

  • Una volta normalizzato il tuo database, aggiungi complessità di costruzione 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).

    
risposta data 28.02.2013 - 17:58
fonte
5

Poiché fanno riferimento a un 'this' ... puoi assegnare il nome del progetto una volta a 'this' (tramite il costruttore, ad esempio) e l'interfaccia per le funzioni di traduzione non cambierebbe per i codificatori. Sotto il cofano, aggiunge solo il nome del progetto alla query del database. In alternativa, puoi fornire "questo" un mezzo per conoscere il nome del progetto da solo. Dipenderà davvero da come hai strutturato le tue classi.

Per la memorizzazione, 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

Utilizza un carattere jolly per applicare una traduzione generale a tutte le app, ma il nome specifico dell'app quando desideri sovrascrivere una traduzione per una determinata app. Ciò manterrà le duplicazioni al minimo.

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

    
risposta data 28.02.2013 - 17:46
fonte
1

Se tutti i tuoi progetti sono scritti in C # e tutte le chiamate ai traduttori sono simili a questa

this.Translate("hello-world")

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

A seconda della struttura reale del tuo programma, in alternativa potrebbe essere più semplice estrarre tali informazioni dal codice IL degli assembly. Ho fatto qualcosa di molto simile qualche tempo fa, anche per scopi di traduzione, usando questo codice di esempio per analizzare gli assembly.

    
risposta data 28.02.2013 - 18:54
fonte

Leggi altre domande sui tag