Tulio Faria

URL amigáveis em sites multi-idiomas no CakePHP

Olá pessoal,

este post é sobre algumas idéias sobre como organizar as URL’s em site multi-idiomas, mais especificamente no nome dos controllers. Não sou dono da verdade, então, comentem dizendo o que vocês acham.

Esta semana me deparei com um problema em um site com versões em inglês e português. A URL em português ficava:

/produtos/informacoes/1/nome-do-produto

Isso sempre funcionou para mim, pois faz sentido para mim otimizar e ligar termo produtos, informacoes e o nome-do-produto na mesma URL. Mas o que acontece quando o site estava em inglês? Simplesmente a URL ficava:

/produtos/informacoes/1/product-name

Ou seja, estaria produtos, informacoes com a nome do produto em inglês na URL. Fato que me deixou encabulado, por misturar português e inglês.

Resolvi fazer um pouco diferente. Ao invés de usar o nome do controller como produtos, resolvi usar apenas p e deixei o nome da action como i.

/p/i/1/nome-do-produto

Ou melhor:

/p/i/produto/informacoes/1/nome-do-produto

Sendo que os dois primeiros paramêtros da action, eu simplesmente ignoro e mudo de acordo com o idioma. Em inglê ficaria:

/p/i/product/details/1/product-name

E eu sempre mantenho o id (no caso dos exemplos 1) em todas as URL’s.

Levando em consideração as boas práticas de programação não é recomendável usar como nome para uma classe P e de um método (action) como i, mas para SEO creio que resolve.

O que vocês acham?

Forte abraço!

Categories: Úteis, CakePHP, CakePHP 1.2

O que um framework NÃO é » « CakePHP 1.2 Final

8 Comments

  1. É legal este esquema, tanto que no CookBook é o mesmo esquema. :) Uma pequena diferença é que no book eles colocam o idioma na frente.

    Só uma coisa, ao invés de utilizar classe/controller P e método/action i, coloque a regra no router indicando os nomes legíveis. Sua url até poderia ser /p/i/…, mas no routers diga que /p é o controller Produtos e /i a action informacoes().

    Um pouco de código:
    Router::connect(‘/:lang/view/*’, array(‘controller’ => ‘nodes’, ‘action’ => ‘view’), array(‘lang’ => ‘[a-z]{2}’));
    Router::connect(‘/view/*’, array(‘controller’ => ‘nodes’, ‘action’ => ‘view’), array(‘lang’ => ‘en’));

    Esse é o esquema de rotas do cookbook.

  2. Juan,
    tem horas que eu não gosto muito de editar as rotas. Pura frescura, pois realmente fica melhor rotear p para produtos e i para informacoes.

    Na verdade tenho essa mania por em um job o meu routes ter ficado gigantesco e muito “gambiarrado” para ser sincero, rs… Daí atualmente evito ao máximo mexer nele.

    Inté

  3. Mas você usa o controller P e a action i? Não entendi.

  4. Sim… Por isso não é uma boa prática.

  5. Tem, mas daí teria que criar no routes… A idéia era sem precisar fazer isso…

  6. Bom, acredito que quanto mais afastados os termos relevantes do domínio, menor será a relevância para os buscadores.
    Mas não há como saber o impacto.
    Se for o caso de um site de acesso público, vale a pena o trabalho.
    No caso de um sistema restrito, não precisa nem pensar.

    Um framework como o Cake facilita nosso trabalho certo? Pensamos em desenvolvimento ágil. Mas é impressionante como ainda temos trabalho.

    E é verdade, se for brincar com as rotas, o arquivo ficará uma “zona”.

    Isso vale para outras coisas. O AuthComponent por exemplo: É bem simples de implementar, mas as configurações podem crescer. Na documentação, a implementação é bem simples, mas se você possui uma tabela com o nome diferente de “users” ou as colunas contendo o login e a senha diferentes do propostos por eles, já era, mais algumas linhas para escrever.

    Com o tempo, tendo menos tempo disponível e mais compromissos, é normal pender para o nosso lado e fazer da maneira mais simples.
    É assim, do mesmo modo que procuramos uma boa IDE, uma boa hospedagem e utilizamos um controlador de versões, qualquer um menos o cvs ;)

    Abraço

  7. Muito bom cara, testei aqui e deu certo, realmente ficou igual o http://book.cakephp.org/pt, agora uma outra dúvida:

    Como você aconselha eu pegar a varivel do idioma /pt, depois vou criar as mensagens dos idiomas ex:

    echo digite_seu_nome[idioma];

    Como você acha melhor trabalar essa parte? abraço!

Deixe uma resposta

Copyright © 2017 Tulio Faria

Theme by Anders NorenUp ↑