web-dev-qa-db-ja.com

/ usr / share / locale / <locale_dir> / LC_MESSAGES /ディレクトリにあるlocale-archiveファイルとマシンオブジェクトファイルの違いは?

私が理解しているように、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に保存されますか?

8
Martin

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を使用して実現できます。

  1. プログラムが作成されると、すべてのprintステートメントは、印刷する必要のある文字列をラップするGNU gettext()関数を使用するように調整されます。
  2. 次に、xgettext(1)はソースを反復処理し、途中で.pot (Portable Object Template Files)を作成します。
  3. 次に、人間の翻訳者はmsginit(1)を使用してそれを.po (Portable Object)ファイルに解析できます。これは通常、メッセージカタログを表します。次に、すべての文字列が手作業で翻訳されます。
  4. その後、msgfmt(1)を使用して、編集した_.po_ファイルをバイナリの.mo (Message Object)ファイルにコンパイルします。これらは、ソフトウェアパッケージと一緒に出荷できます。

システムにパッケージをインストールすると、_/usr/share/locale/<locale_dir>/LC_MESSAGES/_に_$PROGRAM.mo_ファイルが入力されます。例: wgetを呼び出すと、LANGenv-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も確認してください。


私はこれがこの広大なトピックの表面を引っかいただけだと確信しています。それでも、これで十分に始められることを願っています。

3
pidi