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":

Poedit Translation Editor — Poedit
Simple translation editor for gettext, XLIFF and JSON

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":

GitHub - php-gettext/Gettext: PHP library to collect and manipulate gettext (.po, .mo, .php, .json, etc)
PHP library to collect and manipulate gettext (.po, .mo, .php, .json, etc) - 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! 🌈🌟