Saya telah bergumul dengan pertanyaan ini selama beberapa bulan sekarang, tetapi saya belum pernah berada dalam situasi yang saya perlukan untuk mengeksplorasi semua opsi yang mungkin sebelumnya. Saat ini, saya merasa sudah waktunya untuk mengetahui kemungkinan dan membuat preferensi pribadi saya untuk digunakan dalam proyek mendatang saya.
Biarkan saya membuat sketsa situasi yang saya cari
Saya akan memutakhirkan / mengembangkan kembali sistem manajemen konten yang sudah lama saya gunakan. Namun, saya merasa multi bahasa merupakan perbaikan besar untuk sistem ini. Sebelumnya saya tidak menggunakan kerangka kerja apa pun tetapi saya akan menggunakan Laraval4 untuk proyek yang akan datang. Laravel tampaknya merupakan pilihan terbaik dari cara yang lebih bersih untuk kode PHP. Sidenote: Laraval4 should be no factor in your answer
. Saya mencari cara umum terjemahan yang platform / kerangka kerja independen.
Apa yang harus diterjemahkan
Karena sistem yang saya cari harus semudah mungkin digunakan untuk pengguna, metode untuk mengelola terjemahan harus berada dalam CMS. Seharusnya tidak perlu memulai koneksi FTP untuk memodifikasi file terjemahan atau templat yang diuraikan html / php.
Selain itu, saya mencari cara termudah untuk menerjemahkan beberapa tabel basis data mungkin tanpa perlu membuat tabel tambahan.
Apa yang saya hasilkan dengan diri saya sendiri
Karena saya sudah mencari, membaca, dan mencoba berbagai hal sendiri. Ada beberapa opsi yang saya miliki. Tetapi saya masih merasa belum mencapai metode praktik terbaik untuk apa yang sebenarnya saya cari. Saat ini, inilah yang saya buat, tetapi metode ini juga memiliki efek sampingnya.
- PHP Parsed Templates : sistem template harus diuraikan oleh PHP. Dengan cara ini saya dapat memasukkan parameter yang diterjemahkan ke dalam HTML tanpa harus membuka template dan memodifikasinya. Selain itu, templat PHP yang diurai memberi saya kemampuan untuk memiliki 1 templat untuk situs web lengkap alih-alih memiliki subfolder untuk setiap bahasa (yang pernah saya miliki sebelumnya). Metode untuk mencapai target ini bisa berupa Smarty, TemplatePower, Laravel's Blade atau parser templat lainnya. Seperti yang saya katakan ini harus independen terhadap solusi tertulis.
- Database Driven : mungkin saya tidak perlu menyebutkan ini lagi. Tetapi solusinya harus didorong oleh basis data. CMS ditujukan untuk berorientasi objek dan MVC, jadi saya perlu memikirkan struktur data logis untuk string. Seperti template saya akan terstruktur: template / Controller / view.php mungkin struktur ini akan membuat paling masuk akal:
Controller.View.parameter
. Tabel database akan memiliki bidang ini panjang denganvalue
bidang. Di dalam templat kita bisa menggunakan semacam metode sortirecho __('Controller.View.welcome', array('name', 'Joshua'))
dan parameternya berisiWelcome, :name
. Demikian hasilnyaWelcome, Joshua
. Ini sepertinya cara yang baik untuk melakukan ini, karena parameter seperti: nama mudah dimengerti oleh editor. - Beban Basis Data Rendah : Tentu saja sistem di atas akan menyebabkan banyak beban basis data jika string ini sedang dimuat saat bepergian. Oleh karena itu saya memerlukan sistem caching yang merender ulang file bahasa segera setelah diedit / disimpan di lingkungan administrasi. Karena file dihasilkan, tata letak sistem file yang baik juga diperlukan. Saya kira kita bisa pergi dengan
languages/en_EN/Controller/View.php
atau .ini, apa pun yang paling cocok untuk Anda. Mungkin .ini bahkan diurai lebih cepat pada akhirnya. Cetakan ini harus berisi data dalamformat parameter=value;
. Saya kira ini adalah cara terbaik untuk melakukan ini, karena setiap Tampilan yang diberikan dapat menyertakan file bahasa sendiri jika ada. Parameter bahasa kemudian harus dimuat ke tampilan tertentu dan tidak dalam lingkup global untuk mencegah parameter saling menimpa. - Terjemahan Tabel Database : ini sebenarnya adalah hal yang paling saya khawatirkan. Saya sedang mencari cara untuk membuat terjemahan Berita / Halaman / etc. secepat mungkin. Memiliki dua tabel untuk setiap modul (misalnya
News
danNews_translations
) adalah suatu pilihan tetapi rasanya banyak pekerjaan untuk mendapatkan sistem yang baik. Salah satu hal yang saya buat berdasarkan padadata versioning
sistem yang saya tulis: ada satu nama tabel databaseTranslations
, tabel ini memiliki kombinasi uniklanguage
,tablename
danprimarykey
. Misalnya: en_En / Berita / 1 (Mengacu pada versi Bahasa Inggris dari item Berita dengan ID = 1). Tetapi ada 2 kerugian besar untuk metode ini: pertama-tama tabel ini cenderung menjadi cukup panjang dengan banyak data dalam database dan yang kedua adalah pekerjaan yang berat untuk menggunakan pengaturan ini untuk mencari tabel. Misalnya mencari seong SEO dari item akan menjadi pencarian teks lengkap, yang cukup bodoh. Tetapi di sisi lain: ini adalah cara cepat untuk membuat konten yang dapat diterjemahkan di setiap tabel dengan sangat cepat, tapi saya tidak percaya pro ini melebihi con. - Pekerjaan Front-end : Front-end juga membutuhkan pemikiran. Tentu saja kami akan menyimpan bahasa yang tersedia dalam database dan (de) aktifkan yang kami butuhkan. Dengan cara ini skrip dapat menghasilkan dropdown untuk memilih bahasa dan back-end dapat memutuskan secara otomatis terjemahan apa yang dapat dibuat menggunakan CMS. Bahasa yang dipilih (misalnya en_EN) kemudian akan digunakan ketika mendapatkan file bahasa untuk tampilan atau untuk mendapatkan terjemahan yang tepat untuk item konten di situs web.
Jadi, itulah mereka. Ide saya sejauh ini. Mereka bahkan tidak menyertakan opsi pelokalan untuk tanggal dll, tetapi karena server saya mendukung PHP5.3.2 + pilihan terbaik adalah dengan menggunakan ekstensi intl seperti yang dijelaskan di sini: http://devzone.zend.com/1500/internationalization-in -php-53 / - tapi ini akan berguna di stadium pengembangan selanjutnya. Untuk saat ini masalah utamanya adalah bagaimana mendapatkan praktik terbaik penerjemahan konten di situs web.
Selain semua yang saya jelaskan di sini, saya masih memiliki hal lain yang belum saya putuskan, sepertinya pertanyaan sederhana, tetapi sebenarnya itu membuat saya sakit kepala:
Terjemahan URL? Haruskah kita melakukan ini atau tidak? dan dengan cara apa?
Jadi .. jika saya memiliki url ini: http://www.domain.com/about-us
dan bahasa Inggris adalah bahasa default saya. Haruskah URL ini diterjemahkan http://www.domain.com/over-ons
ketika saya memilih bahasa Belanda sebagai bahasa saya? Atau haruskah kita menempuh jalan yang mudah dan cukup mengubah konten halaman yang terlihat di /about
. Hal terakhir sepertinya bukan pilihan yang valid karena itu akan menghasilkan beberapa versi dari URL yang sama, pengindeksan konten ini akan gagal dengan cara yang benar.
Pilihan lain adalah menggunakan http://www.domain.com/nl/about-us
. Ini menghasilkan setidaknya URL unik untuk setiap konten. Juga ini akan lebih mudah untuk pergi ke bahasa lain, misalnya http://www.domain.com/en/about-us
dan URL yang disediakan lebih mudah dipahami untuk Google dan pengunjung Manusia. Dengan menggunakan opsi ini, apa yang kita lakukan dengan bahasa default? Haruskah bahasa default menghapus bahasa yang dipilih secara default? Jadi mengalihkan http://www.domain.com/en/about-us
ke http://www.domain.com/about-us
... Di mata saya ini adalah solusi terbaik, karena ketika CMS diatur hanya untuk satu bahasa tidak perlu memiliki identifikasi bahasa ini di URL.
Dan opsi ketiga adalah kombinasi dari kedua opsi: menggunakan "bahasa-identifikasi-kurang" -URL ( http://www.domain.com/about-us
) untuk bahasa utama. Dan gunakan URL dengan slug SEO yang diterjemahkan untuk bahasa lain: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Saya harap pertanyaan saya membuat kepala Anda retak, mereka retak saya pasti! Memang sudah membantu saya untuk menyelesaikan masalah sebagai pertanyaan di sini. Memberi saya kemungkinan untuk meninjau metode yang saya gunakan sebelumnya dan ide yang saya miliki untuk CMS mendatang.
Saya ingin mengucapkan terima kasih sudah meluangkan waktu untuk membaca teks ini!
// Edit #1
:
Saya lupa menyebutkan: fungsi __ () adalah alias untuk menerjemahkan string yang diberikan. Dalam metode ini jelas harus ada semacam metode mundur di mana teks default dimuat ketika belum ada terjemahan yang tersedia. Jika terjemahannya hilang maka harus dimasukkan atau file terjemahan harus dibuat ulang.
sumber
Jawaban:
Premis topik
Ada tiga aspek berbeda dalam situs multibahasa:
Sementara mereka semua saling berhubungan dengan cara yang berbeda, dari sudut pandang CMS mereka dikelola menggunakan elemen UI yang berbeda dan disimpan secara berbeda. Anda tampaknya percaya diri dalam implementasi dan pemahaman Anda tentang dua yang pertama. Pertanyaannya adalah tentang aspek yang terakhir - "Penerjemahan URL? Haruskah kita melakukan ini atau tidak? Dan dengan cara apa?"
Dari mana URL bisa dibuat?
Hal yang sangat penting adalah, jangan membiasakan diri dengan IDN . Alih-alih mendukung transliterasi (juga: transkripsi dan romanisasi). Meskipun sekilas IDN tampaknya menjadi opsi yang layak untuk URL internasional, sebenarnya IDN tidak berfungsi seperti yang diiklankan karena dua alasan:
'ч'
atau'ž'
menjadi'%D1%87'
dan'%C5%BE'
Saya benar-benar mencoba pendekatan IDN beberapa tahun yang lalu dalam proyek berbasis Yii (framework mengerikan, IMHO). Saya menemui kedua masalah yang disebutkan di atas sebelum mengikis solusi itu. Juga, saya menduga itu mungkin vektor serangan.
Opsi yang tersedia ... seperti yang saya lihat.
Pada dasarnya Anda memiliki dua pilihan, yang dapat disarikan sebagai:
http://site.tld/[:query]
: di mana[:query]
menentukan pilihan bahasa dan kontenhttp://site.tld/[:language]/[:query]
: di mana[:language]
bagian dari URL menentukan pilihan bahasa dan[:query]
hanya digunakan untuk mengidentifikasi kontenKueri adalah Α dan Ω ..
Katakanlah Anda memilih
http://site.tld/[:query]
.Dalam hal ini Anda memiliki satu sumber bahasa utama: konten
[:query]
segmen; dan dua sumber tambahan:$_COOKIE['lang']
untuk browser tertentuPertama, Anda harus mencocokkan kueri dengan salah satu pola perutean yang ditentukan (jika pilihan Anda adalah Laravel, lalu baca di sini ). Pada pencocokan pola yang berhasil, Anda perlu menemukan bahasa.
Anda harus melewati semua segmen pola. Temukan terjemahan potensial untuk semua segmen tersebut dan tentukan bahasa mana yang digunakan. Dua sumber tambahan (cookie dan header) akan digunakan untuk menyelesaikan konflik routing, ketika (bukan "jika") mereka muncul.
Ambil contoh:
http://site.tld/blog/novinka
.Itu transliterasi
"блог, новинка"
, yang dalam bahasa Inggris berarti sekitar"blog", "latest"
.Seperti yang sudah Anda perhatikan, dalam bahasa Rusia "блог" akan ditransliterasikan sebagai "blog". Yang berarti bahwa untuk bagian pertama dari
[:query]
Anda (dalam skenario kasus terbaik ) akan berakhir dengan['en', 'ru']
daftar bahasa yang mungkin. Kemudian Anda mengambil segmen berikutnya - "novinka". Yang mungkin hanya memiliki satu bahasa pada daftar kemungkinan:['ru']
.Ketika daftar memiliki satu item, Anda telah berhasil menemukan bahasa.
Tetapi jika Anda berakhir dengan 2 (contoh: Rusia dan Ukraina) atau lebih banyak kemungkinan .. atau 0 kemungkinan, sebagai kasus mungkin. Anda harus menggunakan cookie dan / atau header untuk menemukan opsi yang benar.
Dan jika semuanya gagal, Anda memilih bahasa default situs.
Bahasa sebagai parameter
Alternatifnya adalah menggunakan URL, yang dapat didefinisikan sebagai
http://site.tld/[:language]/[:query]
. Dalam hal ini, ketika menerjemahkan kueri, Anda tidak perlu menebak bahasa, karena pada saat itu Anda sudah tahu mana yang harus digunakan.Ada juga sumber bahasa kedua: nilai cookie. Tetapi di sini tidak ada gunanya mengacaukan tajuk Bahasa Terima, karena Anda tidak berurusan dengan jumlah bahasa yang tidak diketahui dalam kasus "cold start" (ketika pengguna pertama kali membuka situs dengan permintaan khusus).
Alih-alih, Anda memiliki 3 opsi sederhana yang diprioritaskan:
[:language]
segmen diatur, gunakan itu$_COOKIE['lang']
diatur, gunakan ituKetika Anda memiliki bahasa, Anda hanya mencoba menerjemahkan kueri, dan jika terjemahan gagal, gunakan "nilai default" untuk segmen tertentu (berdasarkan hasil routing).
Bukankah ini opsi ketiga?
Ya, secara teknis Anda dapat menggabungkan kedua pendekatan, tapi itu akan mempersulit proses dan hanya menampung orang-orang yang ingin URL perubahan secara manual dari
http://site.tld/en/news
untukhttp://site.tld/de/news
dan mengharapkan halaman berita perubahan ke Jerman.Tetapi bahkan kasus ini kemungkinan dapat dikurangi dengan menggunakan nilai cookie (yang akan berisi informasi tentang pilihan bahasa sebelumnya), untuk diterapkan dengan sedikit sihir dan harapan.
Pendekatan mana yang digunakan?
Seperti yang mungkin sudah Anda duga, saya akan merekomendasikan
http://site.tld/[:language]/[:query]
sebagai opsi yang lebih masuk akal.Juga dalam situasi kata sebenarnya Anda akan memiliki bagian utama ke-3 di URL: "title". Seperti dalam nama produk di toko online atau judul artikel di situs berita.
Contoh:
http://site.tld/en/news/article/121415/EU-as-global-reserve-currency
Dalam hal ini
'/news/article/121415'
akan menjadi permintaan, dan'EU-as-global-reserve-currency'
judul is. Murni untuk keperluan SEO.Bisakah itu dilakukan di Laravel?
Agak, tapi tidak secara default.
Saya tidak terlalu terbiasa dengan itu, tetapi dari apa yang saya lihat, Laravel menggunakan mekanisme routing berbasis pola sederhana. Untuk menerapkan URL multibahasa, Anda mungkin harus memperluas kelas inti , karena perutean multibahasa membutuhkan akses ke berbagai bentuk penyimpanan (database, cache dan / atau file konfigurasi).
Itu dialihkan. Apa sekarang?
Sebagai hasilnya, Anda akan mendapatkan dua informasi berharga: bahasa saat ini dan segmen kueri yang diterjemahkan. Nilai-nilai ini kemudian dapat digunakan untuk mengirim ke kelas yang akan menghasilkan hasilnya.
Pada dasarnya, URL berikut:
http://site.tld/ru/blog/novinka
(atau versi tanpa'/ru'
) diubah menjadi sesuatu sepertiYang hanya Anda gunakan untuk pengiriman:
.. atau beberapa variasi dari itu, tergantung pada implementasi tertentu.
sumber
Menerapkan i18n Tanpa Kinerja Hit Menggunakan Pre-Processor seperti yang disarankan oleh Thomas Bley
Di tempat kerja, kami baru-baru ini menerapkan i18n pada beberapa properti kami, dan salah satu hal yang terus kami perjuangkan adalah kinerja yang hebat dalam menangani terjemahan on-the-fly, kemudian saya menemukan posting blog yang hebat ini oleh Thomas Bley yang menginspirasi cara kami menggunakan i18n untuk menangani beban lalu lintas besar dengan masalah kinerja minimal.
Alih-alih memanggil fungsi untuk setiap operasi terjemahan, yang seperti yang kita tahu di PHP mahal, kami mendefinisikan file dasar kami dengan placeholder, kemudian menggunakan pra-prosesor untuk menyimpan file-file tersebut (kami menyimpan waktu modifikasi file untuk memastikan kami melayani konten terbaru setiap saat).
Tag Terjemahan
Thomas menggunakan
{tr}
dan{/tr}
menandai untuk menentukan dari mana awal dan akhir terjemahan. Karena kami menggunakan TWIG, kami tidak ingin menggunakan{
untuk menghindari kebingungan sehingga kami menggunakan[%tr%]
dan[%/tr%]
sebaliknya. Pada dasarnya, ini terlihat seperti ini:Perhatikan bahwa Thomas menyarankan menggunakan bahasa Inggris dasar dalam file. Kami tidak melakukan ini karena kami tidak ingin harus memodifikasi semua file terjemahan jika kami mengubah nilainya dalam bahasa Inggris.
File INI
Kemudian, kami membuat file INI untuk setiap bahasa, dalam format
placeholder = translated
:Itu akan sepele untuk memungkinkan pengguna untuk memodifikasi ini di dalam CMS, hanya mendapatkan keypairs dengan
preg_split
pada\n
atau=
dan membuat CMS mampu menulis ke file INI.Komponen Pra-Prosesor
Pada dasarnya, Thomas menyarankan menggunakan 'kompiler' tepat waktu (meskipun, sebenarnya, ini adalah preprosesor) berfungsi seperti ini untuk mengambil file terjemahan Anda dan membuat file PHP statis pada disk. Dengan cara ini, kami pada dasarnya menyimpan file yang diterjemahkan alih-alih memanggil fungsi terjemahan untuk setiap string dalam file:
Catatan: Saya tidak memverifikasi bahwa regex berfungsi, saya tidak menyalinnya dari server perusahaan kami, tetapi Anda dapat melihat bagaimana operasi bekerja.
Cara Menyebutnya
Sekali lagi, contoh ini dari Thomas Bley, bukan dari saya:
Kami menyimpan bahasa dalam cookie (atau variabel sesi jika kami tidak bisa mendapatkan cookie) dan kemudian mengambilnya pada setiap permintaan. Anda dapat menggabungkan ini dengan
$_GET
parameter opsional untuk mengganti bahasa, tetapi saya tidak menyarankan subdomain-per-bahasa atau halaman-per-bahasa karena itu akan mempersulit untuk melihat halaman mana yang populer dan akan mengurangi nilai inbound tautan karena Anda akan lebih jarang menyebar.Mengapa menggunakan metode ini?
Kami menyukai metode preprocessing ini karena tiga alasan:
Mendapatkan Konten Database yang Diterjemahkan
Kami hanya menambahkan kolom untuk konten dalam basis data kami yang disebut
language
, kemudian kami menggunakan metode accessor untukLANG
konstanta yang kami definisikan sebelumnya, sehingga panggilan SQL kami (menggunakan ZF1, sayangnya) terlihat seperti ini:Artikel kami memiliki kunci primer senyawa lebih
id
danlanguage
jadi artikel54
bisa eksis dalam semua bahasa.LANG
Default kami adalahen_US
jika tidak ditentukan.Terjemahan Slug URL
Saya akan menggabungkan dua hal di sini, satu adalah fungsi di bootstrap Anda yang menerima
$_GET
parameter untuk bahasa dan mengabaikan variabel cookie, dan yang lainnya adalah routing yang menerima banyak siput. Maka Anda dapat melakukan sesuatu seperti ini di perutean:Ini dapat disimpan dalam file datar yang dapat dengan mudah ditulis dari panel admin Anda. JSON atau XML dapat memberikan struktur yang baik untuk mendukung mereka.
Catatan Mengenai Beberapa Pilihan Lain
Penerjemahan On-The-Fly berbasis PHP
Saya tidak dapat melihat bahwa ini menawarkan keunggulan dibandingkan terjemahan yang sudah diproses.
Terjemahan Berbasis Front-end
Saya sudah lama menemukan ini menarik, tetapi ada beberapa peringatan. Misalnya, Anda harus menyediakan bagi pengguna seluruh daftar frasa di situs web yang ingin Anda terjemahkan, ini bisa bermasalah jika ada area situs yang Anda sembunyikan atau tidak mengizinkan mereka mengaksesnya.
Anda juga harus berasumsi bahwa semua pengguna Anda bersedia dan dapat menggunakan Javascript di situs Anda, tetapi dari statistik saya, sekitar 2,5% dari pengguna kami berjalan tanpa itu (atau menggunakan Noscript untuk memblokir situs kami agar tidak menggunakannya) .
Terjemahan Berbasis Database
Kecepatan konektivitas basis data PHP bukan apa-apa untuk dituliskan di rumah, dan ini menambah biaya panggilan yang sudah tinggi pada setiap frase untuk diterjemahkan. Masalah kinerja & skalabilitas tampak luar biasa dengan pendekatan ini.
sumber
Why?
: simple .. Saya ingin tidak ingin repot dengan sedikit perubahan dalam teks, pengguna harus dapat melakukannya sendiri tanpa menggunakan editor kode dan / atau program ftp :).INI
file dengan tabel database 3-kolom denganplaceholder
,replacement
,language
. Tombol majemuk aktifplaceholder
danlanguage
. Kemudian miliki 2-col lain dengantempfile
(path to templat) danmodified
(DATETIME).Saya sarankan Anda untuk tidak menciptakan roda dan menggunakan daftar singkatan bahasa gettext dan ISO. Pernahkah Anda melihat bagaimana i18n / l10n diimplementasikan dalam CMS atau kerangka kerja populer?
Menggunakan gettext Anda akan memiliki alat yang ampuh di mana banyak kasus sudah diimplementasikan seperti bentuk angka jamak. Dalam bahasa Inggris Anda hanya memiliki 2 pilihan: tunggal dan jamak. Tetapi dalam bahasa Rusia misalnya ada 3 bentuk dan tidak sesederhana dalam bahasa Inggris.
Juga banyak penerjemah yang sudah memiliki pengalaman untuk bekerja dengan gettext.
Lihatlah CakePHP atau Drupal . Keduanya multibahasa diaktifkan. CakePHP sebagai contoh pelokalan antarmuka dan Drupal sebagai contoh terjemahan konten.
Untuk l10n menggunakan basis data sama sekali tidak terjadi. Ini akan menjadi ton pada permintaan. Pendekatan standar adalah untuk mendapatkan semua data l10n dalam memori pada tahap awal (atau selama panggilan pertama ke fungsi i10n jika Anda lebih suka malas memuat). Itu bisa membaca dari file .po atau dari DB semua data sekaligus. Dan daripada hanya membaca string yang diminta dari array.
Jika Anda perlu mengimplementasikan alat online untuk menerjemahkan antarmuka, Anda dapat memiliki semua data dalam DB tetapi daripada menyimpan semua data ke file untuk bekerja dengannya. Untuk mengurangi jumlah data dalam memori, Anda dapat membagi semua pesan / string yang diterjemahkan ke dalam grup dan hanya memuat grup yang Anda perlukan jika memungkinkan.
Jadi Anda benar-benar tepat di # 3 Anda. Dengan satu pengecualian: biasanya itu adalah satu file besar bukan file per-controller atau lebih. Karena kinerja terbaik untuk membuka satu file. Anda mungkin tahu bahwa beberapa aplikasi web dengan beban tinggi mengkompilasi semua kode PHP dalam satu file untuk menghindari operasi file ketika menyertakan / mengharuskan dipanggil.
Tentang URL. Google secara tidak langsung menyarankan untuk menggunakan terjemahan:
Juga saya pikir Anda perlu mengarahkan pengguna ke awalan bahasa default mis. Http://examlpe.com/about-us akan dialihkan ke http://examlpe.com/en/about-us Tetapi jika situs Anda hanya menggunakan satu bahasa, maka Anda tidak perlu awalan sama sekali.
Lihat: http://www.audiomicro.com/trailer-hit-impact-psychodrama-sound-effects-836925 http://nl.audiomicro.com/aanhangwagen-hit-effect-psychodrama-geluidseffecten-836925 http: / /de.audiomicro.com/anhanger-hit-auswirkungen-psychodrama-sound-effekte-836925
Menerjemahkan konten adalah tugas yang lebih sulit. Saya pikir ini akan menjadi beberapa perbedaan dengan berbagai jenis konten misalnya artikel, item menu dll. Tapi di # 4 Anda berada di jalan yang benar. Lihatlah Drupal untuk memiliki lebih banyak ide. Ini memiliki skema DB yang cukup jelas dan antarmuka yang cukup baik untuk menerjemahkan. Seperti Anda membuat artikel dan memilih bahasa untuknya. Dan kemudian Anda bisa menerjemahkannya ke bahasa lain.
Saya pikir itu tidak masalah dengan siput URL. Anda bisa membuat tabel terpisah untuk siput dan itu akan menjadi keputusan yang tepat. Juga menggunakan indeks yang tepat itu tidak masalah untuk query tabel bahkan dengan sejumlah besar data. Dan itu bukan pencarian teks lengkap tetapi pencocokan string jika akan menggunakan tipe data varchar untuk slug dan Anda dapat memiliki indeks pada bidang itu juga.
PS Maaf, bahasa Inggris saya jauh dari sempurna.
sumber
Itu tergantung pada seberapa banyak konten yang dimiliki situs web Anda. Pada awalnya saya menggunakan database seperti semua orang lain di sini, tetapi bisa memakan waktu untuk membuat skrip semua cara kerja dari database. Saya tidak mengatakan bahwa ini adalah metode yang ideal dan terutama jika Anda memiliki banyak teks, tetapi jika Anda ingin melakukannya dengan cepat tanpa menggunakan database, metode ini bisa berfungsi, Anda tidak dapat mengizinkan pengguna untuk memasukkan data yang akan digunakan sebagai file terjemahan. Tetapi jika Anda menambahkan terjemahan sendiri, itu akan berhasil:
Katakanlah Anda memiliki teks ini:
Anda dapat memasukkan ini dalam database dengan terjemahan, tetapi Anda juga dapat melakukan ini:
Sekarang, jika situs web Anda menggunakan cookie, Anda memiliki ini sebagai contoh:
Untuk membuatnya lebih mudah, mari kita transformasikan dalam kode yang dapat dengan mudah digunakan:
Jika bahasa cookie Anda adalah bahasa Wales dan Anda memiliki kode ini:
Hasilnya adalah:
Jika Anda perlu menambahkan banyak terjemahan untuk situs web Anda dan database terlalu banyak, menggunakan array bisa menjadi solusi yang ideal.
sumber
lang.en.php
yang disertakan dan menggunakan$lang['welcome']
yang dinyatakan dalam setiap file.Saya akan menyarankan Anda untuk tidak benar-benar bergantung pada database untuk terjemahan, itu bisa benar-benar tugas yang berantakan dan bisa menjadi masalah ekstrim dalam hal pengkodean data.
Saya telah menghadapi masalah yang sama beberapa waktu lalu dan menulis kelas berikut untuk menyelesaikan masalah saya
Objek: Lokal \ Lokal
Pemakaian
Bagaimana itu bekerja
{a:1}
diganti dengan argumen 1 yang diteruskan ke metodeLocale::translate('key_name','arg1')
{a:2}
diganti dengan argumen 2 yang diteruskan ke metodeLocale::translate('key_name','arg1','arg2')
Cara kerja deteksi
geoip
diinstal maka akan mengembalikan kode negara olehgeoip_country_code_by_name
dan jika geoip tidak diinstal fallback keHTTP_ACCEPT_LANGUAGE
headersumber
utf8_general_ci
collation adalah cara yang tepat untuk melakukannya.Hanya sebuah sub jawaban: Benar-benar menggunakan url yang diterjemahkan dengan pengenal bahasa di depannya: http://www.domain.com/nl/over-ons
Solusi Hybride cenderung rumit, jadi saya akan tetap menggunakannya. Mengapa? Karena url sangat penting untuk SEO.
Tentang terjemahan db: Apakah jumlah bahasa lebih atau kurang tetap? Atau lebih tepatnya tidak terduga dan dinamis? Jika sudah diperbaiki, saya hanya akan menambahkan kolom baru, jika tidak pergi dengan beberapa tabel.
Tetapi secara umum, mengapa tidak menggunakan Drupal? Saya tahu semua orang ingin membangun CMS mereka sendiri karena lebih cepat, lebih ramping, dll. Tapi itu hanya ide yang buruk!
sumber
Saya tidak akan berusaha untuk memperbaiki jawaban yang sudah diberikan. Alih-alih, saya akan memberi tahu Anda tentang cara kerangka kerja OOP PHP saya sendiri menangani terjemahan.
Secara internal, kerangka kerja saya menggunakan kode seperti en, fr, es, cn dan sebagainya. Array menampung bahasa yang didukung oleh situs web: array ('en', 'fr', 'es', 'cn') Kode bahasa dilewatkan melalui $ _GET (lang = fr) dan jika tidak lulus atau tidak valid, itu diatur ke bahasa pertama dalam array. Jadi kapan saja selama eksekusi program dan dari awal, bahasa saat ini dikenal.
Sangat berguna untuk memahami jenis konten yang perlu diterjemahkan dalam aplikasi yang khas:
1) pesan kesalahan dari kelas (atau kode prosedural) 2) pesan non-kesalahan dari kelas (atau kode prosedural) 3) konten halaman (biasanya disimpan dalam database) 4) string seluruh situs (seperti nama situs web) 5) skrip- string spesifik
Tipe pertama mudah dimengerti. Pada dasarnya, kita berbicara tentang pesan seperti "tidak dapat terhubung ke database ...". Pesan-pesan ini hanya perlu dimuat ketika kesalahan terjadi. Kelas manajer saya menerima panggilan dari kelas lain dan menggunakan informasi yang diteruskan sebagai parameter hanya pergi ke folder kelas yang relevan dan mengambil file kesalahan.
Jenis pesan kesalahan kedua lebih seperti pesan yang Anda dapatkan ketika validasi formulir salah. ("Anda tidak dapat meninggalkan ... kosong" atau "silakan pilih kata sandi dengan lebih dari 5 karakter"). String perlu dimuat sebelum kelas dijalankan. Saya tahu apa itu
Untuk konten halaman yang sebenarnya, saya menggunakan satu tabel per bahasa, setiap tabel diawali oleh kode untuk bahasa tersebut. Jadi en_content adalah tabel dengan konten bahasa Inggris, es_content adalah untuk spanyol, cn_content untuk China dan fr_content adalah barang Prancis.
Jenis string keempat relevan di seluruh situs web Anda. Ini dimuat melalui file konfigurasi bernama menggunakan kode untuk bahasa, yaitu en_lang.php, es_lang.php dan sebagainya. Dalam file bahasa global Anda perlu memuat bahasa yang diterjemahkan seperti array ('Inggris', 'Cina', 'Spanyol', 'Prancis') dalam file global dan array ('Anglais', 'Chinois', ' Espagnol ',' Francais ') dalam file Prancis. Jadi ketika Anda mengisi dropdown untuk pemilihan bahasa, itu dalam bahasa yang benar;)
Akhirnya Anda memiliki string khusus skrip. Jadi, jika Anda menulis aplikasi memasak, mungkin "oven Anda tidak cukup panas".
Dalam siklus aplikasi saya, file bahasa global dimuat terlebih dahulu. Di sana Anda akan menemukan tidak hanya string global (seperti "Situs Web Jack") tetapi juga pengaturan untuk beberapa kelas. Pada dasarnya segala sesuatu yang bergantung pada bahasa atau budaya. Beberapa string di sana termasuk topeng untuk tanggal (MMDDYYYY atau DDMMYYYY), atau Kode Bahasa ISO. Dalam file bahasa utama, saya menyertakan string untuk kelas-kelas individual karena jumlahnya sangat sedikit.
File bahasa kedua dan terakhir yang dibaca dari disk adalah file bahasa skrip. lang_en_home_welcome.php adalah file bahasa untuk skrip home / welcome. Script didefinisikan oleh mode (rumah) dan tindakan (selamat datang). Setiap skrip memiliki folder sendiri dengan file config dan lang.
Script menarik konten dari database yang menamai tabel konten seperti yang dijelaskan di atas.
Jika terjadi kesalahan, manajer tahu di mana mendapatkan file kesalahan yang tergantung pada bahasa. File itu hanya dimuat jika ada kesalahan.
Jadi kesimpulannya jelas. Pikirkan masalah terjemahan sebelum Anda mulai mengembangkan aplikasi atau kerangka kerja. Anda juga membutuhkan alur kerja pengembangan yang menggabungkan terjemahan. Dengan kerangka kerja saya, saya mengembangkan seluruh situs dalam bahasa Inggris dan kemudian menerjemahkan semua file yang relevan.
Hanya kata terakhir yang cepat tentang cara penerapan string terjemahan. Kerangka kerja saya memiliki satu global, manajer $, yang menjalankan layanan yang tersedia untuk layanan lain. Jadi misalnya layanan formulir mendapatkan layanan html dan menggunakannya untuk menulis html. Salah satu layanan di sistem saya adalah layanan penerjemah. $ translator-> set ($ service, $ code, $ string) menetapkan string untuk bahasa saat ini. File bahasa adalah daftar pernyataan seperti itu. $ translator-> get ($ service, $ code) mengambil string terjemahan. $ Code dapat berupa angka seperti 1 atau string seperti 'no_connection'. Tidak ada bentrokan antara layanan karena masing-masing memiliki namespace sendiri di area data penerjemah.
Saya memposting ini di sini dengan harapan ini akan menyelamatkan seseorang dari tugas menciptakan kembali roda seperti yang harus saya lakukan beberapa tahun yang lalu.
sumber
Saya memiliki masalah yang sama beberapa waktu lalu, sebelum mulai menggunakan kerangka kerja Symfony .
Cukup gunakan fungsi __ () yang memiliki arameters pageId (atau objectId, objectTable dijelaskan dalam # 2), bahasa target dan parameter opsional bahasa fallback (default). Bahasa default dapat diatur dalam beberapa konfigurasi global untuk memiliki cara yang lebih mudah untuk mengubahnya nanti.
Untuk menyimpan konten dalam database saya menggunakan struktur berikut: (pageId, bahasa, konten, variabel).
pageId akan menjadi FK ke halaman yang ingin Anda terjemahkan. jika Anda memiliki objek lain, seperti berita, galeri atau apa pun, hanya membaginya menjadi 2 bidang objectId, objectTable.
bahasa - jelas itu akan menyimpan string bahasa ISO EN_en, LT_lt, EN_us dll.
konten - teks yang ingin Anda terjemahkan bersama dengan wildcard untuk penggantian variabel. Contoh "Halo mr. %% nama %%. Saldo akun Anda adalah %% saldo %%."
variabel - variabel yang dikodekan json. PHP menyediakan fungsi untuk menguraikannya dengan cepat. Contoh "nama: Laurynas, saldo: 15,23".
Anda sebutkan juga bidang siput. Anda dapat dengan bebas menambahkannya ke tabel ini hanya untuk memiliki cara cepat untuk mencarinya.
Panggilan basis data Anda harus dikurangi seminimal mungkin dengan menyalin terjemahan. Itu harus disimpan dalam array PHP, karena itu adalah struktur tercepat dalam bahasa PHP. Bagaimana Anda akan membuat cache ini terserah Anda. Dari pengalaman saya, Anda harus memiliki folder untuk setiap bahasa yang didukung dan array untuk setiap pageId. Cache harus dibangun kembali setelah Anda memperbarui terjemahan. HANYA array yang diubah harus dibuat ulang.
saya pikir saya menjawab itu di # 2
ide Anda sangat logis. ini cukup sederhana dan saya pikir tidak akan membuat Anda masalah.
URL harus diterjemahkan menggunakan siput yang tersimpan di tabel terjemahan.
Kata-kata terakhir
itu selalu baik untuk meneliti praktik terbaik, tetapi jangan menemukan kembali roda. hanya mengambil dan menggunakan komponen dari kerangka kerja yang terkenal dan menggunakannya.
lihat komponen terjemahan Symfony . Ini bisa menjadi basis kode yang baik untuk Anda.
sumber
Saya telah mengajukan beberapa pertanyaan yang berhubungan dengan diri saya sendiri, kemudian tersesat dalam bahasa formal ... tetapi hanya untuk membantu Anda sedikit, saya ingin berbagi beberapa temuan:
Saya merekomendasikan untuk melihat CMS lanjutan
Typo3
untukPHP
(saya tahu ada banyak hal tapi itu yang saya pikir paling matang)Plone
diPython
Jika Anda mengetahui bahwa web pada tahun 2013 seharusnya berfungsi berbeda, mulailah dari awal. Itu berarti mengumpulkan tim yang terdiri dari orang-orang yang sangat terampil / berpengalaman untuk membangun CMS baru. Mungkin Anda ingin melihat polimer untuk tujuan itu.
Jika menyangkut coding dan situs web multibahasa / dukungan bahasa asli, saya pikir setiap programmer harus memiliki petunjuk tentang unicode. Jika Anda tidak tahu unicode Anda pasti akan mengacaukan data Anda. Jangan pergi dengan ribuan kode ISO. Mereka hanya akan menghemat memori. Tetapi Anda dapat melakukan segalanya dengan UTF-8 bahkan menyimpan karakter Cina. Tetapi untuk itu Anda harus menyimpan karakter 2 atau 4 byte yang menjadikannya utf-16 atau utf-32.
Jika ini tentang penyandian URL, sekali lagi di sana Anda tidak boleh mencampur penyandian dan menyadari bahwa setidaknya untuk nama domain ada aturan yang ditentukan oleh lobi berbeda yang menyediakan aplikasi seperti browser. misalnya Domain bisa sangat mirip seperti:
ьankofamerica.com atau bankofamerica.com samesamebutdifferent;)
Tentu saja Anda membutuhkan sistem file untuk bekerja dengan semua penyandian. Kelebihan lainnya untuk unicode menggunakan sistem file utf-8.
Jika ini tentang terjemahan, pikirkan tentang struktur dokumen. mis. buku atau artikel. Anda memiliki
docbook
spesifikasi untuk memahami tentang struktur itu. Tetapi dalam HTML itu hanya tentang blok konten. Jadi, Anda ingin memiliki terjemahan pada level itu, juga pada level halaman web atau level domain. Jadi, jika tidak ada blok, maka tidak ada di sana, jika halaman web tidak ada, Anda akan diarahkan ke tingkat navigasi atas. Jika suatu domain harus sepenuhnya berbeda dalam struktur navigasi, maka .. itu adalah struktur yang sama sekali berbeda untuk dikelola. Ini sudah bisa dilakukan dengan Typo3.Jika ini tentang kerangka kerja, yang paling matang yang saya tahu, untuk melakukan hal-hal umum seperti MVC (kata kunci saya sangat membencinya! Seperti "kinerja" Jika Anda ingin menjual sesuatu, gunakan kata kinerja dan featureerich dan Anda menjual ... apa sih)
Zend
. Telah terbukti menjadi hal yang baik untuk membawa standar ke coders php chaos. Tapi, typo3 juga memiliki Framework selain CMS. Baru-baru ini telah dibangun kembali dan disebut flow3 sekarang. Kerangka kerja tentu saja mencakup abstraksi basis data, templating dan konsep untuk caching, tetapi memiliki kekuatan individu.Jika ini tentang caching ... itu bisa sangat rumit / berlapis-lapis. Dalam PHP Anda akan berpikir tentang accellerator, opcode, tetapi juga html, httpd, mysql, xml, css, js ... segala jenis cache. Tentu saja beberapa bagian harus di-cache dan bagian dinamis seperti jawaban blog seharusnya tidak. Beberapa harus diminta melalui AJAX dengan url yang dihasilkan. JSON, hashbangs dll.
Kemudian, Anda ingin memiliki komponen kecil di situs web Anda untuk diakses atau dikelola hanya oleh pengguna tertentu , sehingga secara konseptual yang memainkan peran besar.
Anda juga ingin membuat statistik , mungkin telah mendistribusikan sistem / facebook facebook dll. Setiap perangkat lunak yang akan dibangun di atas Anda di atas cms ... jadi Anda perlu berbagai jenis database di memori, bigdata, xml, apa pun .
baik, saya pikir itu cukup untuk saat ini. Jika Anda belum pernah mendengar tentang salah ketik / plone atau kerangka kerja yang disebutkan, Anda sudah cukup belajar. Di jalur itu Anda akan menemukan banyak solusi untuk pertanyaan yang belum Anda tanyakan.
Jika menurut Anda, mari buat CMS baru karena 2013 dan phpnya akan mati, maka Anda dipersilakan untuk bergabung dengan grup pengembang lain semoga tidak tersesat.
Semoga berhasil!
Dan btw. bagaimana dengan orang-orang yang tidak memiliki situs web lagi di masa depan? dan kita semua akan berada di google +? Saya harap pengembang menjadi sedikit lebih kreatif dan melakukan sesuatu yang bermanfaat (agar tidak berasimilasi dengan borgle)
//// Edit /// Hanya sedikit pemikiran untuk aplikasi yang ada:
Jika Anda memiliki php mysql CMS dan Anda ingin menyematkan dukungan multilang. Anda bisa menggunakan tabel Anda dengan kolom tambahan untuk bahasa apa pun atau menyisipkan terjemahan dengan id objek dan id bahasa di tabel yang sama atau membuat tabel identik untuk bahasa apa pun dan menyisipkan objek di sana, lalu membuat gabungan pilih jika Anda ingin agar semuanya ditampilkan. Untuk database gunakan utf8 general ci dan tentu saja di depan / backend gunakan utf8 text / encoding. Saya telah menggunakan segmen jalur url untuk url seperti yang sudah Anda jelaskan
domain.org/en/about Anda dapat memetakan ID lang ke tabel konten Anda. lagi pula Anda harus memiliki peta parameter untuk url Anda sehingga Anda ingin menentukan parameter yang akan dipetakan dari pathsegment di URL Anda yang akan menjadi eg
domain.org/en/about/employees/IT/administrators/
konfigurasi pencarian
pageid | url
1 | /about/employees/../ ..
1 | /../tentang/karyawan../../
parameter peta ke url pathsegment ""
per mengatakan, itu sudah dibahas di posisi atas.
Dan jangan lupa, Anda harus "menulis ulang" url ke file php penghasil Anda yang dalam banyak kasus adalah index.php
sumber
Pekerjaan basis data:
Buat Tabel Bahasa 'bahasa':
Bidang:
Buat tabel di 'konten' database:
Bidang:
Pekerjaan Front End:
Ketika pengguna memilih bahasa apa saja dari dropdown atau area mana pun, maka simpan id bahasa yang dipilih dalam sesi seperti,
$_SESSION['language']=1;
Sekarang ambil data dari 'database' tabel database berdasarkan id bahasa yang disimpan dalam sesi.
Detail dapat ditemukan di sini http://skillrow.com/multilingual-website-in-php-2/
sumber
Sebagai orang yang tinggal di Quebec di mana hampir semua situs berbahasa Perancis dan Inggris ... saya telah mencoba banyak plugin multi-bahasa untuk WP ... jika tidak, satu-satunya solusi yang bermanfaat yang bekerja dengan semua situs saya adalah mQtranslate ... aku hidup dan mati bersamanya!
https://wordpress.org/plugins/mqtranslate/
sumber
Bagaimana dengan WORDPRESS +
MULTI-LANGUAGE SITE BASIS
(plugin)? situs akan memiliki struktur:Plugin ini menyediakan Antarmuka untuk Terjemahan semua frasa, dengan logika sederhana:
maka dapat di-output:
echo translate('my_title', LNG); // LNG is auto-detected
ps Namun, periksa, apakah plugin masih aktif.
sumber
Opsi yang sangat sederhana yang berfungsi pada situs web mana pun tempat Anda dapat mengunggah Javascript adalah www.multilingualizer.com
Ini memungkinkan Anda menempatkan semua teks untuk semua bahasa ke satu halaman dan kemudian menyembunyikan bahasa yang tidak perlu dilihat pengguna. Bekerja dengan baik.
sumber