Membangun database terjemahan string untuk beberapa proyek (in-house)

9

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.

Mvision
sumber
Ty untuk normalisasi. sebagai q dan a. Saya percaya, github java musim semi akan membantu.
tgkprog

Jawaban:

5

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.

  1. Tulis ulang panggilan terjemahan Anda sehingga membawa ID program kembali ke server

  2. Penerjemah ujung belakang akan meletakkan string dalam tabel database jika belum ada, dan akan menandainya dengan id program

  3. 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).

Jan Doggen
sumber
1
Saya memperbarui pertanyaan saya berdasarkan ide
Mvision
5

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:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

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.

GrandmasterB
sumber
Gagasan untuk memindahkannya ke kelas 'ini' menurut saya bagus, saya pikir saya akan memindahkan nama proyek ke file web / app.config dan membacanya dari sana. Apakah Anda berpikir bahwa ide wild card / project-names scalable hingga sekitar 4000 terjemahan?
Mvision
3
Sebagai perangkat tambahan, pemicu dapat ditambahkan ke database atau DBAL yang memperbarui kolom "program berlangganan" setiap kali kata yang diterjemahkan dibaca.
Bagaimana pemicu basis data bisa mengetahui nama proyek? (Kami menggunakan kerangka kerja entitas 4)
Mvision
@Mvision Saya tidak mengerti mengapa tidak - volume seharusnya tidak menjadi masalah. Jika banyak terjemahan khusus aplikasi hanya menyisipkan nama aplikasi, Anda dapat menggunakan konstanta untuk mengurangi dups juga.
GrandmasterB
nvm saya salah paham. ya pemicu bisa dilakukan, dan akan mempercepat dibandingkan dengan memeriksa dan memperbarui hal-hal itu melalui EF di baca .... panggilan baik
Mvision
1

Jika semua proyek Anda ditulis dalam C #, dan semua panggilan penerjemah terlihat seperti ini

this.Translate("hello-world")

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.

Doc Brown
sumber
Saya dulu suka solusi semacam ini. Tapi itu akan membutuhkan semua 60 proyek (beberapa bahkan bukan milikku) untuk sepenuhnya diuji sebelum pergi ke produksi dengan sistem baru ini. Solusi yang disarankan untuk memindahkan nama proyek ke kode panggilan berfungsi dengan baik dan akan menyebabkan kerumitan yang jauh lebih sedikit, terima kasih!
Mvision
1
@Mvision: Saya pikir yang terjadi adalah yang sebaliknya. Jika Anda menentukan nama proyek untuk terjemahan pada saat dijalankan, Anda harus memastikan setiap halaman web dengan setiap terjemahan untuk semua 60 proyek Anda harus dipanggil sekali untuk memastikan Anda login semuanya. Namun, memindai sumber atau rakitan secara statis, memberi Anda daftar lengkap tanpa perlu pengujian apa pun atau menjalankan keseluruhan sistem.
Doc Brown