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:
- Menghubungkan lokal ('Inggris', 'Belanda', dll) dengan istilah, dan memiliki istilah penghubung batu rosetta, dan istilah dalam bahasa tertentu.
- 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):
* 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/
sumber
<?php echo $term['term_in_english'];?>
saya berusaha keras untuk pendekatan MVC yang solid.Jawaban:
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.
Di pre-.NET kami, kami memiliki rutin yang melakukan penyisipan sehingga frasa akan terlihat seperti ini:
Ini jelas hanya akan digunakan dalam kode Anda
<%= String.Format(phrase, username, points); %>
atau miripYang 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:
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.
sumber
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.
sumber
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.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
sumber