PHP - Forçando atualizado do Getext

Olá meus Unicórnios! 🦄✨

Utilizar arquivos ".mo" e ".po" para gerenciar o idioma do site não é novidade, é uma forma extremamente eficiente, rápida e simples.

A configuração do PHP é extremamente simples:

putenv("LC_ALL=en");
setlocale(LC_ALL, "en");

bindtextdomain("messages", __DIR__ . "/Idiomas/");
textdomain("messages");

Onde será buscado os arquivos de idioma, do idioma Inglês (en), de:

./Idiomas/en/LC_MESSAGES/messages.mo

Porem, você deve ter observado que ao atualizar o arquivo ".po" e compilar o arquivo ".mo", as atualizações não são refletidas no site, sendo necessário reiniciar o servidor do PHP (Apache, IIS, etc)!

Mas Porque isto Ocorre?

O Getext é extremamente rápido, e precisa ser, imagina buscar todos os termos diretamente do arquivo local, iria gerar um gargalo gigante.

Para ser tão rápido, o PHP armazena todos os termos na memória ram do servidor.

Podemos comparar ao MemCache, um cache de memória ram extremamente rápido.

O problema é que o php não disponibiliza uma função para limpar o cache do Getext, então, a limpeza só ira acontecer quando o PHP recarregar o arquivo local.

E como Resolver?

A única situação na qual o php ira atualizar este cache é se mudarmos o arquivo de contexto.

Ou seja, ao invés de buscar o arquivo "messages.mo", agora deve buscar o arquivo "messages_2.mo".

Afinal, se mudou o arquivo, a referencia que o php ira buscar na memória não ira existir.

Podemos simplificar isto através de uma configuração de versão.

Então, considerando que fizemos uma mudança em alguns temos do arquivo de idiomas, atualizamos uma configuração interna do projeto (Onde você armazena configurações do projeto, como "Nome" do site), para indicar que a versão do idioma mudou.

Para exemplo, iremos subir a versão para "3", então temos que deletar a versão "2" e criar a versão "3" copiando o "messages.mo":

<?
// Deletamos a versão 2
@unlink(__DIR__ . "/Idiomas/en/LC_MESSAGES/messages_2.mo");

// Criamos a versão 3
@copy(__DIR__ . "/Idiomas/en/LC_MESSAGES/messages.mo", __DIR__ . "/Idiomas/en/LC_MESSAGES/messages_3.mo");
?>

E depois, atualizamos as configurações de contexto:

<?
putenv("LC_ALL=en");
setlocale(LC_ALL, "en");

bindtextdomain("messages_3", __DIR__ . "/Idiomas/");
textdomain("messages_3");
?>

Por hoje é só, meus unicórnios! 🦄✨

Que a magia do arco-íris continue brilhando em suas vidas! Até mais! 🌈🌟