Skema multi-bahasa yang sesuai, atau berlebihan?

8

UPDATE 2 : Saya benar-benar akhirnya menggunakan ini, dan itu bagus setelah beberapa tweak. Inilah posting saya pada desain aktualnya, dan sedang beraksi: http://tim.hithlonde.com/2013/lemon-schema-works/

Saya sedang membangun aplikasi web, dan saya ingin mendukung banyak bahasa. Struktur ini memiliki dua komponen:

  1. Menghubungkan lokal ('Inggris', 'Belanda', dll) dengan istilah, dan memiliki istilah penghubung batu rosetta, dan istilah dalam bahasa tertentu.
  2. Pengelompokan istilah per halaman. Saya tidak ingin mengatakan, SELECT term1, term2, dll melalui 30+ persyaratan yang mungkin saya butuhkan pada halaman. Saya ingin bertanya dari halaman mana mereka terhubung.

Berikut adalah struktur tabel yang saya usulkan (perhatikan bahwa semua id memiliki hubungan / indeks di antara mereka untuk membuat kueri yang sangat efisien):

Diagram skema

  * locale
      * id
      * value //English, Deutch, etc//
  * terms
    * id
    * value //In English//
  * page 
    * id
    * value //Think add entry, menu//
  * page_group //group all terms to a page, for easy pulling//
    * id
    * page.id
    * term.id
  * rosetta
    * id
    * locale.id
    * term.id
    * value //french word for amount, description, etc//

Ini akan memungkinkan pertanyaan seperti:

SELECT localization.value,
        terms.value
FROM localization
INNER JOIN terms ON terms.id=localization.termid
INNER JOIN page_group ON page_group.termid=localization.termid
INNER JOIN page ON page.id=page_group.pageid
INNER JOIN locale ON locale.id=localization.localeid
WHERE page.value='add_entry' AND locale.id=custlangid
ORDER BY terms.id

Saya hanya perlu meminta dua item; id bahasa yang saya butuhkan, dan halaman yang saya butuhkan. Itu akan melayani semua istilah, dalam bahasa yang ditentukan, yang merupakan bagian dari kelompok istilah untuk halaman itu.

Saya pikir ini adalah struktur yang sangat bagus, tetapi saya akan sangat menyukai umpan balik.

PEMBARUAN : Untuk memperjelas, kami hanya berbicara tentang pelokalan komponen UI . (label, navigasi, teks bermanfaat) Semua info yang dimasukkan pengguna akan disimpan dalam unicode, bukan dalam skema ini.

UPDATE 2 : Saya sebenarnya menggunakan ini, dan ini bagus. Inilah posting saya tentang desain aktualnya, dan sedang beraksi: http://tim.hithlonde.com/2013/lemon-schema-works/

Tim Habersack
sumber
1
Biasanya (dari apa yang saya lihat) lokalisasi dilakukan melalui template di sisi web. Jenis barang apa yang Anda cari untuk dilokalisasi dari sisi basis data?
Philᵀᴹ
Saya ingin melokalisasi semua label, menu nav, dan teks yang membantu (peringatan, dll) Alasan saya untuk mengambil ini dari db adalah, saya tidak ingin logika itu ada di template saya. Dalam template saya, saya ingin <?php echo $term['term_in_english'];?>saya berusaha keras untuk pendekatan MVC yang solid.
Tim Habersack

Jawaban:

6

Kami telah melakukan banyak hal, dan pengguna (administratif) diizinkan untuk memperbaiki terjemahan secara langsung. (Anda mungkin masih menginginkan lapisan caching, tapi saya benar-benar kecewa dengan mengendarainya dengan database nyata dan bukan file sumber daya - ini memberi Anda banyak daya untuk mencari dan menemukan hal-hal yang perlu diterjemahkan, dll). Saya pikir skema Anda mungkin baik-baik saja, jadi saya akan meneruskan beberapa hal yang kami pelajari dengan harapan itu berguna.

Satu hal yang Anda tinggalkan adalah frasa dengan titik penyisipan. Dalam contoh di bawah ini, urutannya terbalik dan bahasanya masih bahasa Inggris, tetapi ini bisa dengan mudah menjadi dua bahasa yang berbeda - berpura-pura ini hanya dua bahasa yang biasanya meletakkan segala sesuatu dalam urutan yang berbeda.

Hello, <username> you have <x> points!

You've got <x> points to spend, <username>!

Di pre-.NET kami, kami memiliki rutin yang melakukan penyisipan sehingga frasa akan terlihat seperti ini:

Hello, {0:username} you have {1:points} points!

You've got {1:points} points to spend, {0:username}!

Ini jelas hanya akan digunakan dalam kode Anda <%= String.Format(phrase, username, points); %>atau mirip

Yang membantu penerjemah sedikit. Tapi .NET String.FOrmat tidak mendukung komentar dalam format string, sayangnya.

Seperti yang Anda katakan, Anda tidak ingin menangani itu di php Anda dengan kesadaran lokal atau frasa meta.

Jadi yang kami punya adalah tabel frase induk:

fraseid, bahasa Inggris, info tambahan

dan tabel terlokalisasi:

fraseid, localeid, terjemahan

Anda juga berasumsi dengan INNER BERGABUNG bahwa ada versi yang dilokalkan - kami cenderung mengabaikannya sampai diterjemahkan, sehingga kueri Anda akhirnya tidak menghasilkan apa-apa pada awalnya (bahkan default)

Jika terjemahan tidak ada, terjemahan kami menjadi bahasa Inggris, kemudian mundur ke kode yang disediakan (jika database tidak memiliki ID, dan juga jelas dari kode apa pengidentifikasi frasa "TXT_LNG_WRNNG_INV_LOW" sebenarnya mencoba untuk mendapatkan ) - jadi ekuivalen dari kueri ini adalah yang kami gunakan:

SELECT COALESCE(localized.translation, phrase.english, @fallback)
FROM DUAL
LEFT JOIN phrase
    ON phrase.phraseid = @phraseid
LEFT JOIN localized
    ON localized.phraseid = phrase.phraseid
    AND localized.localeid = @localeid

Jelas, Anda mungkin mendapatkan semua hal sekaligus menggunakan sistem halaman Anda.

Kami cenderung untuk tidak menautkan hal-hal ke halaman karena mereka banyak digunakan kembali antara halaman (dan tidak hanya dalam fragmen halaman atau kontrol), tetapi itu tentu saja baik-baik saja.

Dalam hal aplikasi Windows asli kami, kami menggunakan refleksi dan file pemetaan dari kontrol ke tag terjemahan sehingga terjemahan tidak memerlukan kompilasi ulang (di aplikasi pra-. NET kami harus menandai kontrol menggunakan Tag atau khusus lainnya properti). Ini mungkin sedikit lebih bermasalah di PHP atau ASP.NET MVC, tetapi mungkin di ASP.NET di mana ada model halaman sisi server full-blown.

Untuk pengujian, Anda dapat dengan jelas meminta untuk menemukan terjemahan yang hilang dengan sangat mudah. Untuk menemukan tempat yang perlu diberi tag, terjemahkan seluruh kamus frasa menggunakan pig-latin atau Klingon atau semacamnya ganti setiap karakter non-spasi dengan? - Bahasa Inggris harus menonjol dan memberi tahu Anda bahwa beberapa plaintext telanjang telah merangkak ke HTML Anda.

Cade Roux
sumber
Terima kasih untuk ini! Saya belum memikirkan poin penyisipan. Saya tidak percaya aplikasi saya benar-benar akan memilikinya, tetapi ada baiknya untuk diingat. Juga, terima kasih atas komentarnya pada skema. Saya telah melakukan desain DB untuk sementara waktu sekarang, tetapi tanpa set peer yang baik untuk membandingkan catatan, itu membuat saya tidak yakin pada saat saya menuju ke arah yang benar. :)
Tim Habersack
0

Biasanya terjemahan dilakukan oleh perusahaan spesialis eksternal. Karena itu, akan merepotkan untuk mengelola konten yang diterjemahkan di dalam basis data. Mereka lebih baik mengelola file "bundel" atau properti melalui beberapa jenis fitur bahasa yang ditawarkan oleh platform Anda. Untuk mencapai itu, dalam database, Anda cukup menempatkan mnemonic untuk string. Kemudian berdasarkan bahasa yang diinginkan, Anda akan mencari di bundel. misalnya.

Data:
Employee_Status = empl_status.active

language Bundles:
Employee.us:  
  empl_status.active=Active

Employee.es
  empl_status.active=<spanish translation goes here>

To get the localized content:
    String status = getLocalizedContent("Employee","empl_status.active", "us");
    String status = getLocalizedContent("Employee","empl_status.active", "es");
    String status = getLocalizedContent("Employee","empl_status.active");
srini.venigalla
sumber
Saya bingung, karena kita berbicara tentang hal yang sama. Saya akan membangun yang setara dengan Anda getLocalizedContent. Kecuali pada level controller saya akan meminta semua istilah yang terhubung ke halaman, dan bahasa yang saya inginkan. Fungsi itu akan memanggil query yang saya jelaskan di atas, dan mengerjakan beberapa sulap jadi saya mendapatkan array asosiatif kembali, di mana kuncinya akan menjadi mnemonik, dan nilainya akan menjadi istilah. Jumlah istilah UI akan menjadi kecil (<100) jadi saya tidak melihatnya menjadi masalah dalam mengelolanya dalam DB. Saya mungkin akan membangun antarmuka sederhana untuk memasukkan istilah yang diterjemahkan dan bundling halaman.
Tim Habersack
0

Cukup buat 3 tabel

1.) Bahasa Master (LangId, LangName)

2.) Master Sumber Daya (ResourceMasterId, TableId, ColumnId, ColumnName)

3.) Rincian Sumber Daya (ResourceMasterId, LangId, Value)

kunci komposit (ResourceMasterId, LangId) pada Rincian Sumber Daya

Bhavik Jani
sumber