翻訳管理 · 1 min read · Jan 20, 2026
静的ウェブサイトのためのGettext
静的ウェブサイトのためのGettext
ここでは、GNU gettextを使用して静的ウェブサイトの翻訳管理システムを実装した方法を説明します。せっかちな方のために、最後に11の指示に要約しました。
目標
このシステムは、ブロックごとの翻訳(文字列ごとの翻訳)を可能にします。これはページごとの翻訳よりも優れています。なぜなら:
- 翻訳されていない部分の変更がすべての翻訳に自動的に適用される(フォーマット、タグ、画像、日付、名前、リンクなど)。
- すべてのページのテキストブロックを一緒に保存することで、繰り返し出現するブロックは一度だけ翻訳すればよい(メニューのテキスト、著作権表示、見出しなど)。
- 翻訳が進行中の間に元の内容が変更されても迷子にならない。
- 元の段落を変更したとき、翻訳のどの部分を更新する必要があるかを簡単に確認できる。
このようなシステムの抽象的なステップは次のとおりです:
- ウェブページ内の各翻訳可能なテキストブロックにマークを付ける。翻訳不可能な部分は共有フレームになります。
- ブロックをデータベースに抽出する。翻訳する。
- ブロックをフレームに戻して元のウェブページを再作成するためのソフトウェアを見つけるか、作成する。ただし、テキストブロックを英語のデータベースまたは翻訳されたバージョンのデータベースのいずれかから取得するオプションがあります。
Gettextは明らかな可能性のように思え、すべてが完璧に機能していますが、私には8時間かかりました。既存のドキュメントは、ウェブサイトや文書ではなく、コンピュータプログラムでのgettextの使用に向けられているため、難しさがありました。そのとき、私は自分がやったことを文書化しなければならないと気づきました。
私がやったこと
私はまず、ウェブページを最小限にコンピュータプログラムに変換しました。これには5つのステップが含まれます:
- テキスト(文字列)をファイルに印刷する小さなプログラムを書く。
- 文字列の代わりにプログラムにウェブページをコピーする。
- gettextに必要な標準的なコードのいくつかを挿入する。
- 文字列を小さな文字列に分割し、翻訳可能な部分と翻訳不可能な部分を分ける。
- 翻訳可能な文字列にgettextのタグを付ける(タグの形式は使用するプログラミング言語によって異なりますが、通常はアンダースコア _ を含むものです)。
Gettextは多くのプログラミング言語で動作するので、パッケージに付属する例から選んでください。私のコンピュータでは、これらはこのフォルダーにあります:
/usr/share/doc/gettext-doc/examples/
言語の選択は重要ではありません。コードは非常にシンプルです。
以下が私の元のindex.htmlです:
Cow
See also: FSFE
サポートされているプログラミング言語の中から、私はScheme(Lispの方言)を選びました。一見すると、以下のコードは複雑に見えますが、最初と3番目のチャンクだけを修正すれば大丈夫です。最初のチャンクでは、自己説明的であるべき3つの変数を定義しています。すべてのウェブページのテキストは3番目のチャンクにあります。翻訳可能なブロックの周りにScheme用のgettextタグ(_)を付けて、ブロックに分割しています。以下が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)
8つの文字列のうち3つが翻訳可能としてマークされています。他の5つは、生成されるページの言語バージョンに関係なく同じである共有フレームの一部です。
HTML内の引用符をバックスラッシュ引用符(\”)に置き換え、出力を読みやすくするためにいくつかの改行(\n)を追加することを忘れないでください。これらはSchemeの引用符と改行シーケンスです。他のいくつかの言語でも同じですが、他の言語では異なる場合もあります。
続行する前に、”build-directory”変数をgenerate-index.scmがあるディレクトリに設定する必要があります。これを行わないと、すべてが正常に動作しているように見えますが、プログラムは翻訳された文字列にアクセスしません。
それが完了したら、次の2つのコマンドで翻訳可能な文字列を抽出します:
$ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm$ mv ciarans-website.po ciarans-website.pot
次に、次のコマンドでフランス語翻訳用のファイル(”po”ファイル)を作成できます:
$ msginit --locale=fr
gettextマニュアルの一部には、「msginit」はオプションであり、手動で行うこともできるが、私には全く機能しなかったと書かれています。私はその問題を診断するのに2時間を費やしました。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が期待するサブディレクトリに配置する必要があります。次の2つのコマンドを使用します:
$ 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
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$
さて、これがあなたの概念実証です。次に、私は自分のサイトをこのシステムに変換し、維持する必要があります(msgmergeを使用)。ここに公開するためのメモを取るようにします。
指示
- 空のファイルgenerate-index.scmを作成する
- 上記のgenerate-index.scmをファイルにコピーする
- generate-index.scm内のbuild-directory(3番目に定義された変数)を、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を編集して3つのテキスト文字列の翻訳を追加する
$ 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)
フリーソフトウェアをサポートする:FSFEのフェローシップに参加する
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。