gettext

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

gettext
原作者サンマイクロシステムズ
開発者様々
初回リリース1990 ; 32年前[1] (1990)
安定リリース
0.21 [2] /2020年7月27日; 22ヶ月前 (2020-07-27)
リポジトリOpenSolarisおよびGNUgettextに基づくさまざまな
オペレーティング·システムクロスプラットフォーム
タイプ国際化とローカリゼーション
ライセンスさまざまな自由ソフトウェアライセンス
Webサイトwww .gnu .org / software / gettext /

コンピューティングでは、gettextは、Unixライクなコンピュータオペレーティングシステムで多言語プログラムを作成するために一般的に使用される国際化およびローカリゼーション(i18nおよびl10n)システムですgettextの主な利点の1つは、プログラミングと翻訳を分離できることです。[3] gettextの最も一般的に使用される実装はGNUgettextであり[4] 1995年にGNUプロジェクトによってリリースされました。ランタイムライブラリはlibintlです。gettextは、名詞の複数形の任意の数に異なる文字列を使用するオプションを提供しますが、この機能はサポートしていません文法的な性別

歴史

当初、POSIXはメッセージをローカライズする手段を提供していませんでした。1980年代後半に、1988年のUniforumgettextと1989年のX/ Open catgets(XPG-3§5)の2つの提案が提起されました。サンマイクロシステムズは1993年に最初のgettextを実装しました。UnixとPOSIXの開発者は、使用するインターフェイスの種類について実際に合意することはありませんでした(他のオプションはX / Openカテゴリです)。そのため、 glibcを含む多くのCライブラリが両方を実装しました。[5] 2019年8月の時点で、gettextをPOSIXの一部にするかどうかは、古い敵がすでに使用されなくなっているにもかかわらず、オースティングループでまだ議論の的となっています。引用された懸念には、システム設定ロケール(グローバル変数)への依存が含まれていましたマルチスレッドの問題が発生する可能性があります)、および幅の広い文字列を含む新しいC言語拡張のサポート。[6]

GNUプロジェクトは、gettextのキーとしてのメッセージアプローチがよりシンプルで親しみやすいものであると判断しました(catgetsを含む他のほとんどのシステムでは、開発者はすべての文字列に「キー」名を付ける必要があります。)[7] 1995年にシステムのフリーソフトウェア実装であるGNUgettextをリリースしました。 [1] Gettext、GNUかどうか、それ以来、多くのプログラミング言語に移植されています。[8] poのシンプルさと広範なエディターのサポートにより、テキストドキュメントの非プログラムコンテキストでの採用や、他のローカリゼーション形式の中間としての採用につながり、po4a(poは何でも)やTranslateToolkitなどのコンバーターがそのような橋。[9] [10]

操作

プログラミング

典型的なgettextワークフロー。左側のde.poインスタンスは、msgmergeを介した翻訳の「更新」を示しています。

gettextの基本的なインターフェースは関数であり、ユーザーが元の言語(通常は英語)で表示する文字列gettext(const char*)を受け入れます。入力時間を節約し、コードの乱雑さを減らすために、この関数は一般的に次のようにエイリアスさます。 _

printf gettext "私の名前は%sです。\ n " )、my_name ); 
printf _ "私の名前は%sです。\ n " )、my_name ); //同じですが、短い  

gettext()次に、提供された文字列を翻訳を検索するためのキーとして使用し、翻訳が利用できない場合は元の文字列を返します。これは 、プログラムID(多くの場合整数)が使用されるPOSIX catgets()[11] AmigaOS GetString()、またはMicrosoftWindowsとは対照的です。 LoadString()同じ元の言語のテキストが異なる意味を持つ可能性がある場合を処理するために、gettextにはcgettext()、追加の「コンテキスト」文字列を受け入れるような関数があります。

xgettextソースで実行され、.pot(ポータブルオブジェクトテンプレート)ファイルが生成されます。このファイルには、ソースから抽出されたすべての翻訳可能な文字列のリストが含まれています。で始まるコメント///は、翻訳者にヒントを与えるために使用されますが、範囲をさらに制限するために他のプレフィックスも構成可能です。そのような一般的なプレフィックスの1つはTRANSLATORS:です。

たとえば、コメント付きの入力ファイルは次のようになります。

///翻訳者:%sには、設定で指定されたユーザーの名前が含まれています
printf _ "私の名前は%sです。\ n " )、my_name ); 

xgettext次のコマンドを使用して実行されます。

xgettext -c /

結果の.potファイルはコメント付きで次のようになります(xgettextは文字列をC言語のprintf形式の文字列として認識することに注意しください

#。
翻訳者:%sには、設定#、c-format #で
指定されたユーザーの名前が含まれています:src / name.c:36 
msgid  "私の名前は%sです。\ n" 
msgstr  ""

POSIXシェルスクリプトでは、gettextは、gettextgettext.shが同様の言語で提供する多くの同じ関数を提供するライブラリを提供します。[12] GNU bash$"msgid"には、関数を提供するためにCライブラリに依存していますが、単純なgettext関数の簡略化された構造もありgettext()ます。[13]

翻訳

翻訳者は.po、プログラムを使用してテンプレートから(ポータブルオブジェクト)ファイルをmsginit取得し、翻訳に記入します。[14] msginitは翻訳を初期化するため、たとえば、フランス語の翻訳の場合、実行するコマンドは次のようになります。[15]

msginit --locale = fr --input = name.pot

これにより、が作成されますfr.po次に、翻訳者は、手動またはPoeditなどの翻訳ツール、またはファイルの編集モードを備えたEmacs.poを使用して、結果のファイルを編集します。編集されたエントリは次のようになります。

#:src / name.c:36 
msgid  "私の名前は%sです。\ n" 
msgstr  "Je m'appelle%s。\ n"

msgfmt最後に、.poファイルはバイナリ.mo(マシンオブジェクト)ファイルにコンパイルされます。.gmoGNU gettextは、別のgettext実装を備えたシステムで独自のファイル名拡張子を使用する場合があります。[16]これで、ソフトウェアパッケージで配布する準備が整いました。

GNUは、プログラミング言語で使用されるフォーマット文字列msgfmtに関連するいくつかのチェックを実行することもできます。また、MO以外の言語固有の形式に出力することもできます。[17] X/Openに相当するものgencat

開発ワークフローの後のフェーズではmsgmerge、古い翻訳を新しいテンプレートに「更新」するために使用できます。msgunfmtファイルの逆コンパイル.moや、バッチ処理用の他の多くのユーティリティもあります

実行中

Unixタイプのシステムでは、ユーザーは環境変数 を設定します。ファイル LC_MESSAGESがある場合は、プログラムは選択された言語で文字列を表示します。.mo

GNUバリアントのユーザーは、代わりに環境変数を使用することもできますLANGUAGEUnix変数との主な違いは、フォールバックのためにコロンで区切られた複数の言語をサポートしていることです。[18]

複数形

インターフェイスはngettext()、文字列内の名詞の数を考慮します。の規則と同様に、実際の使用gettext()ではエイリアス化されることがよくあります。N_コードサンプルを考えてみましょう。

//パラメータ:英語の単数形、英語の複数形、整数カウント
printf ngettext "%d翻訳されたメッセージ" "%d翻訳されたメッセージ" n )、n );   

POファイルの(空の文字列)エントリのヘッダーには、""メタデータが格納されます。そのうちの1つは、言語が使用する複数形で、通常はCスタイルの三項演算子を使用して指定されます。スロベニア語に翻訳したいとしましょう

msgid  "" 
msgstr  "" 
"..." 
"言語:sl \ n" 
"複数形:nplurals = 4;複数形=(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 ]  "%dprevedenihsporočil" 
msgstr [ 1 ]  "%dprevedenosporočilo" 
msgstr [ 2 ]  "%dprevedenisporočili" 
msgstr [ 3 ]  "%dprevedenasporočila"

言語の複数形の参照規則は、Unicodeコンソーシアムによって提供されています。[19] msginitは、特定の1つの言語のファイルを作成するときに、適切なルールも事前に入力します。[14]

実装

Cに加えて、gettextには次の実装があります。ASP.NET [20] [21]WPFの両方のC#[22] Perl[23] PHP[24] Python[25] R[26] Scala[27 ]およびNode.js。[28]

GNU gettextはObjective-Cをネイティブでサポートしていますが、Swiftプログラミング言語はまだサポートされていません。これらのCocoaプラットフォームで一般的に使用されるgettextの実装は、POLocalizedStringです。[29] Microsoft Outlook for iOSチームは、ローカル化されたStringsKitライブラリにgettextのようなAPIも提供しています。[30]

も参照してください

参照

  1. ^ a b "gettext()et al?-comp.unix.solarisの履歴"Compgroups.net 2016年4月3日取得
  2. ^ https://ftp.gnu.org/pub/gnu/gettext/
  3. ^ マーティンデール、リンダ(2002年11月1日)。「南アフリカにおけるデジタルデバイドの橋渡し|LinuxJournal」linuxjournal.comLinuxJournal2019年9月17日にオリジナルからアーカイブされました2019年9月17日取得
  4. ^ Tykhomyrov、Olexiy Ye(2002年11月1日)。「国際化プログラミング入門|LinuxJournal」linuxjournal.comLinuxJournal2019年9月17日にオリジナルからアーカイブされました2019年9月17日取得
  5. ^ 「メッセージ翻訳」GNUCライブラリ
  6. ^ "0001122:POSIXにはgettext()とその仲間が含まれている必要があります-Austin GroupDefectTracker"オースティングループの欠陥トラッカー
  7. ^ 「プログラマーの見解」gettext0.10.351998年4月30日。
  8. ^ 「GNUgettextユーティリティ:プログラミング言語のリスト」
  9. ^ 「po4a」po4a.org
  10. ^ 「ローカリゼーションエンジニアにとって不可欠なツールキット」Toolkitを翻訳します
  11. ^ 「catgetsについて」gnu.org 2017年10月24日取得
  12. ^ 「GNUgettextユーティリティ:sh」
  13. ^ 「GNUgettextユーティリティ:bash」
  14. ^ a b "GNU gettextユーティリティ:POファイル"Gnu.org 2016年4月3日取得
  15. ^ 「GetTextPOおよびPOTファイルを使用して翻訳する方法」Icanlocalize.com 2016年4月3日取得
  16. ^ 「翻訳を伝えるファイル」Gnu.org 2014年4月22日取得
  17. ^ "msgfmt呼び出し"GNUgettextユーティリティ
  18. ^ 「GNUgettextユーティリティ:ロケール環境変数」Gnu.org 2016年4月3日取得
  19. ^ 「言語の複数形の規則」unicode.org
  20. ^ 「GoogleCodeArchive-GoogleCodeProjectHostingの長期保存」Code.google.com 2016年4月3日取得
  21. ^ 「turquoiseowl/i18n:ASP.NETのスマートな国際化」GitHub.com 2016年4月3日取得
  22. ^ "NGettext.Wpf-(NGettextを介した)WPFの適切な国際化サポート"GitHub2019年8月16日。
  23. ^ "libintl-perl-たとえばGNUGettextに実装されているUniforumメッセージ翻訳システムとの互換性を目指すPerlの国際化ライブラリ"github.com 2017年9月14日取得
  24. ^ 「Gettext」php.net 2017年10月24日取得
  25. ^ 「gettext–多言語国際化サービス–Python3.7.0ドキュメント」docs.python.org 2018年9月21日取得
  26. ^ 「gettext:テキストメッセージの翻訳」rdrr.io。_ 2021年11月13日取得
  27. ^ "makkarpov /scalingua:​​Scala用のシンプルなgettextのような国際化ライブラリ"github.com 2016年4月28日取得
  28. ^ "DanielBaulig / node-gettext:JoshuaI.Millerのnode.js用のJavascriptGettextライブラリの適応"GitHub.com 2016年4月3日取得
  29. ^ "hulab / POLocalizedString:iOS / OS X / watchOS/tvOSのgettext"GitHubhulab。2019年9月19日。
  30. ^ "microsoft / LocalizedStringKit:コードから直接.stringsファイルを生成します"GitHubマイクロソフト。2020年2月12日。

外部リンク