8000 エクスプローラのコンテキストメニューの項目が日本語表示されない · Issue #808 · vim-jp/issues · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

エクスプローラのコンテキストメニューの項目が日本語表示されない #808

Closed
k-takata opened this issue Jan 28, 2016 · 17 comments

Comments

@k-takata
Copy link
Member

64bit版Windowsに、公式のインストーラでVimをインストールすると、エクスプローラの右クリックメニューで表示される "Edit with Vim" などの項目が日本語表示されません。
(32bit Windowsであれば問題ありません。)

原因:
インストーラでインストールされるVimは32bit版であり、同梱されているgettextのDLLも32bit版である。
一方、64bit Windowsでは、右クリックメニューの項目表示を行うgvimext.dllは、64bit版がインストールされる。
gvimext.dllは日本語表示を行うためにgettextをロードしようとするが、DLLは32bit版であるためロードできず、日本語表示できない。

@k-takata
Copy link
Member Author

関連todo

Windows installer should install 32-bit version of right-click handler also on
64-bit systems. (Brian Cunningham, 2011 Dec 28)

あとは #508 も。

@k-takata
Copy link
Member Author

(32bit Windowsであれば問題ありません。)

最新ナイトリービルドの、
https://github.com/vim/vim-win32-installer/releases/tag/v7.4.1194
を使うと、32bit Windowsでもメニュー項目が日本語化されません。

原因:

  • 同梱しているgettext DLLの名前が、libintl.dll から libintl-8.dll に変更されたが、GvimExtがそれに対応できていない。
  • gettext DLLがiconv DLLに依存しているバージョンに変更されたが、iconv DLLがDLLの検索パス上に存在しないため、iconv DLLがロードできず、その結果gettext DLLがロードできない。

@mattn
Copy link
Member
mattn commented Jan 29, 2016

ディレクトリ直指定は1個でいいかな。

diff --git a/src/GvimExt/gvimext.cpp b/src/GvimExt/gvimext.cpp
index e644443..81d4cfc 100644
--- a/src/GvimExt/gvimext.cpp
+++ b/src/GvimExt/gvimext.cpp
@@ -158,6 +158,7 @@ HBITMAP IconToBitmap(HICON hIcon, HBRUSH hBackground, int width, int height)
 # define VIMPACKAGE "vim"
 # ifndef GETTEXT_DLL
 #  define GETTEXT_DLL "libintl.dll"
+#  define GETTEXT_DLL_ALT "libintl-8.dll"
 # endif

 // Dummy functions
@@ -206,6 +207,10 @@ dyn_libintl_init(char *dir)
     if (!hLibintlDLL)
     {
    hLibintlDLL = LoadLibrary(GETTEXT_DLL);
+#ifdef GETTEXT_DLL_ALT
+   if (!hLibintlDLL)
+       hLibintlDLL = LoadLibrary(GETTEXT_DLL_ALT);
+#endif
    if (!hLibintlDLL)
        return 0;
     }

@mattn
Copy link
Member
mattn commented Jan 29, 2016

vim/vim#608

@k-takata
Copy link
Member Author

残念ながらそれでは不十分なのです。

@mattn
Copy link
Member
mattn commented Jan 29, 2016

どの件でしょうか?

@k-takata
Copy link
Member Author

これです。

gettext DLLがiconv DLLに依存し 8000 いるバージョンに変更されたが、iconv DLLがDLLの検索パス上に存在しないため、iconv DLLがロードできず、その結果gettext DLLがロードできない。

現象の説明としては、以下が分かりやすいですね。
DLLからDLLを呼ぶのはこんなに難しい - kawanon
http://d.hatena.ne.jp/m_kawanon/20110731/1312116123

gvimext.dll は、explorer.exe (あるいは同様のファイラー等) のプロセスで動くので、DLLの検索パスには、gvim.exe のあるディレクトリは含まれない点がはまりどころです。
パッチは準備中。

@mattn
Copy link
Member
mattn commented Jan 29, 2016

なるほど。パッチお願いします。

@k-takata
Copy link
Member Author

このパッチを投げました。
https://bitbucket.org/k_takata/vim-ktakata-mq/src/479934b94fd56b064c9e4bd8737585c5df69d56a/fix-gvimext-loadlibrary.patch?fileviewer=file-view-default
PATHの先頭に、一時的にVimのruntimeディレクトリを追加してから、libintl.dll, libintl-8.dll の順でロードを試みます。

@k-takata
Copy link
Member Author
k-takata commented Feb 3, 2016

64bit Windowsで日本語表示されない問題は、32bit版の問題が修正されてからレポート予定。
どう直すか(そもそも直すのか)はvim_devの反応しだいかなー。

@k-takata
Copy link
Member Author

7.4.1383
https://groups.google.com/d/topic/vim_dev/VLAesI_qfwI/discussion
32bit版は直りました。

@k-takata
Copy link
Member Author

Related: k-takata/vim-win32-installer#1

@k-takata
Copy link
Member Author

gvimext.dll の 32/64bit版両方をインストールするようにするパッチ。
https://bitbucket.org/k_takata/vim-ktakata-mq/src/c6f0bdb8c24cd02f54ee6b2e97c44020204a9979/win32-intstall-gvimext3264.patch?at=default&fileviewer=file-view-default

インストール後のディレクトリ構成はこんな感じ。

vim80\
  gvim.exe       (32-bit or 64-bit, depends on the zip package or the self-installer)
  vim.exe        (same as above)
  libiconv-2.dll (same as above)
  libintl-8.dll  (same as above)
  libgcc_s_sjlj-1.dll (32-bit only)

  GvimExt32\
    gvimext.dll    (32-bit)
    libiconv-2.dll (32-bit)
    libintl-8.dll  (32-bit)
    libgcc_s_sjlj-1.dll (32-bit)

  GvimExt64\       (No need to install on a 32-bit OS)
    gvimext.dll    (64-bit)
    libiconv-2.dll (64-bit)
    libintl-8.dll  (64-bit)

@k-takata
Copy link
Member Author

アンインストール処理を少し修正。
https://bitbucket.org/k_takata/vim-ktakata-mq/src/a797771dd0314182bf1472547596af2ec1ae78e3/win32-intstall-gvimext3264.patch?at=default&fileviewer=file-view-default

iconvとgettextのDLLが2種類、3セットインストールされるのはビミョーな感じがしますが、32bitインストーラ、32bit/64bit zipパッケージのどれでも同じように動かせるようにするには、こうするのが一番楽かなと思います。

@k-takata
Copy link
Member Author

Posted: vim/vim#2144

@k-takata
Copy link
Member Author

todo listed: vim/vim@24a98a0#diff-38d7929bd26d74d92ceddf984bbfc8dbR38

MS-Windows build and installer improvements:
- Switch to VC2015 for building. (Ken Takata, 2017 Sep 21)
  Check resulting binary on XP.
- Patch to install 32 and 64 bit Gvimext and related dll files. (Ken Takata,
  2017 Sep 23, #2144)

@k-takata
Copy link
Member Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants
0