bayrak

PHP ile Tarayıcının Varsayılan Dilini Bulma

Eğer PHP ile çok dilli uygulamalar geliştiriyorsanız, mutlaka $_SERVER[‘HTTP_ACCEPT_LANGUAGE’] sihirli sabitini kullanmak zorunda kalmışsınızdır. Tarayıcılar genellikle aşağıdaki gibi bir sonuç döndüreceklerdir.

tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3

Peki nedir bunun anlamı? Pek çoğumuz aşağıdaki tek satırlık kod ile bu ifadenin ilk iki harfini keser alırız ve ona göre işlem yaparız. Ya bu her zaman geçerli değil ise? veya kullanıcının tarayıcısının dili hakkında daha fazla şey öğrenmek istiyorsak? Ya da ona alternatif bir dil sunacaksak? veya bir dilin farklı coğrefi bölgelerdeki kullanım farklılıklarını ele alacaksak o zaman aşağıdaki kod çok da işimize istediğimiz gibi yaramayacaktır.

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); 

$_SERVER[‘HTTP_ACCEPT_LANGUAGE’]; sorgusunu incelediğimizde farklı tarayıcılarda farklı sonuçlar da alabiliyoruz. Örneğin aşağıda vereceğim tabloda bunu daha açık göreceksiniz.

(Internet Explorer) tr-TR
(Firefox) tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
(Chrome) tr
(Opera) tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
(Safari) tr-TR

Peki Nedir Bunların Anlamı?

Tarayıcılar sunucuya tarayıcının kullanabildiği mevcut dilleri HTTP_ACCEPT_LANGUAGE başlığı ile gönderirler. “tr-TR” ifadesinde “tr” mevcut dili belirtirken, – den sonra gelen “TR” ifadesi ise yerleşim bölgesi olarak ifade edilir. Bunu “en-US” ile “en-CA” arasında daha net görebiliriz. Her iki ifadede de tarayıcının dili “en” yani İngilizce olmakla birlikte, yerleşim bölgeleri ISO formatına göre ilkinde Amerika Birleşik Devletleri diğerinde ise Kanada olarak görülür. İyi buraya kadar anladık da bu “q=” ifadesi ne anlama geliyor diyebilirsiniz. “q” ifadesi veya değeri bize öncelik belirtir. “q” ifadesi mutlaka 0 (sıfır) ile 1 (bir) arasında bir değer almak zorundadır. “xx-XX;q=x” şeklindeki bir ifadede “q=x” değeri ne kadar büyükse varsayılan olarak o kullanılır. Yani “tr-TR;q=0.6,tr;q=0.1,en-US;q=0.8,en;q=0.3” gibi bir ifadede varsayılan dil ne diye sorarsanız burada varsayılan dil “en-US” dur. Çünkü “q” değeri en büyük ifade budur.

“q” değeri verilmemiş ise her zaman 1 (bir) demektir.

Genellikle bütün tarayıcılar “q” ifadesi 1’e eşit olan dil seçeneğini en başa koyarken, bazı tarayıcılar bu konuda çok da hassas davranmayabiliyor. Biz programcılar, kodlama yaparken mutlaka tüm ihtimalleri düşünmeli ve ona göre hareket etmeliyiz. Şu anda mobil cihazlardan, oyun konsolarına, masaüstü tarayıcılardan GoogleBOT gibi örümceklere (crawler) kadar yelpaze çok fazla genişledi. Hepsinin bir standartta hareket ettiğini söylemek malesef imkansız. En basitinden gönderdilleri USER_AGENT değerleri bile bir birinden o kadar farklı ki, bütün tarayıcıları destekleyebilecek tek bir düzenli ifade yazmanız malesef imkansız.  Aşağıda vereceğim örnek fonksiyon belki de konuyu biraz daha anlamanıza, kafanızda kullanım alanları oluşmasına vesile olabilir.

function get_user_lang($http_accept=null,$deflang='en')
{
$http_accept = is_null($http_accept) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : $http_accept;
$x = explode(',',$http_accept);
$lang = array();
foreach ($x as $val)
{
if(preg_match("/(.*);q=([0-1]{0,1}\.\d{0,4})/i",$val,$matches))
{
$lang[$matches[1]] = (float)$matches[2];
} else {
$lang[$val] = 1.0;
}
}

$qval = 0.0;
foreach ($lang as $key => $value) {
if ($value > $qval) {
$qval = (float)$value;
$deflang = $key;
}
}

$dlang = preg_match("/(.*)-(.*)/i",$deflang,$mlang) ? $mlang[1] : $deflang;

return strtolower($dlang);
}
# Kullanimi:
$lang = get_user_lang();
# Geri donen deger
# tr, en, fr, ar, az gibi...

  1 Comment

  1. Pingback: PHP ile Tarayıcının Varsayılan Dilini Alma | Kuaza – Değişik bi şey!

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Güvenlik Kodu * Time limit is exhausted. Please reload CAPTCHA.