Pergunta

Em todos os lugares em Assim, quando se trata de fazer uma aplicação multi-língua em PHP todos digamos que gettext é a melhor maneira de fazê-lo. Estou apenas querendo saber por quê?

Como o que torna este método abaixo, menos eficiente, em seguida, usando gettext?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>
Foi útil?

Solução

Uma coisa boa com gettext é que ele é uma espécie de padrão de fato:. Ele é usado por muitas aplicações, em muitas línguas - o que significa que muitas pessoas trabalham com ele

Outra coisa boa (talvez uma conseqüência, ou uma causa, ou ambos, na verdade) é que várias ferramentas, como Poedit por exemplo, existe a arquivos gettext EDIT: você não tem que passar por algum PHP (ou qualquer outro) código-fonte. E isso é muito importante:

  • isso significa que pessoas não-técnicas pode editar arquivos de localização gettext
    • talvez isso não parece importante para você agora,
    • mas se você está trabalhando em um aplicativo de código aberto grande, ele vai se tornar importante se for bem sucedido e muitas pessoas precisam-lo em sua própria língua.
  • isso significa que eles não corre o risco de quebrar a aplicação (acho que "erro de interpretação" por causa de uma incompatibilidade entre aspas, por exemplo ;-))

Outras dicas

Existem algumas desvantagens na sua "implementação".

  • gettext contrário ele é implementado em php. ; -)
  • Ele mantém toda a tradução na memória não importa se você usá-lo ou não
  • O que é pior, ele instancia todo o conjunto de dados sempre que você precisa de uma linha (ele faz demorar um pouco e algum memória em PHP)
  • É incapaz de lidar com formas de plural para vários idiomas
  • O código, usando esta tradução é dificilmente legível
  • O código, usando esta tradução não tem incorporado fallback para uso em caso de tradução ausente.

Basicamente, sua implementação é amplamente utilizado em muitos projetos que estão morrendo para reivindicar o seu apoio à internacionalização e invenção altamente inovadora da roda, mas não se importam um pouco sobre o resultado e não conhecem o bom do mau.

É a mesma resposta que, para todas as perguntas olhando como:

O que é melhor com [hightly provou e solução vastamente usado] do que com [meu Noob arrogante hacky aplicação]?

  • Tem sido aqui por um longo tempo, uma acredite ou não, se dev experiente trabalhou com ele, usou-o e elogiou-o, provavelmente é por uma razão.
  • É um padrão, e por isso mesmo que a sua solução seria melhor, o preço a pagar para quebrá-lo pode não valer a pena.
  • Pode fazer de 1000 mais do que a sua implementação, porque isso é desenvolvido com um escopo global em mente enquanto sua idéia visa apenas resolver o seu problema.

Não estou criticando, todos nós fizemos isso, tentando convencer a nós mesmos que somos smarties e outros são programadores exagero. Isso é parte da maneira de aprender. Eu realmente fazer continuamente que, reinventando a roda ou mostrando fora com meus amigos / colegas sobre algum código BEIJO Eu cortei. Com o tempo, você só acabam fazendo isso cada vez menos, e eu suponho que você parar de fazer isso o dia em que você realmente merece a fazê-lo: -)

O vantagem de gettext, em comparação com outras soluções como a sua, Java tabelas de cadeia ou recursos do Windows, é que ela torna o código fonte mais legível.

Comparar isto:

printf(_("No photo available (error %d)."), err);

com este:

printf(i18n(NO_PHOTO), err);
// or some variant of the same thing

No primeiro caso, você pode ver a mensagem ali mesmo no código e você sabe exatamente o que ele faz. Neste último caso, você só vê uma constante simbólica e tem que olhar para cima o texto e formato exato especificadores.

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