Estoy usando Symfony 1.2.7. Mi sitio web está en varios idiomas, cada uno de ellos está en un subdominio como en.example.com, es.example.com. Si el usuario entra en example.com, quiero redirigirlo a su idioma. También quiero tener soporte de staging.example.com y redirigir a es.staging.example.com y en.staging.example.com para que pueda probar todo antes de la implementación.Detecta lenguaje y redirige a un subdominio en Symfony
Tengo el siguiente código que funciona tanto en index.php como en frontend_dev.php. Mi pregunta es, ¿puedes mejorarla? ¿hay una manera mejor o más limpia? ¡Gracias!
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true);
$context = sfContext::createInstance($configuration);
// get the domain parts as an array
$host = array_reverse(explode('.', $_SERVER['HTTP_HOST']));
list($tld, $domain, $subdomain) = $host;
// determine which subdomain we're looking at
$app = ($subdomain == 'staging') ? $subdomain2=$host[3] : $subdomain;
if(empty($app) || $app == 'www')
{
$browser_languages = $context->getRequest()->getLanguages();
foreach($browser_languages as $language)
{
$allowed_culture = in_array($language, sfConfig::get('app_languagesAvailable'));
if($allowed_culture)
{
$domain = $subdomain ? $subdomain.'.'.$domain : $domain;
$url = 'http://'.str_replace($domain.'.'.$tld, $language.'.'.$domain.'.'.$tld, $_SERVER['HTTP_HOST']).$_SERVER['REQUEST_URI'];
$context->getController()->redirect($url);
break;
}
}
}
$context->dispatch();
actualización Solución: Filtro personalizado
<?php
class subdomainFilter extends sfFilter
{
public function execute($filterChain)
{
$context = $this->getContext();
$user = $this->getContext()->getUser();
$request = $this->getContext()->getRequest();
// get the domain parts as an array
$host = array_reverse(explode('.', $request->getHost()));
list($tld, $domain) = $host;
$subdomain2 = $host[3];
$subdomain = $host[2];
// determine which subdomain we're looking at
$app = ($host[2] == 'staging') ? $subdomain2 : $subdomain;
if(empty($app) || $app == 'www')
{
// if first time
if ($this->isFirstCall())
{
$browser_languages = $request->getLanguages();
// set default lang, for API as CURL doesn't set the language
$lang = sfConfig::get('app_default_culture');
foreach($browser_languages as $language)
{
$allowed_culture = in_array($language, sfConfig::get('app_languagesAvailable'));
if($allowed_culture)
{
$lang = $language;
break;
}
}
}else {
// Get user culture
$lang = $user->getCulture();
}
$domain = $subdomain ? $subdomain.'.'.$domain : $domain;
$url = str_replace($domain.'.'.$tld, $lang.'.'.$domain.'.'.$tld, $request->getURI());
$context->getController()->redirect($url);
}
$filterChain->execute();
}
}
gracias treur. Ya revisé esos artículos y no resuelven mi problema. Todas las acciones son iguales en es.example.com y en.example.com. Y quiero redireccionar el dominio principal según el idioma. Voy a actualizar en unas pocas semanas, cuando tengamos tiempo para verificar que todo funcione bien. – fesja
Hmm. Ya veo. En ese caso, creo que usar un filtro es una solución más elegante. Además, los filtros se pueden habilitar/deshabilitar con cookies, lo que eliminará la sobrecarga innecesaria cuando un usuario ya se encuentra en el subdominio correcto: http://www.symfony-project.org/book/1_2/06-Inside-the-Controller -Layer # chapter_06_sub_building_your_own_filter – Treur
eso es mejor. Sin embargo, ¿qué sucede si el usuario actual va a example.com? Tengo su cookie, y sé que quiere la web en inglés; pero si no verifico el host, usará www.example.com en inglés en lugar de en.example.com. Parece que siempre tengo que verificar el host para el subdominio. Si él es un usuario (getCulture()), de lo contrario, verifique los idiomas del navegador. – fesja