Pergunta

Acho que o Yii Great Framework, e o site de exemplo criado com o Yiic Shell é um bom ponto para começar ... no entanto, ele não abrange o tópico de sites de vários idiomas, infelizmente. Os documentos abrangem o tópico de traduzir mensagens curtas, mas não manter o conteúdo multilíngue ...

Estou prestes a começar a trabalhar em um site que precisa estar em pelo menos dois idiomas, e estou me perguntando qual é a melhor maneira de manter o conteúdo disso ... o problema é que o conteúdo é misturado extensivamente com elementos comuns (como arquivos de vídeo incorporados).

Preciso evitar duplicar esses bens comuns ... até agora eu costumava ter uma matriz de matrizes contendo textos (geralmente não mais que 1-2 parágrafos curtos), então o arquivo de exibição estava apenas renderizando o texto de uma matriz.

Agora eu gostaria de evitar mantê -lo em matrizes (o que requer alguma atenção ao colocar citações duplas "" e é inconveniente em geral ...).

Então, qual é a melhor maneira de manter esses parágrafos curtos? Devo mantê -los em db como (id | msg_id | idioma | conteúdo) e selecione -os por msg_id & idioma? Isso ainda exige que eu crie alguns msg_id e incorpore -os ao arquivo de exibição ...

Existe algum paradigma recomendado para o qual YII tem algumas soluções?

Obrigado, m.

Foi útil?

Solução

Um aplicativo YII por padrão usa o método yii :: t () para traduzir mensagens de texto e existem 3 tipos diferentes para fontes de mensagens:

  1. CPHPMESSAGERSOURCE : As traduções são armazenadas como pares de valor-chave em uma matriz PHP.
  2. CGETTEXTMESSAGERSOURCE : As traduções são armazenadas como arquivos GNU getText. (Arquivos PO)
  3. CDBMESSAGERSOURCE : As traduções de mensagens são armazenadas nas tabelas de banco de dados.

Se eu não entendi mal, você está usando matrizes clássicas para traduções. Eu recomendo a você usando arquivos getText e PO com o operações de tradução YII.

Você pode encontrar muitas informações sobre tradução e i18n com yii neste Página de documentação oficial.

Outras dicas

O GetText é bom para a facilidade de tradução, mas a implementação padrão do PHP não é segura. O YII, portanto, usa seu próprio descompactador, aumentando drasticamente o tempo de processamento em comparação com as matrizes PHP.

Desde que eu estava estabelecendo um site de transação em alto volume e alto, o desempenho do desempenho não era aceitável. Além disso, usando a APC, poderíamos armazenar em cache a tradução do PHP, crescendo ainda mais o desempenho.

Minha abordagem foi, portanto, usar matrizes PHP, mas manter as traduções em um banco de dados para facilitar a tradução, gerando os arquivos necessários quando as traduções forem alteradas.

O banco de dados é semelhante a isso:

TABLE Message            // stores source language, updated by script
 id INT UNSIGNED
 category VARCHAR(20)         // first argument to Yii::t()
 key TEXT                     // second argument to Yii::t()
 occurences TINYINT UNSIGNED  // number of times found in sources

TABLE MessageTranslation // stores target language, translated by human  
 id INT UNSIGNED
 language VARCHAR(3)          // ISO 639-1 or 639-3, as used by Yii
 messageId INT UNSIGNED       // foreign key on Message table
 value TEXT
 version VARCHAR(15)
 creationTime TIMESTAMP DEFAULT NOW()
 lastModifiedTime TIMESTAMP DEFAULT NULL
 lastModifiedUserId INT UNSIGNED

Em seguida, modifiquei o comando "mensagem" da ferramenta CLI YIIC para despejar as strings coletadas no banco de dados.

http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-comands/

Uma vez no banco de dados, um CMS simples pode ser configurado para proporcionar aos tradutores uma maneira fácil de traduzir e, ao mesmo tempo, fornecer informações de versão, reverter para versões mais antigas, verificar a qualidade dos tradutores, etc ...

Outro script, também modificado do YIIC, pega as informações do banco de dados e o compila em matrizes PHP. Basicamente, uma junção das duas tabelas para cada idioma e, em seguida, construa uma matriz usando 'mensagem'. Mensagem '.' Categoria 'na pasta especificada pelo idioma.

Os arquivos gerados são carregados normalmente pelo YII CPHPMESSAGESource.

Para imagens, isso era tão simples quanto colocá -las em pastas com o idioma adequado e obter o idioma do aplicativo ao vincular.

<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">

Observe que, na vida real, escrevi um pequeno método ajudante para retirar o país a partir da sequência de idiomas, 'en_us' deveria ser 'en'.

Bem, acho que o que está preocupado aqui é como traduzir texto/mensagens estáticas na página e Yii resolve -a muito bem usando Yii: T () e a resposta de Edigu é para isso.

Eu verifico a postagem no FlexicACMS sobre a tradução de conteúdo dinâmico no banco de dados, bem, em última análise, será o próximo depois que você resolverá o problema estático de texto/mensagem, e essa é uma abordagem realmente boa usando o comportamento do YII. Não tenho certeza se os autores do FlexicACMS são ambiciosos demais para apoiar a tradução dessa maneira, pois tornaria a tradução do conteúdo uma coisa sem preocupações - realmente ótima.

Uma coisa que eles não mencionam é o URL da página traduzida. Por exemplo, você.site.com/fr/translated_article_title.html. Quero dizer, o URL deve ter / idioma_id / parte nele para que possa ajudar com o SEO.

Em yii1 e yii2 yii i18n getTextMessagesource não usa o motor de cache Yii Perfect de qualquer maneira (veja a fonte) para aprimorar a carga de arquivos PO ou MO. Não é recomendável carregar esses arquivos usando o código puro PHP (incluindo yii i18n getTextMessagesource) (é muito mais lento que o php matriz iDX):http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

No entanto, o PHP GetText Ext for Mo arquivos é um pouco mais rápido que a matriz PHP de tradução porque usa cache, mas o ponto negativo é: toda alteração no MO requer reinicialização do servidor.

Eu acho que a melhor solução seria estender Yii i18n getTextMessagesource em sua própria biblioteca de códigos e adicionar a capacidade de cache de getTextMessagesource para aprimorar seu desempenho e usar sua versão estendida como componente.

protected function loadMessages($category, $language);

Apenas não verifique a data modificada de MO em cada carga para comparar com o cache, limpe o cache quando os arquivos MO ou PO forem alterados (pode ser um cronograma).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top