Saya sedang mengembangkan UI untuk aplikasi .NET MVC yang akan memerlukan pelokalan internasional semua konten dalam waktu dekat. Saya sangat akrab dengan .NET secara umum tetapi belum pernah memiliki proyek yang membutuhkan fokus signifikan pada aksesibilitas internasional.
Proyeksi ini awalnya dilakukan dalam bahasa Inggris. Tindakan apa yang harus saya ambil pada titik ini untuk membuatnya lebih mudah untuk menerapkan lokalisasi di masa depan?
.net
localization
internationalization
multilingual
smartcaveman
sumber
sumber
Jawaban:
Anda sedang mengembangkan aplikasi ASP.Net MVC, bukan? Jawaban lain tampaknya khusus untuk aplikasi desktop. Biarkan saya menangkap hal-hal umum:
Deteksi lokal
Sangat penting bahwa aplikasi Anda mendeteksi lokal pengguna dengan benar. Dalam aplikasi desktop, CultureInfo.CurrentCulture memegang lokal format pemformatan (yang harus digunakan untuk memformat angka, tanggal, mata uang, dll.) Sedangkan CultureInfo.CurrentUICulture memegang lokal Antarmuka Pengguna pilihan (yang harus digunakan untuk menampilkan pesan yang dilokalkan) . Untuk aplikasi web, Anda harus mengatur kedua budaya ke otomatis (untuk secara otomatis mendeteksi lokal dari header AcceptLanguage) kecuali jika Anda ingin menerapkan beberapa alur kerja deteksi lokal yang mewah (yaitu ingin mendukung perubahan bahasa sesuai permintaan).
Eksternalisasikan string
Semua string harus berasal dari sumber daya, yaitu file Resx. Di Aplikasi Winforms, hal itu mudah dicapai dengan menyetel properti form yang dapat dilokalkan ke true. Anda juga perlu secara manual (sayangnya) mengeksternalisasi string yang berasal dari model Anda. Ini juga relatif sederhana. Di Asp.Net Anda perlu mengeksternalkan semuanya secara manual ...
Tata letak
Anda pasti perlu mengizinkan untuk ekspansi string. Di dunia Winforms dapat dicapai melalui TableLayoutPanel yang harus digunakan untuk memastikan bahwa tata letak akan menyesuaikan secara otomatis untuk mengakomodasi teks yang lebih panjang. Di dunia web, Anda sedikit kurang beruntung. Anda mungkin perlu menerapkan Mekanisme Pelokalan CSS - cara untuk memodifikasi (menimpa) definisi CSS. Ini akan memungkinkan orang Lokalisasi untuk mengubah masalah gaya pada permintaan. Pastikan bahwa setiap elemen HTML di halaman yang diberikan memiliki id unik - itu akan memungkinkan untuk menargetkannya secara tepat.
Masalah spesifik budaya
Hindari menggunakan grafik, warna dan suara yang mungkin spesifik untuk budaya barat. Jika Anda benar-benar membutuhkannya, harap sediakan sarana Pelokalan. Hindari grafik yang sensitif terhadap arah (karena ini akan menjadi masalah ketika Anda mencoba melokalisasi untuk mengatakan bahasa Arab atau Ibrani). Juga, jangan berasumsi bahwa seluruh dunia menggunakan angka yang sama (yaitu tidak berlaku untuk bahasa Arab).
ToString () dan Parse ()
Pastikan untuk selalu melewati CultureInfo saat memanggil ToString () kecuali itu tidak didukung. Dengan begitu Anda mengomentari niat Anda. Misalnya: jika Anda menggunakan beberapa nomor secara internal dan karena alasan tertentu perlu mengubahnya menjadi penggunaan string:
Untuk angka yang akan ditampilkan untuk digunakan pengguna:
Hal yang sama berlaku untuk Parse (), TryParse () dan bahkan ParseExact () - beberapa bug jahat dapat diperkenalkan tanpa menggunakan CultureInfo dengan benar. Itu karena beberapa jiwa miskin di Microsoft, penuh dengan niat baik memutuskan bahwa itu adalah ide yang baik untuk memperlakukan CultureInfo.CurrentCulture sebagai default (itu akan digunakan jika Anda tidak melewati apa pun) - lagi pula ketika seseorang menggunakan ToString ( ) dia ingin menampilkannya kepada pengguna, bukan? Ternyata itu tidak selalu terjadi - misalnya mencoba untuk menyimpan nomor versi aplikasi Anda dalam database dan kemudian mengubahnya menjadi instance dari kelas Versi. Semoga berhasil.
Tanggal dan zona waktu
Pastikan untuk selalu menyimpan dan membuatkan DateTime dalam UTC (gunakan DateTime. Bukan sebaliknya DateTime. Sekarang). Konversikan ke waktu lokal dalam format lokal setelah ditampilkan:
Jika Anda perlu mengirim email dengan referensi waktu di badan, pastikan untuk memasukkan informasi zona waktu - termasuk offset UTC dan daftar kota:
Pesan majemuk
Anda sudah diperingatkan untuk tidak menggabungkan string. Sebagai gantinya Anda mungkin akan menggunakan String.Format () seperti yang ditunjukkan di atas. Namun, saya harus menyatakan bahwa Anda harus meminimalkan penggunaan pesan majemuk. Itu hanya karena aturan tata bahasa target sangat umum berbeda, sehingga penerjemah mungkin perlu tidak hanya memesan ulang kalimat (ini akan diselesaikan dengan menggunakan placeholder dan String.Format ()), tetapi menerjemahkan seluruh kalimat dengan cara yang berbeda berdasarkan pada apa yang akan diganti. Biarkan saya memberi Anda beberapa contoh:
Masalah penggabungan lainnya
Rangkaian tidak terbatas pada string. Hindari meletakkan kontrol bersama, katakan:
Ingatkan saya lagi dalam [kotak teks dengan angka] hari.
Ini harus dirancang ulang untuk sesuatu seperti: Ingatkan saya lagi dalam beberapa hari ini: [kotak teks].
Pengodean karakter dan font
Selalu simpan, transfer, teks apa pun dalam Unicode (yaitu dalam UTF-8). Jangan font kode keras - Lokalisasi mungkin perlu memodifikasinya dan itu akan mematikan mekanisme default font fall-back (dalam kasus WinForms). Ingatlah untuk mengizinkan karakter "aneh" di sebagian besar bidang (yaitu nama pengguna).
Uji
Anda mungkin perlu menerapkan apa yang disebut terjemahan semu, yaitu menciptakan sumber daya untuk mengatakan budaya Jerman dan menyalin string bahasa Inggris Anda menambahkan awalan dan akhiran. Anda juga dapat membungkus penampung agar mudah mendeteksi string majemuk. Tujuan dari terjemahan semu adalah untuk mendeteksi masalah Pelokalan seperti string yang dikodekan keras, masalah tata letak, dan penggunaan berlebihan pesan majemuk.
sumber
String.Format
sehingga dapat mendukung sintaks keren ini:"There {0:was|were} {0} {0:virus|viruses} found."
Setiap bahasa dapat memuat aturannya sendiri, sehingga Anda bisa melakukannya"Znaleziono {0} {0:wirusy|wirusów}."
Sumbernya ada di GitHub: github.com/scottrippey/SmartFormat/wiki"{0} {0:plik|pliki|plików}"
. Formatter memiliki aturan Polandia yang menentukan mana dari 3 formulir yang akan digunakan, dan dengan benar menentukan kasus khusus. Saat ini saya sedang berupaya menambahkan lebih banyak aturan, sehinggagettext
artikel ini akan terbukti sangat berguna, terima kasih.Beberapa hal dasar yang harus Anda perhitungkan:
Eksternalisasikan semua sumber daya string
Semua sumber daya Anda harus terkandung dalam file eksternal yang dapat diserahkan untuk pelokalan. Jangan lupa tentang pesan kesalahan, jika Anda ingin ini dilokalkan juga.
Berikan ruang yang cukup untuk ekspansi string
String dalam beberapa bahasa cenderung hingga 30% lebih lama (seperti bahasa Yunani) misalnya, jadi pastikan Anda mendesain UI Anda sedemikian rupa sehingga string dapat diperluas jika perlu. Berikut ini contoh yang agak ekstrem untuk bahasa Prancis:
Saya sarankan melakukan semacam terjemahan semu sebagai titik awal ( http://en.wikipedia.org/wiki/Pseudolocalization ). Atau Anda dapat menerjemahkan sumber daya Anda melalui Google Translate atau Bing. Ini akan memberi Anda indikasi yang baik tentang seperti apa terjemahan yang sebenarnya akan terlihat.
Perhatikan teks dalam gambar
Jika Anda menggunakan gambar apa pun dalam aplikasi Anda - pastikan tidak mengandung teks apa pun - ini jelas tidak dapat diterjemahkan.
Jangan pernah menyandikan jalur apa pun ke folder Windows
Jelas, tapi saya pernah melihatnya di masa lalu. Misalnya,
C:\Program Files
diterjemahkan pada beberapa versi internasional Windows, mis. ItuC:\Programme
pada OS Jerman.Hindari penggunaan istilah khusus lokal
Misalnya, jika Anda meminta seseorang untuk 'SMA' mereka pada formulir, ini memiliki sedikit makna di Eropa Barat.
Hindari membuat string melalui penggabungan string
Sebagai contoh, ini terlihat tidak berbahaya:
Tapi, urutan kata dalam bahasa Jepang misalnya akan berbeda, jadi ini mungkin tidak masuk akal.
Pengaturan Waktu / Tanggal
Selalu pastikan untuk mendapatkan format waktu / tanggal dari OS.
sumber
Pertimbangan Khusus untuk Bahasa Asia
Selain semua jawaban hebat yang sudah ada di sini, beberapa peringatan untuk bahasa Asia:
Waspadalah terhadap panjang teks yang berbeda
Teks bahasa Cina dan Korea cenderung jauh lebih pendek daripada teks bahasa Inggris yang setara (karena Anda biasanya membutuhkan lebih sedikit karakter untuk menulis hal yang sama), jadi sebuah halaman mungkin terlihat kosong dalam bahasa Cina tetapi penuh dalam bahasa Jerman ... Anda harus melakukan beberapa ukuran dinamis di sini agar terlihat bagus.
Namun, teks Jepang biasanya cenderung lebih lama, bahkan lebih lama daripada teks bahasa Inggris yang setara dalam hal jumlah karakter.
Waspadalah terhadap tata letak dasar dan tampilan "slide"
Karakter Asia biasanya diletakkan pada garis dasar , yang tidak termasuk keturunan (yaitu bagian bawah dari y, g, q, j dll.) Ketika Anda memformat elemen layar - biasanya tombol - dengan teks di dalamnya, dan jika itu teks hanya bahasa Asia (yaitu tidak ada huruf Barat), maka teks akan terlihat seperti digeser ke atas.
Memformat angka dan unit numerik lokal
Menangani pemformatan angka secara berbeda. Negara-negara Asia yang berbeda memiliki cara yang berbeda dalam memformat angka. Sama dengan mata uang. Sebagai contoh, di Asia Timur, 10.000 (wan) adalah unit umum. Di India, 100.000 (lakh) adalah umum.
Mata uang lokal
Mata uang beberapa negara memiliki banyak nol dan tidak ada titik desimal (misalnya Jepang, Indonesia, Italia), sementara yang lain memiliki hingga dua digit setelah titik desimal.
Waspadai urutan kata yang berbeda
Urutan kata mungkin tidak selalu sama. Yang terbaik untuk dilakukan adalah menggunakan {0}, {1} dll dalam pemformatan string alih-alih urutan kata hard-coding jika string Anda berasal dari kombinasi berbagai bagian data.
Gunakan jenis spesifik lokal
Penyortiran berbeda per bahasa dan per lokal - Anda harus selalu bergantung pada penyortiran khusus lokal O / S.
Berhati-hatilah dengan karakter lebar-lebar / setengah-lebar
Waspadalah terhadap perbedaan antara karakter "lebar penuh" dan "setengah lebar". Kurung, tanda baca dll. Dapat memiliki versi "lebar penuh" yang berbeda dari ASCII standar. Jika Anda melakukan pencarian atau pemisahan string berdasarkan huruf-huruf ini, Anda harus terlebih dahulu mengonversi semua simbol lebar penuh menjadi setara setengah lebar.
Titik bukanlah titik ... koma bukan koma ...
Waspadai input data yang didapat - misalnya, dalam bahasa Cina, titik bukanlah titik ".". Koma adalah lebar penuh, bukan ",". Jangan mencoba mencari tanda baca barat jika pengguna yang melakukan entri data mungkin secara tidak sengaja mengaktifkan IME bahasa Asia.
Nomor telepon
Jangan menganggap apa pun dalam pemformatan nomor telepon. Tidak selalu ada kode area dll dan dapat diformat berbeda. Biasanya, memiliki format string per negara.
Jangan menganggap orang hanya akan memiliki satu nomor ponsel, atau satu nomor faks, dll. Ini tidak seperti ini di Asia.
Alamat - lebih padat dari yang Anda kira
Untuk alamat, jangan menganggap apa pun . Mungkin tidak selalu ada kode pos. Kode pos mungkin tidak selalu berupa angka. Suatu negara mungkin tidak memiliki provinsi / negara bagian. Suatu negara mungkin hanya kota besar (misalnya Singapura). Untuk negara-negara Asia tertentu, unit terkecil dari rumah mungkin "Kamar X, Unit Y, Bagian Z, Lantai A, Blok B, Grup C, Estate D". Secara umum, bersikaplah sangat liberal dalam jumlah bidang dan jumlah karakter yang diizinkan dalam alamat.
Salam
Salam tidak hanya terbatas pada Bapak, Ibu dll Meskipun Anda mungkin aman dalam menggunakan "M" dan "F" untuk seks - kita tidak yang aneh belum ...
sumber
Beberapa langkah dasar adalah memastikan string apa pun yang ditampilkan di layar bukan literal dalam kode Anda. Jika Anda melakukan Winforms, setiap formulir akan memiliki sumber daya UI. Untuk dialog, laporan dll, pastikan Anda menggunakan file sumber daya proyek.
Jadi, alih-alih "Unggahan gagal" dalam kode Anda, Anda mungkin memiliki sesuatu seperti Resources.UploadFailed
Dengan cara ini Anda dapat membuat file sumber daya baru untuk setiap bahasa yang Anda gunakan (dan. Net akan membantu dengan ini.) Dan memiliki string lokal di setiap file.
EDIT Saya lupa menyebutkan ketika Anda melakukan UI Anda, pastikan Anda tidak hanya menjejalkan hal-hal di sana. Bergantung pada bahasa yang Anda cari, real estat bisa menjadi masalah. Saya bekerja pada sebuah proyek yang menjadikan Jerman dan Portugis sebagai 2 pelanggar terbesar untuk pertumbuhan string. Jika kita tidak berhati-hati dalam bahasa Inggris, Perancis dan Italia akan meledak di Jerman.
sumber
Saya sarankan Anda menjalankan FXCop atau Visual Studio Code Analysis (mereka hampir sama) di majelis Anda.
Mereka pandai mendeteksi .NET code yang tidak menggunakan overload berorientasi kultur yang tepat, seperti ini: CA1305: Tentukan IFormatProvider .
Saya harus menambahkan bahwa alat-alat ini juga membuat frustrasi karena mereka biasanya mendeteksi jutaan masalah dalam kode Anda, tetapi tetap saja, bahkan jika Anda tidak mengikuti setiap aturan, Anda harus belajar banyak.
sumber
Selain spesifik cara memuat sumber daya saya akan memastikan bahwa Anda menguji dengan versi pseudo-lokal untuk memulai. Kalau tidak, Anda tidak akan memperhatikan tempat-tempat di mana pertimbangan internasionalisasi dihilangkan sampai akhir.
sumber
Selain semua petunjuk bermanfaat lainnya, berikut adalah beberapa yang tidak ada:
Mempertimbangkan bahwa beberapa negara menggunakan lebih dari satu bahasa. Misalnya, di Kanada, pengguna berharap dapat dengan mudah beralih antara bahasa Inggris dan Prancis.
Jika Anda mengajukan pertanyaan kepada pengguna yang mengharapkan jawaban satu huruf, jangan berharap pengguna menekan tombol 'Y' untuk mengatakan Ya.
Berhati-hatilah dalam procs Stored bahwa tanggal dalam SQL DB dalam format USA
Menempatkan string teks dalam DB memungkinkan Anda untuk nanti menambahkan bahasa tambahan tanpa menggunakan kembali.
Saat mengirim file teks tertulis untuk terjemahan, selalu sertakan deskripsi konteks untuk memastikan penerjemah memilih kata yang benar. Misalnya tanpa konteks, Anda dapat menerjemahkan "pitch:" menjadi sesuatu yang berkaitan dengan suara atau tempat di mana Anda bermain sepak bola
Label alamat selalu perlu diubah. Provinsi di Kanada, Negara di Amerika, County di Inggris
sumber
Anda perlu mempertimbangkan:
Routing untuk multi bahasa
Pindahkan semua string hardcode ke file sumber daya
Contoh untuk properti:
Model:
Melihat:
sumber
Berikut adalah sesuatu yang tidak disebutkan dalam sisa jawaban.
Bergantung pada kompleksitas aplikasi Anda dan pelokalannya, saya akan sangat menyarankan menerapkan penyedia sumber daya alternatif dan menjaga sumber daya lokal dalam database. Dengan skema lokalisasi ASP.NET default, semua sumber daya disimpan dalam file RESX, yang:
Sebagai kemungkinan penggunaan, pertimbangkan untuk menyediakan paket bahasa untuk aplikasi Anda dan kemampuan untuk mengimpor dan mengekspor bahasa melalui UI. File RESX tidak akan membantu di sini.
Dalam skenario seperti ini penyedia sumber daya alternatif sangat membantu. Info lebih lanjut tentang cara menerapkannya dapat ditemukan di sini . Tentu saja ini adalah kasus yang jarang lebih sering terlihat dalam aplikasi perusahaan, tetapi masih berlaku
sumber
Yang paling penting adalah mengelola konten dalam berbagai bahasa. Saya telah mengembangkan beberapa websistes sendiri dan mengelola konten dalam berbagai bahasa adalah tantangan terbesar.
Saya menggunakan Database untuk menyimpan sumber daya / konten. Ini memberi saya fleksibilitas untuk menambahkan dukungan bahasa apa pun yang saya inginkan. Saya telah menerapkan logika jatuh kembali ke bahasa Inggris jika sumber daya dalam bahasa tertentu tidak ditemukan.
Anda nanti dapat menggunakan penerjemah untuk mengonversi nilai bahasa Inggris ke bahasa apa pun.
sumber
Ringkasan hal-hal yang perlu dipertimbangkan dalam internasionalisasi:
Semua informasi harus diinternasionalkan. Mempertimbangkan bahwa gambar dapat memiliki informasi yang ingin kami internasionalisasi.
Ukuran bidang atau string, tergantung bahasa karena dapat menyebabkan masalah bagi kita.
Urutan kata tergantung pada bahasa kita, jadi urutan dalam satu bahasa akan sama dengan yang lain.
Kita harus memperhitungkan bahwa format tanggal akan berubah dari satu bahasa ke bahasa lain
sumber
Lakukan tes Turki :
Jika situs / program Anda berjalan dengan baik dengan klien Turki, Anda dapat yakin bahwa itu akan berjalan pada sebagian besar platform lain.
sumber