Переводы · 4 min read · Jan 20, 2026
Gettext для статических веб-сайтов
Gettext для статических веб-сайтов
Вот как я реализовал систему управления переводами для статического веб-сайта, используя GNU gettext. Для нетерпеливых я свел это к 11 инструкциям в конце.
Цель
Эта система позволяет переводить блоками (строка за строкой), что лучше, чем переводить страницу за страницей, потому что:
- Изменения в непереведенных частях будут автоматически применены ко всем переводам (форматирование, теги, изображения, возможно, даты, имена, ссылки и т. д.).
- Храня текстовые блоки всех страниц вместе, повторяющиеся блоки придется переводить только один раз (текст меню, уведомления об авторских правах, заголовки и т. д.).
- Вы не потеряетесь, когда оригинал изменится, пока перевод все еще в процессе.
- Когда вы изменяете абзац в оригинале, легче увидеть, какие части переводов нужно обновить.
Для такой системы абстрактные шаги следующие:
- Как-то отметьте каждый переводимый текстовый блок на вашей веб-странице. Непереводимые части станут общим каркасом.
- Извлеките блоки в базу данных. Переведите.
- Найдите или напишите программное обеспечение, чтобы объединить блоки обратно в каркас, чтобы восстановить оригинальную веб-страницу - но с возможностью брать текстовые блоки либо из английской базы данных, либо из одной из переведенных версий базы данных.
Gettext казался очевидным вариантом, и теперь все работает идеально, но это заняло у меня восемь часов. Сложность заключалась в том, что существующая документация вся ориентирована на использование gettext для компьютерных программ, а не для веб-сайтов или документов. Вот тогда я понял, что должен задокументировать то, что я сделал:
Что я сделал
Я начал с минимального преобразования своей веб-страницы в компьютерную программу. Это включало пять шагов:
- Напишите крошечную программу, которая выводит некоторый текст (строку) в файл.
- Скопируйте веб-страницу в программу вместо строки.
- Вставьте некоторые стандартные куски кода, необходимые для gettext.
- Разделите строку на более мелкие строки, отделяя переводимые от непереводимых.
- Отметьте переводимые строки тегом 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). Я постараюсь вести заметки, чтобы опубликовать их здесь.
Инструкции
- Создайте пустой файл generate-index.scm
- Скопируйте мой generate-index.scm (выше) в ваш файл
- Настройте build-directory (3-я определенная переменная) в generate-index.scm, чтобы указать на каталог, где находится ваш generate-index.scm
$ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm$ mv ciarans-website.po ciarans-website.pot$ msginit --locale=fr- отредактируйте fr.po, чтобы добавить переводы трех текстовых строк
$ mkdir -p fr/LC_MESSAGES$ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po$ chmod +x generate-index.scm$ LANGUAGE=fr ./generate-index.scm; cat index.html
–
Ciaran O’Riordan, ( RSS)
Поддержите свободное программное обеспечение: присоединяйтесь к Fellowship FSFE
Get new posts in your inbox
No spam. Unsubscribe anytime.