[28] [DFN[POファイル]]は、
[[プログラム]]等で利用する[[文字列]]データの記述形式です。
[[多言語]]対応のため[[プログラム]]と[[文字列]]を分離する際に使われています。

[REFS[
- [1] [CITE@en[GNU `gettext' utilities]] ([TIME[2009-03-20 11:59:11 +09:00]] 版) <https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files>
]REFS]


[FIG(quote)[ [2] [CITE@en[GNU `gettext' utilities]] ([TIME[2009-03-20 11:59:11 +09:00]] 版) <https://www.gnu.org/software/gettext/manual/gettext.html#index-files_002c-_0040file_007b_002epo_007d-and-_0040file_007b_002emo_007d-29>

>The letters PO in .po files means Portable Object, to distinguish it from .mo files, where MO stands for Machine Object. This paradigm, as well as the PO file format, is inspired by the NLS standard developed by Uniforum, and first implemented by Sun in their Solaris system. 
]FIG]

* 構文

[12] [[POファイルの構文解析]]を参照してください。

* 拡張

[4] [CITE@ja[KDE 日本語翻訳プロジェクト]] [CSECTION[KDE の独自拡張]]
([TIME[2009-03-20 15:42:24 +09:00]] 版) <http://www.kde.gr.jp/document/po/index.php#KDEorig>

[9] [CITE[Locale::Maketext::Lexicon::Gettext - PO and MO file parser for Maketext - search.cpan.org]] ([TIME[2009-03-20 16:20:26 +09:00]] 版) <http://search.cpan.org/~drtech/Locale-Maketext-Lexicon-0.77/lib/Locale/Maketext/Lexicon/Gettext.pm>

* 頭部

[26] 
[FIG(middle list)[
- [CODE@en[[[Content-Transfer-Encoding:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[Content-Type:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[Language-Team:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[Last-Translator:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[MIME-Version:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[Project-Id-Version:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[Plural-Forms:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[PO-Revision-Date:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[POT-Creation-Date:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[Report-Msgid-Bugs-To:]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[X-Accelerator-Marker:]]]]
- [CODE@en[[[X-Launchpad-Export-Date:]]]]
- [CODE@en[[[X-Generator:]]]]
- [CODE@en[[[X-Poedit-Country:]]]]
- [CODE@en[[[X-Poedit-Language:]]]]
- [CODE@en[[[X-Poedit-SourceCharset:]]]]
- [CODE@en[[[Language:]]]]
- [CODE@en[[[X-Loco-Source-Locale:]]]]
- [CODE@en[[[X-Loco-Target-Locale:]]]]
- [CODE@en[[[X-Loco-Project-Id:]]]]
- [CODE@en[[[X-Loco-Api-Version:]]]]
- [CODE[X-Direction:]] [SRC[>>34]]
- [CODE[X-Language:]] [SRC[>>34]]
- [CODE[X-Language-in-English:]] [SRC[>>34]]
- [CODE[X-HasWikiMarkup:]] [SRC[>>34]]

]FIG]

[REFS[

- [34] 
[CITE@ja[MoinI18n/ja - 1.9 Master Wiki]], [TIME[2024-09-25T11:55:28.000Z]] <https://master19.moinmo.in/MoinI18n/ja>

]REFS]

* エントリー内

- [CODE@en[[['''#''' ]]]] [[翻訳者注釈]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[['''#'''.]]]] [[抽出注釈]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[['''#''':]]]] [[参照]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[['''#''',]]]] [[旗]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[['''#'''|]]]] 旧版 [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[['''#'''~]]]] 廃止済み [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[domain]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[msgctxt]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[msgid]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[msgid_plural]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[msgstr]]]] [SRC@en[[[GNU]] [[gettext]]]]

[39] [CODE[#]] から始まる構文は[[注釈が意味を持つ]]シリーズかな。

* 旗

- [CODE@en[[[fuzzy]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-wrap]]]]
- [CODE@en[[[awk-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-awk-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[boost-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-boost-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[c-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-c-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[csharp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-csharp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[elisp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-elisp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[gcc-internal-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-gcc-internal-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[java-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-java-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[kde-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-kde-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[librep-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-librep-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[lisp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-lisp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[objc-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-objc-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[object-pascal-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-object-pascal-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[perl-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-perl-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[perl-brace-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-perl-brace-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[php-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-php-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[python-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-python-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[qt-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-qt-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[scheme-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-scheme-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[sh-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-sh-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[smalltalk-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-smalltalk-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[tcl-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-tcl-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[ycp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]
- [CODE@en[[[no-ycp-format]]]] [SRC@en[[[GNU]] [[gettext]]]]

* Charset

[3] [CITE@ja[Re: gettext-0.10.38 について]] ([TIME[2004-06-13 23:44:42 +09:00]] 版) <http://mail.gnome.gr.jp/ml/gnome-translation/200106/msg00005.html>

>
0.1.36 から multibyte が正しく処理されるようになった、ということです
よね。
>  で、shift_jis っぽい encoding である big5 では single byte の 
encoding として処理された時の不具合を避けるために、文字によっては \ を
入れてた、というのがありました。それが最近の gettext では問題となる、
ということのようです (shift_jis の文字列を C のコードに埋め込む場合に
「表」を「表\」にするような...)。
>  euc-jp でも何か問題がありましたかね。文字の上位バイトと下位バイトが
別々の行に泣き別れになってる ja.po の場合にはなにかありそうですが、そ
れかな。

[10] [CITE[Locale::Maketext::Simpleのハマリどころ - Kitano’s Ramblings on Sillicon Valley]] ([TIME[2009-03-20 20:34:22 +09:00]] 版) <http://d.hatena.ne.jp/t-kitano/20070528/1180334424>

[CODE@en[[[Content-Type:]]]] や [CODE@en[[[Content-Transfer-Encoding:]]]]
の左右が [[utf8旗]]に影響を与えるらしいです。

* 値

[35] 
[CODE[msgstr]] に記述される値は、[[文字列]]、つまり当該[[言語]]に[[翻訳]]された[[人間]]対象の[[文章]]片です。

[36] 
実際には[[応用]]依存となる部分が大きく、いろいろな[[文字列]]化データが入ることがあります。

[38] 
[CODE[#,]] のような形で指定されることもあれば、されないこともあります。

[37] 
[CODE[printf]] されるデータは、 [CODE[%s]] などの [CODE[printf]] 形式の[[変数]]文字列が使われます。
[CODE[[[#,]] [[c-format]]]] です。

[40] 
[CODE[[[#,]] [[python-format]]]]
[SRC[>>34]]
のように各言語の同様の[[雛形]]構文の文字列が使われることがあります。

[41] 
[[Webページ]]目的のものでは [[HTML]] の[[タグ]]が使われることがあります。

[42] 
[[言語]]によって変化する[[フォント名]]、[[色]]、 [CODE[class]]、
その他の[[人間]]向け以外の[[文字列]]を [CODE[msgstr]] とすることがあります。

* 実装

[5] [CITE@en[Ruby-GetText-Package - YotaLab Storage]] ([TIME[2009-03-20 15:55:41 +09:00]] 版) <http://www.yotabanana.com/hiki/ruby-gettext.html>

[6] [CITE[Locale::PO - Perl module for manipulating .po entries from GNU gettext - search.cpan.org]] ([TIME[2009-03-20 16:03:51 +09:00]] 版) <http://search.cpan.org/~ken/Locale-PO-0.21/PO.pm>

[7] >>6 は[[ライセンス]]不詳なのが痛い。

[8] [CITE[Steffen Winkler / DBD-PO-2.04 - search.cpan.org]] ([TIME[2009-03-20 16:17:43 +09:00]] 版) <http://search.cpan.org/~steffenw/DBD-PO-2.04/>

[11] [CODE(perl)@en[[[Text::Po::Parser]]]] というのもありましたが、なぜか
[[CPAN]] からは削除されているみたいですね。探せば出てきますが。
2006年のものみたいです。

[13] [CITE@en[PO Viewer]] ([TIME[2009-03-21 22:39:26 +09:00]] 版) <http://suika.fam.cx/~wakaba/-temp/test/po/tools/live>

[[msgfmt]] + [[msgunfmt]] の結果を見れます。

[REFS[
- [17] [CITE@en[tests-web/live.cgi at master · wakaba/tests-web]] ([TIME[2015-02-18 12:10:13 +09:00]] 版) <https://github.com/wakaba/tests-web/blob/master/po/tools/live.cgi>
]REFS]

[18] >>17 は >>13 のソースコード。 >>13 はもう動作しない。

[REFS[
- [16] [CITE@en[wakaba/perl-popopo]] ([TIME[2015-02-18 12:08:55 +09:00]] 版) <https://github.com/wakaba/perl-popopo>
]REFS]

[19] [CITE@en[POEditor - Software translation management app]] ([TIME[2015-02-18 12:17:22 +09:00]] 版) <https://poeditor.com/>

[20] [CITE@en-US[ITS Tool | XML to PO and back again]] ([TIME[2015-02-18 12:38:35 +09:00]] 版) <http://itstool.org/>

[23] [CITE@en[Online PO file editor - Powered by Loco]] ([TIME[2015-02-18 13:55:32 +09:00]] 版) <https://localise.biz/free/poeditor>

[24] [CITE@en[Compiling translations]] ([TIME[2015-01-13 19:51:31 +09:00]] 版) <https://angular-gettext.rocketeer.be/dev-guide/compile/>

* POT

[22] [[翻訳]]した[[文字列]]データを含まない空の状態の [[PO]] ファイルを特に 
[DFN[POT]]
([DFN[PO template]]) と呼んでいます。

[REFS[

[FIG(quote)[
[FIGCAPTION[
[30] [CITE[GNU gettext utilities]]
([TIME[2015-02-18 12:51:49 +09:00]] 版)
<http://www.gnu.org/software/gettext/manual/gettext.html#Template>
]FIGCAPTION]

> After preparing the sources, the programmer creates a PO template file.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[31] [CITE[GNU gettext utilities]]
([TIME[2015-02-18 12:54:07 +09:00]] 版)
<http://www.gnu.org/software/gettext/manual/gettext.html#index-creating-a-new-PO-file>
]FIGCAPTION]

> When starting a new translation, the translator creates a file called LANG.po, as a copy of the package.pot template file with modifications in the initial comments (at the beginning of the file) and in the header entry (the first entry, near the beginning of the file).

]FIG]

]REFS]

* MIME 型

[14] [[MIME型]]は [DFN[[CODE(MIME)@en[text/x-po]]]] が用いられます。
[CODE(MIME)@en[[[charset]]]] [[引数]]が指定されることもあります。

[33] [[POファイル]]に
[DFN[[CODE[text/x-gettext-translation]]]]、
[[POTファイル]]に
[DFN[[CODE[text/x-gettext-translation-template]]]]
も使われるようです。


* 拡張子

[15] [[POファイル]]の[[ファイル名]]の[[拡張子]]には 
[DFN[[CODE(file)@en[.po]]]] が用いられます。

[32] [[POTファイル]]の[[ファイル名]]の[[拡張子]]には
[DFN[[CODE(file)[.pot]]]]
が使われるようです。

* 関連

[27] [[コンパイル]]して[[MOファイル]]にすることがあります。

;; [29] [[gettext]] 本来の想定利用方法は [[MOファイル]]にコンパイルしたものを[[プログラム]]から読み込む方式なのでしょうが、
[[POファイル]]を直接読み込む実装や、
それ以外の[[データ形式]]に変換しておく実装もあります。

* メモ

[21] [CITE@en-US[ITS and PO | ITS Tool]]
([TIME[2015-02-18 12:40:27 +09:00]] 版)
<http://itstool.org/documentation/its-and-po/>

[25] [CITE[Apps/Gtranslator - GNOME Wiki!]]
([TIME[2015-03-18 14:25:42 +09:00]] 版)
<https://wiki.gnome.org/Apps/Gtranslator>