Praktik terbaik untuk mengembangkan aplikasi yang siap di dunia
Bagian ini menjelaskan praktik terbaik yang harus diikuti saat mengembangkan aplikasi yang siap di dunia.
Praktik terbaik globalisasi
Buat aplikasi Anda Unicode secara internal.
Gunakan kelas sadar budaya yang disediakan oleh System.Globalization namespace layanan untuk memanipulasi dan memformat data.
- Untuk pengurutan, gunakan SortKey kelas dan CompareInfo kelas .
- Untuk perbandingan string, gunakan CompareInfo kelas .
- Untuk pemformatan tanggal dan waktu, gunakan DateTimeFormatInfo kelas .
- Untuk pemformatan numerik, gunakan NumberFormatInfo kelas .
- Untuk kalender Gregorian dan non-Gregorian, gunakan Calendar kelas atau salah satu implementasi kalender tertentu.
Gunakan pengaturan properti budaya yang disediakan oleh System.Globalization.CultureInfo kelas dalam situasi yang sesuai. CultureInfo.CurrentCulture Gunakan properti untuk memformat tugas, seperti tanggal dan waktu atau pemformatan numerik. CultureInfo.CurrentUICulture Gunakan properti untuk mengambil sumber daya. Perhatikan bahwa
CurrentCulture
properti danCurrentUICulture
dapat diatur per utas.Aktifkan aplikasi Anda untuk membaca dan menulis data ke dan dari berbagai pengodean dengan menggunakan kelas pengodean di System.Text namespace. Jangan asumsikan data ASCII. Asumsikan bahwa karakter internasional akan disediakan di mana saja pengguna dapat memasukkan teks. Misalnya, aplikasi harus menerima karakter internasional dalam nama server, direktori, nama file, nama pengguna, dan URL.
Saat menggunakan UTF8Encoding kelas , karena alasan keamanan, gunakan fitur deteksi kesalahan yang ditawarkan oleh kelas ini. Untuk mengaktifkan fitur deteksi kesalahan, buat instans kelas menggunakan konstruktor yang mengambil
throwOnInvalidBytes
parameter dan atur nilai parameter ini ketrue
.Jika memungkinkan, tangani string sebagai seluruh string alih-alih sebagai serangkaian karakter individual. Ini sangat penting saat mengurutkan atau mencari substring. Ini akan mencegah masalah yang terkait dengan penguraian karakter gabungan. Anda juga dapat bekerja dengan unit teks daripada karakter tunggal dengan menggunakan System.Globalization.StringInfo kelas .
Tampilkan teks menggunakan kelas yang disediakan oleh System.Drawing namespace.
Untuk konsistensi di seluruh sistem operasi, jangan izinkan pengaturan pengguna untuk mengambil CultureInfoalih .
CultureInfo
Gunakan konstruktor yang menerimauseUserOverride
parameter dan atur kefalse
.Uji fungsionalitas aplikasi Anda pada versi sistem operasi internasional, menggunakan data internasional.
Jika keputusan keamanan didasarkan pada hasil perbandingan string atau operasi perubahan kasus, gunakan operasi string yang tidak peka terhadap budaya. Praktik ini memastikan bahwa hasilnya tidak dipengaruhi oleh nilai
CultureInfo.CurrentCulture
. Lihat bagian "Perbandingan String yang Menggunakan Budaya Saat Ini" dari Praktik Terbaik untuk Menggunakan String untuk contoh yang menunjukkan bagaimana perbandingan string yang sensitif terhadap budaya dapat menghasilkan hasil yang tidak konsisten.Untuk elemen apa pun yang digunakan untuk pertukaran (misalnya, bidang dalam dokumen JSON dalam panggilan API) atau penyimpanan, gunakan CultureInfo; selain itu, Anda harus secara eksplisit menentukan format pulang pergi (seperti penentu
"o"
"O"
format tanggal-waktu). Meskipun string format untuk budaya invarian stabil dan tidak mungkin berubah, menentukan string format eksplisit membantu mengklarifikasi niat kode Anda.- Untuk elemen tanggal/waktu, pertimbangkan saran dan pengamatan penulis Noda Time Jon Skeet, yang berbagi wawasan berharga. Untuk informasi selengkapnya, lihat Jon Skeet: Menyimpan UTC bukanlah peluru perak.
Data globalisasi tidak stabil, dan Anda harus menulis aplikasi Anda dan pengujiannya dengan ingat ini. Ini diperbarui beberapa kali setahun melalui saluran OS host di semua platform yang didukung. Data ini biasanya tidak didistribusikan dengan runtime.
Praktik terbaik pelokalan
Pindahkan semua sumber daya yang dapat dilokalkan untuk memisahkan DLL khusus sumber daya. Sumber daya yang dapat dilokalisasi mencakup elemen antarmuka pengguna, seperti string, pesan kesalahan, kotak dialog, menu, dan sumber daya objek yang disematkan.
Jangan untai (karakter) hardcode atau sumber daya antarmuka pengguna.
Jangan menempatkan sumber daya yang tidak dapat dilokalkan ke dalam DLL khusus sumber daya. Ini membingungkan penerjemah.
Jangan gunakan string komposit yang dibangun pada waktu proses dari frasa yang digabungkan. String komposit sulit dilokalkan karena seringkali mengasumsikan urutan tata bahasa Inggris yang tidak berlaku untuk semua bahasa.
Hindari konstruksi ambigu seperti "Folder Kosong" di mana string dapat diterjemahkan secara berbeda tergantung pada peran tata bahasa komponen string. Misalnya, "kosong" dapat berupa kata kerja atau kata sifat, yang dapat menyebabkan terjemahan yang berbeda dalam bahasa seperti Italia atau Prancis.
Hindari menggunakan gambar dan ikon yang berisi teks dalam aplikasi Anda. Mereka mahal untuk dilokalkan.
Izinkan banyak ruang untuk panjang string untuk diperluas di antarmuka pengguna. Dalam beberapa bahasa, frasa dapat memerlukan ruang 50-75 persen lebih banyak daripada yang mereka butuhkan dalam bahasa lain.
System.Resources.ResourceManager Gunakan kelas untuk mengambil sumber daya berdasarkan budaya.
Gunakan Visual Studio untuk membuat kotak dialog Formulir Windows sehingga dapat dilokalkan menggunakan Formulir Windows Resource Editor (Winres.exe). Jangan kode Formulir Windows kotak dialog dengan tangan.
Mengatur pelokalan profesional (terjemahan).
Untuk deskripsi lengkap tentang membuat dan melokalisasi sumber daya, lihat Sumber Daya di aplikasi .NET.
Praktik terbaik globalisasi untuk ASP.NET dan aplikasi server lainnya
Tip
Praktik terbaik berikut adalah untuk aplikasi ASP.NET Framework. Untuk aplikasi ASP.NET Core, lihat Globalisasi dan pelokalan di ASP.NET Core.
Secara eksplisit mengatur CurrentUICulture properti dan CurrentCulture di aplikasi Anda. Jangan mengandalkan default.
Perhatikan bahwa aplikasi ASP.NET adalah aplikasi terkelola dan oleh karena itu dapat menggunakan kelas yang sama dengan aplikasi terkelola lainnya untuk mengambil, menampilkan, dan memanipulasi informasi berdasarkan budaya.
Ketahuilah bahwa Anda dapat menentukan tiga jenis pengodean berikut dalam ASP.NET:
requestEncoding
menentukan pengodean yang diterima dari browser klien.responseEncoding
menentukan pengodean untuk dikirim ke browser klien. Dalam kebanyakan situasi, pengodean ini harus sama dengan yang ditentukan untukrequestEncoding
.- fileEncoding menentukan pengodean default untuk penguraian file .aspx, .asmx, dan .asax .
Tentukan nilai untuk
requestEncoding
atribut ,responseEncoding
,fileEncoding
,culture
, danuiCulture
di tiga tempat berikut dalam aplikasi ASP.NET:- Di bagian globalisasi file Web.config . File ini berada di luar aplikasi ASP.NET. Untuk informasi selengkapnya, lihat <elemen globalisasi>.
- Dalam direktif halaman. Perhatikan bahwa, ketika aplikasi berada di halaman, file telah dibaca. Oleh karena itu, terlambat untuk menentukan fileEncoding dan requestEncoding. Hanya
uiCulture
,culture
, danresponseEncoding
dapat ditentukan dalam arahan halaman. - Secara terprogram dalam kode aplikasi. Pengaturan ini dapat bervariasi per permintaan. Seperti halnya arahan halaman, pada saat kode aplikasi tercapai, sudah terlambat untuk menentukan
fileEncoding
danrequestEncoding
. HanyauiCulture
,culture
, danresponseEncoding
dapat ditentukan dalam kode aplikasi.
Perhatikan bahwa nilai uiCulture dapat diatur ke bahasa penerima browser.
Untuk aplikasi yang didistribusikan, izinkan pembaruan nol waktu henti (misalnya, Azure Container Apps), atau sejenisnya, Anda harus merencanakan situasi di mana mungkin ada beberapa instans aplikasi dengan aturan format yang berbeda atau data budaya lainnya, aturan zona waktu yang paling relevan.
- Jika penyebaran aplikasi Anda menyertakan database, ingatlah bahwa database akan memiliki aturan globalisasinya sendiri. Dalam kebanyakan kasus, Anda harus menghindari melakukan fungsi terkait globalisasi dalam database.
- Jika penyebaran aplikasi Anda menyertakan aplikasi klien atau frontend web menggunakan sumber daya globalisasi klien, asumsikan bahwa sumber daya klien berbeda dari sumber daya yang tersedia untuk server Anda. Pertimbangkan untuk melakukan fungsi globalisasi secara eksklusif pada klien.
Rekomendasi untuk pengujian yang kuat
Untuk membuat dependensi lebih eksplisit dan pengujian berpotensi lebih mudah dan paralel, Anda harus mempertimbangkan untuk secara eksplisit meneruskan pengaturan yang relevan dengan budaya, seperti
CultureInfo
parameter, hingga metode yang melakukan pemformatan, danTimeZoneInfo
metode yang bekerja dengan tanggal dan waktu. Anda juga harus menggunakan TimeProvider atau jenis serupa saat mengambil waktu.Untuk sebagian besar pengujian, Anda tidak boleh secara eksplisit memvalidasi output yang tepat dari operasi pemformatan tertentu atau offset yang tepat dari zona waktu. Pemformatan dan data zona waktu dapat berubah kapan saja dan mungkin berbeda antara dua instans sistem operasi yang identik (dan proses yang berpotensi berbeda pada komputer yang sama). Mengandalkan nilai yang tepat membuat pengujian rapuh.
- Umumnya, memvalidasi bahwa beberapa output diterima akan cukup (misalnya, string yang tidak kosong saat memformat).
- Untuk beberapa elemen dan format data, memvalidasi bahwa data diurai ke nilai input dapat digunakan sebagai gantinya (roundtripping). Perawatan perlu diambil untuk kasus di mana bidang dihilangkan (misalnya, tahun untuk beberapa bidang terkait tanggal) atau nilai dipotong atau dibulatkan (seperti untuk output floating-point).
- Jika Anda memiliki persyaratan eksplisit untuk memvalidasi semua output format yang dilokalkan, Anda harus mempertimbangkan untuk membuat dan menggunakan budaya kustom selama penyiapan pengujian. Untuk sebagian besar kasus sederhana, ini dapat dilakukan dengan membuat
CultureInfo
instans objek dengan konstruktornyanew CultureInfo(..)
dan mengaturDateTimeFormat
properti danNumberFormat
. Untuk kasus yang lebih rumit, subkelas jenis memungkinkan penimpaan properti tambahan. Ada potensi manfaat tambahan untuk ini, seperti mengaktifkan pseudolocalization dengan file sumber daya. - Jika Anda memiliki persyaratan eksplisit untuk memvalidasi hasil semua operasi tanggal/waktu, Anda harus mempertimbangkan untuk membuat dan menggunakan instans kustom
TimeZoneInfo
selama penyiapan pengujian. Ada potensi manfaat tambahan untuk ini, seperti mengaktifkan pengujian stabil kasus tepi tertentu (misalnya, perubahan pada aturan DST).