1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.
Загрузка

1.4.x Auto Language Switcher 1.0

Автоматический выбор языка для гостей

  1. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Пользователь akinak разместил новый ресурс:

    Auto Language Switcher - Автоматический выбор языка для гостей

    Узнать больше об этом ресурсе...
     
    Alex777, fly_indiz, Gatses и 2 другим нравится это.
  2. fly_indiz

    fly_indiz Местный

    Регистрация:
    20.08.11
    Сообщения:
    460
    Симпатии:
    357
    Версия XF:
    1.4.3
    Придумал более интеллектуальный алгоритм для определения языка:
    Дано:
    - список имеющихся на сайте языков: $installedLanguages (с одним дефолтным языком, который будет выбираться в случае ненахождения подходящего)
    - список соответствий родственных языков: $relatedLanguages
    - клиентский $_SERVER["HTTP_ACCEPT_LANGUAGE"] (Например: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4)

    Что делаем:
    1) Разбиваем $_SERVER["HTTP_ACCEPT_LANGUAGE"] в массив по языкам с приоритетами. Далее расширеные языковые обозначения (ru-RU, en-US) обрезаем до простых (ru, en).
    2) Для повторяющихся языков после упрощения берём средне-арифметический приоритет. (В нашем примере для ru получится: 0.9, для en: 0.5) и сортируем языки в порядке убывания приоритета.
    3) Перебираем языки клиента по убыванию приоритета и ищем совпадение из списка установленных на сайте языков. Первое совпадение будет признано победившим языком. Но если для первого по приоритету языка клиента совпадения не нашлось, то будет произведена сверка этого языка со списком родства. В случае если родственный для главного клиентского языка будет найден среди установленных на сайте - то такое совпадение будет признано победившим.
    PHP:
    /**
    * Define installed languages (language => default). Default language are selected if no language match found.
    */
    $installedLanguages = array(
        
    'en' => true,
        
    'ru' => false
    );

    /**
    * Define related languages
    */
    $relatedLanguages = array(
        
    'ru' => array(
            
    'ru' => 1,
            
    'be' => 0.9,
            
    'ua' => 0.8
        
    ),
        
    'en' => array(
            
    'en' => 1
        
    ),
    );
    $relates = array();
    foreach (
    $relatedLanguages as $language => $arrayMatch)
    {
        foreach (
    $arrayMatch as $realLanguage => $priority)
        {
            
    $relates[$realLanguage] = $language ':' $priority;
        }
    }

    /**
    * Get languages array
    */
    $temp1Languages = array();
    $temp2Languages = array();
    if (isset(
    $_SERVER["HTTP_ACCEPT_LANGUAGE"]))
    {
        if (
    $listLanguages strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))
        {
            if (
    preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/'$listLanguages$listLanguages))
            {
                
    $temp1Languages array_combine($listLanguages[1], $listLanguages[2]);
                foreach (
    $temp1Languages as $language => $priorityLanguage)
                {
                    
    $language strtok($language'-');
                    
    $temp2Languages[$language][] = $priorityLanguage $priorityLanguage 1;
                }
            }
            else 
    $temp2Languages = array();
        }
        else 
    $temp2Languages = array();
    }
    else 
    $temp2Languages = array();

    $clientLanguages = array();
    foreach (
    $temp2Languages as $language => $arrayPriority)
    {
        
    $clientLanguages[$language] = array_sum($arrayPriority) / count($arrayPriority);
    }
    arsort($clientLanguagesSORT_NUMERIC);

    /**
    * Get match language
    */
    $matchLanguage '';
    foreach (
    $installedLanguages as $installedLanguage => $defaultLanguage)
    {
        if (
    $defaultLanguage$matchLanguage $installedLanguage;
    }
    $foundMatch false;
    $count 0;
    foreach (
    $clientLanguages as $clientLanguage => $priority)
    {
        
    $count++;
        if (
    $foundMatch) break;
        foreach (
    $installedLanguages as $installedLanguage => $defaultLanguage)
        {
            if (
    $foundMatch) break;
            if (
    $clientLanguage == $installedLanguage)
            {
                
    $foundMatch true;
                
    $matchLanguage $installedLanguage;
                break;
            }
            else if (
    $count == 1)
            {
                foreach (
    $relates as $realLanguage => $relate)
                {
                    
    $relateLanguage strtok($relate':');
                    if (
    $clientLanguage == $realLanguage && $relateLanguage == $installedLanguage)
                    {
                        
    $foundMatch true;
                        
    $matchLanguage $installedLanguage;
                        break;
                    }
                }
            }
        }
    }
     
    Последнее редактирование: 12.09.2015

Поделиться этой страницей