Domanda

Un mio amico sta ora costruendo un'applicazione web con J2EE e Struts e sarà pronta per visualizzare pagine in diverse lingue.

Mi è stato detto che il modo migliore per supportare un sito multilingue è utilizzare un file delle proprietà in cui memorizzi tutte le stringhe delle tue pagine, qualcosa del tipo:

welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...

Questa soluzione va bene, ma cosa succede se il tuo sito mostra notizie o qualcosa del genere (un blog)?Voglio dire, contenuti che non sono statici, che vengono aggiornati spesso...Le persone che gestiscono il sito devono scrivere ogni nuova voce in ciascuna lingua supportata e archiviare ogni versione della voce nel database.L'applicazione carica solo le voci nella lingua scelta dall'utente.

Come si progetta il database per supportare questo tipo di implementazione?

Grazie.

È stato utile?

Soluzione

Il modo in cui ho progettato il database in precedenza è quello di avere una tabella News contenente informazioni di base come NewsID (int), NewsPubDate (datetime), NewsAuthor (varchar/int) e quindi avere una tabella collegata NewsText con queste colonne:NewsID(int), NewsText(testo), NewsLanguageID(int).E finalmente hai una tabella delle lingue che ha LanguageID(int) e LanguageName(varchar).

Quindi, quando vuoi mostrare ai tuoi utenti la pagina delle notizie, fai:

SELECT NewsText FROM News INNER JOIN NewsText ON News.NewsID = NewsText.NewsID
WHERE NewsText.NewsLanguageID = <<Session["UserLanguageID"]>>

Quel Session-bit è una variabile locale in cui memorizzi la lingua degli utenti quando accedono o entrano nel sito per la prima volta.

Altri suggerimenti

Avvertimento:Non sono un hacker Java, quindi YMMV ma...

Il problema con l'utilizzo di un elenco di "proprietà" è che è necessaria molta disciplina.Ogni volta che aggiungi una stringa che dovrebbe essere inviata all'utente dovrai aprire il file delle proprietà, vedere se quella stringa (o qualcosa di più o meno equivalente ad essa) è già nel file, quindi andare ad aggiungere la nuova proprietà se non lo è.Oltre a ciò, dovresti sperare che il file delle proprietà fosse abbastanza leggibile/modificabile dall'uomo se volessi consegnarlo a un team di traduzione esterno che se ne occupi.

L'approccio basato su database è utile per tutti i contenuti basati su database.Idealmente, vuoi rendere facile collegare insieme pezzi di contenuto con le loro traduzioni.Cade davvero solo per tutti i posti in cui potresti voler produrre qualcosa di simile non lo è da un database (messaggi di errore ecc.).

Una tecnologia abbastanza vecchia che troviamo funziona ancora molto bene è l'uso di gettext.Gettext o qualche variante sembra essere disponibile per la maggior parte delle lingue e piattaforme.La premessa di base è racchiudere l'output in una chiamata di funzione speciale in questo modo:

echo _("Please do not press this button again");

Quindi l'esecuzione degli strumenti gettext sul codice sorgente estrarrà tutte le istanze racchiuse in questo modo in un file "po".Questo conterrà voci come:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr ""

E puoi aggiungere la tua traduzione nel posto appropriato:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr "s’il vous plaît ne pas appuyer sur le bouton ci-dessous à nouveau"

Le esecuzioni successive degli strumenti gettext aggiornano semplicemente i file po.Non hai nemmeno bisogno di estrarre il file po dalla tua fonte.Se ti conosci Maggio vuoi tradurre il tuo sito su tutta la linea, puoi semplicemente utilizzare il formato mostrato sopra (la funzione sottolineata) con tutto il tuo output.Se non fornisci un file po, restituirà semplicemente tutto ciò che hai inserito tra virgolette.gettext è progettato per funzionare con le localizzazioni in modo che la locale dell'utente venga utilizzata per recuperare il file po appropriato.Ciò rende davvero semplice aggiungere nuove traduzioni.

Professionisti di Gettext

  • Non ti intralcia durante la codifica
  • Molto facile aggiungere traduzioni
  • I file PO possono essere compilati per velocità
  • Sono disponibili librerie per la maggior parte delle lingue/piattaforme
  • Esistono buoni strumenti multipiattaforma per gestire le traduzioni.In realtà è possibile configurare il tuo team di traduzione con uno strumento come poModifica per rendere loro molto semplice la gestione dei progetti di traduzione

Gettext Contro

  • Risolve le esigenze di "arredamento" del tuo sito, ma di solito vorresti comunque un approccio basato su database per i tuoi contenuti basati su database

Per maggiori informazioni su gettext vedere questa pagina di Wikipedia

Le applicazioni Web Java supportano l'internazionalizzazione utilizzando la libreria di tag standard Java.

Hai davvero 2 problemi.Contenuti statici e contenuti dinamici.

per il contenuto statico che puoi utilizzare jstl.Utilizza Java ResourceBundleè per raggiungere questo obiettivo.Sono riuscito a ottenere un Pacchetto supportato da database lavorando con l'aiuto di questo sito.

Il secondo problema è il contenuto dinamico.Per risolvere questo problema dovrai archiviare i dati in modo da poter recuperare traduzioni diverse in base alla Locale dell'utente.(La lingua include Paese e lingua).

Non è banale, ma è qualcosa che puoi fare con un po' di pianificazione in anticipo.

@Auron

questo è ciò a cui lo applichiamo.Le nostre app sono tutte PHP, ma gettext ha una lunga tradizione.

Sembra che ci sia un buona implementazione Java

Le librerie di tag vanno bene se utilizzi JSP, ma puoi anche ottenere I18N utilizzando una tecnologia basata su modelli come FreeMarker.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top