Come localizzare correttamente i numeri?


38

Quali avvertenze dovrei conoscere mentre localizzo i numeri nella mia applicazione front-end?

Esempio: in portoghese brasiliano (pt-BR) abbiamo diviso migliaia con punti e decimali con virgole. In inglese americano (en-US) è ​​il contrario. In pt-BR presentiamo le cifre separate da migliaia, lo stesso di en-US. Ma leggendo sull'inglese indiano (en-IN) oggi mi sono imbattuto in questo gioiello:

Il sistema di numerazione indiano è preferito per il raggruppamento delle cifre. Se scritti a parole o quando pronunciati, i numeri inferiori a 100.000 / 100.000 sono espressi esattamente come nell'inglese standard. I numeri compresi e oltre 100.000 / 100.000 sono espressi in un sottoinsieme del sistema di numerazione indiano.

https://en.wikipedia.org/wiki/Indian_English#Numbering_system

Che significa:

1000000 units in pt-BR are formatted 1.000.000
1000000 units in en-US are formatted 1,000,000
1000000 units in en-IN are formatted 10,00,000

Oltre alle virgole, ai punti e ad altri separatori specifici, sembra che anche il mascheramento sia una preoccupazione valida.

Quali altri avvertimenti dovrei conoscere mentre localizzo i numeri nella mia applicazione front-end? Specialmente se sto mostrando numeri a set di caratteri non latini?


3
Diventa ancora più interessante quando si tratta di soldi! :-)
Stephan Bijzitter il

4
Non parlando del sistema di numerazione marziano che ha la base 6 (due volte 3 dita) ;-) Ma il giapponese ha anche una stranezza: uomo = 10.000 scritto come 1.0000, oku = 100.000.000 scritto in Giappone come 1.0000.0000 e chō. .. indovina
qwerty_so

6
Perché devi preoccuparti di questo? Non riesci a seguire le impostazioni del sistema operativo?
Jan Doggen,

3
@JanDoggen perché questo è uno dei problemi interessanti del dominio dell'ingegneria del software, "come presentare correttamente i dati alle persone". Ciò di cui dovrei preoccuparmi quando si progetta un sistema è il dominio di questa domanda. E non sto nemmeno parlando di soldi, come ha detto il nostro amico Stephan, né di data e ora. Solo numeri grezzi.
Machado,

5
@ JanDoggen, diventa molto più complesso quando si tratta di software online. L'utente potrebbe essere in India, su un computer inglese americano, ma leggere una pagina Web in portoghese brasiliano. Il tuo server potrebbe essere cinese. L'app deve comprendere ciò che l'utente desidera, indipendentemente dal sistema operativo in uso o dalla posizione del server. Quindi i tuoi 1.000,00 dollari diventano rupie 67.545,00: una valuta americana, convertita al tasso di cambio locale, ma visualizzata in formato portoghese.
noderman

Risposte:


87

La maggior parte dei linguaggi e dei framework di programmazione ha già un meccanismo sensibile e funzionante che è possibile utilizzare per questo.

Ad esempio, l'ecosistema C # ha lo spazio dei nomi System.Globalization , che consente di specificare ciò che Culturesi desidera:

Console.WriteLine(myMoneyValue.ToString("C", "en-US"));

Questo non è qualcosa che vuoi reinventare. Utilizzare le funzionalità di internazionalizzazione fornite dalla propria lingua o struttura preferita.


2
Sono a conoscenza di System.Globalization e di altri framework che gestiscono questo tipo di complessità per me. Quello che non so è quali problemi stanno risolvendo. Ad esempio, diverse applicazioni che vedo usano mascheramenti specifici su ToString, come .ToString ("#, ## 0.00", locale), ma quella maschera di per sé non è valida se sto mostrando questo numero a un indiano. Quindi, oltre a "non usare maschere specifiche", cos'altro dovrei essere a conoscenza?
Machado,

7
Nulla di cui io sia a conoscenza. Se si utilizza correttamente il framework, dovrebbe funzionare. Ci sono alcuni casi specifici di problemi di internazionalizzazione, ma la costruzione di un elenco completo di questi non è qualcosa che facciamo qui. Vedere questo esempio .
Robert Harvey,

5
Questa è l'unica risposta corretta: imposta la tua locale, quindi invia i tuoi valori attraverso il livello i18n prima di mostrarli all'utente e lascia che gli autori del framework lo gestiscano. Questo è vero per numeri, valori di valuta, stringhe tradotte, date, tutto.

2
Risposta perfetta "Non reinventare la ruota" è qualcosa che dovrebbe sempre essere preso in considerazione quando si affrontano problemi comuni come questo. È un peccato che non posso votare più di una volta.
BgrWorker

3
@Machado "Ad esempio, diverse applicazioni che vedo usano mascheramenti specifici su ToString, come .ToString (" #, ## 0.00 ", locale), ma quella maschera di per sé non è valida se sto mostrando questo numero a una persona indiana ". - Potrebbe non essere chiaro, ma nota che la posizione di ,nella stringa di formato è in gran parte irrilevante e che "#, 0.00" avrebbe lo stesso effetto. ,significa semplicemente "usa separatori di gruppi di numeri nel modo specificato dalla locale".
hvd,

23

Alcune risposte eccellenti qui già, ma non hanno menzionato una cosa che penso sia importante non dimenticare: assicurarsi che ovunque avvenga una formattazione numerica, è chiaro (o può essere controllato) a cosa serve l'output:

  • quando è per l'interfaccia utente, è necessario applicare la formattazione localizzata

  • quando il numero sta per essere scritta in un file, o inviati attraverso la rete, o un'altra forma di cui è necessario il numero in lettura ottica modulo, assicurarsi che sia non formattato secondo la cultura corrente, ma secondo una taratura fissa (ad esempio, nell'ambiente .NET, utilizzare InvariantCulture).

Altrimenti si verificano problemi quando i numeri vengono scritti o inviati utilizzando la cultura A e letti o ricevuti utilizzando la cultura B.

Per la mia esperienza, questo è uno dei maggiori ostacoli nel fare una corretta localizzazione dei numeri: nel tentativo di centralizzare la formattazione e la conversione dei numeri, le persone iniziano a creare funzioni generali e riutilizzabili per la formattazione, quindi iniziano a usarle in tutto il posto. Tuttavia, non appena si richiedono i numeri anche in un formato stringa leggibile dalla macchina da qualche altra parte nel programma, sono necessarie due varianti: una formattazione localizzata e una non localizzata. Ciò comporta un rischio elevato di confondere le due forme di conversione (specialmente quando gli sviluppatori e le macchine di prova hanno le impostazioni internazionali predefinite simili all'impostazione "fissa" utilizzata per la formattazione non UI, ma parte della base utenti non lo ha fatto).

Addendum: questo problema può diventare davvero brutto in situazioni in cui non è chiaro in anticipo se il numero verrà elaborato da una macchina o da un essere umano (o entrambi) in seguito. Ad esempio, come parte dell'output di un file di registro. In tali casi è probabilmente meglio attenersi allo standard "neutro" di non utilizzare alcun separatore tranne il punto come separatore decimale.


2
E peggio ancora, in molte lingue moderne di pogramma le funzioni ovvie / predefinite nella libreria standard sono "localizzate". Quindi, se lo sviluppatore non conosce o si preoccupa della localizzazione, è probabile che l'applicazione risultante sia disfunzionale piuttosto che semplicemente brutta su sistemi stranieri.
Peter Green,

4
Non sono d'accordo su ugualmente male. Uno strumento che non segue le convenzioni numeriche locali nella sua UI sarà ancora utilizzabile. Uno strumento che non riesce a leggere i propri file di dati o non riesce a parlare con il proprio server a causa di discrepanze della convenzione numerica è molto più probabile che sia inutilizzabile.
Peter Green,

5
Un aneddoto di questo: il separatore decimale per en-ZA è cambiato tra Win 7 e Win 8. I valori precedentemente archiviati localmente
avevano

1
@PeterGreen: uno strumento che non segue le convenzioni numeriche locali nella sua UI potrebbe essere ancora utilizzabile o potrebbe essere completamente inutilizzabile per alcuni casi d'uso. Starei molto attento a fare simili ipotesi. Il motivo per cui così tanti sviluppatori sbagliano la localizzazione dei numeri è proprio questo: fare questo tipo di ipotesi.
Doc Brown,

1
@DocBrown Ho il codice orribile più orribile da mantenere che soffre delle routine di analisi localizzate dell'intero / float della libreria standard. Penso che sia giusto dire che un programma scritto senza cura per la localizzazione quando le routine predefinite per questi lavori non sono localizzate può essere inutilizzabile per alcune situazioni, ma se le routine predefinite sono localizzate, il programma sarà sempre interrotto nel momento in cui è eseguito su un computer in cui la locale globale non è l'inglese.
Sebastian Redl,

9

Una corretta localizzazione è piuttosto difficile. La maggior parte degli ecosistemi di programmazione tenta di trovare una soluzione per la localizzazione, ma nella mia esperienza sono tutti più o meno distrutti. Pertanto suggerirei:

  • Non tentare di automatizzare la localizzazione. Non funzionerà sempre. È difficile per te individuare i problemi e frustrante per i tuoi utenti.

  • Sii coerente: non mescolare lingue diverse e convenzioni di formattazione, ad esempio separatori decimali in stile brasiliano nel testo inglese.

  • Supportare esplicitamente un determinato set di impostazioni locali. Collabora con i tuoi traduttori per capire la formattazione corretta di date e numeri. Probabilmente finirai per creare il tuo toolkit di localizzazione, sebbene la maggior parte (ma non tutti) i problemi possano essere delegati a una libreria esistente.

  • Rendi le opzioni di formattazione semplici configurabili da ciascun utente: formati per date e orari, separatori decimali, valuta preferita, ... Ciò è particolarmente utile per viaggiatori, espatriati o altre persone che devono mescolare più località o culture indipendentemente dalla lingua.


18
Inoltre, tieni presente che un gran numero di utenti odia la convenzione che è considerata "corretta per la propria lingua", la considera una pratica legacy orribile e non desidera affatto raggruppare o un diverso tipo di raggruppamento. Pertanto, probabilmente ci dovrebbero essere opzioni per disattivarlo o sovrascriverlo manualmente.
R ..

2

Una considerazione importante: dovresti decidere quanto è abbastanza. Perché se vai nella tana del coniglio cercando di localizzarti perfettamente, diventerà sempre più complesso.

Prendi un'etichetta tipica come "Hai selezionato n articoli". Ciò è errato se è stato selezionato un solo elemento. La brutta ma pragmatica soluzione è scrivere "Hai selezionato n articoli." Ma se vuoi farlo correttamente, hai bisogno di due testi diversi a seconda di n. Se provi a farlo in più locali, diventerà rapidamente molto complesso, poiché lingue diverse hanno una grammatica diversa. Alcune lingue hanno coniugazioni diverse per uno, due e più elementi e così via. Per questo motivo le persone che si conoscono si lamenteranno sempre che i quadri di localizzazione esistenti sono insufficienti.

Ma devi scegliere le tue battaglie e decidere quale livello di raffinatezza è sufficiente. Per molti scopi dovrebbe essere sufficiente una libreria di localizzazione standard per la formattazione di numeri e date.


Questo è risolto dall'ICU (MessageFormat). Lo svantaggio è che l'adozione di terapia intensiva in molte lingue è ancora debole. Tuttavia, lo sviluppatore deve ancora costruire il messaggio nel modo giusto. È davvero più dell'aspetto ingegneristico di esso. userguide.icu-project.org/formatparse/messages
noderman

Ciò è anche risolto dalla funzione ngettext più ampiamente disponibile in GNU gettext, ma la classe MessageFormat sembra risolvere anche alcuni problemi extra che ngettext non ha.
hvd,

2

Non puoi essere a conoscenza di tutti gli avvertimenti delle lingue. Stai parlando di numeri, ma ci sono plurali, generi, regole di confronto. Devi sapere che esistono e fare affidamento su un ampio lavoro svolto da altre persone, in particolare i progetti ICU e CLDR.

La maggior parte dei linguaggi moderni implementa alcune o tutte le caratteristiche di questi progetti, ma anche se non lo fanno, leggere questi progetti ti darà una buona idea di cosa cercare.

http://site.icu-project.org

http://cldr.unicode.org

Aggiornare

Lo strumento di sondaggio CLDR fornisce l'accesso a tutti i modelli. Questo ti mostrerà come formattare un numero in determinate lingue e regioni. Ad esempio, portoghese (Portogallo):

http://st.unicode.org/cldr-apps/v#/pt_PT/Number_Formatting_Patterns/

E se vuoi davvero controllare tutti i dati (e forse usarli), puoi scaricare il CLDR in formato JSON da GitHub:

https://github.com/unicode-cldr/cldr-json#cldr-json

Maggiori informazioni sui download qui:

http://cldr.unicode.org/index/downloads


Grazie per l'input, ma ormai sono per lo più interessato ai numeri. :)
Machado,

Sicuro. Ho appena modificato la risposta per includere un collegamento allo strumento di sondaggio, in cui è possibile restringere la ricerca.
noderman,

Ho provato a cambiare in Brasile, per verificare le differenze, ma non sembra abilitare la visualizzazione per questo: st.unicode.org/cldr-apps/v#/pt_BR/Number_Formatting_Patterns Altrimenti, lo strumento sembra abbastanza buono.
Machado,

Questo perché il Brasile è la lingua principale. Lo strumento di rilevamento viene effettivamente utilizzato per apportare modifiche ai dati CLDR, quindi i root richiedono account speciali. Puoi andare su GitHub e ottenere tutte le informazioni direttamente: github.com/unicode-cldr/cldr-numbers-modern/tree/master/main In particolare, il Brasile è qui: github.com/unicode-cldr/cldr-numbers-modern/ blob / master / main / pt /…
noderman

0

Bene, mentre sono contento di tutte le risposte qui, non sono davvero soddisfatto di ciascuna di esse separatamente per contrassegnarne una come risposta corretta.

Finora questo è ciò di cui dovremmo essere a conoscenza quando localizziamo i numeri:

Per l'uomo :

  • Migliaia di separatori non si separano sempre a migliaia. Vedi il caso indiano nella domanda;
  • Migliaia e decimali personaggi variano cultura per cultura. In tedesco migliaia sono divisi usando spazi, per esempio, mentre in inglese sono i comandi e in portoghese sono i punti;
  • Non abbiamo informazioni se esiste una differenza rilevante tra le lingue da sinistra a destra e da destra a sinistra;
  • Fornire un set specifico di localizzazioni supportate e renderlo chiaro per i tuoi utenti;
  • Consenti ai tuoi utenti di modificare la localizzazione predefinita in una delle localizzazioni supportate e saranno felici e ti invieranno torte grate, perché sei un dio generoso. :);

Per i computer :

  • Ricordare che le macchine non sono indulgenti e dovrebbero sempre ricevere la stessa formattazione durante la serializzazione e la deserializzazione di un numero;
  • Stick con un unico formato per esso;
  • Utilizzare il formato minimo necessario possibile. Evita la separazione di migliaia, i decimali dovrebbero essere sufficienti per la serializzazione e la deserializzazione.

Per gli sviluppatori :

  • (come suggerito da @hyde di seguito): utilizza la libreria esistente per la localizzazione;
  • Se possibile, utilizzare tester nativi e specificare casi di test di localizzazione / internazionalizzazione, altrimenti affidarsi alla libreria;
  • Ricorda che la localizzazione è un problema per lo più risolto. Ogni lingua principale ha una biblioteca, nativa o esterna, in grado di localizzare numeri, date e orari;

1
Elemento mancante: per gli sviluppatori: utilizzare la libreria esistente per la localizzazione. Se possibile, utilizzare tester nativi e specificare casi di test di localizzazione / internazionalizzazione, altrimenti affidarsi alla libreria.
hyde l'
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.