O que é tão bom sobre gettext para arquivos de linguagem?
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
?>
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 emphp
. ; -) - 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.