Saya menggunakan skrip PHP berikut sebagai indeks untuk situs web saya.
Skrip ini harus menyertakan halaman tertentu tergantung pada bahasa browser (terdeteksi secara otomatis).
Script ini tidak bekerja dengan baik dengan semua browser, jadi selalu termasuk index_en.php
untuk bahasa yang terdeteksi (penyebab masalah kemungkinan besar adalah masalah dengan beberapa header Bahasa Terima yang tidak dipertimbangkan).
Bisakah Anda menyarankan saya solusi yang lebih kuat?
<?php
// Open session var
session_start();
// views: 1 = first visit; >1 = second visit
// Detect language from user agent browser
function lixlpixel_get_env_var($Var)
{
if(empty($GLOBALS[$Var]))
{
$GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
$GLOBALS['_SERVER'][$Var] : (!empty($GLOBALS['HTTP_SERVER_VARS'][$Var])) ? $GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
}
}
function lixlpixel_detect_lang()
{
// Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
lixlpixel_get_env_var('HTTP_ACCEPT_LANGUAGE');
lixlpixel_get_env_var('HTTP_USER_AGENT');
$_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
$_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);
// Try to detect Primary language if several languages are accepted.
foreach($GLOBALS['_LANG'] as $K)
{
if(strpos($_AL, $K)===0)
return $K;
}
// Try to detect any language if not yet detected.
foreach($GLOBALS['_LANG'] as $K)
{
if(strpos($_AL, $K)!==false)
return $K;
}
foreach($GLOBALS['_LANG'] as $K)
{
//if(preg_match("/[[( ]{$K}[;,_-)]/",$_UA)) // matching other letters (create an error for seo spyder)
return $K;
}
// Return default language if language is not yet detected.
return $GLOBALS['_DLANG'];
}
// Define default language.
$GLOBALS['_DLANG']='en';
// Define all available languages.
// WARNING: uncomment all available languages
$GLOBALS['_LANG'] = array(
'af', // afrikaans.
'ar', // arabic.
'bg', // bulgarian.
'ca', // catalan.
'cs', // czech.
'da', // danish.
'de', // german.
'el', // greek.
'en', // english.
'es', // spanish.
'et', // estonian.
'fi', // finnish.
'fr', // french.
'gl', // galician.
'he', // hebrew.
'hi', // hindi.
'hr', // croatian.
'hu', // hungarian.
'id', // indonesian.
'it', // italian.
'ja', // japanese.
'ko', // korean.
'ka', // georgian.
'lt', // lithuanian.
'lv', // latvian.
'ms', // malay.
'nl', // dutch.
'no', // norwegian.
'pl', // polish.
'pt', // portuguese.
'ro', // romanian.
'ru', // russian.
'sk', // slovak.
'sl', // slovenian.
'sq', // albanian.
'sr', // serbian.
'sv', // swedish.
'th', // thai.
'tr', // turkish.
'uk', // ukrainian.
'zh' // chinese.
);
// Redirect to the correct location.
// Example Implementation aff var lang to name file
/*
echo 'The Language detected is: '.lixlpixel_detect_lang(); // For Demonstration
echo "<br />";
*/
$lang_var = lixlpixel_detect_lang(); //insert lang var system in a new var for conditional statement
/*
echo "<br />";
echo $lang_var; // print var for trace
echo "<br />";
*/
// Insert the right page iacoording with the language in the browser
switch ($lang_var){
case "fr":
//echo "PAGE DE";
include("index_fr.php");//include check session DE
break;
case "it":
//echo "PAGE IT";
include("index_it.php");
break;
case "en":
//echo "PAGE EN";
include("index_en.php");
break;
default:
//echo "PAGE EN - Setting Default";
include("index_en.php");//include EN in all other cases of different lang detection
break;
}
?>
php
cross-browser
browser-detection
GibboK
sumber
sumber
locale_accept_from_http()
yang mendapatkan bahasa pilihan dariAccept-Language
header. Anda harus selalu memilih metode ini daripada metode yang ditulis sendiri. Periksa hasilnya terhadap daftar ekspresi reguler yang Anda coba dan tentukan bahasa halaman seperti itu. Lihat PHP-I18N sebagai contoh.locale_accept_from_http()
adalah bahwa Anda mungkin tidak mendukung hasil terbaik yang dikembalikan sehingga Anda masih memiliki penguraian header untuk menemukan yang terbaik berikutnya .Jawaban:
mengapa Anda tidak menjaganya agar tetap sederhana dan bersih
sumber
nl
), Yunani (el
) dan Slovenia (sl
) semuanya nampak dua huruf: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspxpl
prioritas pertama danfr
kedua dalam daftar bahasa saya? Saya akan mendapatkan bahasa Inggris alih-alih bahasa Prancis.Bahasa Terima adalah daftar nilai tertimbang (lihatparameter q ). Itu berarti hanya dengan melihat bahasa pertama tidak berarti itu juga yang paling disukai; pada kenyataannya,nilai q dari 0 berarti tidak dapat diterima sama sekali.
Jadi, alih-alih hanya melihat bahasa pertama, parsing daftar bahasa yang diterima dan bahasa yang tersedia dan temukan yang paling cocok:
Jika
findMatches
mengembalikan array kosong, tidak ada kecocokan yang ditemukan dan Anda dapat kembali menggunakan bahasa default.sumber
q
diputuskan? Terima kasihJawaban yang ada agak terlalu bertele-tele jadi saya membuat versi yang lebih kecil dan sesuai otomatis.
Dan penggunaan sampel:
Sumber inti lengkap di sini
sumber
Cara resmi untuk menangani ini adalah menggunakan perpustakaan HTTP PECL . Tidak seperti beberapa jawaban di sini, ini dengan benar menangani prioritas bahasa (nilai-q), kecocokan sebagian bahasa dan akan mengembalikan kecocokan terdekat, atau ketika tidak ada kecocokan, kembali ke bahasa pertama dalam larik Anda.
PECL HTTP:
http://pecl.php.net/package/pecl_http
Cara menggunakan:
http://php.net/manual/fa/function.http-negotiate-language.php
sumber
Masalah dengan jawaban yang dipilih di atas adalah bahwa pengguna mungkin memiliki pilihan pertama mereka ditetapkan sebagai bahasa yang tidak ada dalam struktur kasus, tetapi salah satu dari pilihan bahasa lainnya ditetapkan. Anda harus mengulang sampai menemukan kecocokan.
Ini adalah solusi super sederhana yang berfungsi lebih baik. Browser mengembalikan bahasa sesuai urutan preferensi, sehingga menyederhanakan masalah. Sementara penunjuk bahasa dapat lebih dari dua karakter (misalnya - "EN-US"), biasanya dua yang pertama sudah cukup. Dalam contoh kode berikut ini saya mencari kecocokan dari daftar bahasa yang dikenal oleh program saya.
Saya harap Anda menemukan ini solusi cepat dan sederhana yang dapat Anda gunakan dengan mudah dalam kode Anda. Saya sudah menggunakan ini dalam produksi untuk sementara waktu.
sumber
q
nilai untuk menentukan preferensi, itulah yang menurut spec harus Anda lakukan.Coba yang ini:
sumber
[0-1]{0,1}.\d{0,4}
? Pertama saya kira maksud Anda\.
bukan.
benar? Dan bukankah q selalu dalam bentuk0.1324
atau sesuatu? Bukankah itu sudah cukup untuk menulis0\.?\d{0,4}
? Jika sudah,q=1.0
Anda bisa masuk ke bagian lain.var_dump( getDefaultLanguage());
Skrip berikut adalah versi modifikasi dari kode Xeoncross (terima kasih untuk Xeoncross itu) yang mundur ke pengaturan bahasa default jika tidak ada bahasa yang cocok dengan yang didukung, atau jika kecocokan ditemukan itu menggantikan pengaturan bahasa default dengan yang baru sesuai dengan prioritas bahasa.
Dalam skenario ini, browser pengguna diatur dalam urutan prioritas ke Spanyol, Belanda, Inggris AS dan Inggris dan aplikasi hanya mendukung bahasa Inggris dan Belanda tanpa variasi regional dan bahasa Inggris adalah bahasa default. Urutan nilai dalam string "HTTP_ACCEPT Westph" tidak penting jika karena alasan tertentu browser tidak memesan nilai dengan benar.
sumber
Saya pikir cara terbersih adalah ini!
sumber
Semua hal di atas dengan fallback ke 'en':
... atau dengan fallback bahasa default dan array bahasa yang dikenal:
Satu baris:
Contoh:
sumber
Mencoba,
Terimakasih untuk
sumber
Cepat dan sederhana:
CATATAN: Kode bahasa pertama adalah apa yang digunakan oleh browser, sisanya adalah bahasa lain yang telah diatur pengguna di browser.
Beberapa bahasa memiliki kode wilayah, mis. id-GB, yang lain hanya punya kode bahasa, mis. sk.
Jika Anda hanya ingin bahasa dan bukan wilayah (mis. En, fr, es, dll.), Anda dapat menggunakan:
sumber
Saya punya yang ini, yang menetapkan cookie. Dan seperti yang Anda lihat, pertama-tama memeriksa apakah bahasa tersebut diposting oleh pengguna. Karena bahasa browser tidak selalu menceritakan tentang pengguna.
sumber