私が理解しているように、locale-gen
ユーティリティは/usr/lib/locale/locale-archive
ファイルのエントリと/etc/locale.gen
のロケールテンプレート/構成ファイルに基づいて/usr/share/i18n/locales/
データベースを生成します。さらに、ユーティリティは、翻訳ファイルをマシンオブジェクト形式で/usr/share/locale/<locale_dir>/LC_MESSAGES/
ディレクトリに保存します。例えば:
# dpkg -L wget | grep nl
/usr/share/locale/nl
/usr/share/locale/nl/LC_MESSAGES
/usr/share/locale/nl/LC_MESSAGES/wget.mo
#
たとえばstrace -e open wget
を実行すると、/usr/lib/locale/locale-archive
ファイルと/usr/share/locale/nl/LC_MESSAGES/wget.mo
ファイルの両方が開かれていることがわかります。
どのローカリゼーションデータが/usr/share/locale/<locale_dir>/LC_MESSAGES/
ディレクトリのファイルに保存され、どのローカリゼーションデータが/usr/lib/locale/locale-archive
に保存されますか?
Linuxでローカリゼーションがどのように実装されているかについては、事前にほとんど何も知りませんでしたが、私はそれを回避するために最善を尽くしました。
/ usr/lib/locale/locale-archive
_locale-archive
_は、locale-gen(8)
がlocaledef(1)
を呼び出すことによって生成されるメモリマップトファイルです。メモリマップドとは、プログラムによって作成および呼び出されると、メモリに1回だけロードされることを意味します。
_/etc/locale.gen
_で定義されているすべての言語セットは事前定義されており、アーカイブ自体は非常に静的であるため、メモリ内に複数回保持する必要はありません。したがって、別のプログラムによって呼び出されるたびに、プロセスはすでにメモリにロードされているアーカイブを指しているため、プログラムの仮想メモリに追加されるだけです。このようにして、プロセスの物理メモリフットプリントが削減されるだけでなく、ローカリゼーションに関するすべてのシステムが高速化されます。 (追加のディスクI/Oは必要ありません!)
また、システム全体のすべての言語を含む一種のフェイルバックロケールファイルとして機能するようです。さらに、アーカイブはglibcで記述されたソフトウェアによって頻繁に使用されます。
/usr/share/locale/$LOCALE_DIR/LC_MESSAGES/$PROGRAM.mo
Linuxでのソフトウェアの国際化(_i18n, 18 chars between 'i' and 'n'
_)は、GNU-gettextを使用して実現できます。
gettext()
関数を使用するように調整されます。xgettext(1)
はソースを反復処理し、途中で.pot (Portable Object Template Files)
を作成します。msginit(1)
を使用してそれを.po (Portable Object)
ファイルに解析できます。これは通常、メッセージカタログを表します。次に、すべての文字列が手作業で翻訳されます。msgfmt(1)
を使用して、編集した_.po
_ファイルをバイナリの.mo (Message Object)
ファイルにコンパイルします。これらは、ソフトウェアパッケージと一緒に出荷できます。システムにパッケージをインストールすると、_/usr/share/locale/<locale_dir>/LC_MESSAGES/
_に_$PROGRAM.mo
_ファイルが入力されます。例: wgetを呼び出すと、LANG
env-variableはwget
をポイントして、現在のロケール設定を使用します。その結果、wget
は、ポインターを介して読み取り_.mo binary
_。
ロケールアーカイブの場合:
メモリマッピング: CentOS-メーリングリスト
メソッドI18Nサブパッケージ: さまざまなロケールのFedoraドキュメント-アーカイブのコンパイル
locale(1), localedef(1)
およびlocale-gen(8)
のマンページも検討してください。
_.mo
_ファイルの場合:
_.mo
_ファイルを作成するプロセス: Gettextのウィキペディア
GNU MOファイル形式: 説明とバイナリ形式
xgettext(1), msginit(1)
およびmsgfmt(1)
のマンページも検討してください。
また、ENV変数_LC_MESSAGE
_およびLOCPATH
も確認してください。
私はこれがこの広大なトピックの表面を引っかいただけだと確信しています。それでも、これで十分に始められることを願っています。