Best practice per la localizzazione e la globalizzazione di stringhe ed etichette [chiuso]


124

Sono un membro di un team con più di 20 sviluppatori. Ogni sviluppatore lavora su un modulo separato (qualcosa vicino a 10 moduli). In ogni modulo potremmo avere almeno 50 moduli CRUD, il che significa che attualmente abbiamo circa 500 pulsanti di aggiunta , pulsanti di salvataggio , pulsanti di modifica , ecc.

Tuttavia, poiché vogliamo globalizzare la nostra applicazione, dobbiamo essere in grado di tradurre i testi nella nostra applicazione. Ad esempio, ovunque, la parola add dovrebbe diventare ajouter per gli utenti francesi.

Quello che abbiamo fatto fino ad ora è che per ogni vista in UI o Presentation Layer, abbiamo un dizionario di coppie chiave / valore di traduzioni. Quindi durante il rendering della vista, traduciamo i testi e le stringhe richiesti utilizzando questo dizionario. Tuttavia, con questo approccio, siamo arrivati ​​ad aggiungere qualcosa vicino a 500 in 500 dizionari. Ciò significa che abbiamo violato il principio DRY.

D'altra parte, se centralizziamo stringhe comuni, come mettere add in un unico posto, e chiediamo agli sviluppatori di usarlo ovunque, incontriamo il problema di non essere sicuri che una stringa sia già definita nel dizionario centralizzato o meno.

Un'altra opzione potrebbe essere quella di non avere un dizionario di traduzione e utilizzare servizi di traduzione online come Google Translate, Bing Translator, ecc.

Un altro problema che abbiamo riscontrato è che alcuni sviluppatori sotto lo stress di consegnare il progetto in tempo non riescono a ricordare le chiavi di traduzione . Ad esempio, per il testo del pulsante aggiungi, uno sviluppatore ha utilizzato aggiungi mentre un altro sviluppatore ha utilizzato new , ecc.

Qual è la best practice o il metodo più noto per la globalizzazione e la localizzazione delle risorse di stringa di un'applicazione?


2
Il discorso di Alex Sexton sull'argomento Client Side Internationalization della conferenza JS EU è un buon inizio.
Minko Gechev

Risposte:


51

Per quanto ne so, esiste una buona libreria chiamata localeplanetlocalizzazione e internazionalizzazione in JavaScript. Inoltre, penso che sia nativo e non abbia dipendenze da altre librerie (ad esempio jQuery)

Ecco il sito web della biblioteca: http://www.localeplanet.com/

Guarda anche questo articolo di Mozilla, puoi trovare ottimi metodi e algoritmi per la traduzione lato client: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- a-little-help-da-jSON-e-il-Server /

La parte comune di tutti questi articoli / librerie è che usano una i18nclasse e un getmetodo (in qualche modo definiscono anche un nome di funzione più piccolo come _) per recuperare / convertire il file keyin value. Nella mia spiegazione il keysignificato della stringa che si desidera tradurre e il valuesignificato della stringa tradotta.
Quindi, hai solo bisogno di un documento JSON per archiviare keye value.

Per esempio:

var _ = document.webL10n.get;
alert(_('test'));

E qui il JSON:

{ test: "blah blah" }

Credo che utilizzare le attuali soluzioni di biblioteche popolari sia un buon approccio.


1
Senza offesa, ma non è questo ciò che Afshin ha già provato? Il problema è che diversi sviluppatori hanno difficoltà a ricordare quali chiavi usare. Sono d'accordo con il fatto che il metodo descritto è la strada da percorrere. Non vedo come possa essere altrimenti. Grazie per gli ottimi collegamenti a proposito.
Spock

47

Quando ti trovi di fronte a un problema da risolvere (e francamente, chi non lo è di questi tempi?), La strategia di base solitamente adottata da noi computer è chiamata "divide et impera". Funziona così:

  • Concettualizza il problema specifico come un insieme di sotto-problemi più piccoli.
  • Risolvi ogni piccolo problema.
  • Combina i risultati in una soluzione del problema specifico.

Ma "divide et impera" non è l'unica strategia possibile. Possiamo anche adottare un approccio più generalista:

  • Concettualizza il problema specifico come un caso speciale di un problema più generale.
  • In qualche modo risolvi il problema generale.
  • Adattare la soluzione del problema generale al problema specifico.

- Eric Lippert

Credo che esistano già molte soluzioni per questo problema nei linguaggi lato server come ASP.Net/C#.

Ho delineato alcuni degli aspetti principali del problema

  • Problema : dobbiamo caricare i dati solo per la lingua desiderata

    Soluzione : a questo scopo salviamo i dati in file separati per ciascuna lingua

ex. res.de.js, res.fr.js, res.en.js, res.js (per la lingua predefinita)

  • Problema: i file di risorse per ogni pagina devono essere separati in modo da ottenere solo i dati di cui abbiamo bisogno

    Soluzione : possiamo utilizzare alcuni strumenti già esistenti come https://github.com/rgrove/lazyload

  • Problema: abbiamo bisogno di una struttura di coppie chiave / valore per salvare i nostri dati

    Soluzione : suggerisco un oggetto javascript invece di string / string air. Possiamo trarre vantaggio dall'intellisense di un IDE

  • Problema: i membri generali dovrebbero essere archiviati in un file pubblico e tutte le pagine dovrebbero accedervi

    Soluzione : a questo scopo creo una cartella nella radice dell'applicazione web chiamata Global_Resources e una cartella per memorizzare il file globale per ogni sottocartella l'abbiamo chiamata 'Local_Resources'

  • Problema: ogni membro di sottosistemi / sottocartelle / moduli deve sovrascrivere i membri Global_Resources nel proprio ambito

    Soluzione : ho considerato un file per ciascuno

Struttura dell'applicazione

root/
    Global_Resources/
        default.js
        default.fr.js
    UserManagementSystem/
        Local_Resources/
            default.js
            default.fr.js
            createUser.js
        Login.htm
        CreateUser.htm

Il codice corrispondente per i file:

Global_Resources / Default.js

var res = {
    Create : "Create",
    Update : "Save Changes",
    Delete : "Delete"
};

Global_Resources / default.fr.js

var res = {
    Create : "créer",
    Update : "Enregistrer les modifications",
    Delete : "effacer"
};

Il file di risorse per la lingua desiderata dovrebbe essere caricato sulla pagina selezionata da Global_Resource - Questo dovrebbe essere il primo file che viene caricato su tutte le pagine.

UserManagementSystem / Local_Resources / Default.js

res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";

UserManagementSystem / Local_Resources / default.fr.js

res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";

UserManagementSystem / Local_Resources / createUser.js

// Override res.Create on Global_Resources/default.js
res.Create = "Create User"; 

UserManagementSystem / Local_Resources / createUser.fr.js

// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";

file manager.js (questo file dovrebbe essere caricato per ultimo)

res.lang = "fr";

var globalResourcePath = "Global_Resources";
var resourceFiles = [];

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;

if(!IsFileExist(currentFile))
    currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");

resourceFiles.push(currentFile);

// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";

    if(!IsExist(currentFile))
        currentFile = folder + "\\Local_Resource\\default.js";
    if(!IsExist(currentFile)) throw new Exception("File Not Found");

    resourceFiles.push(currentFile);
}

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }

// Get current page name
var pageNameWithoutExtension = "SomePage";

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;

if(!IsExist(currentFile))
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");

Spero che sia d'aiuto :)


7
L'unica cosa che non mi piace di questo approccio è che la localizzazione e lo sviluppo sono strettamente collegati ... Quindi, quando viene aggiunta una stringa inglese (qualunque sia l'impostazione predefinita), il resto delle lingue deve essere aggiornato tramite il codice. Preferirei creare JSON con uno strumento da un qualche tipo di file di traduzioni. Comunque una buona rappresentazione!
Nate-Wilkins

hanno fatto lo stesso modo che hai fatto per la localizzazione, puoi vederlo in questa query: stackoverflow.com/q/53864279/4061006 . L'unica cosa è come traduci Global_Resources / default.js in Global_Resources / default.fr.js? Quale strumento / kit stai utilizzando per convertire quei file nelle lingue desiderate. Dato che anch'io ho bisogno di questo
Jayavel

Dovresti memorizzare un commento leggibile dall'uomo accanto a ciascuna chiave che descrive dove va la stringa e cosa significa, in modo da poter fornire più contesto al traduttore (oa te stesso) quando aggiungi una nuova lingua e hai dimenticato cosa alcuni delle stringhe significano. Ad esempio, fai qualcosa di simile "Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"}per localizzare le estensioni di Chrome . Oppure crea un file separato contenente questi commenti.
Boris

13

jQuery.i18n è un plugin jQuery leggero per consentire l'internazionalizzazione nelle tue pagine web. Ti consente di creare un pacchetto di stringhe di risorse personalizzate nei file ".properties", proprio come nei Java Resource Bundles. Carica e analizza i bundle di risorse (.properties) in base alla lingua fornita o alla lingua riportata dal browser.

per saperne di più, dai un'occhiata a Come internazionalizzare le tue pagine usando JQuery?


Il collegamento è andato
Alexander Farber il
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.