Tradução · 5 min read · Jan 20, 2026

Gettext Para Websites Estáticos

Gettext Para Websites Estáticos

Aqui está como implementei um sistema de gerenciamento de tradução para um website estático, usando o GNU gettext. Para os impacientes, eu destilei isso em 11 instruções no final.

Objetivo

Este sistema permite tradução bloco a bloco (string a string), o que é melhor do que página a página porque:

  • Mudanças em partes não traduzidas serão aplicadas a todas as traduções automaticamente (formatação, tags, imagens, talvez datas, nomes, links, etc.).
  • Ao armazenar os blocos de texto de todas as páginas juntos, blocos repetidos só precisarão ser traduzidos uma vez (texto do menu, avisos de copyright, cabeçalhos, etc.).
  • Você não se perderá quando o original mudar enquanto a tradução ainda estiver em progresso.
  • Quando você muda um parágrafo no original, é mais fácil ver quais partes das traduções precisam ser atualizadas.

Para tal sistema, os passos abstratos são:

  1. De alguma forma, marque cada bloco de texto traduzível na sua página web. As partes não traduzíveis se tornarão um quadro compartilhado.
  2. Extraia os blocos para um banco de dados. Traduza.
  3. Encontre ou escreva algum software para mesclar os blocos de volta ao quadro para refazer a página web original - mas com a opção de pegar os blocos de texto do banco de dados em inglês ou de uma das versões traduzidas do banco de dados.

Gettext parecia uma possibilidade óbvia, e tudo está funcionando perfeitamente agora, mas me levou oito horas. A dificuldade foi que a documentação existente é toda voltada para o uso do gettext para programas de computador, não para websites ou documentos. Foi quando percebi que eu deveria documentar o que fiz:

O que eu fiz

Comecei transformando minimamente minha página web em um programa de computador. Isso envolveu cinco etapas:

  1. Escreva um pequeno programa que imprime algum texto (uma string) em um arquivo.
  2. Copie a página web para o programa no lugar da string.
  3. Insira alguns trechos de código padrão exigidos pelo gettext.
  4. Quebre a string em strings menores, separando traduzíveis de não traduzíveis.
  5. Marque as strings traduzíveis com a tag do gettext (o formato das tags depende de qual linguagem de programação você usa, mas geralmente é algo envolvendo um sublinhado _).

Gettext funciona com muitas linguagens de programação, então escolha a partir dos exemplos que vêm com o pacote. No meu computador, estes estão nesta pasta:
/usr/share/doc/gettext-doc/examples/
A escolha da linguagem não é importante. O código será muito simples.

Aqui está meu index.html original:



Cow


See also: FSFE

Das linguagens de programação suportadas, escolhi Scheme (um dialeto de Lisp). À primeira vista, o código abaixo parece complexo, mas você só precisará modificar os primeiros e terceiros blocos. O primeiro bloco define três variáveis que devem ser autoexplicativas. Todo o texto da página web está no terceiro bloco. Ele está dividido em blocos e eu coloquei tags gettext para Scheme (_ ) ao redor dos blocos traduzíveis. Aqui está, generate-index.scm:

#!/usr/bin/guile -s
!#
(define output-filename "index.html")
(define project-name "ciarans-website")
(define build-directory "/home/ciaran/website-build/")
(use-modules (ice-9 format))
(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
(textdomain project-name)
(bindtextdomain project-name build-directory)
(define _ gettext)
(define page-text (string-append
   "\n"
(_ "Cow")
   "\n\n\n

" (_ "See also: ") "" (_ "FSFE") "

\n" "\n\n")) (define the-file (open-file output-filename "w")) (display page-text the-file)

Três das oito strings estão marcadas como traduzíveis. As outras cinco fazem parte do quadro compartilhado que será o mesmo, não importa qual versão do idioma da página está sendo gerada.

Lembre-se de substituir quaisquer aspas em seu HTML por aspas invertidas ( \” ), e de adicionar algumas quebras de linha ( \n ) para tornar a saída legível. Essas são as sequências de aspas e nova linha para Scheme. Elas são as mesmas em algumas outras linguagens, mas diferentes em outras.

Antes de continuar, você deve definir a variável “build-directory” para o diretório onde generate-index.scm está. Se você não fizer isso, tudo parecerá funcionar, mas seu programa nunca acessará as strings traduzidas.

Feito isso, você extrai as strings traduzíveis com estes dois comandos:

  • $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  • $ mv ciarans-website.po ciarans-website.pot

E então você pode criar um arquivo (um arquivo “po”) para traduções em francês com este comando:

  • $ msginit --locale=fr

Uma parte do manual do gettext diz que “msginit” é opcional - que você pode fazer isso manualmente em vez disso, mas isso não funcionou para mim de jeito nenhum. Passei duas horas diagnosticando esse problema. Use msginit.

Isso cria fr.po que você pode editar com qualquer editor de texto. Haverá uma linha no topo assim:

"Content-Type: text/plain; charset=UTF-8\n"

Se seu charset for “ASCII”, você provavelmente deve mudá-lo para UTF-8. Se seu charset for algo diferente e você receber mensagens de erro de outras ferramentas gettext (como msgmerge) sobre caracteres inválidos, então mudar o charset para UTF-8 também pode ser a resposta. Haverá também um campo para content-transfer-encoding. O manual diz que isso deve ser sempre “8bit”.

Emacs é particularmente bom para editar arquivos po porque tem um modo de edição especial para eles.

E então você precisa converter seu arquivo po para o formato mo especial e colocá-lo no subdiretório onde o gettext espera que esteja com estes dois comandos:

  • $ mkdir -p fr/LC_MESSAGES
  • $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po

Torne o arquivo Scheme executável, e é isso!

ciaran@hide:~/tests/simple-page$ LANGUAGE=fr ./generate-index.scm; cat index.html

Vache


Voir aussi : La FSFE

ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html Cow

See also: FSFE

ciaran@hide:~/tests/simple-page$

Ok, então aí está sua prova de conceito. A seguir, eu tenho que converter meu site para este sistema e mantê-lo (usando msgmerge). Tentarei manter notas para publicar aqui.

As instruções

  1. Faça um arquivo vazio generate-index.scm
  2. Copie meu generate-index.scm (acima) para seu arquivo
  3. Ajuste o build-directory (3ª variável definida) em generate-index.scm para apontar para o diretório onde seu generate-index.scm está
  4. $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  5. $ mv ciarans-website.po ciarans-website.pot
  6. $ msginit --locale=fr
  7. edite fr.po para adicionar traduções das três strings de texto
  8. $ mkdir -p fr/LC_MESSAGES
  9. $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
  10. $ chmod +x generate-index.scm
  11. $ LANGUAGE=fr ./generate-index.scm; cat index.html


Ciaran O’Riordan, ( RSS)
Apoie o software livre: Junte-se à Fellowship da FSFE

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.