Contents Up Previous Next 原文へのリンク

英語以外のアプリケーションを書く Writing non-English applications

ここでは,英語以外の言語でユーザーとやりとりするアプリケーションの書き方を説明する. 不幸な事に,多くの言語はプラットフォームによって違う文字コード体系を用いている. そういった文字コード体系では多くの文字が違い,同じテキストを全てのプラットフォームで用いることは不可能である.

wxWidgetsは一つのアプリケーションを,文字コードのみが違う (例えばiso8859-13とwindows-1257で書かれたヘルプファイルやメニュー項目) 多くのパッケージとして配布することの回避をサポートする機構を提供する. この機構によって,例えば全てのシステムで透過的に扱われるiso8859-13のデータだけを配布することができる.

ロケールという概念について説明した 国際化(Internationalization)を読んでください

以降の文書では,iso8859-2windows-1250を用いているが,他の文字コードでも同じである

This article describes how to write applications that communicate with user in language other than English. Unfortunately many languages use different charsets under Unix and Windows (and other platforms, to make situation even more complicated). These charsets usually differ in so many characters it is impossible to use same texts under all platforms.

wxWidgets library provides mechanism that helps you avoid distributing many identical, only differently encoded, packages with your application (e.g. help files and menu items in iso8859-13 and windows-1257). Thanks to this mechanism you can, for example, distribute only iso8859-13 data and it will be handled transparently under all systems.

Please read Internationalization which describes the locales concept.

In the following text, wherever iso8859-2 and windows-1250 are used, any encodings are meant and any encodings may be substituted there.

ロケール Locales

複数のプラットフォームで正しくテキストをGUIに表示する一番の方法はロケールを用いることだ. ソースコードの中では英語かそれ以外のキーワードを用い,本当に表示するものはメッセージカタログ (国際化(Internationalization)を参照)の中に書く.

標準的な.poファイルはこのようなヘッダで始まる.

The best way to ensure correctly displayed texts in a GUI across platforms is to use locales. Write your in-code messages in English or without diacritics and put real messages into the message catalog (see Internationalization).

A standard .po file begins with a header like this:

# 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"
次の行に注目する.
Note this particular line:

"Content-Type: text/plain; charset=CHARSET\n"
これはカタログで用いられている文字コードを指定する.このカタログの中の全ての文字列はこの文字コードを用いて エンコードされている.
It specifies the charset used by the catalog. All strings in the catalog are encoded using this charset.

そこには正確な文字コードに関する情報を記す必用がある. そうした.poファイルはこのようになる.
You have to fill in proper charset information. Your .po file may look like this after doing so:

# 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属性をつけないこと)
"#, fuzzy"という行があると,文字コードの変換が行われなくなる
(Make sure that the header is not marked as fuzzy.)
wxWidgetsはこのカタログをどんなプラットフォームでも用いることが出来る. (iso8859-2がUnixのエンコードで,通常はWindowsでは読めないとしてもwxWidgetsは大丈夫)
wxWidgets is able to use this catalog under any supported platform (although iso8859-2 is a Unix encoding and is normally not understood by Windows).

この変換はどのように行われるか? wxLocaleクラスに正しいヘッダを含むメッセージカタログを読み込ませたとき,文字コードをチェックする. そしてそのカタログはユーザーのOSで使われている文字コード (wxLocale::GetSystemEncodingwxLocale::GetSystemEncodingNameを参照) に変換される. これがwxLocaleクラスのデフォルトの動作である. wxLOCALE_CONV_ENCODINGwxLocale::Initに渡さ無い ことにより,この動作を無効にできる.
How is this done? When you tell the wxLocale class to load a message catalog that contains correct header, it checks the charset. The catalog is then converted to the charset used (see wxLocale::GetSystemEncoding and wxLocale::GetSystemEncodingName) by user's operating system. This is default behaviour of the wxLocale class; you can disable it by not passing wxLOCALE_CONV_ENCODING to wxLocale::Init.

フォントマップ Font mapping

wxEncodingConverterwxFontMapper を,テキストを表示する時に用いることができる.
You can use wxEncodingConverter and wxFontMapper to display text:

if (!wxFontMapper::Get()->IsEncodingAvailable(enc, facename))
{
   wxFontEncoding alternative;
   if (wxTheFontMapper->GetAltForEncoding(enc, &alternative, 
                                          facename, FALSE))
   {
       wxEncodingConverted encconv;
       if (!encconv.Init(enc, alternative))
           ...failure...
       else
           text = encconv.Convert(text);
   }
   else
       ...failure...
}
...display text...
データの変換 Converting data

プログラムのデータ(ドキュメント等)全てを一つのエンコーディング(仮にwindows1250とする) で保管したいとする. 明らかに,最も優れた方法はwxEncodingConverterを 用いることである.
You may want to store all program data (created documents etc.) in the same encoding, let's say windows1250. Obviously, the best way would be to use wxEncodingConverter.

ヘルプファイル Help files

もしwxHtmlHelpControllerを使うなら,何の問題も無い. ただ,この例のようなMETAタグを全てのHTMLファイルに確実に含めること.
If you're using wxHtmlHelpController there is no problem at all. You must only make sure that all the HTML files contain the META tag, e.g.

<meta http-equiv="Content-Type" content="text/html; charset=iso8859-2">
そしてhhpプロジェクトファイルはOPTIONSセクションにこの1行を含む.
and that the hhp project file contains one additional line in the OPTIONS section:

Charset=iso8859-2
この行はHTMLヘルプコントローラに,コンテンツやインデックステーブルにどのエンコーディングが用いられて いるかを知らせる.
This additional entry tells the HTML help controller what encoding is used in contents and index tables.