Di perusahaan kami, kami memiliki tabel terjemahan ms-sql yang sudah ada yang menyimpan string seperti ini:
Id | Key | Language | Value
1 | hello-world | nl-BE | Hallo Wereld
2 | hello-world | en-GB | Hello World
Ada 3 bahasa dalam sistem dan saya berharap ini tumbuh hingga maksimum sekitar 10 di masa depan
Tabel ini dibaca oleh beberapa proyek yang sangat berbeda (sekitar 60 proyek, sebagian besar situs web / aplikasi web dan beberapa layanan web), yang masing-masing membuka koneksi database ke database terjemahan, cache terjemahan
Umpan balik dari para pengembang front-end adalah bahwa UI kami untuk memasukkan atau memodifikasi kelemahan terbesar terjemahan adalah bahwa mereka tidak dapat mengetahui proyek apa yang menggunakan string apa.
Mereka terkadang memodifikasi string tanpa mengetahui bahwa mereka melanggar 7 proyek dengannya.
Sekarang mereka hanya perlu mengetikkan sesuatu seperti this.Translate("Hello World")
dan sistem menangani sisanya.
Saya tentu saja bisa memaksa mereka untuk sesuatu seperti this.Translate("Hello World","AwesomeApplication1")
tetapi sepertinya itu akan memerlukan cukup banyak refactoring di banyak banyak proyek.
Bagaimana Anda menyediakan solusi ini? Bagaimana Anda, sebagai seorang dev, memberikan "nama proyek" untuk terjemahan? Bagaimana Anda menyimpan ini di basis data?
Catatan penting: terjemahan yang digunakan kembali adalah inti dari database terpusat, jadi pelingkupan terjemahan untuk satu proyek dengan pergi
1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2
sebenarnya bukan opsi yang diinginkan.
Saya lebih suka sesuatu seperti:
1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2
atau kunci asing yang setara dengan hanya meletakkan nama-nama di tabel.
MEMPERBARUI
Berdasarkan saran untuk menormalkan database saya telah menemukan sesuatu seperti ini sejauh ini:
//this allows me to distinquish if translations where added by developer or by translator
UPDATE2: menambahkan edmx bukan teks. Jika orang tertarik saya bisa github proyek WCF saya membungkus konsep ini sehingga orang lain dapat menguji dan menggunakannya.
Jawaban:
Catatan awal # 1: Anda tidak memberi tahu kami bagaimana terjemahan dipertahankan saat ini
Catatan awal # 2: Basis data Anda tidak dinormalisasi. Apa pun solusi yang akan Anda ambil, pertama-tama lakukan normalisasi basis data Anda . Anda mengalami masalah pemeliharaan yang mengerikan nanti jika Anda tidak melakukannya sekarang
Inilah yang akan saya lakukan.
Tulis ulang panggilan terjemahan Anda sehingga membawa ID program kembali ke server
Penerjemah ujung belakang akan meletakkan string dalam tabel database jika belum ada, dan akan menandainya dengan id program
Jika string sudah ada, itu hanya akan diperbarui jika id program cocok dengan id program asli yang dengannya string dibuat. Jika tidak, kembalikan pemberitahuan konflik.
Variasi:
Anda dapat menggunakan 'ID pengembang / ID penerjemah' alih-alih ID program. Saya menganggap itu lebih baik karena ada orang yang tahu bahasa asing dan mereka yang berpikir mereka tahu. Hanya grup pertama yang memiliki hak modifikasi.
Anda mungkin ingin menyimpan ID semua program yang menggunakan string di DB, sehingga Anda tahu program mana yang bertentangan.
Anda dapat memperluas 'kepemilikan' ini ke setiap bahasa: satu orang dapat berbahasa Inggris, yang lain Belanda.
Setelah database Anda dinormalkan, Anda menambahkan kompleksitas build seperti "Program A dalam Bahasa 1,2,3; B dalam 3 dan 5"
Saya juga menyarankan Anda menulis program 'pemeliharaan terjemahan' terpisah yang akan menunjukkan kepada Anda terjemahan yang hilang dll. Saya pernah melakukannya dengan otorisasi 2 tingkat: setiap terjemahan harus diperiksa oleh orang kedua (biasanya penutur asli).
sumber
Karena mereka mereferensikan 'ini' ... Anda dapat menetapkan nama proyek satu kali untuk 'ini' (melalui konstruktor, misalnya) dan antarmuka ke fungsi terjemahan tidak akan berubah untuk coders. Di bawah tenda, itu hanya menambahkan nama proyek ke permintaan database. Atau, Anda dapat memberikan 'ini' sarana untuk mengetahui nama proyek sendiri. Ini benar-benar akan tergantung pada bagaimana Anda mengatur kelas Anda.
Untuk penyimpanan, Anda dapat melakukan sesuatu seperti:
Gunakan kartu liar untuk menerapkan terjemahan umum ke semua aplikasi, tetapi nama aplikasi spesifik saat Anda ingin mengganti terjemahan untuk aplikasi tertentu. Ini akan membuat duplikasi turun ke minimum.
Untuk melihat program apa yang menggunakan terjemahan mana, Anda sekarang tahu ini - jika Anda tidak ingin melalui dan mengumpulkan informasi itu secara manual, Anda dapat mencatat permintaan terjemahan.
sumber
Jika semua proyek Anda ditulis dalam C #, dan semua panggilan penerjemah terlihat seperti ini
di mana "hello-world" adalah kunci dalam tabel terjemahan Anda, seharusnya tidak terlalu sulit untuk menulis pemindai kode sumber kecil menggunakan ekspresi reguler untuk menemukan semua panggilan penerjemah dan menetapkan kata kunci nama proyek yang sesuai. Dengan cara ini, Anda tidak perlu mengubah kode atau antarmuka penerjemah yang ada.
Bergantung pada struktur sebenarnya dari program Anda, mungkin juga lebih mudah untuk mengekstrak informasi itu dari kode IL majelis Anda. Saya melakukan sesuatu yang sangat mirip beberapa waktu yang lalu, juga untuk tujuan terjemahan, menggunakan kode contoh ini untuk mengurai majelis.
sumber