Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выдача страниц на разных языках
 
 автор: Eugene77   (07.09.2007 в 17:50)   письмо автору
 
 

Как в зависимости от предпочтений клиентского браузера выдать ему страницу на английском или на русском, а роботу выдать обе?

   
 
 автор: SHAman   (07.09.2007 в 17:55)   письмо автору
 
   для: Eugene77   (07.09.2007 в 17:50)
 

Парсить заголовки браузера. $_SERVER вам в помощь.

$_SERVER[HTTP_ACCEPT_LANGUAGE]

Поисковики, скорее всего, не указывают этот заголовок. А если и указывают, то представляются в $_SERVER[HTTP_USER_AGENT]

   
 
 автор: Eugene77   (07.09.2007 в 19:35)   письмо автору
 
   для: SHAman   (07.09.2007 в 17:55)
 

>Парсить заголовки браузера. $_SERVER вам в помощь.
>
>
$_SERVER[HTTP_ACCEPT_LANGUAGE]

>Поисковики, скорее всего, не указывают этот заголовок. А если и указывают, то представляются в $_SERVER[HTTP_USER_AGENT]

Я, конечно, догадывался о существовании этих переменных,
но всё равно спасибо за подстрекательство к смелому шагу!

Вопрос имеет немного другой оттенок:
Реально ли начинающему грамотно пропарсить эти заголовки?
Я ведь толком не знаю даже в каком именно разнообразии они могут проявиться.
Может лучше отдать эту работу серверу или как-то скомбинировать, заставить взаимодействовать скрипты и Apachy?
Кажется это задача должна быть из числа стандартных, значит кто-то может знать чёткое
надёжное решение.

   
 
 автор: bronenos   (07.09.2007 в 19:48)   письмо автору
 
   для: Eugene77   (07.09.2007 в 19:35)
 

phpinfo();
найдите там этот заголовок и посмотрите, в каком виде представлено содержимое

   
 
 автор: kasmanaft   (07.09.2007 в 20:05)   письмо автору
 
   для: bronenos   (07.09.2007 в 19:48)
 

Хы.. а просто echo нельзя сделать? :)

   
 
 автор: bronenos   (07.09.2007 в 20:35)   письмо автору
 
   для: kasmanaft   (07.09.2007 в 20:05)
 

можно, но так он помотрит и еще кучу других полезных

   
 
 автор: Eugene77   (07.09.2007 в 20:32)   письмо автору
 
   для: bronenos   (07.09.2007 в 19:48)
 

Я посмотрел уже, но это лишь один частный пример
Придётся мне ссылку Трианона читать

   
 
 автор: Trianon   (07.09.2007 в 19:57)   письмо автору
 
   для: Eugene77   (07.09.2007 в 19:35)
 

http://zeus.sai.msu.ru:7000/nets/semenov/4/45/http4561.shtml
Раздел 13.4. Поле Accept-Language

   
 
 автор: Eugene77   (07.09.2007 в 20:35)   письмо автору
 
   для: Trianon   (07.09.2007 в 19:57)
 

Это я прочитаю,
но меня грызёт вопрос;
может быть я изобретаю велосипед?
Апачи может быть это делает?
Или про Апачи лучше на другом форуме спросить?

   
 
 автор: Trianon   (07.09.2007 в 20:45)   письмо автору
 
   для: Eugene77   (07.09.2007 в 20:35)
 

апач предоставит Вам это поле в массиве переменных окружения.
php - скопирует его в массив $_SERVER

За Вас его никто воспринимать и обрабатывать не станет.

   
 
 автор: Eugene77   (07.09.2007 в 21:28)   письмо автору
 
   для: Trianon   (07.09.2007 в 20:45)
 

У меня просто в голове не укладывается!
Вроде стандартная задача, неужели никто модуля для апача подходящего не
написал?!
Ну ладно...
Буду смотреть как тут парсить.

Хотя всё равно непонятно как роботов от браузеров отличать.
Список браузеров что ли сделать?
А всех остальных - в роботы?
В любом случае спасибо!

   
 
 автор: Trianon   (07.09.2007 в 21:31)   письмо автору
 
   для: Eugene77   (07.09.2007 в 21:28)
 

Может и написал.

   
 
 автор: bronenos   (07.09.2007 в 22:01)   письмо автору
 
   для: Eugene77   (07.09.2007 в 21:28)
 

ну оставляют такие следы как GoogleBot

   
 
 автор: Loki   (12.09.2007 в 15:31)   письмо автору
 
   для: Eugene77   (07.09.2007 в 17:50)
 

А не забанят?
Если выяснится что роботу и клиенту отдают разные страницы...

   
 
 автор: mihdan   (14.09.2007 в 17:35)   письмо автору
 
   для: Loki   (12.09.2007 в 15:31)
 

НЕТ

   
 
 автор: tricket   (14.09.2007 в 20:10)   письмо автору
 
   для: mihdan   (14.09.2007 в 17:35)
 

ну забанить то не забанят... но с СЕО точки зрения лучше так не делать...
поисковые боты обидчивые твари и иногда эмулируют реального пользователя(как браузер стандартный заголовки посылают)...

   
 
 автор: Eugene77   (15.09.2007 в 19:20)   письмо автору
 
   для: tricket   (14.09.2007 в 20:10)
 

А роботы вообще заголовки касательно языка посылают?
Если посылают, то часто ли? Кто-нибудь проверял?

   
 
 автор: ProtoTeeP   (15.09.2007 в 19:54)   письмо автору
 
   для: Eugene77   (15.09.2007 в 19:20)
 

Да сделай простой выбор языка.. =)

   
 
 автор: Unreal   (19.09.2007 в 21:25)   письмо автору
 
   для: Eugene77   (07.09.2007 в 17:50)
 

Роботу выдавать обе нельзя, то что вы хотите таким образом делать называется "клоакинг", то есть браузеру отдаете одну страницу, боту другую, в результате таких действий весь ваш сайт могут забанить. Именно по этой причине боты поисковиков ходят иногда под юзерагентом обычного браузера.

Теперь по сути, мне одно время нужно было быстро реализовать что-то подобное, ниже код, он кривоватый, но в принципе работает. Он проверяет какой язык установлен предпочтительным у пользователя в настройках браузера, если это русский, украинский или беларусский, то ставится кука и пользователю отдается страница на русском, в противном случае на английском.


<?php
class language {
    
    var 
$language;
    
    function 
__construct() {
        
$this->language "en";
    }
    function 
set_cookie($language) {
        
$domain = ($_SERVER['HTTP_HOST'] !== 'localhost') ? $_SERVER['HTTP_HOST'] : false;
        
setcookie('language'$languagetime()+60*60*24*365'/'$domainfalse);
    }
    
    function 
check_cookie() {
        if(isset(
$_COOKIE['language'])) {
            
$cookie $_COOKIE['language'];
            switch (
$cookie) {
                case 
$cookie == "russian":
                    
$this->language "ru";
                    break;
                case 
$cookie == "english":
                    
$this->language "en";
                    break;
                default:
                    
$this->language "en";
                    break;
            }
        } else {
            if (
$this->check_rus_language() !== 0) {
                
$this->set_cookie('russian');
                
$this->language "ru";
            } 
            
$this->set_cookie('english');
            
$this->language "en";
            
$cookie '';
        }
        return 
$cookie;
    }
    
    function 
check_rus_language() {
        if (isset(
$_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            
$accept_lang $_SERVER['HTTP_ACCEPT_LANGUAGE'];
            
$accept_lang trim($accept_lang);
            if (
preg_match("/(be-by|ru|ru-ru|uk-ua)/i"$accept_lang$match)) {
                
$lang $match[0];
            }
        } else {
            
$lang 0;
        }
        return 
$lang;
    }
    
    function 
set_language() {
        
header("http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
        
header('HTTP/1.1 200 OK');
        
$this->set_cookie("english");
    }
    
    function 
defined_language() {
        return 
$this->language;
    }
    
}
?>

   
 
 автор: Eugene77   (03.10.2007 в 16:42)   письмо автору
 
   для: Unreal   (19.09.2007 в 21:25)
 

Спасибо за интересный код!
Однако сама проверка на предпочтения браузера вызывает сомнения.
А что если там много чего написано?
Мне вот что в голову пришло:

    $language='ru';
    $language_value=0;
//Функция определяет предпочтительный язык
//из числа доступных в переменной $present_languages
// Ей и отдаём строку acceptable language

function http_language($http_str){
    global $language;
    global $language_value;
    $present_languages=array('ru','en','fr');
    $l_q=explode(',',$http_str);
    foreach($l_q as $value){
        $q_val=0;
        $l=explode(';',$value);
        if(in_array(trim($l[0]),$present_languages)){
            if(trim($l[1])=='') $q_val=1;
            else{
                $q=explode('=',$l[1]);
                if(trim($q[0])=='q') {$q_val=floatval($q[1]);echo $q_val;}
            }
           }
           if($q_val>$language_value){
               $language=trim($l[0]);
               $language_value=$q_val;
           }
   }
return $language;
}

Посмотрите, пожалуйста, кто соображает, наколько он полноценный, без слабых мест.
В каких случаях он мне выдаст ошибочный результат?

   
 
 автор: Eugene77   (04.10.2007 в 19:17)   письмо автору
 
   для: Eugene77   (03.10.2007 в 16:42)
 

Проблема в том, что я даже потестировать его нормально не могу.
На моих двух браузерах работает,
но разве это показатель?!
Очень хотелось бы мнение ваше услышать,
тем более, что я сильно не уверен в правильности своего понимания
того, что в ссылке Трианона написано.
Что-то не возникло у меня ясной картины от прочитанного.
Вот если бы кто-то простыми словами объяснил...

   
 
 автор: Eugene77   (06.10.2007 в 18:25)   письмо автору
 
   для: Eugene77   (04.10.2007 в 19:17)
 

Ну, если советом помочь не получается, то может быть кто-нибудь скинет мне сюда
образцы строк, которые оставляют ACCEPT_LANGUEGE и.
Ведь если есть доступ к мультиязычному сайту, то насобирать несложно
Штук 100-200 хотя бы разных.
Я сам проверю свою функцию.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования