Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/12-2
12-2 リソースローカライズのためのオーバレイの使用
Palm OS 3.5 より、オーバレイを使用したローカライズ用のリソースデータベースのサポートが追加されました。ローカライズ用のオーバレイは、ソフトウェアのリコンパイルや変更を必要とすることなくソフトウェアをローカライズする方法を提供します。それぞれのオーバレイデータベースは独立したリソースデータベースで、単一のソフトウェアモジュール(PRC ファイルあるいはベースとなるデータベース)および単一の対象ロケール(言語と地域)に対して適切にローカライズされたリソースのセットを提供します。
ベースとなるデータベースに対する要求はないため、例えばサードパーティが既存のアプリケーション用のローカライズオーバレイを作成する場合でもオリジナルのアプリケーション開発者がなんらかの変更を行なう必要はありません。稀に、オーバレイを無効にしてサードパーティによるオーバレイの作成を防止したい場合があります。そのためには、値 0 の 'xprf' リソース(シンボル名は sysResTExtPrefs)をデータベースに含め、その disableOverlays フラグをセットする必要があります。このリソースは UIResources.r で定義されています。
オーバレイデータベースはベースとなるデータベースと同じクリエータ ID を持ちますが、データベースタイプは 'ovly' になります。また、データベース名にターゲットとなるロケールを示す接尾詞が付加されます。例えば、Datebook.prc は日本向けのオーバレイであることを示す Datebook_jpJP という名前のデータベースによってオーバレイされます。各オーバレイデータベースは、ベースとなるデータベースのタイプ、ターゲットロケール、およびオーバレイが対象とするベースデータベースのバージョンを識別するのに必要な情報を格納した値 1000 の 'ovly' リソースを持ちます。
Palm OS SDK は、オーバレイを作成するためのツールを提供しています。オーバレイ作成に関する詳細は「Palm OS Programming Development Tools Guide」の“PRC to Overlay Tool”の章を参照して下さい。
オーバレイをサポートするシステム上で PRC ファイルがオープンされると、オーバレイマネージャがそのハンドヘルドの現在のロケールを確認し、そのロケールとベースデータベースにマッチするオーバレイを検索します。オーバレイのデータベース名はベースデータベース名と一致していなければならず、接尾詞はロケールの接尾詞と一致していなければなりません。また、ベースデータベースにマッチする値 1000 の 'ovly' リソースを持っている必要があります。名前と接尾詞、およびオーバレイリソースが全て正しければ、オーバレイは PRC ファイルに続いてオープンされます。PRC ファイルが閉じられると、そのオーバレイも閉じられます。
オーバレイは読み取り専用でオープンされ、プログラマからは隠されます。データベースを開くと参照を受け取りますが、それはベースデータベースのものであり、オーバレイのものではありません。リソースマネージャコールも通常通り行なえますが、リソースマネージャは適切な個所でオーバレイにアクセスします。
ローカライズ可能なリソースにアクセスする場合、指定したデータベースだけを対象としてリソースを検索する関数は使用しないで下さい。以下に例を示します。
// WRONG! searches only one database. DmOpenRef dbP = DmNextOpenResDatabase(NULL); UInt16 resIndex = DmFindResource(dpP, strRsc, strRscID); MemHandle resH = DmGetResourceIndex(dbP, resIndex);
上記の例では、dbP はもっとも新しくオープンされたデータベースの参照となります。それは通常、データベースのオーバレイです。この参照を DmFindDatabase に渡すということは、オーバレイだけを対象としてリソースを検索することを意味します。ローカライズされていないリソースを検索している場合、DmFindResource はそのリソースを発見することができません。かわりに DmGet1Resource 関数を使用すると、もっとも新しくオープンされたデータベースとそのオーバレイを対象としてリソースを検索します。または DmGetResource を使用してオープンされている全てのデータベースとそのオーバレイを検索します。
// Right. DmGet1Resource searches both databases. MemHandle resH = DmGet1Resource(strRsc, strRscID); // Or use DmGetResource to search all open databases. MemHandle resH = DmGetResource(strRsc, strRscID);
データマネージャは、リソースデータベースが読み取り専用でオープンされた場合にのみオーバレイをオープンします。リソースデータベースを読み書き両用でオープンした場合、関連するオーバレイはオープンされません。さらに、ベースデータベースのオーバレイされているリソースを変更すると、オーバレイの 'ovly' リソースのチェックサムが不正な値になり、オーバレイがまったく使用できなくなってしまいます。そのため、リソースデータベースを変更する場合はオーバレイデータベースも変更する必要があります。
オーバレイマネージャはパブリックな関数をいくつか提供しているだけですが、それらを直接両用することは通常ありません。役に立つかもしれない関数を1つ挙げるとすれば、OmGetCurrentLocale (あるいは OmGlueGetCurrentLocale )があります。これは、そのハンドヘルドのロケールを識別するための構造体を返します。