Request/53 のバックアップソース(No.13)



* 英語版 [#ce094715]
-ページ:     [[Request]]
-投稿者:     [[request.txt]]
-優先順位:   低
-状態:       提案
-カテゴリー: 編集
-投稿日:     2007-03-31 (土) 20:46:20
-バージョン: 

** メッセージ [#dd2053f6]

* 方法(その1) [#fa7563d2]
次のファイルの日本語メッセージ(20071202版から抽出)を英語に変換してからソースファイルを置換してしまえば、英語版になるはずです。
なお、メッセージ表示が英語になるだけで、欧州文字等が編集できるようになるわけではありません。

#ref(ja.txt)

日本語版ソフトがグローバルにならない要因のひとつに英語情報がないことが挙げられます。
でも、それはどうしようもないか。
ヘルプファイルも英語化されれば使いたがる人が出てくるかもしれません。


* 方法(その2) Resource Database System [#a9aaa499]

サクラエディタで言語別にリソースを切り替える仕組みを実装します。


** リソース管理クラスの作成 [#j38c0922]

リソース管理クラス(CRcDb)は、次の2個のファイルから構成されます。
- CRcDb.cpp
- CRcDb.h

リソース管理クラスはプロセスに唯一であり、CProcessクラスで管理されます。
簡単に呼び出せるようマクロを定義します。
リソース管理クラスの主なメソッドは次の通りです。
詳細はヘッダファイルを参照してください。


*** static CRcDb* GetInstance( void ); [#sf2e72e4]
CRcDbオブジェクトを取得します。

&heart; 例:
CRcDb* lpcRcDb = CRcDb::GetInstance();


*** HINSTANCE RCDB_GetRcDbInstance( void ); [#w91b871b]
リソースDLLのインスタンスを取得します。
リソースDLLを指定していない場合は、アプリケーションのインスタンスを返します。

&heart; 例:
HINSTANCE hInstance = CRcDb::GetInstance()->GetRcDbInstance();
HINSTANCE hInstance = RCDB_GetRcDbInstance();


*** BOOL Initialize( LCID uLangId = 1041 ); [#b14f865b]
リソースDLLをオープンします。
すでにリソースDLLをオープンしている場合は、クローズしてからオープンします。

&heart; 例:
CRcDb::GetInstance()->Initialize(); //引数省略時は1041です。
CRcDb::GetInstance()->Initialize( 1033 );

個別にリソースDLLをオープン・クローズする場合は、OpenRcDb, CloseRcDbメソッドを呼び出します。


*** BOOL SetLanguage( LCID uLangId = 1041 ); [#af55c3fc]
言語を切り替えます。


*** Load系Wrapper [#s8e64b3d]
リソースを切り替える関数Wrapper群です。
以下のWrapperがあります。

LoadMenu, LoadBitmap, LoadAccelerators, LoadCursor, LoadIcon, LoadResource, FindResource, LoadImage, LoadString, DialogBoxParam, CreateDialogParam

Wrapperメソッドには、元のLoad系関数にあるInstance引数がありません。

&heart; 例:
HMENU hMenu = RCDB_LoadMenu( MAKEINTRESOURCE( IDM_MENU1 ) );


*** PropertySheetのWrapper [#t33a5f48]
プロパティシート(PropertySheet)もインスタンスを切り替える必要があります。
ただし、インスタンスは構造体で指定します。

&heart; 例:
PROPSHEETHEADER.hInstance = RCDB_GetRcDbInstance();
PROPSHEETPAGE.hInstance   = RCDB_GetRcDbInstance();


*** 通常の文字列リソース [#f9652608]

- LPCTSTR RCDB_GetString( IDS_STR_EXAMPLE, _T("Example1") );
- int RCDB_GetStringWithCopy( IDS_STR_EXAMPLE, _T("Example1"), lpBuffer, cchMaxBuffer );


*** メニュー文字列リソース [#id685080]
F_*で定義されたメニュー用の文字列は次のような書式文字列に書き直します。

- 書式
Name,Menu
Name,UnChecked,Checked,Compatible

- メソッド
LPCTSTR RCDB_GetMenuString();
LPCTSTR RCDB_GetMenuUnCheckedString();
LPCTSTR RCDB_GetMenuCheckedString();
LPCTSTR RCDB_GetMenuCompatibleString();
int RCDB_GetMenuStringWithCopy();
int RCDB_GetMenuUnCheckedStringWithCopy();
int RCDB_GetMenuCheckedStringWithCopy();
int RCDB_GetMenuCompatibleStringWithCopy();

&heart; 例:
"新規,新規(&N)"
"情報の表示/非表示,情報の表示(&S),情報の非表示(&H),情報の表示/非表示(&T)"
LPCTSTR lpMenu       = RCDB_GetMenuString(       IDS_MENU_EXAMPLE, _T("情報の表示(&S)") );
LPCTSTR lpName       = RCDB_GetDefaultString(    IDS_MENU_EXAMPLE, _T("情報の表示/非表示") );
LPCTSTR lpUnChecked  = RCDB_GetUnCheckedString(  IDS_MENU_EXAMPLE, _T("情報の表示(&S)") );
LPCTSTR lpChecked    = RCDB_GetCheckedString(    IDS_MENU_EXAMPLE, _T("情報の非表示(&H)") );
LPCTSTR lpCompatible = RCDB_GetCompatibleString( IDS_MENU_EXAMPLE, _T("情報の表示/非表示(&T)") );

&tip; MenuとUnCheckedは同じ文字列です。


*** 列挙型文字列リソース [#ja559ef0]
列挙型で管理すると都合の良い文字列です。
const配列で固定で管理されている場合に、プログラムは配列番号でアクセスします。
この配列番号に対応するよう列挙型文字列リソースを定義します。
また、リストビューのカラムヘッダ文字列を定義します。

- 書式
Count,Enum1,Enum2,...

- メソッド
LPCTSTR RCDB_GetEnumString();
int RCDB_GetEnumStringWithCopy();

&heart; 例:
"3,Enum1,Enum2,Enum3"
LPCTSTR lpEnum1 = RCDB_GetEnumString( IDS_ENUM_EXAMPLE, _T("Enum1"), 0 );
LPCTSTR lpEnum2 = RCDB_GetEnumString( IDS_ENUM_EXAMPLE, _T("Enum2"), 1 );

&tip; Countと後に続く文字列の個数が合わない場合、0個(文字列なし)として扱われます。


** 言語の設定ダイアログの作成 [#w2f29370]

- リソース
リソースDLLに設定されている IDS_RCDB_LANG=10000 の文字列リソースを読み込み判断します。

sakura_rc_%u.dll
%uの部分が言語IDです。

&heart; 例: 
#define IDS_RCDB_LANG 10000
IDS_RCDB_LANG = "Sakura-Editor,0,Application Default(Japanese)"
IDS_RCDB_LANG = "Sakura-Editor,1033,English(US)"
IDS_RCDB_LANG = "Sakura-Editor,1041,Japanese"

- 画面
リソースは言語IDで管理するので、同じ言語に対するリソースは1個しかありません。
複数のリソースを使い分けたい場合は、未使用の言語IDを自己責任で使ってください。

#ref(lang-setting.png)
(最新の画面ではバージョン情報表示あり)

&tip; 
実行ファイルにあるリソースは、言語ID=0として表示されます。
バージョンの異なるリソースも表示されますが、選択した場合は不正動作する可能性があることを警告します。


** ダイアログ類のリソース化 [#d1819e80]

基本的にリソース化されています。
表示する言語が変わると、表示幅を調整する必要があります。
ダイアログに後から表示する情報については、その他の文字列のリソース化でリソース化する必要があります。
以下の関数Wrapperを使用します。

- メソッド
DialogBoxParam
CreateDialogParam

&heart; 
通常は CDialog クラスを継承するため、CDialogクラスを修正しておけば自動的にWrapperメソッドが使用されます。


** その他の文字列のリソース化 [#ja323d98]

後々混乱しないよう、リソースマップを作成します。
簡単に識別できるよう、プレフィックスを統一します。

- IDS_STR_* : 15000〜15999
通常文字列です。

- IDS_MENU_* : 29900〜29999
F_*以外でメニュー関係に使われるリソース(F_*と同じ書式を持つ)です。

- IDS_ENUM_* : 29000〜29899
列挙型リソースです。

- IDS_MSG_* : 28000〜28999
MessageBoxで使うメッセージ関係の文字列です。

- その他のプレフィックス
-- IDS_CONFIRM_* : 問い合わせするもの(例: IDS_CONFIRM_FORMAT_DELETE="%sを削除しますか?")
-- *_FORMAT_* : %s,%d等の出力書式を持っているもの(例: IDS_MSG_FORMAT_DELETE="%sを削除") [#ie311253]
-- *_BRACKET_* : 括弧で括ってある文字列(例: IDS_STR_UNTITLED_BRACKET="(Untitled)") [#j21ca301]
-- *__* : 前後に空白があるもの(例: IDS_STR__CLASS=" Class", IDS_STR_CLASS_="Class ") [#j179132f]
-- \n : 改行は\nで行う
-- 文字列終端 : 文字列終端は\nを付けない
-- () : 半角文字を使う


** 日本語リソース化 [#f7bf4e50]

sakura.exeは日本語リソースを持ちます。
上記の方法でリソース化します。


** 英語リソース化 [#ya0d323e]

sakura_rc_1033.dllとして英語リソースを作成します。
sakura.exeを英語化したい場合は、次のマクロを1033に変更します。

//#define RCDB_DEFAULT_LANG 1041
#define RCDB_DEFAULT_LANG 1033

#if RCDB_LANG_DEFAULT == 1041
#define RCDB_USE_DEFAULT(ja,en) ja
#else
#define RCDB_USE_DEFAULT(ja,en) en
#endif

また、既定言語で定義された部分では次のようにコーディングします。

const LPCTSTR tbl[] = {
RCDB_USE_DEFAULT( _T("日本語"), _T("Japanese") ),
RCDB_USE_DEFAULT( _T("英語"),   _T("English(US)") ),
NULL
};

&tip; 注意
設定ファイルの識別キーを変更してしまうと、異なる言語で保存された設定ファイルを読み込めなくなります。


** ヘルプのリソース化 [#aa238978]
HTML Helpを英語化します。
この英語化には力技が必要です。
翻訳ソフトに頼りましょう。

- ヘルプ本体の英語化
ほぼ英語化したものが本Wikiにあります。
これをHTML形式に取り込みます。

- ツールチップの英語化
ツールチップ(Cshelp.txt)を英語化する必要があります。

&heart; 参考
Visual Studio上でHTMLヘルプのビルドができます。
HTMLファイルはUTF-8に切り替える必要があるかもしれません。


** その他 [#n15c5559]

- Debugビルド
Debugビルドした場合、リソースWrapperを呼び出す際に指定されたチェック文字列と比較が行われます。
リソース化の手順に誤りがある場合、実行時にエラーメッセージが表示されます。
ただし、既定言語が日本語の場合のみです。
チェックを行いたくない場合やできない場合は、チェック文字列にNULLを指定してください。

- Releaseビルド
Releaseビルドした場合、チェック文字列は削除されてビルドに含まれません。

- 起動時の対応
設定ファイルが読み込まれるまでの間は、当然のことですが既定の言語で動作します。
プロセスの生成、設定ファイルの読み込みエラーに関するメッセージ類は、リソースに頼るコーディングをしていても、既定の言語になります。

- 整理すべきこと
日本語文字列が非常に多くの場所で使われています。
その他文字列やメッセージ文字列について、複数のコーダーによって無規則状態で作成されているため一貫性がありません。
リソース化する際に統一すべきです。

- フォント
本当の英語環境で動作させようとした場合、フォントを変更する必要があるかもしれません。

-- "MS P ゴシック" --> "MS P Gothic" --> "MS UI Gothic" ?
-- "MS ゴシック"    --> "MS Gothic"
-- "MS 明朝"        --> "MS Mincho"   --> "MS UI Gothic" ?

これらについても既定の言語の切り替えコーディングは必要です。
言語切り替え時にも、リソースで切り替えます。

----

#ref(en-menu.png)

----
- Express 2005+Platform SDKで、メニュー1行のみと、タスクトレイを英語化(GlobalじゃないけどCool ->見た目の確認)。 ただ、添付ファイルと一緒にコメントできないので、後でコメントのみ追加。 -- [[じゅうじ]] &new{2008-03-16 (日) 22:19:06};
- リソース管理クラス(Load系とFormatMessage)とリソースDLLを作るプロジェクトを作成しました(sakura_lang.zip)。なお、英語はほとんど訳されていません。 --  &new{2008-04-03 (木) 20:57:23};
- ツールチップ用のヘルプ(cshelp.txt)も訳す必要があります。 --  &new{2008-04-03 (木) 20:58:41};
- sakura-lang-20080409.zipに英語切り替え対応(一部)をアップしました。いじりたおしてください。 -- [[wakura]] &new{2008-04-09 (水) 20:08:04};
- メッセージ、内部文字列、設定ファイルの識別キー等が未対応。メインメニューが切り替わりません。 --  &new{2008-04-09 (水) 20:09:23};
- Binary:sakura-lang-20080409.zip, Dll-Src:sakura-lang-20080409(dll-src).zip, Exe-Src:sakura-lang-20080409(exe-src).zipとなっています。 --  &new{2008-04-09 (水) 20:14:15};

#comment
#attach

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS