Sering kali, saat membuat pesan untuk ditampilkan kepada pengguna, pesan tersebut akan berisi sejumlah hal yang ingin saya informasikan kepada pelanggan.
Saya akan memberikan contoh: Pelanggan telah memilih sejumlah item dari 1 dan lebih tinggi, dan mengklik hapus. Sekarang saya ingin memberikan pesan konfirmasi kepada pelanggan, dan saya ingin menyebutkan jumlah item yang telah dia pilih untuk meminimalkan kemungkinan dia melakukan kesalahan dengan memilih sekumpulan item dan mengklik hapus ketika dia hanya ingin menghapus salah satu mereka.
Salah satu caranya adalah dengan membuat pesan umum seperti ini:
int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " item(s). Are you sure you want to delete it/them?";
"Masalah" di sini adalah kasus di mana noofitemselected
adalah 1, dan kita harus menulis barang dan itu bukan item dan mereka .
Solusi normal saya akan menjadi seperti ini
int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " " + (noofitemsselected==1?"item" : "items") + ". Are you sure you want to delete " + (noofitemsselected==1?"it" : "them") + "?";
Ini menjadi cukup panjang dan sangat buruk sangat cepat jika ada banyak referensi ke jamak angka di dalam kode, dan pesan yang sebenarnya menjadi sulit untuk dibaca.
Jadi pertanyaan saya sederhana. Apakah ada cara yang lebih baik untuk menghasilkan pesan seperti ini?
EDIT
Saya melihat banyak orang menjadi sangat terpaku jika saya menyebutkan bahwa pesan harus ditampilkan di dalam kotak pesan, dan hanya memberikan jawaban tentang cara menghindari penggunaan kotak pesan sama sekali, dan itu semua bagus .
Namun perlu diingat bahwa masalah pluralisasi juga berlaku untuk teks di tempat lain dalam program selain kotak pesan. Misalnya, label di samping kisi yang menampilkan jumlah baris yang dipilih dalam kisi akan memiliki masalah yang sama terkait kemajemukan.
Jadi ini pada dasarnya berlaku untuk sebagian besar teks yang dikeluarkan dengan cara tertentu dari program, dan kemudian solusinya tidak sesederhana hanya dengan mengubah program menjadi tidak mengeluarkan teks lagi :)
sumber
Jawaban:
Jika ada peluang, sekecil apa pun, aplikasi ini perlu diterjemahkan ke bahasa lain, maka keduanya salah. Cara yang benar untuk melakukannya adalah:
Ini karena bahasa yang berbeda menangani pluralitas secara berbeda. Beberapa orang seperti bahasa Melayu bahkan tidak memiliki bentuk jamak sintaksis sehingga stringnya secara umum akan identik. Memisahkan dua string memudahkan untuk mendukung bahasa lain di kemudian hari.
Jika tidak, jika aplikasi ini dimaksudkan untuk dikonsumsi oleh masyarakat umum dan seharusnya ramah pengguna, maka metode kedua lebih disukai. Maaf, tapi saya tidak tahu cara yang lebih singkat untuk melakukan ini.
Jika aplikasi ini dimaksudkan untuk dikonsumsi hanya secara internal oleh perusahaan Anda, lakukan cara pintas
"item(s)"
. Anda tidak perlu membuat siapa pun terkesan saat menulis kode giat. Tetapi saya menyarankan untuk tidak melakukan ini untuk aplikasi yang dikonsumsi publik karena ini memberi kesan bahwa programmer malas dan dengan demikian menurunkan pendapat mereka tentang kualitas aplikasi. Percayalah, hal-hal kecil seperti ini.sumber
noofitemsselected
dalam contoh ini untuk opsi pertama; karena Anda tahu itu adalah 1.Anda dapat menghindari semua kemajemukan yang berantakan ini dengan hanya menghapus item tanpa pesan apa pun dan memberi pengguna fasilitas Urungkan yang sangat bagus. Pengguna tidak pernah membaca apapun . Anda harus membangun fasilitas Undo yang baik sebagai bagian dari program Anda.
Anda benar-benar mendapatkan 2 keuntungan saat membuat fasilitas Undo yang lengkap. Manfaat pertama membuat hidup pengguna lebih mudah dengan memungkinkan dia membalik kesalahan dan meminimalkan membaca. Manfaat kedua adalah bahwa aplikasi Anda mencerminkan kehidupan nyata dengan memungkinkan pembalikan alur kerja non-sepele (bukan hanya kesalahan).
Saya pernah menulis aplikasi tanpa menggunakan satu dialog pun atau pesan konfirmasi. Butuh beberapa pemikiran serius dan jauh lebih sulit untuk diterapkan daripada menggunakan pesan tipe konfirmasi. Tetapi hasil akhirnya cukup bagus untuk digunakan menurut pengguna akhirnya.
sumber
Bagaimana dengan:
Dengan begitu, Anda menghilangkan kesulitan perjanjian nomor, dan berakhir dengan pesan kesalahan yang lebih singkat dan lebih langsung untuk pengguna sebagai bonus. Kita semua tahu bahwa pengguna tidak membaca pesan kesalahan . Semakin pendek mereka, semakin besar kemungkinan mereka untuk setidaknya melirik pada teks.
Atau, dipersenjatai dengan pengetahuan bahwa pengguna tidak membaca pesan kesalahan, Anda dapat melakukan pendekatan ini dengan cara yang berbeda. Lewati pesan konfirmasi sama sekali, dan cukup sediakan fitur undo yang Just Works, apa pun yang telah dihapus. Sebagian besar pengguna sudah terbiasa membatalkan operasi ketika mereka menyadari bahwa itu bukan yang mereka inginkan, dan cenderung menganggap perilaku ini lebih alami daripada harus berurusan dengan munculan lain yang mengganggu.
sumber
Bagaimana dengan Java selama bertahun-tahun: java.text.MessageFormat dan ChoiceFormat? Lihat http://download.oracle.com/javase/1.4.2/docs/api/java/text/MessageFormat.html untuk informasi lebih lanjut.
Dalam kasus Anda, Anda menginginkan sesuatu yang lebih sederhana:
Keuntungan dari pendekatan ini adalah ia bekerja dengan baik dengan bundel i18n, dan Anda dapat memberikan terjemahan dengan benar untuk bahasa (seperti Jepang) yang tidak memiliki konsep kata jamak atau tunggal.
sumber
Saya akan pergi dengan tidak melakukan hardcoding pesan, tetapi memberikan dua pesan dalam file Resource yang terpisah. Suka
dan kemudian memasukkannya ke dalam String.Format like
Saya pikir pendekatan ini lebih mudah dilokalkan dan dipelihara. Semua pesan UI akan berada di satu lokasi.
sumber
Anda dapat menghindari masalah sepenuhnya dengan menyusun pesan secara berbeda.
sumber
Hal pertama yang saya sarankan adalah: gunakan
string.Format
. Itu memungkinkan Anda melakukan sesuatu seperti ini:Lebih lanjut, di aplikasi WPF, saya telah melihat sistem di mana string sumber daya akan dipisahkan dengan tanda pipa untuk memiliki dua pesan: pesan tunggal dan jamak (atau pesan nol / tunggal / banyak, bahkan). Sebuah konverter khusus kemudian dapat digunakan untuk mengurai sumber daya ini dan menggunakan string yang relevan (diformat), jadi Xaml Anda adalah seperti ini:
sumber
Untuk bahasa Inggris, banyak jawaban di atas. Untuk bahasa lain itu lebih sulit, karena bentuk jamak bergantung pada jenis kelamin kata benda dan akhir kata. Beberapa contoh dalam bahasa Prancis:
Maskulin biasa:
Feminin biasa
Maskulin tidak beraturan (diakhiri dengan 's')
Masalah yang sama terjadi di sebagian besar bahasa Latin dan menjadi lebih buruk di Jerman atau Rusia, di mana ada 3 jenis kelamin (makuline, feminin dan netral).
Anda harus berhati-hati jika tujuan Anda adalah menguasai lebih dari sekedar bahasa Inggris.
sumber
Untuk dapat memiliki pesan jamak yang memungkinkan untuk dilokalkan dengan baik, menurut saya adalah bijaksana untuk terlebih dahulu membuat lapisan tipuan antara nomor dan pesan.
Misalnya, gunakan semacam konstanta untuk menentukan pesan mana yang ingin Anda tampilkan. Ambil pesan menggunakan beberapa fungsi yang akan menyembunyikan detail implementasi.
Selanjutnya, buat kamus yang menampung pesan dan variasi yang mungkin, dan buat variasi tahu kapan harus digunakan.
Sekarang Anda dapat dengan mudah menemukan kunci yang sesuai dengan
quantity
dan menginterpolasi nilaiquantity
dengan pesan itu.Contoh yang terlalu disederhanakan dan naif ini, tetapi saya tidak benar-benar melihat cara lain yang waras untuk melakukan ini dan dapat memberikan dukungan yang baik untuk L10N dan I18N.
sumber
Anda harus menerjemahkan fungsi di bawah ini dari VBA ke C #, tetapi penggunaan Anda akan berubah menjadi:
Saya memiliki fungsi VBA yang saya gunakan di MS Access untuk melakukan apa yang Anda bicarakan. Saya tahu saya akan diretas berkeping-keping karena memposting VBA, tapi ini dia. Algoritme harus terlihat dari komentar:
Penggunaannya terpotong sedikit di komentar kode di atas, jadi saya akan mengulanginya di sini:
Ya, solusi ini mengabaikan bahasa selain bahasa Inggris. Apakah itu penting tergantung pada kebutuhan Anda.
sumber
Anda dapat membuat bentuk jamak secara otomatis, lihat mis. generator jamak .
Untuk aturan pembangkitan jamak, lihat wikipedia
sumber
Bagaimana dengan cara yang lebih umum. Hindari pluralisasi di kalimat kedua:
Saya menemukan bahwa melakukannya dengan cara ini menempatkan angka di akhir baris yang sangat mudah dikenali. Solusi ini akan bekerja dengan logika yang sama dalam bahasa apa pun.
sumber
Number
(saya menjawab sambil menggendong bayi saya untuk tidur).Pendekatan umum saya adalah menulis "fungsi tunggal / jamak", seperti ini:
Kemudian di badan pesan saya memanggil fungsi ini:
Ini tidak jauh lebih baik, tapi setidaknya itu, (a) menempatkan keputusan dalam sebuah fungsi dan dengan demikian mengurai kode sedikit, dan (b) cukup fleksibel untuk menangani bentuk jamak yang tidak beraturan. yaitu cukup mudah untuk mengatakan kata benda (n, "anak", "anak") dan sejenisnya.
Tentu saja ini hanya berfungsi untuk bahasa Inggris, tetapi konsep ini siap dikembangkan ke bahasa dengan akhiran yang lebih kompleks.
Terpikir oleh saya bahwa Anda dapat membuat parameter terakhir opsional untuk kasus mudah:
sumber
Penginternasionalan
Saya berasumsi Anda menginginkan dukungan internasionalisasi, dalam hal ini bahasa yang berbeda memiliki pola yang berbeda untuk bentuk jamak (misalnya bentuk jamak khusus untuk 2 sesuatu, atau bahasa yang lebih rumit seperti Polandia), dan Anda tidak dapat mengandalkan penerapan beberapa pola sederhana pada string Anda untuk memperbaikinya.
Anda dapat menggunakan
ngettext
fungsi GNU Gettext dan memberikan dua pesan bahasa Inggris di kode sumber Anda. Gettext akan menyediakan infrastruktur untuk memilih dari pesan lain (berpotensi lebih) ketika diterjemahkan ke bahasa lain. Lihat http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html untuk penjelasan lengkap tentang dukungan jamak gettext GNU.GNU Gettext berada di bawah LGPL.
ngettext
dinamaiGettextResourceManager.GetPluralString
di port C # Gettext.(Jika Anda tidak memerlukan dukungan pelokalan, dan tidak ingin langsung menggunakan Gettext, tulis fungsi Anda sendiri yang melakukan ini untuk bahasa Inggris, dan berikan dua pesan lengkap ke sana, dengan begitu jika Anda membutuhkan l10n nanti, Anda dapat tambahkan dengan menulis ulang satu fungsi.)
sumber
Bagaimana menulis fungsi seperti
.. dan menggunakannya kapan pun Anda butuhkan?
sumber
Untuk soal pertama maksud saya Pluralize bisa menggunakan Inflector .
Dan yang kedua, Anda bisa menggunakan extension representasi string dengan nama seperti ToPronounString.
sumber
Saya memiliki pertanyaan yang sama persis dengan yang diajukan kepada saya kemarin oleh anggota tim kami.
Sejak itu muncul lagi di sini di StackOverflow, saya membayangkan alam semesta memberi tahu saya untuk mengadakan pesta dalam menghasilkan solusi yang layak.
Saya telah dengan cepat mengumpulkan sesuatu dan itu tidak sempurna namun mungkin berguna atau memicu beberapa diskusi / pengembangan.
Kode ini didasarkan pada gagasan bahwa bisa ada 3 pesan. Satu untuk nol item, satu untuk satu item dan satu untuk lebih dari satu item yang mengikuti struktur berikut:
singlePropertyName
singlePropertyName_Zero
singlePropertyName_Plural
Saya telah membuat kelas internal untuk diuji agar dapat meniru kelas sumber daya. Saya belum menguji ini menggunakan file sumber daya yang sebenarnya jadi saya belum melihat hasil lengkapnya.
Berikut kodenya (saat ini saya telah menyertakan beberapa obat generik di mana saya tahu saya dapat menentukan parameter ketiga hanya sebagai Jenis dan juga parameter kedua adalah string, saya pikir ada cara untuk menggabungkan kedua parameter ini menjadi sesuatu yang lebih baik tetapi saya ' Saya akan kembali ke hal itu ketika saya memiliki waktu luang.
Menguji kelas sumber daya:
dan metode eksekusi cepat saya
sumber
singlePropertyName_All
membuatnya lebih jelas.Dari sudut pandang saya, solusi pertama Anda adalah yang paling sesuai. Mengapa saya mengatakan itu adalah, jika Anda membutuhkan aplikasi untuk mendukung banyak bahasa, opsi kedua bisa melelahkan. Dengan pendekatan pertama, mudah untuk melokalkan teks tanpa banyak usaha.
sumber
Anda bisa menggunakan pesan yang lebih umum seperti 'Apakah Anda yakin ingin menghapus item yang dipilih'.
sumber
Saya bergantung pada seberapa bagus pesan yang ingin Anda terima. Dari yang termudah hingga tersulit:
Tulis ulang pesan kesalahan Anda untuk menghindari pluralisasi. Tidak sebaik untuk pengguna Anda, tetapi lebih cepat.
Gunakan bahasa yang lebih umum tetapi tetap menyertakan nomor.
Gunakan sistem "pluralisasi" dan inflektor ala Rails, sehingga Anda bisa mengatakan
pluralize(5,'bunch')
dan mendapatkan5 bunches
. Rel memiliki pola yang bagus untuk ini.Untuk internasionalisasi, Anda perlu melihat apa yang disediakan Java. Itu akan mendukung berbagai macam bahasa, termasuk yang memiliki bentuk kata sifat yang berbeda dengan 2 atau 3 item. Solusi "s" sangat berpusat pada bahasa Inggris.
Opsi mana yang Anda gunakan bergantung pada tujuan produk Anda. - ndp
sumber
Mengapa Anda ingin menyajikan pesan yang benar-benar dapat dipahami pengguna? Ini bertentangan dengan 40 tahun sejarah pemrograman. Tidaaaaaaak, kami memiliki hal yang baik, jangan merusaknya dengan pesan yang bisa dimengerti .
(j / k)
sumber
Lakukan seperti yang dilakukan di World of Warcraft:
sumber
Ini menjadi sedikit lebih pendek dengan
sumber
Satu pendekatan yang belum pernah saya lihat sebutkan adalah penggunaan tag pengganti / pilih (misalnya, sesuatu seperti "Anda akan squash {0} [? I ({0} = 1): / cactus / cacti /]". (dengan kata lain, memiliki ekspresi seperti format tentukan substitusi berdasarkan apakah argumen nol, diambil sebagai integer, sama dengan 1). Saya telah melihat tag seperti itu digunakan pada hari-hari sebelumnya .net; Saya tidak mengetahui adanya standar untuk mereka dalam .net, saya juga tidak tahu cara terbaik untuk memformatnya.
sumber
Saya akan berpikir di luar kotak sebentar, semua saran di sini adalah melakukan pluralisasi (dan khawatir tentang lebih dari 1 tingkat pluralisasi, jenis kelamin, dll) atau tidak menggunakannya sama sekali dan memberikan pengurungan yang bagus.
Saya akan menggunakan cara non-bahasa dan menggunakan antrian visual untuk itu. misalnya bayangkan sebuah aplikasi Iphone Anda memilih item dengan menyeka jari Anda. sebelum menghapusnya menggunakan tombol hapus utama, ini akan "mengguncang" item yang dipilih dan menampilkan tanda tanya bertuliskan kotak dengan tombol V (ok) atau X (batal) ...
Atau, di dunia 3D Kinekt / Move / Wii - bayangkan memilih file, gerakkan tangan Anda ke tombol hapus dan disuruh menggerakkan tangan Anda di atas kepala untuk mengonfirmasi (menggunakan simbol visual yang sama seperti yang saya sebutkan sebelumnya. meminta Anda menghapus 3 file? ini akan menampilkan 3 file dengan X merah transparan setengah melayang di atas dan meminta Anda melakukan sesuatu untuk mengonfirmasi.
sumber