この概要では英語以外の言語を用いてユーザとやり取りするアプリケーションの作成方法について説明します。残念なことに、Unix や Windows では多くの言語で異なる文字コードが使用されています。(そして、他のプラットフォームではさらに複雑なことになっています) 通常、これらの文字コードは多くの文字で異なっているため、すべてのプラットフォームで同じテキストを使用することはできません。
wxWidgets ライブラリは (エンコーディングだけが異なる) 多くの同一なパッケージを配布しなくてもすむ仕組みを提供しています。(例えば iso8859-13 と windows-1257 を使用したヘルプファイルやメニュー項目などです) この仕組みのおかげで、例えば iso8859-13 のデータを配布するだけで、すべてのシステムでこのデータが透過的に処理されます。
ロケールの概念については 国際化 を参照してください。
以降の文章で iso8859-2 や windows-1250 が使用されているところは任意のエンコーディングを意味しており、好きなエンコーディングに置き換えてください。
プラットフォームをまたがって GUI に正しくテキストを表示する最善の方法はロケールを使用することです。コード中のメッセージは英語か、もしくは発音区別符号を使用せずに書き、実際のメッセージはメッセージカタログ (国際化 参照) に書くようにしてください。
標準の .po ファイルはこのようなヘッダで始まります:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 1999-02-19 16:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n"
この行に注目してください:
"Content-Type: text/plain; charset=CHARSET\n"
これはカタログで使用される文字コードを指定しています。カタログ内のすべての文字列はこの文字コードで符号化されています。
ここに適切な文字コードの情報を記入する必要があります。これを行ったあとの .po ファイルはこのようになります:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 1999-02-19 16:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso8859-2\n" "Content-Transfer-Encoding: 8bit\n"
(ヘッダが fuzzy としてマーク されない ようにしてください)
wxWidgets の対応しているすべてのプラットフォームでこのカタログを使用できます。(iso8859-2 は Unix のエンコーディングであり、通常は Windows で使用できないとしてもです)
これはどのように行われるのでしょうか? 正しいヘッダを含むメッセージカタログを読み込むように wxLocale クラスへ指示すると、そこで文字コードのチェックが行われます。そして、ユーザのオペレーティングシステムで使用されている文字コード (wxLocale::GetSystemEncoding と wxLocale::GetSystemEncodingName 参照) へカタログが変換されます。
ソースコード中の msgid には発音区別符号を含まない文字 (つまり、7 ビット ASCII 文字列) だけを使用するべきで、それらは英語で書いてください。
ソフトウェアを wxWidgets に移植する場合、非英語リテラル文字列を含むレガシーなソースコードに直面するかもしれません。それらの文字列を英語に翻訳し、元の文字列をメッセージカタログに記載する代わりに、非英語の msgid を使用するように wxWidgets を設定し、メッセージカタログを用いて英語へ翻訳しても構いません。
xgettext
を使用する場合、--from-code=<ソースコードの文字コード>
オプションを指定してください。 locale.AddCatalog(wxT("myapp"), wxLANGUAGE_GERMAN, wxT("iso-8859-1"));
テキストを表示するのに wxMBConv の概要 と wxFontMapper を使用できます:
if (!wxFontMapper::Get()->IsEncodingAvailable(enc, facename)) { wxFontEncoding alternative; if (wxFontMapper::Get()->GetAltForEncoding(enc, &alternative, facename, false)) { wxCSConv convFrom(wxFontMapper::Get()->GetEncodingName(enc)); wxCSConv convTo(wxFontMapper::Get()->GetEncodingName(alternative)); text = wxString(text.mb_str(convFrom), convTo); } else ...失敗 (iso8859-1/7ビット ASCII を試すかもしれない)... } ...テキストを表示する...
プログラムで扱うデータ (作成したドキュメントなど) をすべて同じエンコーディングで保持したいと思うかもしれません。仮に utf-8
としましょう。wxCSConv を使用することで、アプリケーションを実行しているシステムで使用されているエンコーディングにデータを変換することができます。(wxLocale::GetSystemEncoding 参照)
wxHtmlHelpController を使用しているのであれば何も問題ありません。必要なことはすべての HTML ファイルに次のような META タグを含めることだけです。
<meta http-equiv="Content-Type" content="text/html; charset=iso8859-2">
また、hhp プロジェクトファイルの OPTIONS
セクションに一行追加する必要があります:
Charset=iso8859-2
この追加のエントリはコンテンツとインデックステーブルで使用されているエンコーディングを HTML ヘルプコントローラに通知します。