国際化のためのガイドライン
以下のセクションでは、Mac OS X の利点を最大限に活用するように、あなたのソフトウェアを国際化するためのやり方についての推奨事項を提供します。
正規の言語 ID とロケール ID を使用しましょう
Mac OS X 10.3 には、CFLocale の関数を通じて正規の【canonical】ロケール ID を取得するための対応が加わりました。
Mac OS X v10.4 以降では、その対応に、正規の言語 ID を取得するためのものが加わりました。(Cocoa での対応も Mac OS X v10.4 にて追加されました。)
もしあなたがユーザの優先ロケール ID を CFBundle または NSBundle を通じて取得すれば、あなたは既に正規のロケール ID を受け取っていることになります。
言語 ID および ロケール ID についての詳細は、「言語とロケールの指定」(19ページ)を参照してください。
正規の言語 ID および ロケール ID をどのように取得するかについての詳細は、「正規の言語 ID とロケール ID を取得する」(30ページ)を参照してください。
バンドルを使用しましょう
Mac OS X のバンドル機構は、各国語化されたリソースを、それらが対応する言語や地域の名前を付けられた、独立したディレクトリ内へあなたに配置させることにより、各国語化の工程を単純化します。
NSBundle または CFBundle は、現在のユーザの言語と地域の設定を元にして、プログラムを各国語化するためにこのリソースフォルダの集合を使用します。
この機構はバンドル化されたプログラムを、さまざまなユーザのためにさまざまな言語で表示することを可能にします。また、リソースをディレクトリでまとめることは、後で新しい各国語化を加えることも容易にします。
Unicode テキストに対応しましょう
アプリケーションは、ユーザへのテキスト表示を伴うすべての状況において、Unicode ベースのテクノロジを使用すべきです。Unicode 対応はマルチバイト言語への対応の要であり、Mac OS X はいくつかの言語(アラビア語、タイ語、ギリシャ語、ハワイ語)を Unicode を通じてのみ対応しています。
あなたが、あなたのソフトウェアをマルチバイト言語のために各国語化するかどうかに関わらず、ユーザが彼らの現地の言葉でテキストデータを入力できるように、やはり Unicode に対応すべきでしょう。
Mac OS X は、Unicode テキストを管理し、表示するための幅広い対応を提供します。ATSUI【Apple Type Services for Unicode Imaging】、MLTE【Multilingual Text Engine】、Quartz、Cocoa Text といったテクノロジはいずれも、テキスト表示における Unicode に作用します。
Core Foundation および Cocoa 文字列もまた、あなたのアプリケーションにおいて Unicode 文字列を記録する手段を提供します。
これらのテクノロジの使用は、事実上、あらゆる言語への対応を可能にします。
Unicode がユーザに対して表示されるテキストのために重要であるとはいえ、あなたのアプリケーションのあらゆる箇所でこれを使用する必要はありません。たとえば、デバッグ用テキストや、内部のログ採取機構のためには、これらのメッセージを翻訳しユーザに対して表示したい場合を除いて、 Unicode を使用する必要はないでしょう。
マルチスクリプト対応を追加するためのガイドライン
マルチスクリプト【multiscript (複数の筆記形式)】への対応を提供するアプリケーションは、同時にさまざまなスクリプトで正確にテキストを表示することができます。
そのようなアプリケーションは、同一の書類の中に異なる言語のスクリプトを含むテキストの入力を受け付け、テキストを表示し、テキストを印刷することを、ユーザの言語の環境設定に関わらず行うことができます。
もしアプリケーションにマルチスクリプトへの対応を提供する用意がなければ、そういったテキストの一部は正しく表示されないでしょう。
マルチスクリプトへの対応はますます重要になり、オペレーティングシステムだけではなく、サードパーティ製アプリケーションにも期待される機能となりつつあります。
一部のユーザは、Mac OS X のような国際化されたオペレーティングシステムを用いて、ある言語で書類を作成し、彼らの言語の環境設定を変更してから、彼らが最後に保存した通りに書類を開くことができることを期待しています。
Mac OS X 上のアプリケーションに、マルチスクリプトへの対応を加えるには、あなたは適切な Unicode テクノロジと API を使用しなければなりません。
Cocoa フレームワーク内のテキストクラスは、自動的にマルチスクリプトへの対応を提供します。
Carbon およびその他の非 Cocoa アプリケーションのためには、あなたは以下のテクノロジを使用する必要があります。
-
いつでも可能なときは、C や Pascal の文字列の代わりに、Core Foundation String Services から CFString を使用して下さい。
CFString オブジェクトは、あなたに国際的な文字セット標準の特定の知識を持つことを要求せずに、Unicode データを内部的に記録し、取り扱います。
もし、Unicode と、 他のエンコーディングによる C や Pascal 文字列との間で変換する必要があれば、CFString が提供する便利機能【facilities】を使用して下さい。
けれども、可能であれば CFSring と C 文字列や Pascal 文字列との相互の変換は避けましょう。このような変換は計算処理的に高コストであり、マルチスクリプト表示に影響を及ぼすような不具合をよく招きがちです。
もし、特定の状況において使用するための CFString や Unicode を意識した API を見つけることができなければ、その文字列はアプリケーションのテキストエンコーディングへ変換してください。
- 日付を整形するには、Core Foundation の CFDateFormatter インタフェースを使用して下さい。
- 数字を整形するには、Core Foundation の CFNumberFormatter インタフェースを使用して下さい。
-
各国語化された文字列のためには、GetIndString の代わりに、Core Foundation の CFCopyLocalizadString(および関連マクロ)を使用して下さい。
GetIndString が返した文字列は、現在のスクリプトシステムに固有のものであり、従ってマルチスクリプトテキストを表示できません。
CFCopyLocalizadString は、マルチスクリプトテキストを表すことのできる、Unicode ベースの CFString オブジェクトを返します。
一般的に、あなたのコードはコード内の静的テキストよりも、動的テキスト処理を用いるべきです。詳細は、「strings ファイルから文字列を取得する」(37ページ)を参照してください。
-
Core Services より下のシステムレイヤにアクセスすることは避けましょう。
あなたは、カーネル環境で利用可能な機能のほとんど(特に BSD および Mach コール)を、Core Services フレームワークを用いて取得できるはずです。BSD 関数を直接呼ぶことは、可能な限り避けましょう。
ファイルシステムにアクセスするためには、Core Foundation URL Services(CFURL)と File Manager のデータ型 FSRef を使用するか、Cocoa の場合は NSFileManager オブジェクトを使用して下さい。
-
TextEdit API を用いることは避けましょう。
TextEdit API はマルチスクリプトテキストを扱う能力を持ちます。けれども、これはあなたにスクリプトのフォントとスタイルをあなた自身で管理することを要求します。
Multilingual Text Engine (MLTE)は、Unicode を元にしたマルチスクリプトテキストを扱うための、より単純な API を提供します。
-
テキストデータが MacRoman エンコーディングであるとは決して仮定してはいけません。
今やあなたは、すべてのテキストデータが MacRoman エンコーディングを使用していると仮定したり、テキストエンコーディングに関する問題をまるっきり無視することはできなくなりました。スクリプトコードを伴わない、タグなしテキストデータは、必ずしもシステムスクリプト(Roman)とは限りません。
もしあなたがこのような思い込みをすれば、ユーザは整合の取れていないテキストを見せられることになるでしょう。最悪の場合、あなたのテキスト処理ルーチンは文字列の解釈を誤り、ユーザのデータを損なったり、システムをクラッシュさせるかもしれません。
Mac OS X におけるファイルエンコーディングの詳細は、「ファイルエンコーディングとフォント」(51ページ)を参照してください。
翻訳できる文字列を慎重に検討しましょう
あなたのアプリケーションのためのテキストを書くときは、そのテキストをどう翻訳するかについて考えてみてください。
たとえ strings ファイルの整形オプションが有効であったとしても、言語の間の文法上の違いは、一部のテキストの翻訳を難しくすることがあります。特に、単数形と複数形の間の区別を(たとえば、カウンタ変数のために)必要とする文字列は、さまざまな状況においてさまざまな文字列を必要とすることがあります。
あなたの翻訳チームと、翻訳の問題の可能性を取り除く方法について、問題が発生する前に話し合いましょう。
文字列と strings ファイルについての詳細は、「strings ファイル」(37ページ)を参照してください。