zgadzam się z użytkownika @ tripleee komentarzu na temat korzystania z nagłówka HTTP zamiast odnośnika swoje IP, które mogą często prowadzić do błędnych wartości lub użytkowników siłą zdalnych serwerów proxy język ustawień oni nie chcą.
Spróbuj kontrolera wtyczki do przekierowywania na podstawie Locale użytkownika podaną przez ich przeglądarki:
<?php
class Application_Plugin_Language extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
/*
// if you add "localization.default_locale = "en_US" to your application.ini, uncomment the following
$config = new Zend_Config($this->getOption('localization'), true);
$loc = (isset($config->default_locale)) ? $config->default_locale : 'en_US';
*/
$module = $request->getModuleName();
if ($module != 'default') return ;
// You can also check a cookie or session value here to see if you can return from the plugin as well
$loc = 'en_US';
Zend_Locale::setDefault($loc);
try {
$locale = new Zend_Locale(Zend_Locale::BROWSER);
} catch (Zend_Locale_Exception $e) {
$locale = new Zend_Locale($loc);
}
$language = $locale->getLanguage(); // e.g. "en", "de", "ru" etc.
$urlHelper = new Zend_Controller_Action_Helper_Url();
$url = $urlHelper->url(array('module' => $language, 'controller' => 'form', 'action' => 'index'));
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$redirector->gotoUrl($url);
}
}
Ta wtyczka będzie przekierować do modułu z nazwą języka opartego na języku ustalonym przez przeglądarkę użytkownika, jeżeli obecnie żądają modułu domyślnego.
Uwaga: ten kod nie sprawdza, czy moduł, do którego następuje przekierowanie, istnieje. Przed przekierowaniem sprawdź, czy język jest obsługiwany.
Można również dodać sprawdzenie pliku cookie lub wartości sesji, która zawiera pożądany język użytkownika i przekierowanie na podstawie tego.
Zarejestruj wtyczki dodając to do application.ini
:
resources.frontController.plugins.language = "Application_Plugin_Language"
Jeśli chcesz przekierować na podstawie kraju, a nie język, a następnie zmienić $language = $locale->getLanguage();
do $region = $locale->getRegion();
nadzieję, że pomoże.
Dlaczego zakładasz, że kraj wskazuje preferowany język? Do tego celu należy użyć nagłówka HTTP "Accept-Language". Kod kraju jest przydatny w przypadku konkretnych krajów, takich jak tabele walut i kodów pocztowych. – tripleee
Lepszym pomysłem jest również, aby nie mieć osobnych katalogów dla każdego języka. Powinieneś używać ccTLD lub zwracać zawartość w poprawnym języku określonym przez 'Accept-Language' przy zachowaniu tego samego schematu URL. –