Best practice multi language website

Eu tenho lutado com essa questão há alguns meses, mas eu não estive em uma situação que eu precisava para explorar todas as opções possíveis antes. Agora, sinto que é hora de conhecer as possibilidades e criar minha preferência pessoal para usar em meus próximos projetos.

Deixe-me primeiro esboçar a situação que estou procurando

Estou prestes a atualizar / redesenvolver um sistema de gerenciamento de conteúdo que já uso há algum tempo. No entanto, estou sentindo que o multi language é uma grande melhoria para este sistema. Antes eu não usava nenhum framework, mas vou usar o Laraval4 para o próximo projeto. O Laravel parece a melhor escolha de uma maneira mais limpa de codificar o PHP.Sidenote: Laraval4 should be no factor in your answer. Eu estou procurando maneiras gerais de tradução independentes de plataforma / framework.

O que deveria ser traduzido

Como o sistema que estou procurando precisa ser o mais amigável possível, o método de gerenciar a tradução deve estar dentro do CMS. Não deve haver necessidade de iniciar uma conexão FTP para modificar arquivos de tradução ou qualquer modelo analisado em html / php.

Além disso, estou procurando a maneira mais fácil de traduzir várias tabelas de banco de dados, talvez sem a necessidade de criar tabelas adicionais.

O que eu criei comigo mesmo?

Como eu tenho procurado, lendo e tentando as coisas eu mesmo já. Existem algumas opções que tenho. Mas ainda não sinto como se tivesse alcançado um método de melhor prática para o que realmente estou procurando. Agora, isso é o que eu inventei, mas esse método também tem efeitos colaterais.

Modelos PHP Parsed: o sistema de template deve ser analisado pelo PHP. Dessa forma, posso inserir os parâmetros traduzidos no HTML sem precisar abrir os modelos e modificá-los. Além disso, os modelos PHP analisados ​​permitem que eu tenha um modelo para o site completo, em vez de ter uma subpasta para cada idioma (que eu já tive antes). O método para alcançar este alvo pode ser Smarty, TemplatePower, Laravel's Blade ou qualquer outro analisador de templates. Como eu disse, isso deveria ser independente da solução escrita.Database Driven: talvez eu não precise mencionar isso novamente. Mas a solução deve ser baseada em banco de dados. O CMS é destinado a ser orientado a objetos e MVC, então eu precisaria pensar em uma estrutura de dados lógicos para as seqüências de caracteres. Como meus modelos seriam estruturados: templates / Controller / View.php talvez essa estrutura fizesse mais sentido:Controller.View.parameter. A tabela do banco de dados teria esses campos um longo com umvalue campo. Dentro dos modelos, poderíamos usar algum método de classificação comoecho __('Controller.View.welcome', array('name', 'Joshua')) e o parâmetro contémWelcome, :name. Assim, o resultado éWelcome, Joshua. Isso parece ser uma boa maneira de fazer isso, porque os parâmetros como: name são fáceis de entender pelo editor.Carga baixa de banco de dados: É claro que o sistema acima causaria cargas de carga de banco de dados se essas cadeias estivessem sendo carregadas em movimento. Portanto, eu precisaria de um sistema de cache que renderizasse novamente os arquivos de idioma assim que eles fossem editados / salvos no ambiente de administração. Como os arquivos são gerados, também é necessário um bom layout do sistema de arquivos. Eu acho que podemos ir comlanguages/en_EN/Controller/View.php ou .ini, o que mais lhe convier. Talvez um .ini seja analisado mais rapidamente no final. Este fould deve conter os dados noformat parameter=value; . Eu acho que esta é a melhor maneira de fazer isso, já que cada View que é renderizado pode incluir seu próprio arquivo de idioma, se existir. Os parâmetros de idioma, em seguida, devem ser carregados para uma exibição específica e não em um escopo global para evitar que os parâmetros se sobreponham.Tradução da tabela de banco de dados: na verdade é a coisa que mais me preocupa. Eu estou procurando uma maneira de criar traduções de News / Pages / etc. o mais rápido possível. Tendo duas tabelas para cada módulo (por exemploNews eNews_translations) é uma opção, mas parece que há muito trabalho para obter um bom sistema. Uma das coisas que eu criei é baseada emdata versioning sistema que eu escrevi: existe um nome de tabela de banco de dadosTranslations, esta tabela tem uma combinação única delanguage, tablename eprimarykey. Por exemplo: en_En / News / 1 (Referindo-se à versão em inglês do item Notícias com ID = 1). Mas há duas grandes desvantagens nesse método: em primeiro lugar, essa tabela tende a ficar bastante longa com muitos dados no banco de dados e, em segundo lugar, seria um trabalho muito grande usar essa configuração para pesquisar na tabela. Por exemplo. procurando a lesma de SEO do item seria uma pesquisa de texto completo, o que é bastante burro. Mas, por outro lado: é uma maneira rápida de criar conteúdo traduzível em todas as tabelas com muita rapidez, mas não acredito que esse profissional supere o peso dos trapaceiros.Trabalho de front-end: Também o front-end precisaria de algum pensamento. É claro que armazenaríamos os idiomas disponíveis em um banco de dados e (des) os ativos de que precisamos. Dessa forma, o script pode gerar um menu suspenso para selecionar um idioma e o back-end pode decidir automaticamente quais traduções podem ser feitas usando o CMS. O idioma escolhido (por exemplo, en_EN) seria usado ao obter o arquivo de idioma para uma visualização ou para obter a tradução correta para um item de conteúdo no site.

Então eles estão lá. Minhas idéias até agora. Eles nem incluem opções de localização para datas, etc., mas como meu servidor suporta PHP5.3.2 +, a melhor opção é usar a extensão intl como explicado aqui:http://devzone.zend.com/1500/internationalization-in-php-53/ - mas isso seria útil em qualquer estádio posterior de desenvolvimento. Por enquanto, a questão principal é como ter a melhor prática de tradução do conteúdo em um site.

Além de tudo o que expliquei aqui, ainda tenho outra coisa que ainda não decidi, parece uma pergunta simples, mas na verdade vem me dando dores de cabeça:

Tradução de URL? Devemos fazer isso ou não? e de que maneira?

Então, se eu tiver esse URL:http://www.domain.com/about-us e Inglês é meu idioma padrão. Este URL deve ser traduzido emhttp://www.domain.com/over-ons quando eu escolho o holandês como minha língua? Ou devemos seguir o caminho fácil e simplesmente alterar o conteúdo da página visível em/about. A última coisa não parece ser uma opção válida, porque isso geraria várias versões do mesmo URL, essa indexação do conteúdo falhará no caminho certo.

Outra opção é usarhttp://www.domain.com/nl/about-us em vez de. Isso gera pelo menos um URL exclusivo para cada conteúdo. Também seria mais fácil ir para outro idioma, por exemplohttp://www.domain.com/en/about-us e o URL fornecido é mais fácil de entender para os visitantes do Google e do Homem. Usando esta opção, o que fazemos com os idiomas padrão? O idioma padrão deve remover o idioma selecionado por padrão? Então redirecionandohttp://www.domain.com/en/about-us parahttp://www.domain.com/about-us ... Aos meus olhos, essa é a melhor solução, porque quando o CMS é configurado para apenas uma linguagem, não é necessário ter essa identificação de idioma na URL.

E uma terceira opção é uma combinação de ambas as opções: usando o "language-identification-less" -URL (http://www.domain.com/about-us) para o idioma principal. E use uma URL com um slug SEO traduzido para sublanguages:http://www.domain.com/nl/over-ons & http://www.domain.com/de/uber-uns

Espero que minha pergunta faça suas cabeças quebrarem, eles quebraram a minha com certeza! Isso já me ajudou a resolver as coisas como uma questão aqui. Deu-me a possibilidade de rever os métodos que usei antes e a ideia que tenho para o meu próximo CMS.

Eu gostaria de agradecê-lo já por ter tido tempo para ler este monte de texto!

// Edit #1:

Esqueci de mencionar: a função __ () é um alias para traduzir uma determinada string. Nesse método, obviamente, deve haver algum tipo de método de fallback em que o texto padrão é carregado quando ainda não há traduções disponíveis. Se a tradução estiver faltando, ela deve ser inserida ou o arquivo de tradução deve ser regenerado.

questionAnswers(13)

yourAnswerToTheQuestion