2013-10-10 2 views
0

Как реализовать обнаружение браузера в Magento для загрузки нужного языка.Magento: обнаружение браузера для загрузки правильного языка

Пример: Если США Пользователь серфинг в моем магазин Magento, Magento должен загрузить путь: ..myshop ../ США/ США = Если код филиал японского пользователя серфинг в моем магазин Magento, Magento должны загрузить путь: ..myshop ../ JP/ Jp = и код филиала так далее

Я предполагаю, что я должен адаптировать .htaccess с перезаписи URL-адресов, но я никогда не делал этого раньше. Как мне это сделать?

Как выглядит код обнаружения браузера и где его можно разместить? В header.phtml?

спасибо очень много заранее!

Edit: index.php в CE 1.7.0.2 выглядит как этот

/** 
* Error reporting 
*/ 
error_reporting(E_ALL | E_STRICT); 

/** 
* Compilation includes configuration file 
*/ 
define('MAGENTO_ROOT', getcwd()); 

$compilerConfig = MAGENTO_ROOT . '/includes/config.php'; 
if (file_exists($compilerConfig)) { 
    include $compilerConfig; 
} 

$mageFilename = MAGENTO_ROOT . '/app/Mage.php'; 
$maintenanceFile = 'maintenance.flag'; 

if (!file_exists($mageFilename)) { 
    if (is_dir('downloader')) { 
     header("Location: downloader"); 
    } else { 
     echo $mageFilename." was not found"; 
    } 
    exit; 
} 

if (file_exists($maintenanceFile)) { 
    include_once dirname(__FILE__) . '/errors/503.php'; 
    exit; 
} 

require_once $mageFilename; 

#Varien_Profiler::enable(); 

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) { 
    Mage::setIsDeveloperMode(true); 
} 

#ini_set('display_errors', 1); 

umask(0); 

/* Store or website code */ 
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : ''; 

/* Run store or run website */ 
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store'; 

Mage::run($mageRunCode, $mageRunType); 

Но это Link описывает follwing код, который вы не можете просто заменить:

require_once 'app/Mage.php'; 

/* Determine correct language store based on browser */ 
function getStoreForLanguage() 
{ 
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
     foreach (explode(",", strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $accept) { 
      if (preg_match("!([a-z-]+)(;q=([0-9.]+))?!", trim($accept), $found)) { 
       $langs[] = $found[1]; 
       $quality[] = (isset($found[3]) ? (float) $found[3] : 1.0); 
      } 
     } 
     // Order the codes by quality 
     array_multisort($quality, SORT_NUMERIC, SORT_DESC, $langs); 
     // get list of stores and use the store code for the key 
     $stores = Mage::app()->getStores(false, true); 
     // iterate through languages found in the accept-language header 
     foreach ($langs as $lang) { 
      $lang = substr($lang,0,2); 
      if (isset($stores[$lang]) && $stores[$lang]->getIsActive()) return $stores[$lang]; 
     } 
    } 
    return Mage::app()->getStore(); 
} 

/* Auto redirect to language store view if request is for root */ 
if ($_SERVER['REQUEST_URI'] === '/') { 
    header('Location: '.getStoreForLanguage()->getBaseUrl()); 
    exit; 
} 

#Varien_Profiler::enable(); 

#Mage::setIsDeveloperMode(true); 

#ini_set('display_errors', 1); 

umask(0); 
Mage::run(); 

Может кто-нибудь помочь мне узнать, где его поставить или где можно адаптировать index.php

Еще раз спасибо!

ответ

0

Запрос, отправленный браузером, имеет поле "Accept-Language" header. Это форматирование не настолько интуитивно, и если вы хотите сделать это правильно, это выходит за рамки возможности файла htaccess и mod_rewrite для правильного разбора. Вот типичный «Accept-Language» запрос заголовок:

Accept-Language: da, en-gb;q=0.8, en;q=0.7 

Что означает: «Я предпочитаю датский, но будет принимать британский английский и другие типы английского»

Таким образом, вы не можете просто смотреть за первые две буквы поля. Если у вас нет датского языка, вам нужно продолжить синтаксический анализ, чтобы найти правильный язык. Magento, вероятно, имеет несколько способов борьбы с этим, например: http://www.magentocommerce.com/wiki/multi-store_set_up/how_to_automatically_redirect_to_a_store_view_based_on_the_browser_language

+0

в этой связи пурпурного он не объясняет, куда положить код. Я боюсь, что я переоцениваю то, что мне все еще нужно. Я использую CE 1.7.0.2, поэтому я редактирую свой первоначальный вопрос. Было бы неплохо получить еще один намек, потому что я уже пробовал это, и произошла ошибка. Очевидно, причина, по которой я переписывал smthg, полезный в index.php – furba

0

Просто вставьте следующий код после require_once $mageFilename; в вашем CE 1.7.0.2 index.php:

/* Determine correct language store based on browser */ 
function getStoreForLanguage() 
{ 
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
     foreach (explode(",", strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $accept) { 
      if (preg_match("!([a-z-]+)(;q=([0-9.]+))?!", trim($accept), $found)) { 
       $langs[] = $found[1]; 
       $quality[] = (isset($found[3]) ? (float) $found[3] : 1.0); 
      } 
     } 
     // Order the codes by quality 
     array_multisort($quality, SORT_NUMERIC, SORT_DESC, $langs); 
     // get list of stores and use the store code for the key 
     $stores = Mage::app()->getStores(false, true); 
     // iterate through languages found in the accept-language header 
     foreach ($langs as $lang) { 
      $lang = substr($lang,0,2); 
      if (isset($stores[$lang]) && $stores[$lang]->getIsActive()) return $stores[$lang]; 
     } 
    } 
    return Mage::app()->getStore(); 
} 

/* Auto redirect to language store view if request is for root */ 
if ($_SERVER['REQUEST_URI'] === '/') { 
    header('Location: '.getStoreForLanguage()->getBaseUrl()); 
    exit; 
} 

Убедитесь, что вы не удалять или перезапишите любой код в файле index.php, и все должно быть в порядке!