◀ANSI版開発トップへ
  • 5706 英語版 (求むreviwer)
    • 5707 Re:英語版 (求むreviwer)
      • 5708 Re2:英語版 (求むreviwer)
        • 5709 Re3:英語版 (求むreviwer)
    • 5713 Re:英語版 (求むreviwer)
    • 5714 Re:英語版 (求むreviwer)
      • 5715 Re2:英語版 (求むreviwer)
    • 5716 リソースの外部DLL化
      • 5717 Re:リソースの外部DLL化
      • 5718 Re:リソースの外部DLL化(req53に在る模様)
      • 5719 Re:リソースの外部DLL化
      • 5720 Re:リソースの外部DLL化
        • 5721 Re2:リソースの外部DLL化
        • 5722 Re2:リソースの外部DLL化
          • 5723 Re3:リソースの外部DLL化
      • 5724 Re:リソースの外部DLL化
  • [5706] 英語版 (求むreviwer) げんた 2011年03月05日 18:14

    Lucien さんが,サクラエディタの英語版を作ってくれました.
    内容としては 1.6.6.0を英語化したものになっています.

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

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

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

    さらに,Unicode版にも着手したいとの希望なのですが,
    この方法でUnicode版に統合する形で入れられますかね?
    いかがでしょうか.
    • [5707] Re:英語版 (求むreviwer) ryoji 2011年03月05日 23:54

      ▼ げんたさん
      > あと,リソースには日本語・英語の両方が入っているのですが,
      > 扱いをどうしましょうかね...
      >
      > さらに,Unicode版にも着手したいとの希望なのですが,
      > この方法でUnicode版に統合する形で入れられますかね?
      > いかがでしょうか.

      リソースで言語切替する手法は定石的なものですし、Unicode版でも可能なんじゃないかと思います。
      欲しいですし、頑張って統合(日英一本化)に持ち込んでもらえたらいいなぁ~、と思います。その「頑張る」ってのがたいへんそうで、逃げ腰になっちゃいますが。
      σ(^^;;;
      • [5708] Re2:英語版 (求むreviwer) げんた 2011年03月06日 11:25

        >▼ げんたさん
        >> あと,リソースには日本語・英語の両方が入っているのですが,
        >> 扱いをどうしましょうかね...
        >>
        >> さらに,Unicode版にも着手したいとの希望なのですが,
        >> この方法でUnicode版に統合する形で入れられますかね?
        >> いかがでしょうか.
        >
        >リソースで言語切替する手法は定石的なものですし、Unicode版でも可能なんじゃないかと思います。
        >欲しいですし、頑張って統合(日英一本化)に持ち込んでもらえたらいいなぁ~、と思います。
        がんばる部分は協力してくれるとのことですので甘えるとして,たぶんかなりの箇所に同じような変更がばらまかれることになりますので予め「こうして欲しい」というところを伝えておいた方が良いかと思います.
        というのもあって,ANSI版をとりあえず見ていただけたらなと思ったのですが.

        ANSI版の変更点で言うと,例えば
        * LoadStringを含めて関数(or マクロ)にするべき?
        メッセージ表示も実はMYMESSAGEBOXを使っているところもあればwsprintfのところもあったりしてバラバラ.
        * 文字列用バッファは256文字固定でその都度取っているが...
        * SetThreadLocale, SetThreadUILanguage (Windows 95/98ではどちらも使えないのですね)
        SetThreadLocaleを使って言語自体を切り替えるより,FindResourceExで取得したハンドルをLoadStringに渡した方がいいのでしょうか.今はGetModuleHandle(NULL)が毎回呼ばれていますが,これだとリソースの外部DLL化に対応できませんよね.

        あと,実際に着手するとしても UNICODE版は頻繁に変更が入っているので,うまく協調してできるかが心配です.
        • [5709] Re3:英語版 (求むreviwer) ryoji 2011年03月06日 13:55

          > あと,実際に着手するとしても UNICODE版は頻繁に変更が入っているので,うまく協調してできるかが心配です.
          自分はこのところV2(UNICODE版)本体を正式版にする作業で手一杯で、もともとこのあたりで一休みのつもりでいました。簡単に修正可能なバグくらいは対応するつもりではいましたけど。
          日英統合自体には賛成ですので、それまでの間、それ以外の修正はパッチとして保留しておいて、しばらく凍結(コミット禁止)、ということになってもいいです、はい。その際にひとこと号令かけていただければ。(^^)
          #むしろ明確に止めていただいたほうが気持ちの切替えはしやすいです
    • [5713] Re:英語版 (求むreviwer) なすこじ 2011年03月07日 00:25

      ▼ げんたさん
      とりあえずビルドしてみました。

      VC6, VS2005EE でビルドエラー
       SetThreadUILanguage() が無い

      BCC5.5.1 でビルドエラー
       Error sakura_rc_jp.rc 135 34: Expecting BEGIN

      VS2008EE ビルド正常終了
       日本語 Windows XP SP2で起動テスト
        地域と言語:日本語
         英語メニューで正常に動作

        地域と言語:英語(米国)
         sakura.exeのみだと起動しない
      ---------------------------
      sakura
      ---------------------------
      \'D:\_MyWork\???????\sakura.exe\'
      ???????????????
      ?????????????????????? ???????????????
      ---------------------------

         ビルドしたReleaseフォルダで起動すると日本語メニューで立ち上がる(なぜ?)

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

      sakura_english.exeの時は英語メニューとか (^^; 間に合うのかな?
      ビルド環境とWin9x,NTの扱いをどうするかもあるので、ANSI版は英語メニュー版として別にしておいた方が良いかも?

      ではでは。
    • [5714] Re:英語版 (求むreviwer) なすこじ 2011年03月21日 11:08

      メニューまわりを見てみました。英語が話せるわけではないので、その辺は割り引いてください (^^;

      ■タイプ別設定、共通設定
      全体的にフィールドやボタンの幅が足りなくて文字列が表示しきれない所が見られるため保留。

      ■メニュー
      メニュー全体について
       メニュー文字列の末尾にアクセスキーがある場合、文字列とアクセスキーの間にスペースがあった方が見やすいと思う(現在はスペースの有無が混在している)
        「Save all (Z)」 OK
        「Close Untitled(R)」→「Close Untitled (R)」

       文字列の途中にアクセスキーがあるメニューで()が付いていたり大文字にしてある所があるが、()は無しで無理に大文字にしない方が見やすいと思う。
        「Close all (O)ther tabs」→「Close all other tabs」
        「Move to neXt group」→「Move to next group」

       ダイアログが表示されるメニューで文字列末尾に「...」の無いものがある、またはその逆。
        「Save As」→「Save As...」
        「Open C/C++ header with same name...」→「Open C/C++ header with same name」

      Fileメニュー
       「Save As」:「名前を付けて保存(A)...」
        →「Save As...」(...を付ける)

       「Save\Close」:「保存して閉じる(E)」
        円マークは & の誤り?
        →「Save&Close」または「Save & Close」または「Save and Close」

       「Re-open With encoding」:「開き直す(W)」
        サブニューが「Re-open」「Re-Open」混在している。どちらかに統一。

      Editメニュー
       「High Level Editing」:「高度な操作(V)」
        改行単位と折り返し単位が表現できていない(難しいので無くても良い?)

        「Copy selected line nr.(:)」:「選択範囲内全行番号付きコピー(:)」
         英語では番号の略語は「No.」の方が一般的な気がする。日本人にも分かりやすいです。
         「nr.」はオランダ・デンマークとかのヨーロッパ語な感じ?

       「Cursor Movement」:「移動(O)」
        「End of file(Z)」:「ファイルの最後に移動(B)」
         →「End of file (B)」(アクセスキーの誤り)

        「Jump to Line」:「指定行へジャンプ(J)...」
         →「Jump to Line...」

        「Jump to Initial search start position」:「検索開始位置へ戻る(I)」
         Initialが無しの「Jump to search start position (I)」でも良い気がする。

       「Cosmetik」:「整形(K)」
        英語としては「Cosmetic」の方が違和感がないけどkで正しい?
        「Trimmng (K)」ではどうでしょうか。

      Convertメニュー
       「Full Height」「Half Height」
        Height→Width だと思う。

       「Change Encoding」
        「Base64 Decode and save」→「Base64 Decode and Save」
        「uudecode and save」→「uudecode and Save」
         saveの先頭を大文字にした方が良いと思ったけど、他のメニューを見ると選択に迷う (^^;

      (つづく)
      • [5715] Re2:英語版 (求むreviwer) なすこじ 2011年03月21日 11:09

        (つづき)

        Searchメニュー
         「Find」:「検索(F)...」
          →「Find...」

         「Replace」:「置換(R)...」
          →「Replace...」

         「Jump to Initial search start position」:「検索開始位置へ戻る(I)」
          Initialが無しの「Jump to search start position(I)」でも良い気がする。
          (Editのサブメニューにも存在)

         「Open C/C++ header with same name...」:「同名のC/C++ヘッダ(ソース)を開く(C)」
          →「Open C/C++ header with same name」

         「DIFF Differences」:「DIFF差分表示(D)...」
          →「DIFF Differences...」

        Toolメニュー
         メニュー内にmacroとMacroが混在するのでMacroで統一する。
         「Save the macro」:「キーマクロの保存(R)」
          →「Save the Macro」

         「Load the macro」:「キーマクロの読み込み(M)」
          →「Load the Macro」

         「Run the macro」:「キーマクロの実行(A)」
          →「Run the Macro」

         「Run an Existing macro」:「名前を指定して実行(E)...」
          →「Run an Existing Macro...」

        Settingsメニュー
         「File type list」:「タイプ別設定一覧(L)...」
          →「File type list...」

         「File type settings」:「タイプ別設定(Y)...」
          →「File type settings...」

         「Common Settings」:「共通設定(C)...」
          →「Common Settings...」

         「Font settings」:「フォント設定(F)...」
          →「Font settings...」

         「Manage History」:「履歴の管理(O)...」
          →「Manage History...」

        Windowメニュー
         「Close all (O)ther tabs」:「このタブ以外を閉じる(O)」
          →「Close all other tabs」(かっこは削除かつ小文字で)

         「Window list」:「ウィンドウ一覧(W)...」
          →「Window list...」

         「Tab control」:「タブの操作(B)」
          「Move to neXt group」:「次のグループに移動(X)」
           →「Move to next group」

          「Move to preV group」:「前のグループに移動(V)」
           →「Move to prev group」

         「Show outpUt window」:「アウトプット(U)」
          →「Show output window」

        Helpメニュー
         「Search help by keyword」:「キーワード検索(S)...」
          →「Search help by keyword...」

         「CoMmand list」:「コマンド一覧(M)」
          →「Command list」

        以上
    • [5716] リソースの外部DLL化 なすこじ 2011年04月06日 13:25

      メッセージリソースの外部DLL対応を試しに作成していますが、初期値作成より前にDLLを読み込む必要があるのでちょっと悩ましいです。

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

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

      上記を考えましたが、1.の場合だと現状は初期値作成後にiniファイルを読み込むので言語選択情報だけは先に読み込む必要があります。
      なので、2.の方法で作ってみようと思いますがどうでしょうか?
      • [5717] Re:リソースの外部DLL化 なすこじ 2011年04月06日 16:29

        とりあえずソースを以下にアップしました(14番)
         http://www.geocities.jp/nasukoji_7/download/download_sakuraeditor.html

        SetThread...() はコメントアウトしてあるのでVC6でもビルド可能です(BCCはリソースでエラーになってしまった)

        sakura_lang_en_US.dll を作成して sakura.exe と同一階層に置くとexe起動時に読み込まれます。
        日本語Windowsで実行すると検索ダイアログなどが英語になります。
      • [5718] Re:リソースの外部DLL化(req53に在る模様) なすこじ 2011年04月07日 13:06

        wikiのrequest 53に対してwakuraさんによるリソース切り替えの実装がアップされていました。
        車輪の再発明になってしまうので、そこにあるソースと上手いこと融合させたいのですが、wikiの「ライセンス明確化推進計画 」にwakuraさんの名前がありません。

        zlib/libpng ライセンスで組み込んでも良いです? > wakuraさん

        一応コメントに「いじりたおしてください」とありますので大丈夫とは思いますが念のため (^^;
      • [5719] Re:リソースの外部DLL化 なすこじ 2011年04月11日 10:14

        結局wakuraさんのソースを使用しない状態でやり切りました。
        あと必要なのは、現在読み込まれているDLLの情報表示や、exeとのバージョンが不一致の時の警告表示などでしょうか。

        ・外部DLLの名称は sakura_lang_*.dll となります('*' の部分は一応自由)
        ・外部DLLはsakura.exeと同一階層におく必要があります
        ・外部DLLには言語IDと言語表示用文字列を追加しています
        ・外部DLLを読み込んだ場合、上記の言語IDを SetThreadLocale, SetThreadUILanguage に使用します
        ・内部リソースを使用する場合 SetThreadLocale, SetThreadUILanguage を発行しません

        http://www.geocities.jp/nasukoji_7/download/download_sakuraeditor.html
      • [5720] Re:リソースの外部DLL化 syat 2011年04月26日 07:16

        ▼ なすこじさん
        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変数のバッファでもよいので。。
        • [5721] Re2:リソースの外部DLL化 なすこじ 2011年04月27日 23:09

          ▼ 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さんの間では何か進展しているのでしょうか?

          ではでは。
        • [5722] Re2:リソースの外部DLL化 なすこじ 2011年04月30日 20:30

          ▼ syatさん
          すみません、私変なことを書いていました。

          >  ↓使用例
          > ::MYMESSAGEBOX( m_hWnd, MB_OK , GSTR_APPNAME, CSelectLang::LoadString2( STR_ERR_DLGFIND1 ) );
          >  自動変数の返却がだめならstatic変数のバッファでもよいので。。

          ならその場で使うだけなのでstaticでOKですね。
          • [5723] Re3:リソースの外部DLL化 syat 2011年05月02日 22:42

            ▼ なすこじさん
            連続してLoadStringしてるところは呼び元でバッファを準備するしかないと思いますが、例のようにメッセージボックスを出す程度の用途なら便利関数でさらっと書きたいなぁ、と思ったので。

            ちなみにUNICODE版には渡した文字列をA <-> W変換してくれるto_wchar, to_acharという関数があって、使い勝手が良いです。(引数はたったの一個)
            どうやってるのかと思ったら内部で64個分のバッファを用意して使い回してました。

            >だれが(日本人?外国人?)どのように(日本語OS?英語OS?日英以外のローカライズ版OS?で)利用するかをもう少し考えないと変なものができてしまいそうです。
            OSの違いはちょっとわからないですが、基本、日本語より英語のほうが得意な人が使うのでしょう。
            本体と言語DLLをセットにして「英語版」として配布するイメージなら、言語の混在はあまり気になりません。

            >・初期値データも翻訳されています
            これは、難しい。。
            言語が絡む所ってタイプ別設定の名称だったりカスタムメニュー名だったりで、起動時に初期設定されてしまうので、例えば日本語で使っていて後から英語DLLを導入した場合、メニューやダイアログはほとんど英語なのに、タイプ別設定やウィンドウタイトルなどが日本語混じりになって???です。
            iniを消して全再起動すればよいのですけど。
            根本的に直すなら、今後の機能実装で初期値をiniにベタ書きしないような、本体での対応が必要な気がします。
            iniには初期値として空欄を設定し、画面表示は空欄だったらリソースから取った文字列を表示するとか。
      • [5724] Re:リソースの外部DLL化 なすこじ 2011年06月02日 21:14

        syatさんの意見を参考に ::LoadString() をラップした関数で文字列リソースを読み込む様にしてみました。

         http://www.geocities.jp/nasukoji_7/download/download_sakuraeditor.html
          14-2. sakura_multi_lang_20110602.zip

        CLoadString::LoadStringSt(UINT uid)
        CLoadString::LoadString(UINT uid)

        LoadStringSt()は4個ある静的バッファに文字列を取り込みます。バッファをぐるぐる使いまわすので、5回リソースを読み込むと最初の文字列が破壊されます。

        LoadString()は変数を準備して使用します。
         CLoadString cStr; cStr.LoadString( リソースID );

        アルファベット順で CEditView_Diff.cpp まで変更完了しています(残り300箇所ちょっと)
        ひとまずこんな感じです。

        そういえば「No Title」に番号が付く件は現在そのままです。
        あとVC2008以降でないとビルドが通りません。

        これから暫くはサクラエディタ以外の事をするので、この件には手を入れられなくなります。

        ではでは。