Schema multilingue appropriato o eccessivo?


8

AGGIORNAMENTO 2 : Ho finito per usarlo, ed è fantastico dopo un paio di modifiche. Ecco il mio post sul suo design attuale e in azione: http://tim.hithlonde.com/2013/lemon-schema-works/

Sto creando un'app Web e voglio che supporti più lingue. Questa struttura ha due componenti:

  1. Connessione locale ('inglese', 'Deutch', ecc.) Con i termini e con una pietra rosetta che collega i termini e i termini in una lingua specifica.
  2. Raggruppare i termini per pagina. Non voglio dire, selezionare term1, term2, ecc. Attraverso i 30+ termini che potrei avere bisogno su una pagina. Voglio chiedere dalla pagina a cui sono collegati.

Ecco la mia struttura di tabella proposta (nota che tutti gli ID hanno relazioni / indici tra loro per effettuare query molto efficienti):

Diagramma di schema

  * locale
      * id
      * value //English, Deutch, etc//
  * terms
    * id
    * value //In English//
  * page 
    * id
    * value //Think add entry, menu//
  * page_group //group all terms to a page, for easy pulling//
    * id
    * page.id
    * term.id
  * rosetta
    * id
    * locale.id
    * term.id
    * value //french word for amount, description, etc//

Ciò consentirà query come:

SELECT localization.value,
        terms.value
FROM localization
INNER JOIN terms ON terms.id=localization.termid
INNER JOIN page_group ON page_group.termid=localization.termid
INNER JOIN page ON page.id=page_group.pageid
INNER JOIN locale ON locale.id=localization.localeid
WHERE page.value='add_entry' AND locale.id=custlangid
ORDER BY terms.id

Devo solo chiedere due articoli; l'id della lingua di cui ho bisogno e la pagina di cui ho bisogno. Fornirà tutti i termini, nella lingua specificata, che fanno parte del gruppo di termini per quella pagina.

Penso che questa sia davvero una buona struttura, ma mi piacerebbe un po 'di feedback.

AGGIORNAMENTO : per chiarire, stiamo solo parlando della localizzazione dei componenti dell'interfaccia utente . (etichette, navigazione, testo utile) Tutte le informazioni immesse dall'utente verranno archiviate in Unicode, non in questo schema.

AGGIORNAMENTO 2 : Ho finito per usarlo ed è fantastico. Ecco il mio post sul suo design attuale e in azione: http://tim.hithlonde.com/2013/lemon-schema-works/


1
Normalmente (da quello che ho visto) la localizzazione viene eseguita tramite modelli sul lato web delle cose. Che tipo di cose stai cercando di localizzare dal lato database?
Philᵀᴹ

Voglio localizzare tutte le etichette, il menu di navigazione e qualsiasi testo utile (avvertenze, ecc.) Il mio ragionamento per prendere questo da db è, non voglio quella logica nei miei modelli. Nei miei modelli, desidero <?php echo $term['term_in_english'];?>che sto cercando un solido approccio MVC.
Tim Habersack,

Risposte:


6

Abbiamo fatto molto di questo e agli utenti (amministrativi) è stato permesso di correggere le traduzioni dal vivo. (Potresti comunque desiderare un livello di memorizzazione nella cache, ma sono totalmente a corto di guida con un database reale e non con i file di risorse - ti dà un sacco di potere per interrogare e trovare cose che devono essere tradotte, ecc.). Penso che il tuo schema probabilmente vada bene, quindi passerò solo alcune cose che abbiamo imparato nella speranza che sia utile.

Una cosa che hai lasciato fuori sono le frasi con punti di inserimento. Nell'esempio seguente, l'ordine è invertito e la lingua è ancora inglese, ma potrebbe facilmente essere due lingue diverse - fingi che siano solo due lingue che normalmente mettono le cose in un ordine diverso.

Hello, <username> you have <x> points!

You've got <x> points to spend, <username>!

Nel nostro pre-.NET, avevamo una routine che faceva l'inserimento in modo che le frasi fossero così:

Hello, {0:username} you have {1:points} points!

You've got {1:points} points to spend, {0:username}!

Questo sarebbe ovviamente semplicemente usato nel tuo codice come <%= String.Format(phrase, username, points); %>o simile

Il che ha aiutato un po 'il traduttore. Purtroppo .NET String.FOrmat non supporta i commenti all'interno della stringa di formato.

Come dici tu, non vorresti gestirlo nel tuo php con consapevolezza locale o meta-frasi.

Quindi quello che avevamo era una tabella delle frasi principali:

frasario, inglese, informazioni supplementari

e una tabella localizzata:

fraseid, localeid, traduzione

Hai anche supposto con INNER JOINS che esistano le versioni localizzate - tendevamo a lasciarle fuori fino a quando non venivano tradotte, in modo che la tua query finisse per non restituire nulla all'inizio (nemmeno l'impostazione predefinita)

Se non esisteva una traduzione, la nostra passava automaticamente all'inglese, quindi passava al codice fornito (nel caso in cui il database non avesse l'ID, ed era anche chiaro dal codice quale identificatore di frase "TXT_LNG_WRNNG_INV_LOW" stava effettivamente cercando di ottenere ) - quindi l'equivalente di questa query è quello che abbiamo usato:

SELECT COALESCE(localized.translation, phrase.english, @fallback)
FROM DUAL
LEFT JOIN phrase
    ON phrase.phraseid = @phraseid
LEFT JOIN localized
    ON localized.phraseid = phrase.phraseid
    AND localized.localeid = @localeid

Ovviamente, potresti ottenere tutte le cose contemporaneamente usando il tuo sistema di pagine.

Abbiamo teso a non collegare le cose alla pagina perché sono state riutilizzate molto tra le pagine (e non solo nei frammenti di pagina o nei controlli), ma va sicuramente bene.

Nel caso delle nostre app native di Windows, abbiamo usato la riflessione e un file di mappatura dal controllo al tag di traduzione in modo che la traduzione non richiedesse la ricompilazione (nelle app pre.NET abbiamo dovuto taggare i controlli usando il Tag o altri speciali proprietà). Questo è probabilmente un po 'più problematico in PHP o ASP.NET MVC, ma è possibile in ASP.NET dove esiste un modello di pagina lato server completo.

Per i test, puoi ovviamente interrogare per trovare facilmente le traduzioni mancanti. Per trovare i luoghi che devono essere taggati, tradurre l'intero dizionario delle frasi usando pig-latin o Klingon o qualcosa del genere sostituire ogni carattere non spaziale con? - l'inglese dovrebbe distinguersi e farti sapere che un po 'di testo in chiaro nudo si è insinuato nel tuo HTML.


Grazie per questo! Non avevo pensato ai punti di inserimento. Non credo che la mia app ne abbia effettivamente, ma è bene tenerlo a mente. Inoltre, grazie per i commenti sullo schema. Ho fatto la progettazione di DB per un po 'di tempo, ma senza un buon insieme di peer per confrontare le note, a volte non sono sicuro che stia andando nella giusta direzione. :)
Tim Habersack,

0

Di solito le traduzioni vengono eseguite da società specializzate esterne. Come tale, sarebbe una seccatura gestire il contenuto tradotto all'interno di un database. Stanno meglio gestendo in "bundle" o file di proprietà attraverso una sorta di funzionalità linguistica offerta dalla tua piattaforma. Per ottenere ciò, nel database, è sufficiente inserire un mnemonico per la stringa. Quindi, in base alla lingua desiderata, dovresti cercare nel pacchetto. per esempio.

Data:
Employee_Status = empl_status.active

language Bundles:
Employee.us:  
  empl_status.active=Active

Employee.es
  empl_status.active=<spanish translation goes here>

To get the localized content:
    String status = getLocalizedContent("Employee","empl_status.active", "us");
    String status = getLocalizedContent("Employee","empl_status.active", "es");
    String status = getLocalizedContent("Employee","empl_status.active");

Sono confuso, dal momento che stiamo parlando della stessa cosa. Costruirò l'equivalente del tuo getLocalizedContent. Tranne a livello di controller, richiederò tutti i termini collegati a una pagina e la lingua in cui la voglio. Quella funzione chiamerà la query che ho descritto sopra e funzionerà in modo da ottenere un array associativo, dove la chiave sarà il mnemonico e il valore sarà il termine. Il numero di termini dell'interfaccia utente sarà piccolo (<100), quindi non vedo che sia un problema gestirlo in un DB. Probabilmente costruirò una semplice interfaccia per inserire termini tradotti e raggruppare pagine.
Tim Habersack,

0

Basta creare 3 tabelle

1.) Language Master (LangId, LangName)

2.) Resource Master (ResourceMasterId, TableId, ColumnId, ColumnName)

3.) Dettagli risorsa (ResourceMasterId, LangId, Value)

chiave composita (ResourceMasterId, LangId) su Dettagli risorsa

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.