[Ttssh2-commit] [8254] [Tooltip] trunk(r8242まで)をマージした

scmno****@osdn***** scmno****@osdn*****
2019年 10月 3日 (木) 00:22:54 JST


Revision: 8254
          https://osdn.net/projects/ttssh2/scm/svn/commits/8254
Author:   yasuhide
Date:     2019-10-03 00:22:53 +0900 (Thu, 03 Oct 2019)
Log Message:
-----------
[Tooltip] trunk(r8242まで)をマージした

r8232 | r8225 の文言を修正した。
r8233 | コメント修正
r8234 | r8225 の文言を再修正した。
r8239 | ポート転送で、クライアントにデータを送り終える前に切断する問題を修正
r8240 | ttssh2でSetI18DlgStrs()を使用するようにした
r8241 | ttproxyでSetI18DlgStrs()を使用するようにした
r8242 | dllのi18n.cを使用するよう修正

Revision Links:
--------------
    https://osdn.net/projects/ttssh2/scm/svn/commits/8232
    https://osdn.net/projects/ttssh2/scm/svn/commits/8225
    https://osdn.net/projects/ttssh2/scm/svn/commits/8233
    https://osdn.net/projects/ttssh2/scm/svn/commits/8234
    https://osdn.net/projects/ttssh2/scm/svn/commits/8225
    https://osdn.net/projects/ttssh2/scm/svn/commits/8239
    https://osdn.net/projects/ttssh2/scm/svn/commits/8240
    https://osdn.net/projects/ttssh2/scm/svn/commits/8241
    https://osdn.net/projects/ttssh2/scm/svn/commits/8242

Modified Paths:
--------------
    branches/tootip_classify/TTProxy/ProxyWSockHook.h
    branches/tootip_classify/doc/en/html/about/history.html
    branches/tootip_classify/doc/ja/html/about/history.html
    branches/tootip_classify/teraterm/ttpmacro/CMakeLists.txt
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v10.vcxproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v11.vcxproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v12.vcxproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v14.vcxproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v15.vcxproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v16.vcxproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v9.vcproj
    branches/tootip_classify/teraterm/ttpmacro/ttpmacro.vcproj
    branches/tootip_classify/ttssh2/ttxssh/auth.c
    branches/tootip_classify/ttssh2/ttxssh/fwd.c
    branches/tootip_classify/ttssh2/ttxssh/fwdui.c
    branches/tootip_classify/ttssh2/ttxssh/hosts.c
    branches/tootip_classify/ttssh2/ttxssh/ssh.c
    branches/tootip_classify/ttssh2/ttxssh/ttxssh.c

Added Paths:
-----------
    branches/tootip_classify/tests/#39614-portforward.rb

-------------- next part --------------
Modified: branches/tootip_classify/TTProxy/ProxyWSockHook.h
===================================================================
--- branches/tootip_classify/TTProxy/ProxyWSockHook.h	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/TTProxy/ProxyWSockHook.h	2019-10-02 15:22:53 UTC (rev 8254)
@@ -750,58 +750,30 @@
             return Dialog::dispatch(message, wParam, lParam);
         }
         virtual bool onInitDialog() {
-            char uimsg[MAX_UIMSG], uitmp[MAX_UIMSG];
+            const static DlgTextInfo text_info[] = {
+                { 0, "DLG_OTHER_TITLE" },
+                { IDC_GRP_COMMON, "DLG_OTHER_COMMON" },
+                { IDC_TIMEOUT_LABEL, "DLG_OTHER_TIMEOUT" },
+                { IDC_TIMEOUT_SECONDS, "DLG_OTHER_SECOND" },
+                { IDC_LOGFILE_LABEL, "DLG_OTHER_LOG" },
+                { IDC_REFER, "DLG_OTHER_REFER" },
+                { IDC_GRP_SOCKS, "DLG_OTHER_SOCKS" },
+                { IDC_RESOLVE_LABEL, "DLG_OTHER_RESOLV" },
+                { IDC_GRP_TELNET, "DLG_OTHER_TELNET" },
+                { IDC_HOSTNAME_LABEL, "DLG_OTHER_HOST" },
+                { IDC_USERNAME_LABEL, "DLG_OTHER_USER" },
+                { IDC_PASSWORD_LABEL, "DLG_OTHER_PASS" },
+                { IDC_CONNECTED_LABEL, "DLG_OTHER_CONNECT" },
+                { IDC_ERROR_LABEL, "DLG_OTHER_ERROR" },
+//              { IDOK, "BTN_OK" },
+//              { IDCANCEL, "BTN_CANCEL" },
+            };
+            char uimsg[MAX_UIMSG];
 
             Dialog::onInitDialog();
 
-            GetWindowText(uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_TITLE", uimsg, sizeof(uimsg), uitmp);
-            SetWindowText(uimsg);
-            GetDlgItemText(IDC_GRP_COMMON, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_COMMON", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_GRP_COMMON, uimsg);
-            GetDlgItemText(IDC_TIMEOUT_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_TIMEOUT", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_TIMEOUT_LABEL, uimsg);
-            GetDlgItemText(IDC_TIMEOUT_SECONDS, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_SECOND", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_TIMEOUT_SECONDS, uimsg);
-            GetDlgItemText(IDC_LOGFILE_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_LOG", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_LOGFILE_LABEL, uimsg);
-            GetDlgItemText(IDC_REFER, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_REFER", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_REFER, uimsg);
-            GetDlgItemText(IDC_GRP_SOCKS, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_SOCKS", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_GRP_SOCKS, uimsg);
-            GetDlgItemText(IDC_RESOLVE_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_RESOLV", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_RESOLVE_LABEL, uimsg);
-            GetDlgItemText(IDC_GRP_TELNET, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_TELNET", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_GRP_TELNET, uimsg);
-            GetDlgItemText(IDC_HOSTNAME_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_HOST", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_HOSTNAME_LABEL, uimsg);
-            GetDlgItemText(IDC_USERNAME_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_USER", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_USERNAME_LABEL, uimsg);
-            GetDlgItemText(IDC_PASSWORD_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_PASS", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_PASSWORD_LABEL, uimsg);
-            GetDlgItemText(IDC_CONNECTED_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_CONNECT", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_CONNECTED_LABEL, uimsg);
-            GetDlgItemText(IDC_ERROR_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_OTHER_ERROR", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_ERROR_LABEL, uimsg);
-            GetDlgItemText(IDOK, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("BTN_OK", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDOK, uimsg);
-            GetDlgItemText(IDCANCEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDCANCEL, uimsg);
+            HWND hWnd = (HWND)this;
+			SetI18DlgStrs("TTProxy", hWnd, text_info, _countof(text_info), UILanguageFile);
 
             host = GetDlgItem(IDC_HOSTNAME);
             user = GetDlgItem(IDC_USERNAME);
@@ -910,40 +882,24 @@
             return Dialog::dispatch(message, wParam, lParam);
         }
         virtual bool onInitDialog() {
-            char uimsg[MAX_UIMSG], uitmp[MAX_UIMSG];
+            char uimsg[MAX_UIMSG];
 
             Dialog::onInitDialog();
 
-            GetWindowText(uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_TITLE", uimsg, sizeof(uimsg), uitmp);
-            SetWindowText(uimsg);
-            GetDlgItemText(IDC_URL_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_URL", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_URL_LABEL, uimsg);
-            GetDlgItemText(IDC_TYPE_LEBEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_TYPE", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_TYPE_LEBEL, uimsg);
-            GetDlgItemText(IDC_HOSTNAME_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_HOST", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_HOSTNAME_LABEL, uimsg);
-            GetDlgItemText(IDC_PORT_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_PORT", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_PORT_LABEL, uimsg);
-            GetDlgItemText(IDC_USERNAME_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_USER", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_USERNAME_LABEL, uimsg);
-            GetDlgItemText(IDC_PASSWORD_LABEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_PASS", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_PASSWORD_LABEL, uimsg);
-            GetDlgItemText(IDC_OPTIONS, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_OTHER", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDC_OPTIONS, uimsg);
-            GetDlgItemText(IDOK, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("BTN_OK", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDOK, uimsg);
-            GetDlgItemText(IDCANCEL, uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uitmp);
-            SetDlgItemText(IDCANCEL, uimsg);
+            const static DlgTextInfo text_info[] = {
+                { 0, "DLG_SETUP_TITLE" },
+                { IDC_URL_LABEL, "DLG_SETUP_URL" },
+                { IDC_TYPE_LEBEL, "DLG_SETUP_TYPE" },
+                { IDC_HOSTNAME_LABEL, "DLG_SETUP_HOST" },
+                { IDC_PORT_LABEL, "DLG_SETUP_PORT" },
+                { IDC_USERNAME_LABEL, "DLG_SETUP_USER" },
+                { IDC_PASSWORD_LABEL, "DLG_SETUP_PASS" },
+                { IDC_OPTIONS, "DLG_SETUP_OTHER" },
+//              { IDOK, "BTN_OK" },
+//              { IDCANCEL, "BTN_CANCEL" },
+            };
+			HWND hWnd = HWND(this);		// \x82\xA4\x82܂\xAD\x93\xAE\x82\xA9\x82Ȃ\xA2?
+			SetI18DlgStrs("TTProxy", hWnd, text_info, _countof(text_info), UILanguageFile);
 
             url  <<= GetDlgItem(IDC_URL);
             type <<= GetDlgItem(IDC_TYPE);
@@ -1539,22 +1495,22 @@
 		   
 		   buf[0] VER  protocol version: X'05'
 		   buf[1] REP  Reply field: 
- 				 o  X'00' succeeded
-				 o  X'01' general SOCKS server failure
-				 o  X'02' connection not allowed by ruleset
-				 o  X'03' Network unreachable
-				 o  X'04' Host unreachable
-				 o  X'05' Connection refused
-				 o  X'06' TTL expired
-				 o  X'07' Command not supported
-				 o  X'08' Address type not supported
-				 o  X'09' to X'FF' unassigned
-		   buf[2] RSV    RESERVED: X'00'
-		   buf[3] ATYP   address type of following address
-				 o  IP V4 address: X'01'
-				 o  DOMAINNAME: X'03'
-				 o  IP V6 address: X'04'
-		   buf[4:N] BND.ADDR       server bound address
+ 				 o  X'00' succeeded
+				 o  X'01' general SOCKS server failure
+				 o  X'02' connection not allowed by ruleset
+				 o  X'03' Network unreachable
+				 o  X'04' Host unreachable
+				 o  X'05' Connection refused
+				 o  X'06' TTL expired
+				 o  X'07' Command not supported
+				 o  X'08' Address type not supported
+				 o  X'09' to X'FF' unassigned
+		   buf[2] RSV    RESERVED: X'00'
+		   buf[3] ATYP   address type of following address
+				 o  IP V4 address: X'01'
+				 o  DOMAINNAME: X'03'
+				 o  IP V6 address: X'04'
+		   buf[4:N] BND.ADDR       server bound address
 		   buf[N+1] BND.PORT       server bound port in network octet order 
 		 */
         if (buf[0] != SOCKS5_VERSION || buf[1] != SOCKS5_REP_SUCCEEDED) {   /* check reply code */
@@ -1667,9 +1623,9 @@
 		  buf[1] CD
 		           90 request granted
 		           91 request rejected or failed
-		           92 request rejected becasue SOCKS server cannot connect to
+		           92 request rejected becasue SOCKS server cannot connect to
 	                  identd on the client
-				   93 request rejected because the client program and identd
+				   93 request rejected because the client program and identd
 	                  report different user-ids
 		  buf[2:3] DSTPORT \x83|\x81[\x83g\x94ԍ\x86
 		  buf[4:7] DSTIP   IP\x83A\x83h\x83\x8C\x83X

Modified: branches/tootip_classify/doc/en/html/about/history.html
===================================================================
--- branches/tootip_classify/doc/en/html/about/history.html	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/doc/en/html/about/history.html	2019-10-02 15:22:53 UTC (rev 8254)
@@ -59,7 +59,7 @@
     <ul>
       <li>The toolchip during resizing can not be displayed on the left and top edge of the desktop. This bug was introduced in 4.103.</li>
       <li>Eterm look-feel: When a image file is randomly selected with the wallpaper, invalid file may be selected. </li>
-      <!--li>\x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82̃w\x83\x8B\x83v\x83{\x83^\x83\x93\x82\xAA\x8B@\x94\\x82\xB7\x82\xE9\x82悤\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B4.104\x82ł̃G\x83\x93\x83o\x83O\x81B</li-->
+      <li>The help button of File-Log, File-Trasnfer, and Setup-Font dialog does not work well. This bug was introduced in 4.104.</li>
     </ul>
   </li>
 
@@ -3224,6 +3224,7 @@
       <li>SSH1: The <a href="../commandline/ttssh.html#nosecuritywarning">/nosecuritywarning</a> option does not work well.</li>
       <li>The problem is improved in the user authentication dialog that the delay occurs when the focus is moved from the user name to passphrase by using TAB key after entering the user name.</li>
       <li>When the user name is left blank in the user authentication dialog, the focus may not be moved from the user name to the pull-down menu on the right side with TAB key.</li>
+      <li>Fixed a port forwarding issue that closes the client connection before completing all data transmission.</li>
     </ul>
   </li>
 </ul>

Modified: branches/tootip_classify/doc/ja/html/about/history.html
===================================================================
--- branches/tootip_classify/doc/ja/html/about/history.html	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/doc/ja/html/about/history.html	2019-10-02 15:22:53 UTC (rev 8254)
@@ -59,7 +59,7 @@
     <ul>
       <li>\x83\x8A\x83T\x83C\x83Y\x92\x86\x82̏c\x89\xA1\x83T\x83C\x83Y\x83c\x81[\x83\x8B\x83`\x83b\x83v\x82\xAA\x81A\x83f\x83X\x83N\x83g\x83b\x83v\x82̍\xB6\x92[\x82Ə\xE3\x92[\x82ŕ\\x8E\xA6\x82\xB3\x82\xEA\x82Ȃ\xAD\x82Ȃ\xC1\x82Ă\xA2\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B4.103\x82ł̃G\x83\x93\x83o\x83O\x81B</li>
       <li>Eterm look-feel: \x95ǎ\x86\x82ƍ\xAC\x8D\x87\x82\xB7\x82\xE9\x89摜\x83t\x83@\x83C\x83\x8B\x82\xF0\x83\x89\x83\x93\x83_\x83\x80\x82ɑI\x91\xF0\x82\xB7\x82\xE9\x8DہA\x96\xB3\x8A֌W\x82ȃt\x83@\x83C\x83\x8B\x82\xF0\x91I\x91\xF0\x82\xB7\x82邱\x82Ƃ\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
-      <li>\x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82̃w\x83\x8B\x83v\x83{\x83^\x83\x93\x82\xAA\x8B@\x94\\x82\xB7\x82\xE9\x82悤\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B4.104\x82ł̃G\x83\x93\x83o\x83O\x81B</li>
+      <li>\x83\x8D\x83O\x8D̎\xE6\x81E\x83t\x83@\x83C\x83\x8B\x91\x97\x90M\x81E\x83t\x83H\x83\x93\x83g\x83_\x83C\x83A\x83\x8D\x83O\x82̃w\x83\x8B\x83v\x83{\x83^\x83\x93\x82\xAA\x8B@\x94\\x82\xB5\x82Ȃ\xA2\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B4.104\x82ł̃G\x83\x93\x83o\x83O\x81B</li>
     </ul>
   </li>
 
@@ -3230,6 +3230,7 @@
       <li>SSH1: <a href="../commandline/ttssh.html#nosecuritywarning">/nosecuritywarning</a>\x83I\x83v\x83V\x83\x87\x83\x93\x82\xAA\x8B@\x94\\x82\xB5\x82Ă\xA2\x82Ȃ\xA9\x82\xC1\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
       <li>\x83\x86\x81[\x83U\x94F\x8F؃_\x83C\x83A\x83\x8D\x83O\x82ŁA\x83\x86\x81[\x83U\x96\xBC\x82\xF0\x93\xFC\x97͌\xE3\x82\xCCTAB\x83L\x81[\x82Ńp\x83X\x83t\x83\x8C\x81[\x83Y\x97\x93\x82ւ̈ړ\xAE\x82ɒx\x89\x84\x82\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x89\xFC\x91P\x82\xB5\x82\xBD\x81B</li>
       <li>\x83\x86\x81[\x83U\x94F\x8F؃_\x83C\x83A\x83\x8D\x83O\x82ŁA\x83\x86\x81[\x83U\x96\xBC\x82\xF0\x8B󗓂ɂ\xB5\x82\xBD\x8C\xE3\x81ATAB\x83L\x81[\x82ʼnE\x91\xA4\x82̃v\x83\x8B\x83_\x83E\x83\x93\x83\x81\x83j\x83\x85\x81[\x82Ƀt\x83H\x81[\x83J\x83X\x88ړ\xAE\x82\xB5\x82Ȃ\xA2\x82\xB1\x82Ƃ\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
+      <li>\x83|\x81[\x83g\x93]\x91\x97\x82ŁA\x83N\x83\x89\x83C\x83A\x83\x93\x83g\x82Ƀf\x81[\x83^\x82𑗂\xE8\x8FI\x82\xED\x82\xE9\x91O\x82ɐڑ\xB1\x82\xF0\x90ؒf\x82\xB7\x82\xE9\x8Fꍇ\x82\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
     </ul>
   </li>
 </ul>

Modified: branches/tootip_classify/teraterm/ttpmacro/CMakeLists.txt
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/CMakeLists.txt	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/CMakeLists.txt	2019-10-02 15:22:53 UTC (rev 8254)
@@ -15,7 +15,6 @@
   ../common/ttddecmnd.h
   ../common/tttypes.h
   ../common/tt-version.h
-  ../common/i18n.c
   ../common/i18n.h
   ../common/ttlib.c
   ../common/ttlib.h

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v10.vcxproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v10.vcxproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v10.vcxproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -130,7 +130,6 @@
     <ClCompile Include="..\common\dlglib_cpp.cpp" />
     <ClCompile Include="..\common\dlglib_tmpl.cpp" />
     <ClCompile Include="..\common\dllutil.cpp" />
-    <ClCompile Include="..\common\i18n.c" />
     <ClCompile Include="..\common\tmfc.cpp" />
     <ClCompile Include="..\common\tmfc_frame.cpp" />
     <ClCompile Include="..\common\ttlib.c" />

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v11.vcxproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v11.vcxproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v11.vcxproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -130,7 +130,6 @@
     <ClCompile Include="..\common\dlglib_cpp.cpp" />
     <ClCompile Include="..\common\dlglib_tmpl.cpp" />
     <ClCompile Include="..\common\dllutil.cpp" />
-    <ClCompile Include="..\common\i18n.c" />
     <ClCompile Include="..\common\tmfc.cpp" />
     <ClCompile Include="..\common\tmfc_frame.cpp" />
     <ClCompile Include="..\common\ttlib.c" />

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v12.vcxproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v12.vcxproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v12.vcxproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -130,7 +130,6 @@
     <ClCompile Include="..\common\dlglib_cpp.cpp" />
     <ClCompile Include="..\common\dlglib_tmpl.cpp" />
     <ClCompile Include="..\common\dllutil.cpp" />
-    <ClCompile Include="..\common\i18n.c" />
     <ClCompile Include="..\common\tmfc.cpp" />
     <ClCompile Include="..\common\tmfc_frame.cpp" />
     <ClCompile Include="..\common\ttlib.c" />

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v14.vcxproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v14.vcxproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v14.vcxproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -130,7 +130,6 @@
     <ClCompile Include="..\common\dlglib_cpp.cpp" />
     <ClCompile Include="..\common\dlglib_tmpl.cpp" />
     <ClCompile Include="..\common\dllutil.cpp" />
-    <ClCompile Include="..\common\i18n.c" />
     <ClCompile Include="..\common\tmfc.cpp" />
     <ClCompile Include="..\common\tmfc_frame.cpp" />
     <ClCompile Include="..\common\ttlib.c" />

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v15.vcxproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v15.vcxproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v15.vcxproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -133,7 +133,6 @@
     <ClCompile Include="..\common\dlglib_cpp.cpp" />
     <ClCompile Include="..\common\dlglib_tmpl.cpp" />
     <ClCompile Include="..\common\dllutil.cpp" />
-    <ClCompile Include="..\common\i18n.c" />
     <ClCompile Include="..\common\tmfc.cpp" />
     <ClCompile Include="..\common\tmfc_frame.cpp" />
     <ClCompile Include="..\common\ttlib.c" />
@@ -207,4 +206,4 @@
       <UserProperties RESOURCE_FILE="ttpmacro.rc" />
     </VisualStudio>
   </ProjectExtensions>
-</Project>
\ No newline at end of file
+</Project>

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v16.vcxproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v16.vcxproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v16.vcxproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -133,7 +133,6 @@
     <ClCompile Include="..\common\dlglib_cpp.cpp" />
     <ClCompile Include="..\common\dlglib_tmpl.cpp" />
     <ClCompile Include="..\common\dllutil.cpp" />
-    <ClCompile Include="..\common\i18n.c" />
     <ClCompile Include="..\common\tmfc.cpp" />
     <ClCompile Include="..\common\tmfc_frame.cpp" />
     <ClCompile Include="..\common\ttlib.c" />
@@ -207,4 +206,4 @@
       <UserProperties RESOURCE_FILE="ttpmacro.rc" />
     </VisualStudio>
   </ProjectExtensions>
-</Project>
\ No newline at end of file
+</Project>

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v9.vcproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v9.vcproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.v9.vcproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -424,10 +424,6 @@
 			Filter="c"
 			>
 			<File
-				RelativePath="..\common\i18n.c"
-				>
-			</File>
-			<File
 				RelativePath="ttl.c"
 				>
 			</File>

Modified: branches/tootip_classify/teraterm/ttpmacro/ttpmacro.vcproj
===================================================================
--- branches/tootip_classify/teraterm/ttpmacro/ttpmacro.vcproj	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/teraterm/ttpmacro/ttpmacro.vcproj	2019-10-02 15:22:53 UTC (rev 8254)
@@ -427,10 +427,6 @@
 			Filter="c"
 			>
 			<File
-				RelativePath="..\common\i18n.c"
-				>
-			</File>
-			<File
 				RelativePath="ttl.c"
 				>
 			</File>

Added: branches/tootip_classify/tests/#39614-portforward.rb
===================================================================
--- branches/tootip_classify/tests/#39614-portforward.rb	                        (rev 0)
+++ branches/tootip_classify/tests/#39614-portforward.rb	2019-10-02 15:22:53 UTC (rev 8254)
@@ -0,0 +1,49 @@
+#!/usr/bin/ruby
+# coding: UTF-8
+#
+# Ticket: #39614 のテストスクリプト
+#
+# Tera Term で /ssh-L8000:ttssh2.osdn.jp:80 を指定してサーバに接続後、
+# このスクリプトを実行する。
+# 再現しない場合は sleep の時間を適宜調整する
+#
+
+require 'socket'
+
+s = TCPSocket.open("localhost", 8000)
+
+puts "Send request."
+s.write "GET /tmp/ticket-39614-test.txt HTTP/1.0\r\nHost: ttssh2.osdn.jp\r\n\r\n"
+
+puts "Wait 5 seconds."
+sleep 5
+
+puts "Skip HTTP header"
+
+while s.gets
+  break if /^\r\n$/ =~ $_
+end
+
+count = 0
+
+puts "Reading body part..."
+while data = s.read(4096)
+  count += data.size
+  if ((count / 4096) % 64) == 0
+    puts "#{count} bytes read"
+    sleep 1
+  end
+end
+
+s.close
+
+result = ""
+if count == 13229000
+  result = "data OK."
+elsif count < 13229000
+  result = "data corrupted."
+else
+  result = "unknown data."
+end
+
+puts "END: #{count} bytes read. #{result}"


Property changes on: branches/tootip_classify/tests/#39614-portforward.rb
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: branches/tootip_classify/ttssh2/ttxssh/auth.c
===================================================================
--- branches/tootip_classify/ttssh2/ttxssh/auth.c	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/ttssh2/ttxssh/auth.c	2019-10-02 15:22:53 UTC (rev 8254)
@@ -1343,21 +1343,14 @@
 
 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
 {
-	char uimsg[MAX_UIMSG];
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_TIS_TITLE" },
+		{ IDC_SSHAUTHBANNER, "DLG_TIS_BANNER" },
+		{ IDOK, "BTN_OK" },
+		{ IDCANCEL, "BTN_DISCONNECT" },
+	};
+	SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
-	GetWindowText(dlg, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
-	SetWindowText(dlg, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
-	SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
-	SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
-
 	init_auth_machine_banner(pvar, dlg);
 	init_password_control(pvar, dlg, IDC_SSHPASSWORD, NULL);
 

Modified: branches/tootip_classify/ttssh2/ttxssh/fwd.c
===================================================================
--- branches/tootip_classify/ttssh2/ttxssh/fwd.c	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/ttssh2/ttxssh/fwd.c	2019-10-02 15:22:53 UTC (rev 8254)
@@ -310,14 +310,28 @@
 
 	channel = pvar->fwd_state.channels + local_channel_num;
 
-	if (channel->local_socket != INVALID_SOCKET) {
-		shutdown(channel->local_socket, 1);
-	}
 	channel->status |= FWD_CLOSED_REMOTE_IN;
-	if ((channel->status & FWD_CLOSED_REMOTE_OUT) == FWD_CLOSED_REMOTE_OUT) {
-		closed_local_connection(pvar, local_channel_num);
-		FWD_free_channel(pvar, local_channel_num);
+
+	logprintf(LOG_LEVEL_VERBOSE, "%s: SSH_MSG_CHANNEL_EOF receive. channel: %d", __FUNCTION__, local_channel_num);
+
+	if (channel->writebuf.datalen == 0) {
+		// \x83N\x83\x89\x83C\x83A\x83\x93\x83g\x82֑\x97\x82\xE9\x83f\x81[\x83^\x82\xAA\x8Ec\x82\xC1\x82Ă\xA2\x82Ȃ\xA2\x8Fꍇ\x82̓R\x83l\x83N\x83V\x83\x87\x83\x93\x82\xF0 shutdown \x82\xB7\x82\xE9
+		logprintf(LOG_LEVEL_VERBOSE,
+		          "%s: shutdown local socket. channel: %d", __FUNCTION__, local_channel_num);
+		if (channel->local_socket != INVALID_SOCKET) {
+			shutdown(channel->local_socket, 1);
+		}
+		if ((channel->status & FWD_CLOSED_REMOTE_OUT) == FWD_CLOSED_REMOTE_OUT) {
+			closed_local_connection(pvar, local_channel_num);
+			FWD_free_channel(pvar, local_channel_num);
+		}
 	}
+	else {
+		// \x83o\x83b\x83t\x83@\x82Ƀf\x81[\x83^\x82\xAA\x8Ec\x82\xC1\x82Ă\xA2\x82\xE9\x8Fꍇ\x82͂\xB1\x82\xB1\x82ł\xCD shutdown \x8Fo\x97\x88\x82Ȃ\xA2
+		// write_local_connection_buffer() \x82Ńf\x81[\x83^\x82\xAA\x82\xB7\x82ׂđ\x97\x82\xE8\x8FI\x82\xED\x82\xC1\x82\xBD\x8E\x9E\x82\xC9 shutdown \x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9
+		logprintf(LOG_LEVEL_VERBOSE, "%s: buffer not empty. channel: %d, remained data length: %d",
+		          __FUNCTION__, local_channel_num, channel->writebuf.datalen);
+	}
 }
 
 void FWD_channel_output_eof(PTInstVar pvar, uint32 local_channel_num)
@@ -659,11 +673,30 @@
 {
 	FWDChannel *channel = pvar->fwd_state.channels + channel_num;
 
+	if (channel->writebuf.datalen == 0) {
+		logprintf(LOG_LEVEL_VERBOSE, "%s: write buffer is empty. channel: %d", __FUNCTION__, channel_num);
+		return;
+	}
+
+	logprintf(LOG_LEVEL_VERBOSE, "%s: remained data length: %d, channel: %d", __FUNCTION__,
+	          channel->writebuf.datalen, channel_num);
+
 	if ((channel->status & FWD_BOTH_CONNECTED) == FWD_BOTH_CONNECTED) {
 		if (!UTIL_sock_write_more
 			(pvar, &channel->writebuf, channel->local_socket)) {
 			channel_error(pvar, "writing", channel_num, WSAGetLastError());
 		}
+		if (channel->writebuf.datalen == 0 && (channel->status & FWD_CLOSED_REMOTE_IN) == FWD_CLOSED_REMOTE_IN) {
+			// \x83N\x83\x89\x83C\x83A\x83\x93\x83g\x82ւ̃f\x81[\x83^\x82\xAA\x82\xB7\x82ׂđ\x97\x82\xE8\x8FI\x82\xED\x82\xC1\x82Ă\xA8\x82\xE8\x81A\x83\x8A\x83\x82\x81[\x83g\x82\xA9\x82\xE7\x82\xCC EOF \x82\xF0\x8E\xF3\x90M\x8Dς݂Ȃ\xE7\x82\xCE
+			// \x83N\x83\x89\x83C\x83A\x83\x93\x83g\x82ւ̃R\x83l\x83N\x83V\x83\x87\x83\x93\x82\xF0 shutdown \x82\xB7\x82\xE9 (\x91\x97\x90M\x95\xFB\x8C\xFC\x82̂\xDD)
+			logprintf(LOG_LEVEL_VERBOSE,
+				  "%s: shutdown local socket. channel: %d", __FUNCTION__, channel_num);
+			shutdown(channel->local_socket, 1);
+			if ((channel->status & FWD_CLOSED_REMOTE_OUT) == FWD_CLOSED_REMOTE_OUT) {
+				closed_local_connection(pvar, channel_num);
+				FWD_free_channel(pvar, channel_num);
+			}
+		}
 	}
 }
 

Modified: branches/tootip_classify/ttssh2/ttxssh/fwdui.c
===================================================================
--- branches/tootip_classify/ttssh2/ttxssh/fwdui.c	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/ttssh2/ttxssh/fwdui.c	2019-10-02 15:22:53 UTC (rev 8254)
@@ -498,39 +498,20 @@
 	FWDRequestSpec *requests =
 		(FWDRequestSpec *) malloc(sizeof(FWDRequestSpec) * num_specs);
 	int i;
-	char uimsg[MAX_UIMSG];
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_FWD_TITLE" },
+		{ IDC_PORTFORWARD, "DLG_FWDSETUP_LIST" },
+		{ IDC_ADD, "DLG_FWDSETUP_ADD" },
+		{ IDC_EDIT, "DLG_FWDSETUP_EDIT" },
+		{ IDC_REMOVE, "DLG_FWDSETUP_REMOVE" },
+		{ IDC_XFORWARD, "DLG_FWDSETUP_X" },
+		{ IDC_SSHFWDX11, "DLG_FWDSETUP_XAPP" },
+		{ IDOK, "BTN_OK" },
+		{ IDCANCEL, "BTN_CANCEL" },
+		{ IDC_SSHFWDSETUP_HELP, "BTN_HELP" },
+	};
+	SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
-	GetWindowText(dlg, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_TITLE", pvar, uimsg);
-	SetWindowText(dlg, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_PORTFORWARD, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWDSETUP_LIST", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_PORTFORWARD, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_ADD, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWDSETUP_ADD", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_ADD, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_EDIT, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWDSETUP_EDIT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_EDIT, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_REMOVE, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWDSETUP_REMOVE", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_REMOVE, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_XFORWARD, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWDSETUP_X", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_XFORWARD, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDX11, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWDSETUP_XAPP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDX11, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
-	SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
-	SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDSETUP_HELP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_HELP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDSETUP_HELP, pvar->ts->UIMsg);
-
 	FWD_get_request_specs(pvar, requests, num_specs);
 
 	for (i = 0; i < num_specs; i++) {
@@ -804,51 +785,24 @@
 
 static void init_fwd_edit_dlg(PTInstVar pvar, FWDRequestSpec *spec, HWND dlg)
 {
-	char uimsg[MAX_UIMSG];
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_FWD_TITLE" },
+		{ IDD_SSHFWDBANNER, "DLG_FWD_BANNER" },
+		{ IDC_SSHFWDLOCALTOREMOTE, "DLG_FWD_LOCAL_PORT" },
+		{ IDC_SSHFWDLOCALTOREMOTE_LISTEN, "DLG_FWD_LOCAL_LISTEN" },
+		{ IDC_SSHFWDLOCALTOREMOTE_HOST, "DLG_FWD_LOCAL_REMOTE" },
+		{ IDC_SSHFWDLOCALTOREMOTE_PORT, "DLG_FWD_LOCAL_REMOTE_PORT" },
+		{ IDC_SSHFWDREMOTETOLOCAL, "DLG_FWD_REMOTE_PORT" },
+		{ IDC_SSHFWDREMOTETOLOCAL_LISTEN, "DLG_FWD_REMOTE_LISTEN" },
+		{ IDC_SSHFWDREMOTETOLOCAL_HOST, "DLG_FWD_REMOTE_LOCAL" },
+		{ IDC_SSHFWDREMOTETOLOCAL_PORT, "DLG_FWD_REMOTE_LOCAL_PORT" },
+		{ IDC_SSHFWDLOCALDYNAMIC, "DLG_FWD_DYNAMIC_PORT" },
+		{ IDC_SSHFWDLOCALDYNAMIC_LISTEN, "DLG_FWD_DYNAMIC_LISTEN" },
+		{ IDOK, "BTN_OK" },
+		{ IDCANCEL, "BTN_CANCEL" },
+	};
+	SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
-	GetWindowText(dlg, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_TITLE", pvar, uimsg);
-	SetWindowText(dlg, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDD_SSHFWDBANNER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_BANNER", pvar, uimsg);
-	SetDlgItemText(dlg, IDD_SSHFWDBANNER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_LOCAL_PORT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE_LISTEN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_LOCAL_LISTEN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE_LISTEN, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE_HOST, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_LOCAL_REMOTE", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE_HOST, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE_PORT, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_LOCAL_REMOTE_PORT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDLOCALTOREMOTE_PORT, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_REMOTE_PORT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL_LISTEN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_REMOTE_LISTEN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL_LISTEN, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL_HOST, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_REMOTE_LOCAL", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL_HOST, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL_PORT, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_REMOTE_LOCAL_PORT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDREMOTETOLOCAL_PORT, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDLOCALDYNAMIC, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_DYNAMIC_PORT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDLOCALDYNAMIC, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHFWDLOCALDYNAMIC_LISTEN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_FWD_DYNAMIC_LISTEN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHFWDLOCALDYNAMIC_LISTEN, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
-	SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
-	SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
-
 	switch (spec->type) {
 	case FWD_REMOTE_TO_LOCAL:
 		setup_edit_controls(dlg, spec, IDC_SSHFWDREMOTETOLOCAL,

Modified: branches/tootip_classify/ttssh2/ttxssh/hosts.c
===================================================================
--- branches/tootip_classify/ttssh2/ttxssh/hosts.c	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/ttssh2/ttxssh/hosts.c	2019-10-02 15:22:53 UTC (rev 8254)
@@ -1726,8 +1726,17 @@
 static INT_PTR CALLBACK hosts_add_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
 										   LPARAM lParam)
 {
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_UNKNOWNHOST_TITLE" },
+		{ IDC_HOSTWARNING, "DLG_UNKNOWNHOST_WARNING" },
+		{ IDC_HOSTWARNING2, "DLG_UNKNOWNHOST_WARNING2" },
+		{ IDC_HOSTFINGERPRINT, "DLG_UNKNOWNHOST_FINGERPRINT" },
+		{ IDC_FP_HASH_ALG, "DLG_UNKNOWNHOST_FP_HASH_ALGORITHM" },
+		{ IDC_ADDTOKNOWNHOSTS, "DLG_UNKNOWNHOST_ADD" },
+		{ IDC_CONTINUE, "BTN_CONTINUE" },
+		{ IDCANCEL, "BTN_DISCONNECT" },
+	};
 	PTInstVar pvar;
-	char uimsg[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -1736,30 +1745,7 @@
 		SetWindowLongPtr(dlg, DWLP_USER, lParam);
 
 		// \x92lj\xC1\x81E\x92u\x82\xAB\x8A\xB7\x82\xA6\x82Ƃ\xE0 init_hosts_dlg \x82\xF0\x8CĂ\xF1\x82ł\xA2\x82\xE9\x82̂ŁA\x82\xBB\x82̑O\x82ɃZ\x83b\x83g\x82\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9
-		GetWindowText(dlg, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_UNKNOWNHOST_TITLE", pvar, uimsg);
-		SetWindowText(dlg, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTWARNING, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_UNKNOWNHOST_WARNING", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTWARNING2, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_UNKNOWNHOST_WARNING2", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING2, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTFINGERPRINT, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_UNKNOWNHOST_FINGERPRINT", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTFINGERPRINT, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_FP_HASH_ALG, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_UNKNOWNHOST_FP_HASH_ALGORITHM", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_FP_HASH_ALG, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_ADDTOKNOWNHOSTS, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_UNKNOWNHOST_ADD", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_ADDTOKNOWNHOSTS, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_CONTINUE, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_CONTINUE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_CONTINUE, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
-		SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
+		SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
 		switch (pvar->dns_key_check) {
 		case DNS_VERIFY_NOTFOUND:
@@ -1897,8 +1883,17 @@
 static INT_PTR CALLBACK hosts_replace_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
 											   LPARAM lParam)
 {
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_UNKNOWNHOST_TITLE" },
+		{ IDC_HOSTWARNING, "DLG_DIFFERENTKEY_WARNING" },
+		{ IDC_HOSTWARNING2, "DLG_DIFFERENTKEY_WARNING2" },
+		{ IDC_HOSTFINGERPRINT, "DLG_DIFFERENTKEY_FINGERPRINT" },
+		{ IDC_FP_HASH_ALG, "DLG_DIFFERENTKEY_FP_HASH_ALGORITHM" },
+		{ IDC_ADDTOKNOWNHOSTS, "DLG_DIFFERENTKEY_REPLACE" },
+		{ IDC_CONTINUE, "BTN_CONTINUE" },
+		{ IDCANCEL, "BTN_DISCONNECT" },
+	};
 	PTInstVar pvar;
-	char uimsg[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -1907,30 +1902,7 @@
 		SetWindowLongPtr(dlg, DWLP_USER, lParam);
 
 		// \x92lj\xC1\x81E\x92u\x82\xAB\x8A\xB7\x82\xA6\x82Ƃ\xE0 init_hosts_dlg \x82\xF0\x8CĂ\xF1\x82ł\xA2\x82\xE9\x82̂ŁA\x82\xBB\x82̑O\x82ɃZ\x83b\x83g\x82\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9
-		GetWindowText(dlg, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTKEY_TITLE", pvar, uimsg);
-		SetWindowText(dlg, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTWARNING, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTKEY_WARNING", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTWARNING2, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTKEY_WARNING2", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING2, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTFINGERPRINT, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTKEY_FINGERPRINT", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTFINGERPRINT, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_FP_HASH_ALG, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTKEY_FP_HASH_ALGORITHM", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_FP_HASH_ALG, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_ADDTOKNOWNHOSTS, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTKEY_REPLACE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_ADDTOKNOWNHOSTS, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_CONTINUE, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_CONTINUE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_CONTINUE, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
-		SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
+		SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
 		switch (pvar->dns_key_check) {
 		case DNS_VERIFY_NOTFOUND:
@@ -2066,8 +2038,17 @@
 static INT_PTR CALLBACK hosts_add2_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
 											LPARAM lParam)
 {
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_DIFFERENTTYPEKEY_TITLE" },
+		{ IDC_HOSTWARNING, "DLG_DIFFERENTTYPEKEY_WARNING" },
+		{ IDC_HOSTWARNING2, "DLG_DIFFERENTTYPEKEY_WARNING2" },
+		{ IDC_HOSTFINGERPRINT, "DLG_DIFFERENTTYPEKEY_FINGERPRINT" },
+		{ IDC_FP_HASH_ALG, "DLG_DIFFERENTTYPEKEY_FP_HASH_ALGORITHM" },
+		{ IDC_ADDTOKNOWNHOSTS, "DLG_DIFFERENTTYPEKEY_ADD" },
+		{ IDC_CONTINUE, "BTN_CONTINUE" },
+		{ IDCANCEL, "BTN_DISCONNECT" },
+	};
 	PTInstVar pvar;
-	char uimsg[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -2076,30 +2057,7 @@
 		SetWindowLongPtr(dlg, DWLP_USER, lParam);
 
 		// \x92lj\xC1\x81E\x92u\x82\xAB\x8A\xB7\x82\xA6\x82Ƃ\xE0 init_hosts_dlg \x82\xF0\x8CĂ\xF1\x82ł\xA2\x82\xE9\x82̂ŁA\x82\xBB\x82̑O\x82ɃZ\x83b\x83g\x82\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9
-		GetWindowText(dlg, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTTYPEKEY_TITLE", pvar, uimsg);
-		SetWindowText(dlg, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTWARNING, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTTYPEKEY_WARNING", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTWARNING2, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTTYPEKEY_WARNING2", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING2, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTFINGERPRINT, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTTYPEKEY_FINGERPRINT", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTFINGERPRINT, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_FP_HASH_ALG, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTTYPEKEY_FP_HASH_ALGORITHM", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_FP_HASH_ALG, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_ADDTOKNOWNHOSTS, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_DIFFERENTTYPEKEY_ADD", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_ADDTOKNOWNHOSTS, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_CONTINUE, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_CONTINUE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_CONTINUE, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
-		SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
+		SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
 		switch (pvar->dns_key_check) {
 		case DNS_VERIFY_NOTFOUND:

Modified: branches/tootip_classify/ttssh2/ttxssh/ssh.c
===================================================================
--- branches/tootip_classify/ttssh2/ttxssh/ssh.c	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/ttssh2/ttxssh/ssh.c	2019-10-02 15:22:53 UTC (rev 8254)
@@ -9606,7 +9606,7 @@
 
 	} else if (c->type == TYPE_PORTFWD) {
 		// CHANNEL_CLOSE \x82𑗂\xE8\x95Ԃ\xB3\x82Ȃ\xA2\x82ƃ\x8A\x83\x82\x81[\x83g\x82\xCCchannel\x82\xAA\x8AJ\x95\xFA\x82\xB3\x82\xEA\x82Ȃ\xA2
-		// c.f. RFC 4253 5.3. Closing a Channel
+		// c.f. RFC 4254 5.3. Closing a Channel
 		ssh2_channel_send_close(pvar, c);
 
 		// \x93]\x91\x97\x83`\x83\x83\x83l\x83\x8B\x93\xE0\x82ɂ\xA0\x82\xE9\x83\\x83P\x83b\x83g\x82̉\xF0\x95\xFA\x98R\x82\xEA\x82\xF0\x8FC\x90\xB3 (2007.7.26 maya)

Modified: branches/tootip_classify/ttssh2/ttxssh/ttxssh.c
===================================================================
--- branches/tootip_classify/ttssh2/ttxssh/ttxssh.c	2019-10-02 15:09:00 UTC (rev 8253)
+++ branches/tootip_classify/ttssh2/ttxssh/ttxssh.c	2019-10-02 15:22:53 UTC (rev 8254)
@@ -1285,6 +1285,21 @@
 static INT_PTR CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
 								   LPARAM lParam)
 {
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_HOST_TITLE" },
+		{ IDC_HOSTNAMELABEL, "DLG_HOST_TCPIPHOST" },
+		{ IDC_HISTORY, "DLG_HOST_TCPIPHISTORY" },
+		{ IDC_SERVICELABEL, "DLG_HOST_TCPIPSERVICE" },
+		{ IDC_HOSTOTHER, "DLG_HOST_TCPIPOTHER" },
+		{ IDC_HOSTTCPPORTLABEL, "DLG_HOST_TCPIPPORT" },
+		{ IDC_SSH_VERSION_LABEL, "DLG_HOST_TCPIPSSHVERSION" },
+		{ IDC_HOSTTCPPROTOCOLLABEL, "DLG_HOST_TCPIPPROTOCOL" },
+		{ IDC_HOSTSERIAL, "DLG_HOST_SERIAL" },
+		{ IDC_HOSTCOMLABEL, "DLG_HOST_SERIALPORT" },
+		{ IDC_HOSTHELP, "DLG_HOST_HELP" },
+		{ IDOK, "BTN_OK" },
+		{ IDCANCEL, "BTN_CANCEL" },
+	};
 	static char *ssh_version[] = {"SSH1", "SSH2", NULL};
 	PGetHNRec GetHNRec;
 	char EntName[128];
@@ -1294,7 +1309,6 @@
 	static char *ComPortDesc[MAXCOMPORT];
 	int comports;
 	BOOL Ok;
-	char uimsg[MAX_UIMSG];
 	static HWND hwndHostname     = NULL; // HOSTNAME dropdown
 	static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown
 
@@ -1303,45 +1317,7 @@
 		GetHNRec = (PGetHNRec) lParam;
 		SetWindowLongPtr(dlg, DWLP_USER, lParam);
 
-		GetWindowText(dlg, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);
-		SetWindowText(dlg, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
-		SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
-		SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
+		SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
 		// \x83z\x83X\x83g\x83q\x83X\x83g\x83\x8A\x82̃`\x83F\x83b\x83N\x83{\x83b\x83N\x83X\x82\xF0\x92lj\xC1 (2005.10.21 yutaka)
 		if (pvar->ts->HistoryList > 0) {
@@ -2386,18 +2362,13 @@
 static void init_about_dlg(PTInstVar pvar, HWND dlg)
 {
 	char buf[1024];
-	char uimsg[MAX_UIMSG];
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_ABOUT_TITLE" },
+		{ IDC_FP_HASH_ALG, "DLG_ABOUT_FP_HASH_ALGORITHM" },
+		{ IDOK, "BTN_OK" },
+	};
+	SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
-	GetWindowText(dlg, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);
-	SetWindowText(dlg, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_FP_HASH_ALG, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_ABOUT_FP_HASH_ALGORITHM", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_FP_HASH_ALG, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
-	SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-
 	// TTSSH\x82̃o\x81[\x83W\x83\x87\x83\x93\x82\xF0\x90ݒ肷\x82\xE9 (2005.2.28 yutaka)
 	_snprintf_s(buf, sizeof(buf), _TRUNCATE,
 	            "TTSSH\r\nTera Term Secure Shell extension, %d.%d\r\nCompatible with SSH protocol version 1.5 and 2.0", TTSSH_VERSION_MAJOR, TTSSH_VERSION_MINOR);
@@ -2642,139 +2613,65 @@
 	HWND hostkeyRotationControlList = GetDlgItem(dlg, IDC_HOSTKEY_ROTATION_COMBO);
 	int i;
 	int ch;
-	char uimsg[MAX_UIMSG];
-	char *rotationItem[SSH_UPDATE_HOSTKEYS_MAX] = {
+	static const char *rotationItem[SSH_UPDATE_HOSTKEYS_MAX] = {
 		"No",
 		"Yes",
 		"Ask",
 	};
-	char *rotationItemKey[SSH_UPDATE_HOSTKEYS_MAX] = {
+	static const char *rotationItemKey[SSH_UPDATE_HOSTKEYS_MAX] = {
 		"DLG_SSHSETUP_HOSTKEY_ROTATION_NO",
 		"DLG_SSHSETUP_HOSTKEY_ROTATION_YES",
 		"DLG_SSHSETUP_HOSTKEY_ROTATION_ASK",
 	};
 
-	GetWindowText(dlg, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_TITLE", pvar, uimsg);
-	SetWindowText(dlg, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_COMPRESSLABEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_COMPRESSLABEL, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_COMPRESSNONE, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NONE", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_COMPRESSNONE, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_COMPRESSHIGH, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_HIGHEST", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_COMPRESSHIGH, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_COMPRESSNOTE, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NOTE", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_COMPRESSNOTE, pvar->ts->UIMsg);
+	const static DlgTextInfo text_info[] = {
+		{ 0, "DLG_SSHSETUP_TITLE" },
+		{ IDC_COMPRESSLABEL, "DLG_SSHSETUP_COMPRESS" },
+		{ IDC_COMPRESSNONE, "DLG_SSHSETUP_COMPRESS_NONE" },
+		{ IDC_COMPRESSHIGH, "DLG_SSHSETUP_COMPRESS_HIGHEST" },
+		{ IDC_COMPRESSNOTE, "DLG_SSHSETUP_COMPRESS_NOTE" },
 
-	GetDlgItemText(dlg, IDC_CIPHERORDER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_CIPHERORDER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_UP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_DOWN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, pvar->ts->UIMsg);
+		{ IDC_CIPHERORDER, "DLG_SSHSETUP_CIPHER" },
+		{ IDC_SSHMOVECIPHERUP, "DLG_SSHSETUP_CIPHER_UP" },
+		{ IDC_SSHMOVECIPHERDOWN, "DLG_SSHSETUP_CIPHER_DOWN" },
 
-	GetDlgItemText(dlg, IDC_KEX_ORDER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_KEX", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_KEX_ORDER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHKEX_MOVEUP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_KEX_UP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHKEX_MOVEUP, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHKEX_MOVEDOWN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_KEX_DOWN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHKEX_MOVEDOWN, pvar->ts->UIMsg);
+		{ IDC_KEX_ORDER, "DLG_SSHSETUP_KEX" },
+		{ IDC_SSHKEX_MOVEUP, "DLG_SSHSETUP_KEX_UP" },
+		{ IDC_SSHKEX_MOVEDOWN, "DLG_SSHSETUP_KEX_DOWN" },
 
-	GetDlgItemText(dlg, IDC_HOST_KEY_ORDER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_HOST_KEY_ORDER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEUP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY_UP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEUP, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEDOWN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY_DOWN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEDOWN, pvar->ts->UIMsg);
+		{ IDC_HOST_KEY_ORDER, "DLG_SSHSETUP_HOST_KEY" },
+		{ IDC_SSHHOST_KEY_MOVEUP, "DLG_SSHSETUP_HOST_KEY_UP" },
+		{ IDC_SSHHOST_KEY_MOVEDOWN, "DLG_SSHSETUP_HOST_KEY_DOWN" },
 
-	GetDlgItemText(dlg, IDC_MAC_ORDER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_MAC", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_MAC_ORDER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHMAC_MOVEUP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_MAC_UP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHMAC_MOVEUP, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHMAC_MOVEDOWN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_MAC_DOWN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHMAC_MOVEDOWN, pvar->ts->UIMsg);
+		{ IDC_MAC_ORDER, "DLG_SSHSETUP_MAC" },
+		{ IDC_SSHMAC_MOVEUP, "DLG_SSHSETUP_MAC_UP" },
+		{ IDC_SSHMAC_MOVEDOWN, "DLG_SSHSETUP_MAC_DOWN" },
 
-	GetDlgItemText(dlg, IDC_COMP_ORDER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_COMP_ORDER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHCOMP_MOVEUP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMP_UP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHCOMP_MOVEUP, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHCOMP_MOVEDOWN, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_COMP_DOWN", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHCOMP_MOVEDOWN, pvar->ts->UIMsg);
+		{ IDC_COMP_ORDER, "DLG_SSHSETUP_COMP" },
+		{ IDC_SSHCOMP_MOVEUP, "DLG_SSHSETUP_COMP_UP" },
+		{ IDC_SSHCOMP_MOVEDOWN, "DLG_SSHSETUP_COMP_DOWN" },
 
-	GetDlgItemText(dlg, IDC_KNOWNHOSTS, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_KNOWNHOSTS, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RW", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RO", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_HEARTBEATLABEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_HEARTBEATLABEL, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_HEARTBEATLABEL2, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT_UNIT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_HEARTBEATLABEL2, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_REMEMBERPASSWORD, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_PASSWORD", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_REMEMBERPASSWORD, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_FORWARDAGENT, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_FORWARDAGENT, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_FORWARDAGENTCONFIRM, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENTCONFIRM", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_FORWARDAGENTCONFIRM, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_FORWARDAGENTNOTIFY, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENTNOTIFY", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_FORWARDAGENTNOTIFY, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_VERIFYHOSTKEYDNS, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_VERIFYHOSTKEYDNS", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_VERIFYHOSTKEYDNS, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_NOTICEBANNER, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_NOTICE", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_NOTICEBANNER, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
-	SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
-	SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_SSHSETUP_HELP, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("BTN_HELP", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_SSHSETUP_HELP, pvar->ts->UIMsg);
+		{ IDC_KNOWNHOSTS, "DLG_SSHSETUP_KNOWNHOST" },
+		{ IDC_CHOOSEREADWRITEFILE, "DLG_SSHSETUP_KNOWNHOST_RW" },
+		{ IDC_CHOOSEREADONLYFILE, "DLG_SSHSETUP_KNOWNHOST_RO" },
+		{ IDC_HEARTBEATLABEL, "DLG_SSHSETUP_HEARTBEAT" },
+		{ IDC_HEARTBEATLABEL2, "DLG_SSHSETUP_HEARTBEAT_UNIT" },
+		{ IDC_REMEMBERPASSWORD, "DLG_SSHSETUP_PASSWORD" },
+		{ IDC_FORWARDAGENT, "DLG_SSHSETUP_FORWARDAGENT" },
+		{ IDC_FORWARDAGENTCONFIRM, "DLG_SSHSETUP_FORWARDAGENTCONFIRM" },
+		{ IDC_FORWARDAGENTNOTIFY, "DLG_SSHSETUP_FORWARDAGENTNOTIFY" },
+		{ IDC_VERIFYHOSTKEYDNS, "DLG_SSHSETUP_VERIFYHOSTKEYDNS" },
+		{ IDC_NOTICEBANNER, "DLG_SSHSETUP_NOTICE" },
+		{ IDOK, "BTN_OK" },
+		{ IDCANCEL, "BTN_CANCEL" },
+		{ IDC_SSHSETUP_HELP, "BTN_HELP" },
 
-	GetDlgItemText(dlg, IDC_HOSTKEY_ROTATION_STATIC, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_HOSTKEY_ROTATION", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_HOSTKEY_ROTATION_STATIC, pvar->ts->UIMsg);
+		{ IDC_HOSTKEY_ROTATION_STATIC, "DLG_SSHSETUP_HOSTKEY_ROTATION" },
+		{ IDC_LOGLEVEL, "DLG_SSHSETUP_LOGLEVEL" },
+		{ IDC_LOGLEVEL_UNIT, "DLG_SSHSETUP_LOGLEVEL_UNIT" },
+	};
+	SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
-	GetDlgItemText(dlg, IDC_LOGLEVEL, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_LOGLEVEL", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_LOGLEVEL, pvar->ts->UIMsg);
-	GetDlgItemText(dlg, IDC_LOGLEVEL_UNIT, uimsg, sizeof(uimsg));
-	UTIL_get_lang_msg("DLG_SSHSETUP_LOGLEVEL_UNIT", pvar, uimsg);
-	SetDlgItemText(dlg, IDC_LOGLEVEL_UNIT, pvar->ts->UIMsg);
-
-
 	SendMessage(compressionControl, TBM_SETRANGE, TRUE, MAKELONG(0, 9));
 	SendMessage(compressionControl, TBM_SETPOS, TRUE,
 	            pvar->settings.CompressionLevel);
@@ -4259,45 +4156,22 @@
 	switch (msg) {
 	case WM_INITDIALOG:
 		{
-		GetWindowText(dlg, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_TITLE", pvar, uimsg);
-		SetWindowText(dlg, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_KEYTYPE, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_KEYTYPE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_KEYTYPE, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_KEYBITS_LABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_BITS", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_KEYBITS_LABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_KEY_LABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_PASSPHRASE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_KEY_LABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_CONFIRM_LABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_PASSPHRASE2", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_CONFIRM_LABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_COMMENT_LABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_COMMENT", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_COMMENT_LABEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_SAVE_PUBLIC_KEY, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_SAVEPUBLIC", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_SAVE_PUBLIC_KEY, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_SAVE_PRIVATE_KEY, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_SAVEPRIVATE", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_SAVE_PRIVATE_KEY, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_GENERATE", pvar, uimsg);
-		SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_CLOSE", pvar, uimsg);
-		SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_SSHKEYGENSETUP_HELP, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("BTN_HELP", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_SSHKEYGENSETUP_HELP, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_BCRYPT_KDF_CHECK, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_BCRYPT_KDF", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_BCRYPT_KDF_CHECK, pvar->ts->UIMsg);
-		GetDlgItemText(dlg, IDC_BCRYPT_KDF_ROUNDS_LABEL, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_KEYGEN_BCRYPT_ROUNDS", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_BCRYPT_KDF_ROUNDS_LABEL, pvar->ts->UIMsg);
+		const static DlgTextInfo text_info[] = {
+			{ 0, "DLG_KEYGEN_TITLE" },
+			{ IDC_KEYTYPE, "DLG_KEYGEN_KEYTYPE" },
+			{ IDC_KEYBITS_LABEL, "DLG_KEYGEN_BITS" },
+			{ IDC_KEY_LABEL, "DLG_KEYGEN_PASSPHRASE" },
+			{ IDC_CONFIRM_LABEL, "DLG_KEYGEN_PASSPHRASE2" },
+			{ IDC_COMMENT_LABEL, "DLG_KEYGEN_COMMENT" },
+			{ IDC_SAVE_PUBLIC_KEY, "DLG_KEYGEN_SAVEPUBLIC" },
+			{ IDC_SAVE_PRIVATE_KEY, "DLG_KEYGEN_SAVEPRIVATE" },
+			{ IDOK, "DLG_KEYGEN_GENERATE" },
+			{ IDCANCEL, "BTN_CLOSE" },
+			{ IDC_BCRYPT_KDF_CHECK, "DLG_KEYGEN_BCRYPT_KDF" },
+			{ IDC_BCRYPT_KDF_ROUNDS_LABEL, "DLG_KEYGEN_BCRYPT_ROUNDS" },
+			{ IDC_SSHKEYGENSETUP_HELP, "BTN_HELP" },
+		};
+		SetI18DlgStrs("TTSSH", dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
 		init_password_control(pvar, dlg, IDC_KEY_EDIT, NULL);
 		init_password_control(pvar, dlg, IDC_CONFIRM_EDIT, NULL);


Ttssh2-commit メーリングリストの案内