AirOneの国際化プログラミングの方針
目次
1. 方針
2. 各論
2.1. 日付・時刻
2.2. 表示HTML
3. 国際化の作業
1. 方針
AirOneの内部コード、外部コードは、共にutf-8です。必要に応じて、libiconvでutf8と他の文字コード変換を行います。
AirOneは、以下の箇所にロケール依存性があります。
- ファイル名(ファイルシステム): システムロケールと呼びます
- ブラウザの表示言語(preferred language): UIロケールと呼びます
* システムロケールの扱い
- プラットフォーム依存の値です。
- afwアプリは、システムロケールの値そのものを知る必要はありません(setlocale()の戻り値に依存するコードを書いてはいけません)。
- プロセスはsetlocale(LC_CTYPE, "")で初期化します。
- ファイル名は、入力時にaru_nativetoutf8()、出力時にaru_utf8tonative()します。
(注: 内部動作。WindowsではGetACP()で取得するコードページ依存の動作をします)
* UIロケールの扱い
- afwが定義するプラットフォーム非依存の値です(例:"ja", "en")。
- airu_get_ui_locale()で、プラットフォーム依存ロケールからafw定義値へマップします。
- UIロケールの値は、後で説明するディレクトリ名に使われます。
- afwアプリは、陰に陽にUIロケールの値を知る必要があります。
- UIロケールは事実上、言語です。
=> 変更予定
「3. 国際化の作業」参照
* アプリの実装方針
- C/C++ のコードは、プロセスの一番初めに、OSデフォルトのロケールで、setlocale(LC_CTYPE, "");をします。
- 漢字などUIロケール依存のものは、基本的にXSLTなどの外部ファイルに任せます。
* POSIXロケール的な説明
- 文字コード (LC_CTYPE)
システムロケールに従います(setlocale(LC_CTYPE,""))。
暗黙に、システムロケールとファイルシステムは同一の文字コードを使っていることを想定しています。そうで無い場合は、未サポートです。
- 照合、ソート (LC_COLLATE)
現状、文字照合とソートは、Cロケール相当(つまりstrcmp()やstrcasecmp()相当)で行います(setlocale不要)。
- 日付、時刻 (LC_TIME)
下記、「2.1. 日付・時刻」を参照(setlocale不要)
- メッセージ (LC_MESSAGES)
下記、「2.2. 表示HTML」を参照(setlocale不要)
- 数値フォーマット (LC_NUMERIC)
未定義(setlocale不要)
- 通貨記号 (LC_MONETARY)
未定義(setlocale不要)
2. 各論
2.1. 日付・時刻
- AirOneでは、ユーザーに表示するUI上の日時表現の出力は、XSLTのXPATHの拡張関数を使用して行います。Cのコードで生成することはありません。
- AirOneでは、時刻の表記として、以下のものを採用します。
YYYY年M月D日(W) hh:mm
時間は24時間表示。
ex) 2002年2月6日(水) 14:30
- 拡張(追加)された日付フォーマット用の XPATH 関数は
- ar_strftime()
- ar_strflocaltime()
これらの関数が使用している書式指定コードは、C言語 の strftime() と同じです。ar_strflocaltime() は GMT を渡すと、ローカルの時間に変更して返します。詳細な説明は、libariel-html の外部仕様書を参照してください。
- 上記関数の引数でサポートしている日時データは、以下の3通りです。
1. YYYYMMDDhhmmss
2. YYYYMMDDThhmmss
3. YYYYMMDD
4. YYYYMMDDThhmmssZ
したがって、XML の生データ内ではこの形式を使ってください。
- 注意1
Cロケールで返ってきた値を、各ロケールに対応した文字にマップするのは、XSLTの役割です。
ex) ar_strftime(), ar_strflocaltime()は、曜日として Tue, Wed,... などを返します。その値を"火"、"水"、... などにマップして表示するのは、XSLTの役割です。
- 注意2
"年"、"時"、"分"などの文字は、拡張関数に渡さない(渡すと化けます)。
以下の方法で、XSLT を実装します。
(i) フォーマットを定義せず、かならず、2001/2/6-15:30-3 というような値を使う。これを、XSLT のsubstring などでパースして使う。
(ii) フォーマットには漢字を渡さない。つまり、
ar_strflocaltime(20020206T153000, "%Y")年
ar_strflocaltime(20020206T153000, "%M")月
ar_strflocaltime(20020206T153000, "%D")日
などのように、数字だけを取るようにする。
** 注意
- strftime()は使用しません。
- setlocale(LC_TIME)は不要です。
2.2. 表示HTML
UIロケール名(例:"ja")ディレクトリを作り、そこに言語ごとのファイルを置きます。
xgettext(libariel-util)は、UIロケール依存のメッセージファイルを使います。
XSLT について
xslt/$appname/xslt.conf
xslt/$appname/*.xsl (default : English)
xslt/$appname/ja/*.xsl (UI locale dependent files)
HTML について
html/*.html (default: English)
html/ja/*.html (UI locale dependent files)
image,cssについて
image/*.* (lang independent files)
image/ja/*.* (UI locale dependent files)
css/*.css (lang independent files)
css/ja/*.css (UI locale dependent files)
xml について
xml/ja/$appname.xml
remark : airu_xgt_open(fname, locale) -> airu_xgt_open(xmlpath, fname, locale);