Foros del Web » Programando para Internet » PHP » Zend »

Zend y SEO

Estas en el tema de Zend y SEO en el foro de Zend en Foros del Web. Hola a Todos. Me gustaría saber vuestra opinión sobre una cosa. Estoy realizando un proyecto en Zend y es multi idioma. La manera que lo ...
  #1 (permalink)  
Antiguo 07/06/2011, 05:56
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Zend y SEO

Hola a Todos.

Me gustaría saber vuestra opinión sobre una cosa.

Estoy realizando un proyecto en Zend y es multi idioma. La manera que lo quiero hacer es diferenciar el idioma por directorios, dominio.com (para el idioma por defecto) y los demas pues dominio.com/es y dominio.com/fr.

El tema de la traducción lo voy a hace a través de gettext, pero aquí tengo mis dudas.

1) Para los metatags del SEO, que hago?, las implemento en la base de datos y las rescato de ahí?, supuestamente la web es bastante grande, así que aquí tengo la duda si hacer esto o utilizar un xml o un gettext, que opiniais?

2) El tema de los textos pequeños, pues bien, los recojo del gettext, pero los textos que son muy amplios, había pensado implementarlos en la base de datos, hago bien?, o utilizo distintos archivos, pero cuales?, es que aquí no he visto en la documentación de Zend nada realmente que me convenza.

3) Tengo otra duda, quiero que mis urls sean amigables, pero también quiero que estén traducidas, osea, que español sería dominio.com/sobre-nosotros y en inglés dominio.com/en/about-us, como hago esto?, introduzco las urls en base de datos?, o se puede hacer un router que lo haga?, sería mejor en base de datos, no?, pero aún siendo en base de datos habría que hacer un router, supongo.

Bueno, se que son muchas preguntas y difíciles, pero técnicamente no tengo muchas dudas, sino que mis dudas vienen de plantear que será lo mejor para un sitema que va a ser grande y quiero obtener el mayor rendimiento en mi desarrollo.

Gracias por adelantado.
  #2 (permalink)  
Antiguo 07/06/2011, 06:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Zend y SEO

Que tal antoniojim,

bbdd deberías utilizar para las traducciones cuando el contenido es administrable.
gettext por lo general se utiliza para contenidos estaticos creado por el cliente con alguna de las herramientas para tal fin.
Para el resto utiliza el adapter que te quede mas comodo, en mi caso array para cuando son pocos datos y .ini si son mas datos, este último tiene algunos problemas con el UTF-8 y algunos símbolos.

Con respecto a traducir las url's, lo puedes hacer a traves del router.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 08/06/2011, 02:33
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Hola, gracias por tu respuesta.

El tema de los textos si que creo que va a ser administrable pero los metatags del SEO no. Que hagao ahí?, los coloco en un .mo o accedo a bd?, O los pongo uno a uno en los controllers?,

La verdad es que me gustaría tenerlos centralizados. Yo lo malo que veo del gettext es que cuando quiero añadir o modificar es un poco lento.
  #4 (permalink)  
Antiguo 08/06/2011, 03:33
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Zend y SEO

Cita:
Iniciado por antoniojim Ver Mensaje
El tema de los textos si que creo que va a ser administrable pero los metatags del SEO no. Que hagao ahí?, los coloco en un .mo o accedo a bd?, O los pongo uno a uno en los controllers?,
Si no son administrables con array o ini es suficiente, gettext podrías utilizarlo si los textos van a cambiar periódicamente.

Cita:
Iniciado por antoniojim Ver Mensaje
La verdad es que me gustaría tenerlos centralizados. Yo lo malo que veo del gettext es que cuando quiero añadir o modificar es un poco lento.
Recuerda que puedes utilizar algún sistema de cacheo.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 08/06/2011, 03:46
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Me refiero lento al modificar el .mo, que hay que insertar las palabras nuevas y generar un archivo nuevo. Luego gettext creo que es el más rápido.

Con respecto a lo del SEO, es posible tener dos variables distintas de Zend_Translate? una para las palabras y otra para el SEO?, utilizando distintos métodos?
  #6 (permalink)  
Antiguo 08/06/2011, 03:55
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Y ahora que estoy revisando toda la documentación de Zend_translate, no es mejor utilizar un CVS para los metatags, lo digo porque un CVS es mucho más fácil de manejar por un usuario que un .ini, por si luego modifican los metatags a mano.

Lo que no quiero luego es que mi aplicación luego sea lenta, por eso me estoy tomando tantas molestias en ver como lo hago.

Sino tomo los metatags de la BD que así sería mejor, no?
  #7 (permalink)  
Antiguo 09/06/2011, 05:37
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Hola de nuevo.

La verdad es que ya me estoy decidiendo y optando por cosas.

Para el tema de las palabras traducidas, he optado por gettext, por todo lo que leo es lo más rápido a nivel de ejecución.

Para el tema de SEO, lo que he hecho es crear un archivo .ini (al final lo estudié y es más sencillo que el CVS aunque lo tenga que editar luego el cliente). Lo que hagao es añadirle un translation más, y luego lo recojo haciendo un script según el controller y el action.

Y los textos los he introducido en la base de datos porque luego el cliente los podrá administrar y como lleva etiquetas HTML, el cliente no lo va a saber manejar, así que a través de un CMS con un editor lo controlarará.

Ahora, tengo problemas con el tema de la traducción de los segmentos del router.

Para manejar la web, lo que hago es que cuando tengo una dirección, como idioma por defecto cojo "es" y cuando delante de la dirección tengo "en", pues cojo inglés, un ejemplo sería este: dominio.com/sobrenosotros para español y dominio.com/en/sobrenosotros para el inglés.

Para eso utilizo este router:

Código PHP:
$router->addRoute(
            
'lang',
            new 
Zend_Controller_Router_Route(
              
'en/:controller/:action/*',
              array(
                     
'controller' => 'index',
                     
'action' => 'index',
                     
'lang'=>'en'
              
)
             )
             ); 
y funciona a la perfeccción.

Pero ahora lo que quiero es hacer es las urls traducidas, para eso he seguido los ejemplos de la documentación de Zend, pero resulta que me da un error cuando hago el asemble, me dice Could not find a translator. Este es el código:

Código PHP:
$translate Zend_Registry::getInstance()->Zend_Translate;
            
Zend_Controller_Router_Route::setDefaultTranslator($translate);
         
            
$route=new Zend_Controller_Router_Route(
                            
':@controller/:@action/*',
                            array(
                                
'controller'=>'index',
                                
'action'=>'index'
                            
)
                            );
            
            
$router->addRoute('pageses',$route);
            
            
$route->assemble(array('controller'=>'index','action'=>'index'));
            
$route->assemble(array('controller'=>'index','action'=>'index')); 
  #8 (permalink)  
Antiguo 09/06/2011, 06:21
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Ya he descubierto de donde venía el error.

Resulta que yo lanzo un plugin para determinar que lenguage estoy utilizando y cargar los lenguages y establecer el locale.

Así que hacía esto en mi bootstrap:

Código PHP:
protected function _initPlugins(){
        
$this->bootstrap('frontController');
                
//inicializo este plugin para comprobar que idioma es el que estoy
                //utilizando, y ahí cargo el .mo correspondiente
                
$pluginlang= new Zend_My_Controller_Plugin_Language();
                
$this->frontController->registerPlugin($pluginlang);


Obviar el tema de Zend delante de My, es que tuve problemas con los autoloads.

y luego hacia los router con un:

Código PHP:
protected function _initRouter() {
           
            
/* dentro los routers */
             
    

Y claro, me daba error porque buscaba la traducción y me decía que no estaba.

Resulta que ejecuta antes el _initRouter() que el plugin, dentro del plugin la función que está declarada es la de routeShutdown.

Como hago para que se me registre antes el zend_translate antes de hacer los routers, o lo meto todo en el plugin?, pero quiero tenerlos separados porque me pueden servir para distintos proyectos y además que veo que son dos cosas diferentes aunque vayan ligadas.

Alguién me puede echar una mano?
  #9 (permalink)  
Antiguo 09/06/2011, 07:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend y SEO

También lo puedes poner en otro plugin, y llenar las rutas en el routeStartup.

Saludos.
  #10 (permalink)  
Antiguo 09/06/2011, 07:31
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Hola, gracias por la respuesta

Entonces cual se ejecuta antes, el start, no?
  #11 (permalink)  
Antiguo 09/06/2011, 07:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Zend y SEO

Mira el orden aquí http://framework.zend.com/manual/en/...r.plugins.html
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 09/06/2011, 07:48
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

He hecho todo esto que me habeís dicho, pero resulta que ahora tengo un problema.

Al hacer dos plugins, en el start pongo lo de los lenguages y en el shutdown lo de las rutas, pero resulta que para poder coger un parametro de la dirección necesito tener hechas las rutas antes, sino no me coge el parametro de la dirección que es lo haga ahora.



Código PHP:
$requestParams $this->getRequest()->getParams();

              
$language = (isset($requestParams['lang'])) ? $requestParams['lang'] : false
  #13 (permalink)  
Antiguo 09/06/2011, 08:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend y SEO

Yo me refería a 2 plugins, lo dos los puedes llamar en routeStartup y se ejecutan en cadena.
  #14 (permalink)  
Antiguo 09/06/2011, 08:31
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Pues estoy probando ahora mismo los dos con shutdown porque en startup todavía no están formadas los parametros y no los puedo rescatar para ver que idioma es el que estoy buscando.

Cuando vaya avanzando voy contando.
  #15 (permalink)  
Antiguo 09/06/2011, 08:38
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Zend y SEO

Para acceder a los parámetros tienes que utilizar shutdown.
__________________
http://es.phptherightway.com/
thats us riders :)
  #16 (permalink)  
Antiguo 09/06/2011, 08:53
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Gracias por vuestras respuesta, pero ya tengo un lio que no veas.

Lo que he hecho por ahora, es poner los dos en shutdown, pero pasa que para que los parametros me vengan correctos necesito haber hecho antes los routers porque sino no sabe de que paramentro viene, y claro si necesito tener antes el parametro para que me traduzca las urls, ya no se como hacerlo.

Hay alguna manera de ver los parametros antes?, y de coger la url que viene?

Gracias por todas vuestras ayudas.
  #17 (permalink)  
Antiguo 09/06/2011, 09:31
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Voy a hacer un resumen de lo que me pasa y de lo que quiero, por si me podeís ayuda.

1. Quiero recoger de la url el idioma, pero cuando no haya que sea el idioma por defecto, osea, dominio.com sería español y dominio.com/en/ sería inglés.

2. Para eso hago un router y lo pongo en el bootstrap y funciona bien.

3. Para ver el lenguge que utilizo lo recojo de los parametros que previamente he puesto en el router y utilizo el locale que me interese en cada momento, para esto utilizo un plugin en modo shutdown.

4. A partir de saber que idioma utilizo con un parametro quiero que mis direcciones sean traducidas para que tengan este aspecto: dominio.com/sobre-nosotros para el español y dominio.com/en/about-us para el inglés

5. El problema es que para traducir las urls necesito saber primero en que locale estoy y para lo tengo que recoger de los parametros.

6. Para poder recogerlo del parametro primero necesito saber como montar los parametros con el router, pero para montar las urls traducidas necesito saber cual es el locale,

es la pescadilla que se muerde la cola.

Ahora mismo estoy bloqueado y no se como hacerlo. He pensado que podría coger la url completo y comprobarlo para ver el idioma, pero no se si eso se puede hacer o hay alguna función en zend que te de la url.
  #18 (permalink)  
Antiguo 09/06/2011, 09:34
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Zend y SEO

Podes postear el plugin ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #19 (permalink)  
Antiguo 09/06/2011, 09:36
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Claro, aquí tienes el plugin para ver que lengua escojo:
Código PHP:
class Zend_My_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract

      
{
          public function 
routeShutdown(Zend_Controller_Request_Abstract $request)

          {
              echo 
"Languages<br>";
              
//utilizo la clase de Zend Translate con get text para traducir
              //las palabras que se modifiquen para ello se añaden todas las traducciones
            
$translate = new Zend_Translate('gettext'APPLICATION_PATH '/configs/languages/es_ES.mo''es');
            
$translate2 = new Zend_Translate('ini'APPLICATION_PATH '/configs/languages/seo_es_ES.ini''es');

            
$translate->addTranslation(APPLICATION_PATH '/configs/languages/en_GB.mo''en');
            
            
$translate->addTranslation(array("content"=>$translate2,"locale"=>"es"));
            
            
            
//para saber que idioma estoy utilizando lo cojo de la ruta
            //a traves del parametro lang que he definido en el Bootstrap con un router
              
$requestParams $this->getRequest()->getParams();
              
//var_dump($requestParams);
              
$language = (isset($requestParams['lang'])) ? $requestParams['lang'] : false;


               
//Reviso el idioma con el que estoy trabajando, y si no hay ninguno
              //que se haya pasado por el parametro lang se escoge por defecto es
              
if ($translate->isAvailable($language)) {
                  
$translate->setLocale($language);
              }
              else {
                   
$translate->setLocale("es");
                   
$language="es";
              }
              
              
             
//registro el objeto Zend_translate en $translate para hacer
             //uso del él y también el lenguage que estoy utilizando
               
Zend_Registry::set('Zend_Translate'$translate);
               
Zend_Registry::set('lang',$language);
          }

      } 
  #20 (permalink)  
Antiguo 10/06/2011, 06:26
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Hola otra vez, he rehecho el plugin y lo he aunado todo en uno.

Resulta que he tenido que hacer un $_SERVER['REQUEST_URI'] porque no he encontrado ninguna manera den zend de recoger la url en el startup.

Aún así, algo no estoy haciendo con el router porque no me funcionan como yo quiero, a ver si me podeís echar una mano.

Aquí os dejo el código del plugin:
Código PHP:
 class Zend_My_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract

      
{
          
          protected 
$_request;
          protected 
$_locale;
          protected 
$_translate;
          protected 
$_router;
          
          public function 
routeStartup(Zend_Controller_Request_Abstract $request) {
              
$this->_request=$request;
              
              
$this->initLocale();
              
$this->initTranslate();
              
$this->initRouter();
          }
          
          protected function 
initLocale() {
                
// Primero, miro en la url si hay un idioma escogido o no
                // como es el primero, me tengo que asegurar que no sea un 
                // modulo o un controller o un action 
                // para eso utilizo isLocale para ver si lo que cojo es un
                // idioma o no, si no lo es, cojo como idioma predefenido 'es'
                
$uri_parts explode('/'$_SERVER['REQUEST_URI']);
                
$locale = (Zend_Locale::isLocale($uri_parts[1]))
                        ? 
$uri_parts[1]
                        : 
'es'//idioma por defecto 'es'
                
                //segundo, establezco el locale que haya cogido de la 
                //dirección y hago un paramentro lang para tenerlo en el request
                //y registro el locale
                
                
$this->_locale = new Zend_Locale($locale);
                
$this->_request->setParam('lang'$this->_locale->toString());

                
                
Zend_Registry::set('Zend_Locale'$this->_locale);
                
Zend_Registry::set('lang',$this->_locale->toString());
                echo 
$this->_locale->toString();
          }
          protected function 
initTranslate() {
              
/*Ahora inicializo mi translate, tanto las palabras que quiero 
               * a través de gettext como los seo con los archivos ini
              */
              
$this->_translate= new Zend_Translate(
                                    
'gettext',
                                    
APPLICATION_PATH.'/configs/languages/es_ES.mo',
                                    
'es'); //inicializo el translate y añado español
              
$this->_translate->addTranslation(
                                    
APPLICATION_PATH.'/configs/languages/en_GB.mo',
                                    
'en'); //añado el inglés.
              /* añado los archivos ini para el seo, para eso genero una 
               * variable nueva de translate con otro adaptador y luego la
               * añado
              */
              
$translateSeoES=new Zend_Translate(
                                    
'ini',
                                    
APPLICATION_PATH.'/configs/languages/seo_es_ES.ini',
                                    
'es'); //para el español
              
$translateSeoEN=new Zend_Translate(
                                    
'ini',
                                    
APPLICATION_PATH.'/configs/languages/seo_en_GB.ini',
                                    
'en'); //para el inglés
              
$this->_translate->addTranslation(array("content"=>$translateSeoES,"locale"=>"es"));
              
$this->_translate->addTranslation(array("content"=>$translateSeoEN,"locale"=>"en"));
              
              
              if (!
$this->_translate->isAvailable($this->_locale->toString())) {
                    throw new 
Zend_Translate_Exception('Translation for locale '
                    
$this->_locale->toString() . ' does not exist.');
              }
              
              
//establezo el locale para la traduccion
              
$this->_translate->setLocale($this->_locale->toString());
              
//registro el translate
              
Zend_Registry::set('Zend_Translate',$this->_translate);
              
          }
          protected function 
initRouter() {
               
$this->_router Zend_Controller_Front::getInstance()->getRouter();
               
             
            
/*
             * La manera de trabajar va a ser que las páginas de información
             * van a ir en el controller index, cada uno con su vista, así que 
             * he hecho estos routers para que no aparezca el nombre del 
             * controlador, sólo la acción
             */
        
Zend_Controller_Router_Route::setDefaultTranslator($this->_translate);
        
        
$route = new Zend_Controller_Router_Route(
                        
':@controller/:@action/*',
                        array(
                            
'lang' => 'es',
                            
'controller' => 'index',
                            
'action' => 'index'
                        
)
        );
        
$this->_router->addRoute('language'$route);
        
$route->assemble(array("controller"=>"index","action"=>"action"));
        
$route->assemble(array("controller"=>"index","action"=>"action"));
        
        
$route = new Zend_Controller_Router_Route(
                        
':lang/:@controller/:@action/*',
                        array(
                            
'lang'=>'en',
                            
'controller' => 'index',
                            
'action' => 'index'
                        
)
        );
        
$this->_router->addRoute('localized'$route);
        
$route->assemble(array("controller"=>"index","action"=>"action"));
        
$route->assemble(array("controller"=>"index","action"=>"action"));
        
               
          }
      } 
  #21 (permalink)  
Antiguo 10/06/2011, 08:37
 
Fecha de Ingreso: marzo-2005
Ubicación: Málaga
Mensajes: 115
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Zend y SEO

Ya me está empezando a funcionar, leyendo la documentación de Zend te recomiendan que cuando vayas a hacer segmentos traducidos en un router hagas un archivo aparte para él solo por si estás utilizando esas palabras en otro sitio, así que lo que he hecho ha sido hacer lo que me dice y ahora ha empezado a funcionar bien, con lo cual me temo que era un problema con el orden en el que poner la traducción.

Entonces he cambiado la linea en la función initRouter

Código PHP:
Zend_Controller_Router_Route::setDefaultTranslator($this->_translate); 
por

Código PHP:
$translator = new Zend_Translate(
                            
'ini',
                            
APPLICATION_PATH.'/configs/languages/url_es_ES.ini',
                            
'es');
        
$translator->addTranslation(
                            
APPLICATION_PATH.'/configs/languages/url_en_GB.ini',
                            
'en');

        
// Establecer el "locale" actual para el traductor
        
$translator->setLocale($this->_locale->toString());

        
// Establecerlo como traductor por defecto para las rutas
        
Zend_Controller_Router_Route::setDefaultTranslator($translator); 
Así que ahora he vuelto a hacer casi lo mismo que al principio pero con la diferencia que para recoger la variable de lenguage no recurro al parametro, sino que cojo la dirección de la variable $_SERVER y hago un explode.

Espero que esto le pueda servir de ayuda a alguién, a mi me ha costado un buen dolor de cabeza.

Etiquetas: frameworks-y-php-orientado-a-objetos, seo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:31.