Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Situs web multi bahasa praktik terbaik

Premis topik

Ada tiga aspek berbeda dalam situs multibahasa:

  • terjemahan antarmuka
  • konten
  • perutean url

Meskipun semuanya 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 terakhir - "Terjemahan URL? Haruskah kita melakukan ini atau tidak? dan dengan cara apa?"

Terbuat dari apa URL itu?

Hal yang sangat penting adalah, jangan terlalu tertarik dengan IDN . Alih-alih mendukung transliterasi (juga:transkripsi dan romanisasi). Meskipun sekilas IDN tampaknya merupakan opsi yang layak untuk URL internasional, sebenarnya IDN tidak berfungsi seperti yang diiklankan karena dua alasan:

  • beberapa browser akan mengubah karakter non-ASCII seperti 'ч' atau 'ž' ke '%D1%87' dan '%C5%BE'
  • jika pengguna memiliki tema khusus, font tema kemungkinan besar tidak memiliki simbol untuk huruf tersebut

Saya sebenarnya mencoba pendekatan IDN beberapa tahun yang lalu dalam proyek berbasis Yii (kerangka kerja yang mengerikan, IMHO). Saya mengalami kedua masalah yang disebutkan di atas sebelum menggores 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 konten

  • http://site.tld/[:language]/[:query] :di mana [:language] bagian dari URL mendefinisikan pilihan bahasa dan [:query] hanya digunakan untuk mengidentifikasi konten

Kueri adalah dan ..

Katakanlah Anda memilih http://site.tld/[:query] .

Dalam hal ini Anda memiliki satu sumber utama bahasa:konten [:query] segmen; dan dua sumber tambahan:

  • nilai $_COOKIE['lang'] untuk browser tertentu
  • daftar bahasa di header HTTP Accept-Language

Pertama, Anda harus mencocokkan kueri dengan salah satu pola perutean yang ditentukan (jika pilihan Anda adalah Laravel, maka baca di sini ). Pada pencocokan pola yang berhasil, Anda perlu menemukan bahasanya.

Anda harus melalui 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 perutean, ketika (bukan "jika") muncul.

Ambil contoh:http://site.tld/blog/novinka .

Itu transliterasi dari "блог, новинка" , yang dalam bahasa Inggris berarti kurang lebih "blog", "latest" .

Seperti yang sudah Anda perhatikan, dalam bahasa Rusia "блог" akan ditransliterasikan sebagai "blog". Artinya untuk bagian pertama [:query] Anda (dalam skenario kasus terbaik ) akan berakhir dengan ['en', 'ru'] daftar kemungkinan bahasa. Kemudian Anda mengambil segmen berikutnya - "novinka". Itu mungkin hanya memiliki satu bahasa dalam daftar kemungkinan:['ru'] .

Ketika daftar memiliki satu item, Anda telah berhasil menemukan bahasanya.

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, saat menerjemahkan kueri, Anda tidak perlu menebak bahasanya, karena pada saat itu Anda sudah tahu mana yang akan digunakan.

Ada juga sumber bahasa sekunder:nilai cookie. Tapi di sini tidak ada gunanya mengacaukan tajuk Bahasa Terima, karena Anda tidak berurusan dengan jumlah kemungkinan bahasa yang tidak diketahui jika terjadi "awal dingin" (ketika pengguna pertama kali membuka situs dengan kueri khusus).

Sebagai gantinya, Anda memiliki 3 opsi sederhana yang diprioritaskan:

  1. jika [:language] segmen disetel, gunakan
  2. jika $_COOKIE['lang'] sudah diatur, gunakan
  3. gunakan bahasa default

Bila Anda memiliki bahasa, Anda cukup mencoba menerjemahkan kueri, dan jika terjemahan gagal, gunakan "nilai default" untuk segmen tertentu (berdasarkan hasil perutean).

Bukankah ini pilihan ketiga?

Ya, secara teknis Anda dapat menggabungkan kedua pendekatan, tetapi itu akan memperumit proses dan hanya mengakomodasi orang-orang yang ingin mengubah URL http://site.tld/en/news secara manual ke http://site.tld/de/news dan berharap halaman berita berubah ke bahasa Jerman.

Tetapi bahkan kasus ini mungkin dapat dikurangi dengan menggunakan nilai cookie (yang akan berisi informasi tentang pilihan bahasa sebelumnya), untuk diimplementasikan dengan lebih sedikit keajaiban dan harapan.

Pendekatan mana yang digunakan?

Seperti yang mungkin sudah Anda duga, saya akan merekomendasikan http://site.tld/[:language]/[:query] sebagai pilihan yang lebih masuk akal.

Juga dalam situasi kata nyata Anda akan memiliki bagian utama ke-3 di URL:"judul". Seperti 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 kueri, dan 'EU-as-global-reserve-currency' adalah judul. Murni untuk tujuan SEO.

Bisakah itu dilakukan di Laravel?

Agak, tapi tidak secara default.

Saya tidak terlalu mengenalnya, tetapi dari apa yang saya lihat, Laravel menggunakan mekanisme perutean berbasis pola sederhana. Untuk menerapkan URL multibahasa, Anda mungkin harus memperluas kelas inti , karena perutean multibahasa memerlukan akses ke berbagai bentuk penyimpanan (database, cache, dan/atau file konfigurasi).

Ini dialihkan. Bagaimana sekarang?

Sebagai hasil dari semua itu, 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' ) berubah menjadi seperti

$parameters = [
   'language' => 'ru',
   'classname' => 'blog',
   'method' => 'latest',
];

Yang baru saja Anda gunakan untuk pengiriman:

$instance = new {$parameter['classname']};
$instance->{'get'.$parameters['method']}( $parameters );

.. atau beberapa variasinya, tergantung pada implementasi tertentu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Transaksi Codeigniter

  2. Koneksi Jarak Jauh Mysql Ubuntu

  3. Cara mengatur koneksi MySQL jarak jauh

  4. MySQL:Penggunaan fungsi grup tidak valid

  5. Cara Query kolom JSON di MySQL