言語DLLで言語を切り替えられるようにします。
ベースは昨年初めにANSI版にてLucienさんが公開された翻訳リソース、およびなすこじさん作のDLL切り替えです。(>>data:5706)
【主な変更】
・言語DLLプロジェクトをsakura_coreと並列に配置
・UNICODE版のリソースを元にメッセージ定数などを追加(String_define.hを追加)
・なすこじさんの言語切り替えを追加(CSelectLang.cpp, CSelectLang.h)
・メインメニューのノード文字列を常にiniに保存していたのを、ノード名変更があったときのみ保存しそれ以外はリソースから取得するように。
・文字列ロードマクロ追加 LS( ) 、LSW( ) (LoadStringStを呼んでいるだけ)
【本体残り作業】
・メインメニュー・・・コマンド一覧とカスタムメニューを除き完了
・画面制御・・・2画面ほど実施
・メッセージ・・・未着手
【英語DLL残り作業】
・メインメニュー・・・ひとまず完了。Unicodeはアクセスキーの指定が要らないので削除
・ダイアログ・・・2割くらい英語化
・メッセージ・・・とりあえず翻訳済み。Unicode独自分の追加
【その他】
・メッセージ定数名が STR_ERR_クラス名_連番 のような名前なので、もう少し意味のある名前に・・・
ざっと見させてもらいました
翻訳そのものはチェックしていません
気になった点を列記させていただきます
1)英語版リソースのダイアログのフォントが"MS ゴシック"になってる
"Arial","Times New Roman","Tahoma"のどれかにすべきかな
翻訳が完了していないと難しいでしょうが
2)言語を切り替える"設定"がほしい
次回立上時から有効みたいな感じになるかな
3)>言語DLLプロジェクトをsakura_coreと並列に配置
と言う事ならば、ヘッダファイルはコピーではなくsakura_coreのを読み込むべきでは
rcソースのコンパチビリティを保ちたいならばヘッダファイル越しにsakura_coreのを参照するとか
例えば"Funccode_define.h"ならば中身を
#include "..\sakura_core\Funccode_define.h"
見たいな感じで
4)言語DLLプロジェクトは本体と同じVC++ 2005の方が良いのではないですか
勝手な事を言いますが最後までがんばってください
遅くなりましたが、
1) 近いうちに修正します。ちなみにIrfanViewの言語プラグインでは"Microsoft Sans Serif"がデフォのようです。
http://www.irfanview.net/lang/irfanview_language_sdk.zip
2) 近いうちに…(現在は一番最初に読み込んだ "sakura_lang_*.dll"を使用)
3) そうしました。
4) vc2003とvc2005のプロジェクトを作り、vc6のは消しました。
branches/trunk2_i18nを作ったので、そこにコミットしながら作業したいと思います。
テストバイナリをアップしました。
http://ux.getuploader.com/sakura_editor/download/84/sakura_en_20131001.zip
現在の進捗は、
・メニュー ほぼ完
・ダイアログ リソースは完。コンボボックスの中身などは未
・内部処理、メッセージ 少し着手
・共通設定―ウィンドウから言語選択が可能
trunk2の更新は時々マージしていますが、今後内部処理に手が入って競合がどんどん発生すると思うので、タイミング見てtrunk2に入れてしまいたいです。
ソースコードをチェックアウトしてみたのですが、自分の環境だとコンパイルできませんでした(VC2005EE)。
ログを添付します。
uint32_tが未定義の場合の定義を追加しました。
また2003プロジェクトファイルに不足があったため修正しました。
SetThreadUILanguageが使用できませんでした(VC2005EE)。
GetProcAddressを使った動的な呼び出しと、OSによる条件処理を追加してみましたが、
SetThreadUILanguage/SetThreadLocaleの部分は実行されないようです。
該当の箇所は現在死にロジックです。わかりにくくてすみません。
当初はここでINIを見て言語切り替えするつもりでしたが、この時点で共有メモリが初期化されていないため、まずは内部リソースで起動し、CProcess::InitializeProcess()の後でChangeLangしています。
むしろChangeLangにSetThreadUILanguage/SetThreadLocaleが抜けてました。
これでコモンダイアログも英語化されるようになりました。
VC2005EEとVC2003には、SetThreadUILanguageがライブラリに含まれていないようです。
プロトタイプ宣言を追加してみましたがリンクできませんでした。
trunk2にマージする場合、
・GetProcAddressを使用する
・コンパイラの下限バージョンを変更する
のどちらかが必要になりそうです。
SetThreadUILanguageを呼ばなくてもコモンダイアログが英語化されない程度なので、無ければ呼ばないでよいと思います。
CSelectLang.cppをコミットしました。
VC2005EEとVC2003共に実行ファイルの作成を確認しました。
また、日本語版(DLL未使用)で描画時間&ファイルの読み込みを
確認してみましたが、処理時間に大きな変化はありませんでした。
日本語版限定であればtrunk2へのマージは特に問題なさそうです。
DLLファイルのリソースにBitmap/Icon/Cursort等が含まれていますが、
これらはsakura.exe側のリソースが使用されているのでDLL側のリソースは削除できそうです。
ご確認ありがとうございます。
branchesを長引かせるとソースの差分が追いにくくなるのでキリの良いところでマージしてしまいます。
不要リソースの部分はifdefで囲って、本体の場合は有効、言語DLLの場合は無効、みたいにできるとrcが使いまわししやすいかと(下の手順の3をイメージしながら)
新しい言語DLLを作るときの手順は以下をイメージしています。
1.trunk2をチェックアウトまたは最新化する
2.sakura_lang_en_USをコピーして名前を変える(例、sakura_lang_xx_XX)
3.trunk2/sakura_rc.rcをsakura_lang_xx_XX/sakura_lang.rcにコピーする
(en_USがメンテされてないかもしれないので…)
4.sakura_lang.rcの STR_SELLANG_NAME と STR_SELLANG_LANGID を修正する
5.sakura_lang.rcを翻訳する
6.コンパイル&テスト
7.公開。sakura_lang_xx_XXはコミットしてよい
IDR_MENU1に"#ifndef SAKURA_LANG_RESOURCE"を追加しました。
trunk2用に更新しました。
[r3469]でcommitしました。
Related
Commit: [r3469]
大変おかしな修正をしていました;SetThreadUILanguageが呼ばれません。。
SDKのバージョン識別が容易でないようなので、おっしゃる通りGetProcAddressするしかないかもしれません。
サンプルぽいもの
http://microsoft.public.vc.mfc.narkive.com/hSKPoJj0/sdk-integration-in-vs2005
Last edit: syat 2013-10-14
WindowsXP+英語版DLLで"タイプ別設定"または"共通設定"を選択したときに
ダイアログ表示が"OK/キャンセル/ヘルプ"のままになっているようです。
PSH_USEPAGELANGを追加すると、"OK/Cancel/Help"になります。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774546%28v=vs.85%29.aspx
問題の現象と、パッチ適用で解決することを確認しました。
[r3418]でcommitしました。
Related
Commit: [r3418]
参考まで
ANSI版当時のスレ http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=dev&tree=r5706
キー割り当ての英語化が思ったよりやっかいでした。
1.INIからキー名を読み込み共有メモリ上に保持する作りのため、INI読み込み後に言語切り替えするのでは間に合わない。なので言語切り替え後に共有メモリを更新する関数(CProcess::RefreshString)を呼ぶようにしました。
2.キー名の大半は"F1"や"A"、"Ins"など言語切り替えが不要なので、
手抜きメモリ節約のため、KEYDATAINIT.m_pszKeyNameに文字列と文字列IDを混在させています。ポインタの0x0000~0xFFFFはNo Access Regionらしいので文字列IDとかぶることは無いはずです。3.マウス設定のINI読み込み部で、キーコードを一律0にしているためキー名でヒットさせるつくりになっており多言語化と相性がよくないため、マウスにも独自仮想キーコードを割り当てました。この結果INIに互換性がなくなり、新Verで保存したINIを旧Verで読むとマウス設定が消えます。
リビジョン3447でtrunk2_i18nブランチをtrunk2に投入しました。
KeyBind.patchは入っていません。
KeyBind.patch
英語にして日本語のキー割り当てをインポートすると、キーコードの文字が日本語に戻るような気がするんですが、
いいんでしょうか。
まだ、作り途中なのでしょうがtrunk2を動かしてみたら、それ以前の問題でした。
trunk2の時点で
CSelectLang::ChangeLang()を適用するタイミングがおかしいです。
CPropWin::GetDataは、タブを切り替えると実行されるので、
共通設定のタブを切り替えるだけで、共通設定をキャンセルで閉じても、言語が切り替わります。
いじっていると共通設定のタブを切り替えるとタブが消えていくこともあります。
共通設定タブに表示される文字とダイアログの中身の言語が違うこともあります。
KeyBind.patchでは
RefreshString()は、共通データを更新しますが、PropCommonでコピーを持っているので、そちらが更新されません、のでOKを押すとコピーの日本語に上書きされて英語になりません。
"OK"が選択されたときのみ反映するようにしました。
CPropWin::GetData()でCSelectLang::ChangeLang()を呼び出すのではなく、
PM_CHANGESETTING_ALLを受け取ったタイミングで反映します。
(通常の設定変更の処理と同じ流れです)
また言語DLLからindexを計算する関数を追加しました。