| 原作者 | サン・マイクロシステムズ[1] |
|---|---|
| 開発者 | 様々な |
| 初回リリース | 1990年[2] |
| 安定リリース | 0.23 [3]
/ 2024年12月1日 |
| リポジトリ | OpenSolarisとGNU gettextに基づくさまざまな |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | 国際化とローカリゼーション |
| ライセンス | さまざまなフリーソフトウェアライセンス |
| Webサイト | www.gnu.org/software/gettext/ |
コンピューティングにおいて、gettextはUnix 系コンピュータオペレーティング システムで多言語プログラムを書くために一般的に使用される国際化およびローカリゼーション(i18n および l10n) システムです。gettext の主な利点の 1 つは、プログラミングと翻訳を分離できることです。[4] gettext の最も一般的に使用されている実装は、 1995 年にGNU プロジェクトによってリリースされたGNU gettext [5]です。ランタイム ライブラリはlibintlです。gettext は、任意の数の複数形の名詞に異なる文字列を使用するオプションを提供しますが、この機能は文法上の性別をサポートしていません。このシステムで使用される主なファイル名拡張子は、.POT (Portable Object Template)、. PO (Portable Object)、および .MO (Machine Object) です。[6]
歴史
当初、POSIX はメッセージをローカライズする手段を提供しませんでした。1980 年代後半に 2 つの提案、1988 年の Uniforum gettext と 1989 年の X/Open catgets (XPG-3 § 5) が提起されました。Sun Microsystems は1993 年に最初の gettext を実装しました。[1] Unix と POSIX の開発者は、どのようなインターフェイスを使用するかについて実際には合意に至らなかったため (もう 1 つの選択肢は X/Open catgets)、glibc を含む多くのC ライブラリが両方を実装しました。[7] 2019 年 8 月の時点で、gettext が POSIX の一部であるべきかどうかは、その古くからの敵がすでに使用されなくなっているにもかかわらず、オースティン グループでまだ議論の的となっています。挙げられた懸念には、システム設定のロケール (マルチスレッドの問題が発生するグローバル変数)への依存と、ワイド文字列を含む新しい C 言語拡張のサポートが含まれていました。[8][アップデート]
GNUプロジェクトは、 gettext のメッセージをキーとして扱うアプローチの方がシンプルで使いやすいと判断しました (catgets を含む他のほとんどのシステムでは、開発者が各文字列の「キー」名を考え出す必要があります)。[9]彼らは1995 年に、このシステムのフリー ソフトウェア実装である GNU gettext をリリースしました。 [2] Gettext は、GNU かどうかに関わらず、それ以来多くのプログラミング言語に移植されています。[10] po のシンプルさと幅広いエディター サポートにより、プログラム以外のコンテキストでもテキスト ドキュメントに採用されるようになり、他のローカリゼーション フォーマット間の中間手段としても使用されるようになりました。このような橋渡しとして、po4a (po は何でも) や Translate Toolkit などのコンバータが登場しています。[11] [12]
手術
プログラミング

gettextの基本的なインターフェースはgettext(const char*)関数であり、ユーザーが元の言語(通常は英語)で見る文字列を受け入れます。入力時間を節約し、コードの乱雑さを減らすために、この関数は一般に次のように別名付けられます:[13]_
printf ( gettext ( "私の名前は%sです。\n " ), my_name ); printf ( _ ( "私の名前は%sです。\n " ), my_name ); // 同じですが、短くなります
gettext()提供された文字列をキーとして翻訳を検索し、翻訳が利用できない場合は元の文字列を返します。これは、プログラムID(多くの場合整数)が使用されるPOSIX catgets()、[14]、 AmigaOS GetString()、[15]、またはMicrosoft Windows LoadString()とは対照的です 。同じ元の言語のテキストが異なる意味を持つ可能性がある場合に対処するために、gettextにはcgettext()追加の「コンテキスト」文字列を受け入れるような関数があります。
xgettextはソースに対して実行され、.potソースから抽出されたすべての翻訳可能な文字列のリストを含む (Portable Object Template) ファイルを生成します。 で始まるコメントは///翻訳者にヒントを与えるために使用されますが、範囲をさらに制限するために他のプレフィックスも構成可能です。そのような一般的なプレフィックスの 1 つは ですTRANSLATORS:。
たとえば、コメント付きの入力ファイルは次のようになります。
/// 翻訳者: %s には、環境設定で指定されたユーザー名が含まれます
printf ( _ ( "私の名前は %s です。\n " ), my_name );
xgettext次のコマンドを使用して実行されます:
xgettext -c /
結果の .pot ファイルは、コメントを付けると次のようになります (xgettext は文字列をC言語のprintf形式の文字列として認識することに注意してください)。
#. TRANSLATORS: %s には、設定で指定されたユーザー名が含まれます。
#、c 形式
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""
POSIXシェルスクリプトでは、gettextは、gettext.sh同様の言語でgettextが提供する多くの同じ機能を提供するライブラリを提供します。[16] GNU bashにも単純なgettext関数の簡略化された構造があります$"msgid"が、関数の提供にはCライブラリに依存していますgettext()。[17]
翻訳
翻訳者はプログラム.poを使用してテンプレートから(ポータブルオブジェクト)ファイルを生成しmsginit、翻訳を入力します。[18] msginit翻訳を初期化するので、例えばフランス語の翻訳の場合、実行するコマンドは次のようになります。[6]
msginit --locale=fr --input=name.pot
これにより が作成されますfr.po。翻訳者は、結果のファイルを手動で、またはPoeditなどの翻訳ツールや、ファイル編集モードを備えたEmacs.poを使用して編集します。編集されたエントリは次のようになります。
#: src/name.c:36
msgid "My name is %s.\n"
msgstr "私は %s と名乗っています。\n"
最後に、.poファイルはmsgfmtバイナリ(マシンオブジェクト)ファイルにコンパイルされます。GNU gettextは、別のgettext実装を持つシステムでは.mo独自のファイル名拡張子を使用する場合があります。 [19]これらは、ソフトウェアパッケージとともに配布できる状態になりました。
.gmo
GNUはmsgfmtプログラミング言語で使用されるフォーマット文字列に関連するいくつかのチェックも実行できます。また、MO以外の言語固有の形式での出力も可能です。 [20] X /Openの同等のものはですgencat。
開発ワークフローの後の段階では、msgmerge古い翻訳を新しいテンプレートに「更新」するために使用できます。また、ファイルのmsgunfmt逆コンパイル.moや、バッチ処理用の他の多くのユーティリティもあります。
ランニング
Unixタイプのシステムでは、ユーザーが環境変数 LC_MESSAGESを設定し、そのファイルがある場合は、プログラムは選択した言語で文字列を表示します.mo。
GNU系のユーザーは、代わりに環境変数を使用することもできますLANGUAGE。Unix変数との主な違いは、フォールバックとしてコロンで区切られた複数の言語をサポートしていることです。[21]
複数形
インターフェースngettext()は、文字列内の名詞の数を考慮します。 の規則と同様にgettext()、実際の使用では に別名が付けられることがよくありますN_。次のコード サンプルを検討してください。
// パラメータ: 英語の単数形、英語の複数形、整数カウント
printf ( ngettext ( "%d 個の翻訳されたメッセージ" , "%d 個の翻訳されたメッセージ" , n ), n );
""PO ファイルの (空文字列) エントリのヘッダーには、いくつかのメタデータが格納されます。その 1 つは、言語で使用される複数形です。これは通常、C スタイルの三項演算子を使用して指定されます。スロベニア語を翻訳するとします。
msgid ""
msgstr ""
"..."
"言語: sl\n"
"複数形: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
複数形が 4 つあるので、最終的な po は次のようになります。
#: src/msgfmt.c:876
#, c-format
msgid "%d 翻訳済みメッセージ"
msgid_plural "%d 翻訳済みメッセージ"
msgstr[ 0 ] "%d 件の事前報告"
msgstr[ 1 ] "%d 件の事前報告"
msgstr[ 2 ] "%d 個のスポロチリ"
msgstr[ 3 ] "%d 個のスポロチラ"
言語の複数形規則はUnicodeコンソーシアムによって提供されています。[22] msginitは特定の言語のファイルを作成するときに適切な規則を事前に入力します。[18]
実装
Cに加えて、gettextには次の実装があります:ASP.NET用のC# [23] [ 24]とWPF用のC# [25] Perl、[26] PHP、[27] Python、[28] R、[29] Scala、[30] Node.js [31 ]
GNU gettextはObjective-Cをネイティブサポートしていますが、 Swiftプログラミング言語はまだサポートされていません。これらのCocoaプラットフォームでよく使用されるgettext実装はPOLocalizedStringです。[32] Microsoft Outlook for iOSチームもgettextのようなAPIを備えたLocalizedStringsKitライブラリを提供しています。[33]
参照
参考文献
- ^ ab “About gettext”. gnu.org . 2024年5月9日閲覧。
- ^ ab "History of gettext() et al? - comp.unix.solaris". Compgroups.net . 2012年3月23日時点のオリジナルよりアーカイブ。2016年4月3日閲覧。
{{cite web}}: CS1 メンテナンス: 不適切 URL (リンク) - ^ Bruno Haible (2024年12月1日). 「gettext-0.23 リリース [安定版]」 . 2024年12月1日閲覧。
- ^ Martindale, Linda (2002年11月1日). 「南アフリカのデジタル格差を埋める | Linux Journal」. linuxjournal.com . Linux Journal . 2019年9月17日時点のオリジナルよりアーカイブ。 2019年9月17日閲覧。
- ^ Tykhomyrov, Olexiy Ye (2002 年 11 月 1 日). 「国際化プログラミング入門 | Linux Journal」. linuxjournal.com . Linux Journal . 2019 年 9 月 17 日時点のオリジナルよりアーカイブ。2019年9 月 17 日閲覧。
- ^ ab 「GetText PO および POT ファイルを使用した翻訳方法」。Icanlocalize.com。2016年4 月 3日閲覧。
- ^ 「メッセージ翻訳」。GNU C ライブラリ。
- ^ 「0001122: POSIX には gettext() とその仲間が含まれている必要があります - Austin Group Defect Tracker」。Austin Group Defect Tracker。
- ^ 「プログラマの視点」. gettext 0.10.35 . 1998年4月30日.
- ^ 「GNU gettext ユーティリティ: プログラミング言語のリスト」。
- ^ "po4a". po4a.org .
- ^ 「ローカリゼーション エンジニアに必須のツールキット」。翻訳ツールキット。
- ^ 「GNU gettext utilities: How Marks Appear in Sources」www.gnu.org . 2024年3月25日時点のオリジナルよりアーカイブ。2024年4月3日閲覧。
- ^ 「catgetsについて」gnu.org . 2017年10月24日閲覧。
- ^ 「AmigaOS マニュアル: Python モジュールとパッケージ - AmigaOS ドキュメンテーション Wiki」. wiki.amigaos.net . 2023 年7 月 9 日閲覧。
- ^ 「GNU gettext ユーティリティ: sh」。
- ^ 「GNU gettext ユーティリティ: bash」。
- ^ ab 「GNU gettext ユーティリティ: PO ファイル」。Gnu.org。2016年4 月 3 日閲覧。
- ^ 「翻訳を伝達するファイル」Gnu.org 2014年4月22日閲覧。
- ^ 「msgfmt の呼び出し」。GNU gettext ユーティリティ。
- ^ 「GNU gettext ユーティリティ: ロケール環境変数」。Gnu.org。2016年4 月 3 日閲覧。
- ^ 「言語の複数形の規則」。unicode.org。
- ^ 「Google Code アーカイブ - Google Code プロジェクト ホスティングの長期ストレージ」。Code.google.com。2016年4月 3 日閲覧。
- ^ 「 turquoiseowl/i18n: ASP.NET のスマートな国際化」。GitHub.com。2016年4 月 3 日閲覧。
- ^ 「NGettext.Wpf - WPF の適切な国際化サポート (NGettext 経由)」。GitHub。2019年 8 月 16 日。
- ^ 「libintl-perl - GNU Gettext などで実装されている Uniforum メッセージ翻訳システムとの互換性を目的とした Perl 用国際化ライブラリ」。github.com。2017年9 月 14 日閲覧。
- ^ “Gettext”. php.net . 2017年10月24日閲覧。
- ^ 「gettext – 多言語国際化サービス – Python 3.7.0 ドキュメント」。docs.python.org。2018年9 月 21 日閲覧。
- ^ 「gettext: テキストメッセージを翻訳する」。rdrr.io 。 2021年11月13日閲覧。
- ^ 「makkarpov/scalingua: Scala 用のシンプルな gettext のような国際化ライブラリ」. github.com . 2016 年4 月 28 日閲覧。
- ^ 「DanielBaulig/node-gettext: Joshua I. Miller の Javascript Gettext ライブラリを node.js 用に改良したもの」。GitHub.com。2016年4月 3 日閲覧。
- ^ 「hulab/POLocalizedString: gettext for iOS/OS X/watchOS/tvOS」。GitHub。hulab 。 2019年9月19日。
- ^ 「microsoft/LocalizedStringKit: コードから直接 .strings ファイルを生成する」。GitHub。Microsoft。2020年2 月 12 日。
外部リンク
- 公式 GNU gettext サイト
