Ho visto questo fatto in alcune applicazioni, e non mi è chiaro che sia ok o se si tratta di una violazione della separazione dei poteri.
Ho visto questo fatto in alcune applicazioni, e non mi è chiaro che sia ok o se si tratta di una violazione della separazione dei poteri.
Internazionalizzazione e localizzazione (vedi definizioni del W3C ) non è qualcosa di monolitico. Comprende un'intera serie di funzionalità, alcune delle quali sono rilevanti per la vista, alcune per il controller e altre per il modello.
Localization refers to the adaptation of a product, application or document content to meet the language, cultural and other requirements of a specific target market (a locale).
In genere, si tratta di formattare numeri, date e ora e di utilizzare la lingua dell'utente nel layout dello schermo e nei menu. Tutto questo è in genere pertinente per la vista .
Interpretazione delle scorciatoie da tastiera, tasti funzione (ad esempio, la freccia sinistra e destra non significano lo stesso se si utilizza una lingua da sinistra a destra o una da destra a sinistra) o i comandi degli utenti sono in linea di principio una responsabilità di il controller ( disclaimer: intendo il controller nel senso di pattern MVC originale ; alcune varianti moderne potrebbero rimandare anche alla vista ).
Molto presto tuttavia, la localizzazione potrebbe riguardare aspetti più delicati. Ad esempio:
Internationalization is the design and development of a product, application or document content that enables easy localization for target audiences that vary in culture, region, or language.
In base a questa definizione, puoi progettare la tua applicazione dall'inizio per l'internazionalizzazione. Quindi hai la scelta su dove metterlo:
Nonostante la mia preferenza, non sarò dogmatico: alla fine dipende dal contesto, dai costi e dai benefici attesi. Se sei per esempio un importante fornitore di ERP a livello mondiale e consideri questa una caratteristica di differenziazione di mercato fondamentale, potresti benissimo prenderla in considerazione.
In un'applicazione MVC, l'internazionalizzazione appartiene principalmente alle visualizzazioni. Se un modello o un servizio ha bisogno di tradurre alcune stringhe, non c'è niente di sbagliato nell'usare anche i componenti di internazionalizzazione.
L'alternativa sta costringendo il modello a gestire tutte le stringhe. Ciò farebbe sì che il modello abbia un gran numero di codice boilerplate senza vantaggi reali.
Per gli elementi che trattano la presentazione, come i componenti dell'interfaccia utente e i messaggi di errore, la vista sembra il posto logico per me.
Ma l'internazionalizzazione è più, come le regole di pagamento e fiscali possono differire tra i vari paesi. O opzioni di consegna, politica di restituzione, leggi sulla privacy ecc. Ognuno dovrebbe essere preso in considerazione e reso parte del sistema.
Alcuni di questi argomenti, come l'interfaccia utente, appartengono alla vista. Altri come le descrizioni dei prodotti in più lingue sembrano posizionati meglio nel modello.
E applicare le regole appropriate per fornire un servizio in base alle leggi locali assomiglia alle regole aziendali.
Internazionalizzazione, ( I18n ), è davvero un dettaglio di implementazione ma l'approccio "migliore" che ho visto è l'uso di strumenti come gettext che consente al codice sorgente di contenere qualsiasi stringa richiesta nella lingua preferita dagli sviluppatori ma contrassegnata per sostituzione del tempo di esecuzione e per l'estrazione e la traduzione in risorse esterne specifiche per lingua / locale.
In gettext
il tuo esempio potrebbe essere:
printf(_("Hello")); // Greeting marked for I18n
Quindi gli strumenti gettext
estrarrebbero questo, con testo marcato in modo simile, in un file .pot
, questo sarebbe convertito in un file .po
per il francese chiamato fr.po
e le traduzioni aggiunte e quindi compilate in un .mo
file. Se questo è stato spedito con il tuo programma e inserito nella posizione corretta, l'utente, se la sua lingua era impostata su francese, vede Bonjour piuttosto che Hello.
Dove questo è un grande vantaggio è che:
gettext
& biblioteca. Leggi altre domande sui tag design-patterns mvc internationalization