Переводы · 4 min read · Jan 20, 2026

Gettext для статических веб-сайтов

Gettext для статических веб-сайтов

Вот как я реализовал систему управления переводами для статического веб-сайта, используя GNU gettext. Для нетерпеливых я свел это к 11 инструкциям в конце.

Цель

Эта система позволяет переводить блоками (строка за строкой), что лучше, чем переводить страницу за страницей, потому что:

  • Изменения в непереведенных частях будут автоматически применены ко всем переводам (форматирование, теги, изображения, возможно, даты, имена, ссылки и т. д.).
  • Храня текстовые блоки всех страниц вместе, повторяющиеся блоки придется переводить только один раз (текст меню, уведомления об авторских правах, заголовки и т. д.).
  • Вы не потеряетесь, когда оригинал изменится, пока перевод все еще в процессе.
  • Когда вы изменяете абзац в оригинале, легче увидеть, какие части переводов нужно обновить.

Для такой системы абстрактные шаги следующие:

  1. Как-то отметьте каждый переводимый текстовый блок на вашей веб-странице. Непереводимые части станут общим каркасом.
  2. Извлеките блоки в базу данных. Переведите.
  3. Найдите или напишите программное обеспечение, чтобы объединить блоки обратно в каркас, чтобы восстановить оригинальную веб-страницу - но с возможностью брать текстовые блоки либо из английской базы данных, либо из одной из переведенных версий базы данных.

Gettext казался очевидным вариантом, и теперь все работает идеально, но это заняло у меня восемь часов. Сложность заключалась в том, что существующая документация вся ориентирована на использование gettext для компьютерных программ, а не для веб-сайтов или документов. Вот тогда я понял, что должен задокументировать то, что я сделал:

Что я сделал

Я начал с минимального преобразования своей веб-страницы в компьютерную программу. Это включало пять шагов:

  1. Напишите крошечную программу, которая выводит некоторый текст (строку) в файл.
  2. Скопируйте веб-страницу в программу вместо строки.
  3. Вставьте некоторые стандартные куски кода, необходимые для gettext.
  4. Разделите строку на более мелкие строки, отделяя переводимые от непереводимых.
  5. Отметьте переводимые строки тегом gettext (формат тегов зависит от используемого языка программирования, но обычно это что-то с подчеркиванием _).

Gettext работает с множеством языков программирования, так что выбирайте любой из примеров, которые идут с пакетом. На моем компьютере они находятся в этой папке:
/usr/share/doc/gettext-doc/examples/
Выбор языка не важен. Код будет очень простым.

Вот мой оригинальный index.html:



Корова


Смотрите также: FSFE

Из поддерживаемых языков программирования я выбрал Scheme (диалект Lisp). На первый взгляд, код ниже выглядит сложным, но вам нужно будет изменить только первые и третьи части. Первая часть определяет три переменные, которые должны быть самоочевидными. Весь текст веб-страницы находится в третьей части. Он разбит на блоки, и я обернул переводимые блоки в теги gettext для Scheme (_ ). Вот он, 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"
(_ "Корова")
   "\n\n\n

" (_ "Смотрите также: ") "" (_ "FSFE") "

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

Три из восьми строк отмечены как переводимые. Остальные пять являются частью общего каркаса, который будет одинаковым независимо от языковой версии страницы.

Не забудьте заменить любые кавычки в вашем HTML на обратные слеши-кавычки ( \” ), и добавить несколько переносов строк ( \n ), чтобы сделать вывод читаемым. Это последовательности кавычек и переноса строки для Scheme. Они одинаковы в нескольких других языках, но отличаются в других.

Перед тем как продолжить, вы должны установить переменную “build-directory” на каталог, где находится generate-index.scm. Если вы этого не сделаете, все будет казаться работающим, но ваша программа никогда не получит доступ к переведенным строкам.

После этого вы извлекаете переводимые строки с помощью этих двух команд:

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

А затем вы можете создать файл (файл “po”) для французских переводов с помощью этой команды:

  • $ msginit --locale=fr

Одна часть руководства по gettext говорит, что “msginit” является необязательным - вы можете сделать это вручную, но это у меня не сработало. Я потратил два часа на диагностику этой проблемы. Используйте msginit.

Это создает fr.po, который вы можете редактировать с помощью любого текстового редактора. Вверху будет строка, похожая на эту:

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

Если ваша кодировка “ASCII”, вам, вероятно, следует изменить ее на UTF-8. Если ваша кодировка другая и вы получаете сообщения об ошибках от других инструментов gettext (таких как msgmerge) о недопустимых символах, то изменение кодировки на UTF-8 также может быть решением. Также будет поле для content-transfer-encoding. В руководстве говорится, что это всегда должно быть “8bit”.

Emacs особенно хорош для редактирования файлов po, потому что у него есть специальный режим редактирования для них.

А затем вам нужно преобразовать ваш файл po в специальный формат mo и поместить его в подкаталог, где gettext ожидает его увидеть, с помощью этих двух команд:

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

Сделайте файл Scheme исполняемым, и все!

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

Вак


Смотрите также: La FSFE

ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html Корова

Смотрите также: FSFE

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

Хорошо, вот ваше доказательство концепции. Далее мне нужно преобразовать мой сайт в эту систему и поддерживать его (используя msgmerge). Я постараюсь вести заметки, чтобы опубликовать их здесь.

Инструкции

  1. Создайте пустой файл generate-index.scm
  2. Скопируйте мой generate-index.scm (выше) в ваш файл
  3. Настройте build-directory (3-я определенная переменная) в generate-index.scm, чтобы указать на каталог, где находится ваш generate-index.scm
  4. $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  5. $ mv ciarans-website.po ciarans-website.pot
  6. $ msginit --locale=fr
  7. отредактируйте fr.po, чтобы добавить переводы трех текстовых строк
  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)
Поддержите свободное программное обеспечение: присоединяйтесь к Fellowship FSFE

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.