Domanda

Qualche tempo fa stavo leggendo l'articolo del W3C su "Riutilizzo di stringhe in contenuti con script', che contiene alcuni consigli utili sull'internazionalizzazione, ma che mi sembra in contrasto con il principio DRY (Don't Repeat Yourself) di eliminazione del codice ripetitivo.

Per prendere il loro esempio, potremmo avere un codice come questo...

print "The printer is ";
if (printer.working) {
    print "on.\n";
} else {
    print "off.\n";
}

print "The stapler is ";
if (stapler.working) {
    print "on.\n";
} else {
    print "off.\n";
}

Il mio istinto sarebbe quello di eliminare la ripetizione all'incirca come segue...

report-state(printer, "printer");
report-state(stapler, "stapler");

function report-state(name, object) {
    print "The "+name+" is ";
    if (object.working) {
        print "on\n";
    } else {
        print "off\n";
    }
}

...ma ciò causerebbe difficoltà nel codice se avessimo bisogno di localizzarlo in spagnolo perché la parola per 'on' è apparentemente diversa in questi due casi.

Quindi, immagino che la mia domanda sia: in che modo gli altri sviluppatori hanno affrontato il bilanciamento del principio DRY con l'internazionalizzazione del loro codice?

Una parte di me vuole sostenere che l’internazionalizzazione è una di quelle programmazioni estreme”non ne avrai bisogno"situazioni.D’altro canto, tuttavia, il refactoring tenendo presente il principio DRY dovrebbe bilanciare questo aspetto semplificando l’implementazione delle funzionalità richieste, non più difficile come in questo caso.

È stato utile?

Soluzione

Cercherei di mantenere le frasi complete nella risorsa linguistica.Come hai detto potresti aver bisogno di parole diverse in contesti diversi.Ma il problema più grande è che l’ordine delle frasi potrebbe essere diverso nelle diverse lingue.Quindi costruire stringhe a partire da parole può causare problemi.

Basta conservare

The printer is on
The printer is off
The stapler is on
The stapler is off

nella risorsa linguistica per ogni lingua.La ripetizione qui è meno un grattacapo di manutenzione che cercare di capire dove appariranno tutte le singole parole nella tua applicazione.

Altri suggerimenti

Concordo al 100% con Mendelt.

Non è solo un problema di manutenzione, ma può essere anche linguistico.In tutte le lingue latine il genere, il numero e il caso del soggetto influiscono su altri elementi.Esempio per il rumeno

  The printer is on: Imprimanta este pornită // feminine
  The printer is off: Imprimanta este oprită
  The stapler is on: Perforatorul este pornit // masculine
  The stapler is off: Perforatorul este oprit

Vedi anche http://www.mihai-nita.net/article.php?artID=20060430a

Sono d'accordo con Mendelt Siebenga quando dice che dovresti conservare intere frasi o frasi nei tuoi file di risorse linguistiche.Le differenze grammaticali ti impediranno sempre di sostituire singole parole tra le lingue.Ciò porterà comunque a un codice meno ripetitivo rispetto al primo esempio perché è necessario solo controllare il tipo di oggetto e il suo stato, quindi stampare il messaggio appropriato dalla risorsa del linguaggio.

Cerchiamo di non creare stringhe di messaggi manipolando il programma perché loc.la squadra non può vederli.

La loc.il team in realtà preferisce messaggi separati ma quasi duplicati.Tuttavia accetteranno messaggi parametrizzati.

Ad esempio, "Il %(apparecchio)% è %(on_or_off)%".

I parametri possono non funzionare, ma almeno è più ovvio per la squadra di locomotiva quando funzionerà e quando no.

Suppongo che dipenda dal livello di qualità della lingua che intendi raggiungere.

Cercando di ridurre al minimo la ripetizione del codice che gestisce queste stringhe linguistiche reali, ti stai semplicemente esponendo a un intero altro livello di logica nelle sintassi e nelle strutture dei diversi linguaggi.Ci sarebbe un'enorme quantità di lavoro coinvolta nella produzione di un codice che mantenga ancora la struttura originale del linguaggio riducendo al minimo la ripetizione.

Dovresti decidere quale fosse l'approccio più adatto a un particolare problema;Codice che si ripete, o codice che cerca di essere un tuttofare e si adatta a innumerevoli regole di linguaggio (senza dubbio un incubo di manutenzione).

Naturalmente, puoi trovare una via di mezzo e ridurre al minimo la ripetizione del codice, ma rinunciare a un'eloquenza grammaticale soddisfacente.Prendiamo l'esempio di Ultima Online: quando è stato localizzato, una stringa che in precedenza diceva "Una pila di 329 monete d'oro" è diventata qualcosa come "Una pila di monete d'oro:329".Non eccezionale, ma una soluzione abbastanza ragionevole che si presta facilmente alla localizzazione.

Suggerirei di utilizzare un CMS anziché l'hardcoding nei valori testuali per coprire la localizzazione.

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