Düzgün sayıları yerelleştirmek nasıl?


38

Ön uç uygulamamdaki sayıları yerelleştirirken hangi uyarıları bilmem gerekir?

Örnek: Brezilya Portekizcesi'nde (pt-BR) binlerce virgülle noktalarla ve ondalık sayılarla bölüyoruz. ABD İngilizcesinde (en-ABD) tam tersi. Pt-BR'de, en-ABD ile aynı şekilde, onlarla ayrılan rakamları sunarız. Fakat bugün Hint İngilizcesi (en-IN) hakkında okumak bu gemiyle karşılaştım:

Hint numaralandırma sistemi, rakam gruplaması için tercih edilir. Sözcüklerle yazıldığında veya konuşulduğunda, 100.000 / 100.000'den az sayılar Standart İngilizce’deki gibi ifade edilir. 100.000 / 100.000 dahil ve ötesindeki sayılar, Hint numaralandırma sisteminin bir alt kümesinde ifade edilir.

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

Bunun anlamı:

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

Virgüllerin, noktaların ve diğer belirli ayırıcıların yanı sıra, maskelemenin de geçerli bir endişe olduğu görülmektedir.

Ön uç uygulamamdaki sayıları yerelleştirirken diğer hangi uyarıları bilmem gerekir? Özellikle latin olmayan karakter kümelerine sayıları gösteriyorsam?


3
Para ile uğraşırken daha da ilginçleşiyor! :-)
Stephan Bijzitter

4
Tabanı 6 olan (iki kez 3 parmaklı) Marslı numaralandırma sisteminden bahsetmiyoruz ;-) Ama Japonların da tuhaflıkları var: adam = 10.000 1.0000, oku = 100.000.000 Japonya'da 1.0000.0000 ve chō. .. tahmin
qwerty_so

6
Neden mi sen bu konuda endişe zorunda? İşletim sistemi ayarlarını takip edemiyor musunuz?
Jan Doggen

3
@JanDoggen, çünkü Yazılım Mühendisliği alanının ilginç sorunlarından biri, "insanlara verileri nasıl düzgün şekilde sunabileceği". Bir sistem tasarlarken benim için endişelenmem gereken, bu sorunun alanı. Ve arkadaşım Stephan'ın dediği gibi tarih ve saatten de bahsetmiyorum bile. Sadece ham sayılar.
Machado

5
@JanDoggen, çevrimiçi yazılımlarla uğraşırken bu çok daha karmaşık bir hal alıyor. Kullanıcı ABD'de bir bilgisayarda Hindistan'da olabilir, ancak Brezilya Portekizcesi'nde bir web sayfasını okuyor. Sunucunuz Çince olabilir. Uygulamanız, hangi işletim sistemini kullandığına veya sunucunuzun nerede olduğuna bakılmaksızın kullanıcının ne istediğini anlamalıdır. Böylece 1.000,00 dolarınız 67,545,00 rupi olur: yerel para biriminde dönüştürülen ancak Portekizce olarak görüntülenen ABD para birimi.
noderman

Yanıtlar:


87

Çoğu programlama dili ve çerçevesi zaten bunun için kullanabileceğiniz mantıklı, çalışma mekanizmasına sahiptir.

Örneğin, C # ekosistemi, istediğiniz belirtmenizi sağlayan System.Globalization ad alanına sahiptir Culture:

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

Bu yeniden icat etmek istediğin bir şey değil. En sevdiğiniz dil veya çerçevenin sağladığı uluslararasılaştırma özelliklerini kullanın.


2
System.Globalization ve benim için bu tür karmaşıklığı idare eden diğer çerçevelerin farkındayım. Bilmediğim şey, hangi sorunları çözdükleri. Örneğin, gördüğüm birkaç uygulama, ToString'de, .ToString ("#, ## 0.00", yerel) gibi belirli maskeleme kullanıyor, ancak bu sayı Hintli bir kişiye gösteriliyorsa bu maske geçersiz. Öyleyse, "belirli maskeler kullanmayın" dışında, başka nelerin farkında olmalıyım?
Machado

7
Bildiğim hiçbir şey yok. Çerçeveyi doğru kullanırsanız, sadece çalışması gerekir. Belli, belirli uluslararasılaşma sorunları vakaları var, ancak kapsamlı bir liste oluşturmak burada yaptığımız bir şey değil. Bu örneğe bakınız .
Robert Harvey,

5
Tek doğru cevap bu: yerel ayarınızı yapın, ardından kullanıcıya göstermeden önce değerlerinizi i18n katmanından aşağıya itin ve çerçeve yazarlarının onunla ilgilenmesine izin verin. Bu, sayılar, para birimi değerleri, çevrilmiş dizeler, tarihler, her şey için geçerlidir.

2
Mükemmel cevap. "Tekerleği yeniden icat etmeyin", bunun gibi yaygın problemlerle uğraşırken her zaman göz önünde bulundurulması gereken bir şeydir. Yazık ki, birden fazla kez oy kullanamıyorum.
BgrWorker

3
@Machado "Örneğin, gördüğüm birçok uygulama ToString üzerinde .ToString (" #, ## 0.00 ", yerel) gibi belirli maskeleme kullanıyor, ancak bu sayı Hintli bir kişiye gösteriliyorsa bu maske geçersiz ." - Açık olmayabilir, ancak ,format dizesindeki pozisyonun büyük ölçüde alakasız olduğunu ve "#, 0.00" un aynı etkiye sahip olacağını unutmayın. ,basitçe "yerel grup tarafından belirtilen şekilde sayı grubu ayırıcıları kullan" anlamına gelir.
HVD

23

Bazı mükemmel cevaplar burada zaten, ama unutmamayı düşündüğüm bir şeyden bahsetmediler: bir sayı biçimlendirmesinin nerede gerçekleştiğinden, çıktının ne için kullanıldığının açık (veya kontrol edilebilir) olduğundan emin olun:

  • kullanıcı arayüzü için olduğunda, yerelleştirilmiş biçimlendirme uygulanmalıdır

  • Numara bir dosyaya yazılacak veya ağ üzerinden veya makinenin okunabilir biçimde sayısının gerekli olduğu başka bir formda gönderilecekse , geçerli kültüre göre değil , sabit bir ayara göre biçimlendirilmiş olduğundan emin olun. (örneğin, .NET ortamında kullanın InvariantCulture).

Aksi takdirde, sayılar A kültürü kullanılarak yazıldığında veya gönderildiğinde, B kültürünü kullanarak okunduğunuzda veya aldığınızda sorun yaşarsınız

Tecrübelerime göre, bu sayıların doğru şekilde yerelleştirilmesinin önündeki en büyük engellerden biridir: sayı biçimlendirmesini ve dönüştürülmesini merkezileştirme çabasıyla, insanlar biçimlendirme için genel, yeniden kullanılabilir işlevler yaratmaya başlar ve daha sonra bunları her yerde kullanmaya başlarlar. yer, yerleştirmek. Bununla birlikte, bir kişi makine tarafından okunabilen bir dizge biçiminde, programın başka bir yerinde sayılara ihtiyaç duyduğunda, iki değişken gereklidir: yerelleştirilmiş ve yerel olmayan bir biçimlendirme. Bu, iki dönüşüm türünün karıştırılması riskini doğurur (özellikle geliştiriciler ve test makineleri, kullanıcı arayüzü olmayan biçimlendirme için kullanılan "sabit" ayarlara benzeyen varsayılan yerel ayarlara sahipse, ancak kullanıcı tabanının bir kısmı yoktur).

Zeyilname: bu sorun, eğer sayının bir makine tarafından mı yoksa bir insan (veya her ikisi) tarafından mı işleneceğini önceden belli olmadığı durumlarda çok kötü olabilir. Örneğin, bir günlük dosyasının çıktısının bir parçası olarak. Bu gibi durumlarda, ondalık ayırıcı olarak belirtilen nokta dışında ayırıcı kullanmama "nötr" standardına uymak muhtemelen en iyisidir.


2
Ve daha da kötüsü birçok modern şiir dili, standart kütüphanedeki açık / varsayılan işlevler “yerelleştirilmiştir”. Bu nedenle, geliştirici yerelleştirmeyi bilmiyor veya önemsemiyorsa, ortaya çıkan uygulamanın yalnızca yabancı sistemlerde çirkin olmaktan çok işlevsiz olması muhtemeldir.
Peter Green,

4
Aynı derecede kötü olduğu konusunda hemfikirim. Kullanıcı arabiriminde yerel sayısal kuralları izlemeyen bir araç hala kullanılabilir durumda olacak. Sayısal kurallar uyuşmazlıkları nedeniyle kendi veri dosyalarını okuyamayan veya sunucusuyla konuşamayan bir aracın kullanılamaz olması çok daha olasıdır.
Peter Green,

5
Bunun bir fıkrası: en-
ZA'nın

1
@PeterGreen: 's arayüzünde yerel sayısal kuralları takip etmeyen bir araçtır olabilir hala kullanilabilir, ya da olabilir belirli kullanım durumları için tam kullanışsız olması. Böyle varsayımlarda bulunurken çok dikkatli olurdum. Birçok dev firmanın sayıların yerelleşmesini yanlış yapmasının sebebi tam da şudur - bu tür varsayımlar.
Doktor Brown,

1
@DocBrown Standart kütüphanenin yerelleştirilmiş tamsayı / kayan ayrıştırma yordamlarından muzdarip olmasını sağlamak için en korkunç eski kurallara sahibim. Bu işler için varsayılan rutinlerin yerelleştirilmediği durumlarda yerelleştirmeye dikkat edilmeden yazılmış bir programın bazı durumlar için kullanılamaz olabileceğini söylemek doğru olmaz, ancak varsayılan rutinler yerelleştirilirse, program her an bozulacaktır küresel yerel ayarın İngilizce olmadığı bir bilgisayarda yürütülür.
Sebastian Redl

9

Doğru yerelleştirme oldukça zordur. Çoğu programlama ekosistemi yerelleştirme için bir çözüm girişiminde bulunur, ancak deneyimlerime göre hepsi aşağı yukarı kırıldı. Bu nedenle şunu önerebilirim:

  • Yerelleştirmeyi otomatikleştirmeye çalışmayın. Her zaman işe yaramaz. Sorunları tespit etmek ve kullanıcılarınız için sinir bozucu olmak zordur.

  • Tutarlı olun: farklı dilleri ve biçimlendirme kurallarını karıştırmayın, örneğin İngilizce metinde Brezilya tarzı ondalık ayırıcılar.

  • Belirli bir yerel ayar kümesini açıkça destekleyin. Tarihler ve sayılar için doğru biçimlendirmeyi bulmak için çevirmenlerinizle birlikte çalışın. Muhtemelen kendi yerelleştirme araç setinizi yaratmanız gerekecek, ancak çoğu (ancak tümü değil) mevcut bir kütüphaneye aktarılabilir.

  • Her kullanıcı tarafından yapılandırılabilir basit formatlama seçimleri yapın: tarih ve saat formatları, ondalık ayırıcılar, tercih edilen para birimi,…. Bu özellikle birden fazla yerel dili veya kültürü dilden bağımsız olarak karıştırması gereken yolcular, gurbetçiler veya diğer insanlar için kullanışlıdır.


18
Ayrıca, çok sayıda kullanıcının "yerel ayarları için doğru" sayılan sözleşmeden nefret ettiğini, bunun çok çılgınca bir eski uygulama olduğunu ve hiçbir şekilde gruplama veya farklı bir gruplama yapılmasını istemediğini unutmayın. Bu nedenle, muhtemelen kapatmak veya manuel olarak geçersiz kılmak için seçenekler olması gerekir.
R ..

2

Önemli bir husus: Ne kadar olduğuna karar vermelisin. Çünkü mükemmel bir şekilde lokalize etmeye çalışan tavşan deliğinden aşağıya inerseniz, gittikçe daha karmaşık hale gelecektir.

"N öğelerini seçtiniz" gibi tipik bir etiket alın. Seçilen yalnızca bir öğe varsa, bu yanlış. Çirkin ama pragmatik çözüm "n öğeyi seçtiniz" yazıyor. Fakat doğru yapmak istiyorsanız, n'ye bağlı olarak iki farklı metne ihtiyacınız vardır. Bunu birden fazla yerde yapmaya çalışırsanız, farklı diller farklı gramerlere sahip olduğundan hızlıca karmaşıklaşacaktır. Bazı dillerin bir, iki ve birden fazla öğe için farklı konjugasyonları vardır. Bu nedenlerden dolayı bilgi sahibi kişiler mevcut yerelleştirme çerçevelerinin yetersiz kalmasından daima şikayet edecektir.

Fakat savaşlarınızı seçmeli ve hangi düzeyde karmaşıklığın yeterli olduğuna karar vermelisiniz. Pek çok amaç için, sayıları ve tarihleri ​​biçimlendirmek için standart bir yerelleştirme kütüphanesi yeterli olmalıdır.


Bu, ICU (MessageFormat) tarafından çözülür. Dezavantajı, YBÜ'nün birçok dilde kabul edilmesinin hala zayıf olmasıdır. Bununla birlikte, geliştiricinin hala mesajı doğru şekilde oluşturması gerekir. Bu gerçekten mühendislik yönünden daha fazla. userguide.icu-project.org/formatparse/messages
noderman

Bu aynı zamanda GNU gettext'teki daha yaygın olan ngettext işlevi tarafından da çözülür , ancak MessageFormat sınıfı da ngettext'in çözemediği bazı ekstra sorunları çözüyor gibi görünmektedir.
HVD

2

Dillerin tüm uyarılarını bilemezsiniz. Rakamlardan bahsediyorsun, ama çoğullar, cinsiyetler, harmanlamalar var. Bunların var olduğunu bilmeniz ve özellikle ICU ve CLDR projeleri olmak üzere diğer insanlar tarafından gerçekleştirilen kapsamlı çalışmalara güvenmeniz gerekir.

Çoğu modern dil, bu projelerin bazılarını veya tümünü uygular, ancak yapmasalar bile, bu projeleri okumak size ne arayacağınız konusunda iyi bir fikir verecektir.

http://site.icu-project.org

http://cldr.unicode.org

Güncelleme

CLDR anket aracı tüm kalıplara erişim sağlar. Bu, belirli bir dil ve bölgede numaraların nasıl biçimlendirileceğini gösterecektir. Örneğin, Portekizce (Portekiz):

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

Tüm verileri gerçekten kontrol etmek istiyorsanız (ve belki de kullanabilirsiniz), CLDR'yi JSON formatında GitHub'dan indirebilirsiniz:

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

Buradan indirmeler hakkında daha fazla bilgi:

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


Giriş için teşekkür ederim, ama çoğunlukla şu ana kadar sayılarla ilgileniyorum. :)
Machado

Elbette. Yanıtı, aramanızı daraltabileceğiniz anket aracına bir bağlantı eklemek için az önce düzenleme yaptım.
noderman

Farklılıkları kontrol etmek için Brezilya'yı değiştirmeye çalıştım, ancak bunun için görselleştirmeyi sağlayacak gibi görünmüyor: st.unicode.org/cldr-apps/v#/pt_BR/Number_Formatting_Patterns Aksi halde, araç oldukça iyi görünüyor.
Machado

Çünkü Brezilya kök dildir. Anket aracı aslında CLDR verilerinde değişiklik yapmak için kullanılır, bu nedenle kökler özel hesaplar gerektirir. GitHub'a gidip tüm bilgileri doğrudan alabilirsiniz: github.com/unicode-cldr/cldr-numbers-modern/tree/master/main Özellikle, Brezilya burada: github.com/unicode-cldr/cldr-numbers-modern/ blob / master / main / pt /…
noderman,

0

Buradaki tüm cevaplardan memnun olduğum halde, doğru cevabı işaretlemek için her birinden ayrı ayrı gerçekten memnun değilim.

Şimdiye kadar bu sayıları yerelleştirirken bilmemiz gereken şey:

İnsanlar için :

  • Binlerce ayırıcı her zaman binlerceda ayrılmaz. Sorudaki Hint örneğini görün;
  • Binlerce ve ondalık karakter, kültüre kültüre çeşitlilik gösterir. Almanca'da binlerce kişi boşluklar kullanılarak bölünmüştür; örneğin, İngilizce'de komutanlar ve Portekizce'de noktalar;
  • Soldan sağa ve sağdan sola diller arasında anlamlı bir fark olup olmadığını bilmiyoruz;
  • Belirli bir desteklenen yerelleştirme kümesi sağlayın ve kullanıcılarınız için netleştirin;
  • Kullanıcılarınızın varsayılan yerelleştirmeyi, desteklenen yerelleştirmeden birine değiştirmelerine izin verin; cömert bir tanrı olduğunuz için mutlu olacaklar ve size kekleri minnettar olarak gönderecekler. :);

Bilgisayarlar için :

  • Makinelerin esnek olmadıklarını ve bir numarayı serileştirirken ve seri hale getirirken daima aynı biçimlendirmeyi almaları gerektiğini unutmayın;
  • Bunun için tek bir formatla sopa;
  • Mümkün olan minimum gerekli formatı kullanın. Binlerce ayrımdan kaçının, ondalık sayılar seri hale getirme ve seri hale getirme için yeterli olmalıdır.

Geliştiriciler için :

  • (aşağıda @hyde tarafından önerildiği gibi): Yerelleştirme için mevcut kitaplığı kullanın;
  • Yapabiliyorsanız, yerel test cihazlarını kullanın ve yerelleştirme / uluslararasılaşma test durumlarını belirtin, aksi takdirde kütüphaneye güvenin;
  • Yerelleştirmenin çoğunlukla çözülmüş bir sorun olduğunu unutmayın. Her ana dilin, sayıları, tarihleri ​​ve saatleri yerelleştirebilen, yerli veya harici bir kütüphanesi vardır;

1
Eksik öğe: Geliştiriciler için: yerelleştirme için mevcut kitaplığı kullanın. Yapabiliyorsanız, yerel test cihazlarını kullanın ve yerelleştirme / uluslararasılaşma test durumlarını belirtin, aksi takdirde kütüphaneye güvenin.
Hyde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.