PHP - Editando arquivo Getext via PHP
Olá meus Unicórnios! 🦄✨
Normalmente utilizamos ferramentas externas para inserir as traduções dos termos, um ótimo programa é o "Poedit":
Porem, imagina o problema de a cada vez que precisamos alterar uma tradução, ser necessário abrir o Poedit, alterar, subir ao servidor, etc, etc, etc.
Não apenas isto, quando vamos fazer a primeira tradução, temos milhares de termos para traduzir, ao invés de traduzir termo por termo, podemos utilizar a API do Google Translate.
Para resolver isto, iremos utilizar o repositório "php-gettext/Gettext":
Este repositório é EXCELENTE e muito simples de utilizar.
Antes de tudo, precisamos deixar bem claro qual o arquivo de idioma original, e qual o arquivo compilado que o PHP ira utilizar:
- PO: Arquivo original, onde adicionamos todos os termos que podem ser traduzidos
- MO: Arquivo compilado utilizado pelo PHP
Para este exemplo, iremos editar o idioma "inglês", onde o arquivo ".po" fica em:
./Idiomas/en/LC_MESSAGES/messages.mo
Inicialmente iremos incluir o repositório em nossas dependências:
composer require gettext/gettext
Em nosso PHP, iremos carregar as class de carregamento e de compilação:
<?
use Gettext\Translations;
use Gettext\Loader\PoLoader;
use Gettext\Generator\MoGenerator;
use Gettext\Generator\PoGenerator;
?>
Agora precisamos carregar o arquivo "PO" (Não compilado) na Class do Gettext:
<?
$InfPORaw = file_get_contents("./Idiomas/en/LC_MESSAGES/messages.po");
$ObjLoader = new PoLoader();
$InfTranslations = $ObjLoader->loadString($InfPORaw);
?>
Depois disto, teremos acesso a todos os termos que podem ser traduzidos através do array "$InfTranslations".
Nele, podemos traduzir utilizando a API do Google Translate e salvar a tradução que serão compilada:
<?
foreach( $InfTranslations as $InfTranslation )
{
echo "Texto Original: " . $InfTranslation->getOriginal();
echo "<br>";
echo "Texto Traduzido: " . $InfTranslation->getTranslation();
echo "<br>";
$InfTranslation->translate("Texto Traduzido");
}
?>
Depois disto, iremos salvar o novo arquivo "PO":
<?
$ObjGenerator = new PoGenerator();
$InfContent = $ObjGenerator->generateString($InfTranslations);
file_put_contents("./Idiomas/en/LC_MESSAGES/messages.po", $InfContent);
?>
E por fim, salvar o arquivo compilado "MO":
<?
$ObjGenerator = new MoGenerator();
$InfContent = $ObjGenerator->generateString($InfTranslations);
file_put_contents("./Idiomas/en/LC_MESSAGES/messages.mo", $InfContent);
?>
Nosso código completo deve ficar semelhante ao código abaixo:
<?
use Gettext\Translations;
use Gettext\Loader\PoLoader;
use Gettext\Generator\MoGenerator;
use Gettext\Generator\PoGenerator;
// Carregamos o Conteudo do arquivo PO
$InfPORaw = file_get_contents("./Idiomas/en/LC_MESSAGES/messages.po");
// Carregamos o conteudo do arquivo PO para dentro da Class de Carregamento
$ObjLoader = new PoLoader();
$InfTranslations = $ObjLoader->loadString($InfPORaw);
// Listagem de todos os termos que serão traduzidos
foreach( $InfTranslations as $InfTranslation )
{
// Exibimos na Tela o Texto Original e a Tradução Presente no Arquivo PO
echo "Texto Original: " . $InfTranslation->getOriginal();
echo "<br>";
echo "Texto Traduzido: " . $InfTranslation->getTranslation();
echo "<br>";
// >> Aqui você pode aplicar uma tradução do texto, ou buscar uma tradução de sua base de dados
// Aplicamos uma nova tradução para o Termo
$InfTranslation->translate("Texto Traduzido");
}
// Criamos o conteudo do novo arquivo PO com as traduções que aplicamos
$ObjGenerator = new PoGenerator();
$InfContent = $ObjGenerator->generateString($InfTranslations);
// Salvamos o novo arquivo PO
file_put_contents("./Idiomas/en/LC_MESSAGES/messages.po", $InfContent);
// Criamos o conteudo do novo arquivo MO com as traduções que aplicamos
$ObjGenerator = new MoGenerator();
$InfContent = $ObjGenerator->generateString($InfTranslations);
// Salvamos o novo arquivo MO
file_put_contents("./Idiomas/en/LC_MESSAGES/messages.mo", $InfContent);
?>
Por hoje é só, meus unicórnios! 🦄✨
Que a magia do arco-íris continue brilhando em suas vidas! Até mais! 🌈🌟