Dünya çapında kullanıma hazır uygulamalar geliştirmek için en iyi yöntemler
Bu bölümde, dünya için hazır uygulamalar geliştirirken izleyebileceğiniz en iyi yöntemler açıklanmaktadır.
Genelleştirme en iyi yöntemleri
Uygulamanızı dahili olarak Unicode yapın.
Verileri işlemek ve biçimlendirmek için ad alanı tarafından System.Globalization sağlanan kültüre duyarlı sınıfları kullanın.
- Sıralama için sınıfını SortKey ve sınıfını CompareInfo kullanın.
- Dize karşılaştırmaları için sınıfını CompareInfo kullanın.
- Tarih ve saat biçimlendirmesi için sınıfını DateTimeFormatInfo kullanın.
- Sayısal biçimlendirme için sınıfını NumberFormatInfo kullanın.
- Gregoryen ve Gregoryen olmayan takvimler için sınıfını Calendar veya belirli takvim uygulamalarından birini kullanın.
Sınıfı tarafından System.Globalization.CultureInfo sağlanan kültür özelliği ayarlarını uygun durumlarda kullanın. CultureInfo.CurrentCulture Tarih ve saat veya sayısal biçimlendirme gibi görevleri biçimlendirmek için özelliğini kullanın. CultureInfo.CurrentUICulture Kaynakları almak için özelliğini kullanın.
CurrentCulture
veCurrentUICulture
özelliklerinin iş parçacığı başına ayarlanabileceğini unutmayın.Uygulamanızın ad alanında kodlama sınıflarını kullanarak çeşitli kodlamalardan veri okumasını ve yazmasını System.Text sağlayın. ASCII verilerini varsaymayın. Bir kullanıcının metin girebileceği her yerde uluslararası karakterlerin sağlandığını varsayalım. Örneğin, uygulamanın sunucu adlarında, dizinlerinde, dosya adlarında, kullanıcı adlarında ve URL'lerde uluslararası karakterleri kabul etmesi gerekir.
sınıfını UTF8Encoding kullanırken, güvenlik nedeniyle bu sınıf tarafından sunulan hata algılama özelliğini kullanın. Hata algılama özelliğini açmak için, bir parametre alan oluşturucuyu kullanarak sınıfının bir
throwOnInvalidBytes
örneğini oluşturun ve bu parametrenin değerini olaraktrue
ayarlayın.Mümkün olduğunda, dizeleri tek tek bir karakter dizisi yerine tüm dizeler olarak işleyebilir. Bu özellikle alt dizeleri sıralarken veya ararken önemlidir. Bu, birleştirilmiş karakterleri ayrıştırma ile ilgili sorunları önler. Sınıfını kullanarak System.Globalization.StringInfo tek karakter yerine metin birimleriyle de çalışabilirsiniz.
Ad alanı tarafından System.Drawing sağlanan sınıfları kullanarak metin görüntüleme.
İşletim sistemleri arasında tutarlılık sağlamak için kullanıcı ayarlarının öğesini geçersiz kmasına CultureInfoizin verme. Bir
useUserOverride
parametreyiCultureInfo
kabul eden ve olarak ayarlayanfalse
oluşturucuyu kullanın.Uluslararası verileri kullanarak uygulamanızın işlevselliğini uluslararası işletim sistemi sürümlerinde test edin.
Bir güvenlik kararı dize karşılaştırma veya büyük/küçük harf değiştirme işleminin sonucuna bağlıysa, kültüre duyarsız bir dize işlemi kullanın. Bu uygulama, sonucun değerinden
CultureInfo.CurrentCulture
etkilenmemesini sağlar. Kültüre duyarlı dize karşılaştırmalarının tutarsız sonuçlara nasıl neden olabileceğini gösteren bir örnek için, Dizeleri Kullanmak için En İyi Yöntemler'in "Geçerli Kültürü Kullanan Dize Karşılaştırmaları" bölümüne bakın.Değişim (örneğin, BIR API çağrısındaki JSON belgesindeki bir alan) veya depolama için kullanılan herhangi bir öğe için öğesini kullanın CultureInfo; ayrıca, bir gidiş dönüş biçimi (örneğin
"O"
,"o"
tarih-saat biçimi tanımlayıcısı) belirtmelisiniz. Sabit kültür için biçim dizeleri kararlı ve değişme olasılığı düşük olsa da, açık bir biçim dizesi belirtmek kodunuzun amacını netleştirmeye yardımcı olur.- Tarih/saat öğeleri için değerli içgörüleri paylaşan Noda Time yazarı Jon Skeet'in önerilerini ve gözlemlerini göz önünde bulundurun. Daha fazla bilgi için bkz . Jon Skeet: UTC depolama gümüş madde işareti değildir.
Genelleştirme verileri kararlı değildir ve uygulamanızı ve testlerini bunu göz önünde bulundurarak yazmanız gerekir. Desteklenen tüm platformlardaki konak işletim sistemi kanalları aracılığıyla yılda birkaç kez güncelleştirilir. Bu veriler genellikle çalışma zamanıyla birlikte dağıtılmaz.
Yerelleştirme en iyi yöntemleri
Tüm yerelleştirilebilir kaynakları yalnızca kaynak DLL'lerine taşıyın. Yerelleştirilebilir kaynaklar dizeler, hata iletileri, iletişim kutuları, menüler ve eklenmiş nesne kaynakları gibi kullanıcı arabirimi öğelerini içerir.
Dizeleri veya kullanıcı arabirimi kaynaklarını sabit kodlamayın.
Yerelleştirilebilir olmayan kaynakları yalnızca kaynak DLL'lerine koymayın. Bu, çevirmenlerin kafasını karıştırır.
Birleştirilmiş tümceciklerden çalışma zamanında oluşturulan bileşik dizeleri kullanmayın. Bileşik dizelerin yerelleştirilmesi zordur çünkü genellikle tüm dillere uygulanmayan bir İngilizce dil bilgisi sırası kabul ederler.
Dize bileşenlerinin dil bilgisi rollerine bağlı olarak dizelerin farklı şekilde çevrilebildiği "Boş Klasör" gibi belirsiz yapılardan kaçının. Örneğin, "boş" bir fiil veya sıfat olabilir ve bu da İtalyanca veya Fransızca gibi dillerde farklı çevirilere yol açabilir.
Uygulamanızda metin içeren resimler ve simgeler kullanmaktan kaçının. Yerelleştirmesi pahalıdır.
Dizelerin uzunluğunun kullanıcı arabiriminde genişletilmesi için bol miktarda yer açın. Bazı dillerde tümcecikler, diğer dillerde ihtiyaç duyduklarından yüzde 50-75 daha fazla alan gerektirebilir.
Kültüre dayalı kaynakları almak için sınıfını System.Resources.ResourceManager kullanın.
Windows Forms Kaynak Düzenleyicisi (Winres.exe) kullanılarak yerelleştirilebilmeleri için Visual Studio'yu kullanarak Windows Forms iletişim kutuları oluşturun. Windows Forms iletişim kutularını el ile kodlamayın.
Profesyonel yerelleştirme (çeviri) için düzenleyin.
Kaynakları oluşturma ve yerelleştirmenin tam açıklaması için bkz . .NET uygulamalarında kaynaklar.
ASP.NET ve diğer sunucu uygulamaları için genelleştirme en iyi yöntemleri
İpucu
Aşağıdaki en iyi yöntemler ASP.NET Framework uygulamalarına yöneliktir. ASP.NET Core uygulamaları için bkz . ASP.NET Core'da Genelleştirme ve yerelleştirme.
Uygulamanızda ve CurrentCulture özelliklerini açıkça ayarlayınCurrentUICulture. Varsayılan değerlere güvenmeyin.
ASP.NET uygulamaların yönetilen uygulamalar olduğunu ve bu nedenle kültüre dayalı bilgileri almak, görüntülemek ve işlemek için diğer yönetilen uygulamalarla aynı sınıfları kullanabileceğini unutmayın.
ASP.NET aşağıdaki üç kodlama türünü belirtebileceğinizi unutmayın:
requestEncoding
istemcinin tarayıcısından alınan kodlamayı belirtir.responseEncoding
istemci tarayıcısına gönderilecek kodlamayı belirtir. Çoğu durumda, bu kodlama içinrequestEncoding
belirtilenle aynı olmalıdır.- fileEncoding, .aspx, .asmx ve .asax dosyası ayrıştırma için varsayılan kodlamayı belirtir.
bir ASP.NET uygulamasında aşağıdaki üç yerde ,
responseEncoding
fileEncoding
, ,culture
veuiCulture
özniteliklerinin değerlerinirequestEncoding
belirtin:- Web.config dosyasının genelleştirme bölümünde. Bu dosya, ASP.NET uygulamasının dışındadır. Daha fazla bilgi için bkz <. genelleştirme> öğesi.
- Bir sayfa yönergesinde. Bir uygulama bir sayfadayken dosyanın zaten okunduğunu unutmayın. Bu nedenle, fileEncoding ve requestEncoding belirtmek için çok geç. Yalnızca
uiCulture
,culture
veresponseEncoding
bir sayfa yönergesinde belirtilebilir. - Uygulama kodunda program aracılığıyla. Bu ayar istek başına farklılık gösterebilir. Bir sayfa yönergesinde olduğu gibi, uygulamanın koduna ulaşılana kadar ve
requestEncoding
belirtmekfileEncoding
için çok geç olur. Uygulama kodunda yalnızcauiCulture
,culture
veresponseEncoding
belirtilebilir.
uiCulture değerinin tarayıcı kabul diline ayarlanabileceğini unutmayın.
Dağıtılan uygulamalar için sıfır kapalı kalma süresi güncelleştirmelerine izin verin (örneğin Azure Container Apps) veya benzer durumlarda, uygulamanın farklı biçim kurallarına veya diğer kültür verilerine sahip birden çok örneğinin (en uygun saat dilimi kuralları) bulunabileceği durumları planlamanız gerekir.
- Uygulama dağıtımınız bir veritabanı içeriyorsa, veritabanının kendi genelleştirme kurallarına sahip olacağını unutmayın. Çoğu durumda, veritabanında genelleştirmeyle ilgili işlevleri gerçekleştirmekten kaçınmanız gerekir.
- Uygulama dağıtımınız istemci genelleştirme kaynaklarını kullanan bir istemci uygulaması veya web ön ucu içeriyorsa, istemci kaynaklarının sunucunuz için kullanılabilir kaynaklardan farklı olduğunu varsayalım. İstemcide genelleştirme işlevlerini özel olarak gerçekleştirmeyi göz önünde bulundurun.
Güçlü test için Öneriler
Bağımlılıkları daha açık hale getirmek ve test etmeyi daha kolay ve paralel hale getirmek için, parametreler gibi
CultureInfo
kültürle ilgili ayarları biçimlendirme gerçekleştiren yöntemlere ve tarih veTimeZoneInfo
saatlerle çalışan yöntemlere açıkça geçirmeyi göz önünde bulundurmanız gerekir. Ayrıca zamanı alırken veya benzer bir tür kullanmanız TimeProvider gerekir.Çoğu test için, belirli bir biçimlendirme işleminin tam çıkışını veya saat diliminin tam uzaklığını açıkça doğrulamamalısınız . Biçimlendirme ve saat dilimi verileri herhangi bir zamanda değişebilir ve bir işletim sisteminin birbirinin aynı iki örneği (ve aynı makinedeki olası farklı işlemler) arasında farklılık gösterebilir. Tam bir değere güvenmek, testlerin kırılgan olmasını sağlar.
- Genel olarak, bazı çıktıların alındığını doğrulamak yeterli olacaktır (örneğin, biçimlendirme sırasında boş olmayan dizeler).
- Bazı veri öğeleri ve biçimleri için, verilerin giriş değerine ayrıştırılıp ayrıştırılmadığını doğrulamak (yuvarlama) kullanılabilir. Alanların bırakıldığı durumlar (örneğin, tarihle ilgili bazı alanlar için yıl) veya kesilen veya yuvarlanan değer (kayan nokta çıkışı gibi) için dikkatli olunması gerekir.
- Tüm yerelleştirilmiş biçim çıkışını doğrulamak için açık gereksinimleriniz varsa, test kurulumu sırasında özel bir kültür oluşturmayı ve kullanmayı göz önünde bulundurmanız gerekir. Çoğu basit durumda, bir nesnenin oluşturucusunun
new CultureInfo(..)
örneği oluşturularakCultureInfo
ve özellikleri ayarlanarakDateTimeFormat
NumberFormat
bu yapılabilir. Daha karmaşık durumlar için, türün alt sınıflanması ek özelliklerin geçersiz kılınmasına olanak tanır. Kaynak dosyalarıyla sahte konum belirlemeyi etkinleştirme gibi bunun olası ek avantajları vardır. - Tüm tarih/saat işlemlerinin sonuçlarını doğrulamak için açık gereksinimleriniz varsa, test kurulumu sırasında özel
TimeZoneInfo
bir örnek oluşturmayı ve kullanmayı düşünmelisiniz. Belirli uç durumlarının kararlı testini (örneğin, DST kurallarındaki değişiklikler) etkinleştirme gibi bunun olası ek avantajları vardır.