[スレッド全体]

2011/3/5 (土) 18:14:42 げんた  
INCM1.23c
[5706] 英語版 (求むreviwer)
Lucien さんが,サクラエディタの英語版を作ってくれました.
内容としては 1.6.6.0を英語化したものになっています.

ソースは以下のブランチに格納されています.
/sakura/branches/english/

手法としては埋め込まれている文字列を全てリソースに追い出して
LoadStringで読み出しています.
とりあえずはバグ,ロジック,翻訳等何でも結構ですので,
コメントをお願いします.

あと,リソースには日本語・英語の両方が入っているのですが,
扱いをどうしましょうかね...

さらに,Unicode版にも着手したいとの希望なのですが,
この方法でUnicode版に統合する形で入れられますかね?
いかがでしょうか.

2011/4/6 (水) 13:25:32 なすこじ  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16
[5716] リソースの外部DLL化
メッセージリソースの外部DLL対応を試しに作成していますが、初期値作成より前にDLLを読み込む必要があるのでちょっと悩ましいです。

1. 言語選択ダイアログにてメッセージリソースを選択する
 選択後アプリを再起動する(動的変更は難しい)。
 選択された情報をiniファイルへ記憶し、次回起動時に読み込む。

2. 最初に見つけたメッセージリソースを自動的に読み込む
 iniまたはexeと同一階層からDLLを探し、最初に見つかったメッセージリソースを読み込む。

上記を考えましたが、1.の場合だと現状は初期値作成後にiniファイルを読み込むので言語選択情報だけは先に読み込む必要があります。
なので、2.の方法で作ってみようと思いますがどうでしょうか?

2011/4/26 (火) 07:16:01 syat  
Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0
[5720] Re:リソースの外部DLL化
▼ なすこじさん
20110410の版で、DLLによって言語が切り替わることを確認しました。
DLL化はあきらかに有用なので、せっかくenglishブランチを切っていることだし、どんどんコミットしていったらどうでしょうか。

>あと必要なのは、現在読み込まれているDLLの情報表示や、exeとのバージョンが不一致の時の警告表示などでしょうか。
exeとのバージョン一致は課題ですね。本体をバージョンアップして、DLLのバージョンが古いままだと、新たに追加されたメッセージが空文字になってしまいとても残念。

以下、多言語化に対して気づいたことを。(亀レスで申し訳ないです)
・翻訳&文字列リソース化お疲れさまでした。>Lucienさん、なすこじさん
・英語版リソースで「(無題)」が「No Title11」のように連番がついたままです。
・ANSI版だと結局LoadStringAが呼ばれるのでsjis変換されるはず。本格的な多言語対応はUNICODE版かな?


もしUNICODE版に入れていくのであれば、以下も検討してほしいです。

・exeとDLLのバージョン不一致救済として、DLLから文字列を取得できなかったときは内部リソースから取得するようにしたらよいかも。
 ↓こんなメソッドを用意する
int CSelectLang::LoadString( UINT uid, LPSTR _pszLabel, int nBufferMax )
{
        int nRet = ::LoadString( getLangRsrcInstance(), uid, _pszLabel, nBufferMax );
        if( nRet == 0 ){
                return ::LoadString( ::GetModuleHandle(NULL), uid, _pszLabel, nBufferMax );
        }
        return nRet;
}

・毎回バッファを用意するのが正直面倒なので、糖衣構文が欲しい。
 ↓このくらい
LPSTR CSelectLang::LoadString2( UINT uid )
{
        char _pszLabel[1024];
        CSelectLang::LoadString( uid, _pszLabel, _countof(_pszLabel)-2 );
        return _pszLabel;
}
 ↓使用例
::MYMESSAGEBOX( m_hWnd, MB_OK , GSTR_APPNAME, CSelectLang::LoadString2( STR_ERR_DLGFIND1 ) );
 自動変数の返却がだめならstatic変数のバッファでもよいので。。

2011/4/27 (水) 23:09:10 なすこじ  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16
[5721] Re2:リソースの外部DLL化
▼ syatさん
確認どうもありがとうございます。
本命のUNICODE版への布石ということで実験的にANSI版を作ってみたものなので、完成度が低くてコミットはちょっと悩む所です (^^;

・初期値データも翻訳されています
 なので、iniファイル無しで起動した時の言語で初期値が作成されてしまいます。
 一旦作成されるとiniファイルが後から読み込まれて上書きされるので元に戻りません。
 exeのバージョンアップで追加設定があった場合、起動した時点で読み込んだ言語に依存します。

・現状プロセス起動時にDLLを探しているのでウィンドウ毎に言語が混在可能です
 例えば、日本語OSかつDLL無しでsakura.exeを起動し英語DLLをコピー後もう1枚画面を開いた場合、1枚目は日本語メニュー、2枚目は英語メニューとなります。

だれが(日本人?外国人?)どのように(日本語OS?英語OS?日英以外のローカライズ版OS?で)利用するかをもう少し考えないと変なものができてしまいそうです。

> もしUNICODE版に入れていくのであれば、以下も検討してほしいです。
>
> ・exeとDLLのバージョン不一致救済として、DLLから文字列を取得できなかったときは内部リソースから取得するようにしたらよいかも。
>  ↓こんなメソッドを用意する
> int CSelectLang::LoadString( UINT uid, LPSTR _pszLabel, int nBufferMax )
> {
>         int nRet = ::LoadString( getLangRsrcInstance(), uid, _pszLabel, nBufferMax );
>         if( nRet == 0 ){
>                 return ::LoadString( ::GetModuleHandle(NULL), uid, _pszLabel, nBufferMax );
>         }
>         return nRet;
> }


そうですね。これは必要だと思います。

> ・毎回バッファを用意するのが正直面倒なので、糖衣構文が欲しい。
>  ↓このくらい
> LPSTR CSelectLang::LoadString2( UINT uid )
> {
>         char _pszLabel[1024];
>         CSelectLang::LoadString( uid, _pszLabel, _countof(_pszLabel)-2 );
>         return _pszLabel;
> }
>  ↓使用例
> ::MYMESSAGEBOX( m_hWnd, MB_OK , GSTR_APPNAME, CSelectLang::LoadString2( STR_ERR_DLGFIND1 ) );
>  自動変数の返却がだめならstatic変数のバッファでもよいので。。


確かに面倒です。悩んだのですが良い方法が浮かびませんでした (^^;
連続してLoadStringしている箇所もあったので、staticで1個というのもできません(今のままでは)
さすがに自動変数はまずいと思います。クラスを作ってコンストラクタでロードでしょうか?

取りあえずこんな感じです。
私の方は5月末まで忙しくて何もできそうにないのですが、げんたさんとLucienさんの間では何か進展しているのでしょうか?

ではでは。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.010][st:0.000]