私が知る限り、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
#
exampleを実行すると、ファイルとファイルの両方が開いている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
?
答え1
Linuxでローカライズがどのように実装されているのかは事前に全く知らなかったにもかかわらず、それについて学ぶために最善を尽くしました。
簡単な紹介;
/usr/lib/locale/locale アーカイブ
locale-archive
locale-gen(8)
を呼び出して作成されたメモリマッピングファイルlocaledef(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 を使って達成できます。
- プログラムを書くとき、各printステートメントは、
gettext()
印刷する必要がある文字列をラップするためにGNU関数を使用するのに適しています。 - その後、
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
環境変数は現在のロケール設定を使用するように指示します。wget
これにより、wget
正しいプリコンパイル済み翻訳がポインタを介して読み取りに含まれます.mo binary
。
追加の詳細とソース
ロケールアーカイブの場合:
メモリマッピング:CentOSメーリングリスト
I18N下請け方法:さまざまなロケールのアーカイブコンパイルに関するFedoraドキュメント
また、locale(1), localedef(1)
とのマンページを検討してくださいlocale-gen(8)
。
ファイルの場合.mo
:
ファイル作成プロセス.mo
:GettextのWikipedia
GNU MOファイル形式:解釈とバイナリ形式
また、xgettext(1), msginit(1)
とのマンページを検討してくださいmsgfmt(1)
。
また、ENV変数LC_MESSAGE
とLOCPATH
。
私はこれがこの膨大なテーマの表面にすぎないと確信しています。それにもかかわらず、これが始めるのに十分であることを願っています。