[Ttssh2-commit] [7319] ttssh unicode化 #2

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2018年 12月 11日 (火) 00:01:44 JST


Revision: 7319
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7319
Author:   zmatsuo
Date:     2018-12-11 00:01:44 +0900 (Tue, 11 Dec 2018)
Log Message:
-----------
ttssh unicode化 #2

Ticket Links:
------------
    http://sourceforge.jp/projects/ttssh2/tracker/detail/2

Modified Paths:
--------------
    branches/cmake/ttssh2/ttxssh/CMakeLists.txt
    branches/cmake/ttssh2/ttxssh/auth.c
    branches/cmake/ttssh2/ttxssh/crypt.c
    branches/cmake/ttssh2/ttxssh/fwd.c
    branches/cmake/ttssh2/ttxssh/fwdui.c
    branches/cmake/ttssh2/ttxssh/hosts.c
    branches/cmake/ttssh2/ttxssh/ssh.c
    branches/cmake/ttssh2/ttxssh/ttxssh.c
    branches/cmake/ttssh2/ttxssh/ttxssh.h
    branches/cmake/ttssh2/ttxssh/util.c
    branches/cmake/ttssh2/ttxssh/util.h
    branches/cmake/ttssh2/ttxssh/x11util.c

-------------- next part --------------
Modified: branches/cmake/ttssh2/ttxssh/CMakeLists.txt
===================================================================
--- branches/cmake/ttssh2/ttxssh/CMakeLists.txt	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/CMakeLists.txt	2018-12-10 15:01:44 UTC (rev 7319)
@@ -19,6 +19,8 @@
   ../../teraterm/common/dlglib_cpp.cpp
   ../../teraterm/common/dlglib_tmpl.cpp
   ../../teraterm/common/servicenames.h
+  ../../teraterm/common/codeconv.cpp
+  ../../teraterm/common/codeconv.h
   )
 
 source_group(

Modified: branches/cmake/ttssh2/ttxssh/auth.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/auth.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/auth.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -32,6 +32,7 @@
 #include "ssh.h"
 #include "key.h"
 #include "dlglib.h"
+#include "codeconv.h"
 
 #include <io.h>
 #include <fcntl.h>
@@ -291,9 +292,11 @@
 	if (pvar->auth_state.failed_method != SSH_AUTH_NONE) {
 		/* must be retrying a failed attempt */
 		TCHAR uimsg[MAX_UIMSG];
-		UTIL_get_lang_msgT("DLG_AUTH_BANNER2_FAILED", uimsg, _countof(uimsg), _T("Authentication failed. Please retry."), pvar->ts->UILanguageFile);
+		UTIL_get_lang_msgT("DLG_AUTH_BANNER2_FAILED", uimsg, _countof(uimsg),
+						   _T("Authentication failed. Please retry."), pvar->ts->UILanguageFile);
 		SetDlgItemTextT(dlg, IDC_SSHAUTHBANNER2, uimsg);
-		UTIL_get_lang_msgT("DLG_AUTH_TITLE_FAILED", uimsg, _countof(uimsg), _T("Retrying SSH Authentication"), pvar->ts->UILanguageFile);
+		UTIL_get_lang_msgT("DLG_AUTH_TITLE_FAILED", uimsg, _countof(uimsg),
+						   _T("Retrying SSH Authentication"), pvar->ts->UILanguageFile);
 		SetWindowTextT(dlg, uimsg);
 		default_method = pvar->auth_state.failed_method;
 	}
@@ -314,7 +317,7 @@
 						   _T("Use challenge/response(&TIS) to log in"), pvar->ts->UILanguageFile);
 		SetDlgItemTextT(dlg, IDC_SSHUSETIS, uimsg);
 	} else {
-		UTIL_get_lang_msgT("DLG_AUTH_METHOD_CHALLENGE2",  uimsg, _countof(uimsg),
+		UTIL_get_lang_msgT("DLG_AUTH_METHOD_CHALLENGE2", uimsg, _countof(uimsg),
 						   _T("Use keyboard-&interactive to log in"), pvar->ts->UILanguageFile);
 		SetDlgItemTextT(dlg, IDC_SSHUSETIS, uimsg);
 	}
@@ -424,9 +427,10 @@
 
 static int get_key_file_name(HWND parent, char *buf, int bufsize, PTInstVar pvar)
 {
-	OPENFILENAMEA params;
-	char fullname_buf[2048] = "identity";
-	char filter[MAX_UIMSG];
+	OPENFILENAME params;
+	TCHAR fullname_buf[2048] = _T("identity");
+	TCHAR filter[MAX_UIMSG];
+	TCHAR uimsg[MAX_UIMSG];
 
 	ZeroMemory(&params, sizeof(params));
 	params.lStructSize = sizeof(OPENFILENAME);
@@ -433,9 +437,9 @@
 	params.hwndOwner = parent;
 	// \x83t\x83B\x83\x8B\x83^\x82̒lj\xC1 (2004.12.19 yutaka)
 	// 3\x83t\x83@\x83C\x83\x8B\x83t\x83B\x83\x8B\x83^\x82̒lj\xC1 (2005.4.26 yutaka)
-	UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar,
-	                  "identity files\\0identity;id_rsa;id_dsa;id_ecdsa;id_ed25519;*.ppk\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0id_ecdsa(SSH2)\\0id_ecdsa\\0id_ed25519(SSH2)\\0id_ed25519\\0PuTTY(*.ppk)\\0*.ppk\\0all(*.*)\\0*.*\\0\\0");
-	memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
+	UTIL_get_lang_msgT("FILEDLG_OPEN_PRIVATEKEY_FILTER", filter, _countof(filter),
+					   _T("identity files\\0identity;id_rsa;id_dsa;id_ecdsa;id_ed25519;*.ppk\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0id_ecdsa(SSH2)\\0id_ecdsa\\0id_ed25519(SSH2)\\0id_ed25519\\0PuTTY(*.ppk)\\0*.ppk\\0all(*.*)\\0*.*\\0\\0"),
+					   pvar->ts->UILanguageFile);
 	params.lpstrFilter = filter;
 	params.lpstrCustomFilter = NULL;
 	params.nFilterIndex = 0;
@@ -444,15 +448,18 @@
 	params.nMaxFile = sizeof(fullname_buf);
 	params.lpstrFileTitle = NULL;
 	params.lpstrInitialDir = NULL;
-	UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
-	                  "Choose a file with the RSA/DSA/ECDSA/ED25519 private key");
-	params.lpstrTitle = pvar->ts->UIMsg;
+	UTIL_get_lang_msgT("FILEDLG_OPEN_PRIVATEKEY_TITLE", uimsg, _countof(uimsg),
+					   _T("Choose a file with the RSA/DSA/ECDSA/ED25519 private key"),
+					   pvar->ts->UILanguageFile);
+	params.lpstrTitle = uimsg;
 	params.Flags =
 		OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
 	params.lpstrDefExt = NULL;
 
-	if (GetOpenFileNameA(&params) != 0) {
-		copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
+	if (GetOpenFileName(&params) != 0) {
+		const char *strA = ToCharT(fullname_buf);
+		copy_teraterm_dir_relative_path(buf, bufsize, strA);
+		free((void *)strA);
 		return 1;
 	} else {
 		return 0;
@@ -506,9 +513,11 @@
 		keyfile[0] = 0;
 		GetDlgItemText(dlg, file_ctl_ID, keyfile, sizeof(keyfile));
 		if (keyfile[0] == 0) {
-			UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
-			                  "You must specify a file containing the RSA/DSA/ECDSA/ED25519 private key.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			char buf[1024];
+			UTIL_get_lang_msgU8("MSG_KEYSPECIFY_ERROR", buf, _countof(buf),
+								"You must specify a file containing the RSA/DSA/ECDSA/ED25519 private key.",
+							   pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, buf);
 			SetFocus(GetDlgItem(dlg, file_ctl_ID));
 			destroy_malloced_string(&password);
 			return FALSE;
@@ -576,7 +585,7 @@
 				}
 				default:
 				{
-					char buf[1024];
+					char uimsg[1024];
 
 					// \x83t\x83@\x83C\x83\x8B\x82\xAA\x8AJ\x82\xAF\x82\xBD\x8Fꍇ\x82̓t\x83@\x83C\x83\x8B\x8C`\x8E\xAE\x82\xAA\x95s\x96\xBE\x82ł\xE0\x93ǂݍ\x9E\x82\xF1\x82ł݂\xE9
 					if (fp != NULL) {
@@ -589,10 +598,10 @@
 						break;
 					}
 
-					UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
-					                  "read error SSH2 private key file\r\n%s");
-					_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
-					notify_nonfatal_error(pvar, buf);
+					UTIL_get_lang_msgU8("MSG_READKEY_ERROR", uimsg, _countof(uimsg),
+										"read error SSH2 private key file\r\n%s",
+										pvar->ts->UILanguageFile);
+					notify_nonfatal_error(pvar, uimsg);
 					// \x82\xB1\x82\xB1\x82ɗ\x88\x82\xBD\x82Ƃ\xA2\x82\xA4\x82\xB1\x82Ƃ\xCD SSH2 \x94閧\x8C\xAE\x83t\x83@\x83C\x83\x8B\x82\xAA\x8AJ\x82\xAF\x82Ȃ\xA2\x82̂\xC5
 					// \x8C\xAE\x83t\x83@\x83C\x83\x8B\x82̑I\x91\xF0\x83{\x83^\x83\x93\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x88ڂ\xB7
 					SetFocus(GetDlgItem(dlg, IDC_CHOOSERSAFILE));
@@ -603,9 +612,9 @@
 
 			if (key_pair == NULL) { // read error
 				char buf[1024];
-				UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
-				                  "read error SSH2 private key file\r\n%s");
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
+				UTIL_get_lang_msgU8("MSG_READKEY_ERROR", buf, _countof(buf),
+									"read error SSH2 private key file\r\n%s",
+									pvar->ts->UILanguageFile);
 				notify_nonfatal_error(pvar, buf);
 				// \x83p\x83X\x83t\x83\x8C\x81[\x83Y\x82\xAA\x8C\xAE\x82ƈ\xEA\x92v\x82\xB5\x82Ȃ\xA9\x82\xC1\x82\xBD\x8Fꍇ\x82\xCDIDC_SSHPASSWORD\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x88ڂ\xB7 (2006.10.29 yasuhide)
 				if (invalid_passphrase) {
@@ -639,9 +648,10 @@
 			pvar->pageant_keylistlen = putty_get_ssh2_keylist(&pvar->pageant_key);
 		}
 		if (pvar->pageant_keylistlen == 0) {
-			UTIL_get_lang_msg("MSG_PAGEANT_NOTFOUND", pvar,
-			                  "Can't find Pageant.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			char buf[1024];
+			UTIL_get_lang_msgU8("MSG_PAGEANT_NOTFOUND", buf, _countof(buf),
+								"Can't find Pageant.", pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, buf);
 
 			return FALSE;
 		}
@@ -650,9 +660,11 @@
 		// \x8C\xAE\x82̐\x94
 		pvar->pageant_keycount = get_uint32_MSBfirst(pvar->pageant_curkey);
 		if (pvar->pageant_keycount == 0) {
-			UTIL_get_lang_msg("MSG_PAGEANT_NOKEY", pvar,
-			                  "Pageant has no valid key.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			char buf[1024];
+			UTIL_get_lang_msgU8("MSG_PAGEANT_NOKEY", buf, _countof(buf),
+								"Pageant has no valid key.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, buf);
 
 			return FALSE;
 		}
@@ -687,14 +699,16 @@
 	}
 	if (method == SSH_AUTH_RHOSTS || method == SSH_AUTH_RHOSTS_RSA) {
 		if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
-			UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
-			                  "Rhosts authentication will probably fail because it was not "
-			                  "the default authentication method.\n"
-			                  "To use Rhosts authentication "
-			                  "in TTSSH, you need to set it to be the default by restarting\n"
-			                  "TTSSH and selecting \"SSH Authentication...\" from the Setup menu "
-			                  "before connecting.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			char uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgU8("MSG_RHOSTS_NOTDEFAULT_ERROR", uimsg, _countof(uimsg),
+								"Rhosts authentication will probably fail because it was not "
+								"the default authentication method.\n"
+								"To use Rhosts authentication "
+								"in TTSSH, you need to set it to be the default by restarting\n"
+								"TTSSH and selecting \"SSH Authentication...\" from the Setup menu "
+								"before connecting.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 		}
 
 		pvar->auth_state.cur_cred.rhosts_client_user =
@@ -1001,6 +1015,7 @@
 
 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
 {
+	char uimsg[MAX_UIMSG];
 	logprintf(LOG_LEVEL_VERBOSE, "Server reports supported authentication method mask = %d", types);
 
 	if (SSHv1(pvar)) {
@@ -1018,10 +1033,11 @@
 	pvar->auth_state.supported_types = types;
 
 	if (types == 0) {
-		UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
-		                  "Server does not support any of the authentication options\n"
-		                  "provided by TTSSH. This connection will now close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_NOAUTHMETHOD_ERROR", uimsg, _countof(uimsg),
+							"Server does not support any of the authentication options\n"
+							"provided by TTSSH. This connection will now close.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return 0;
 	} else {
 		if (pvar->auth_state.auth_dialog != NULL) {
@@ -1287,10 +1303,12 @@
 		                    cur_active !=
 		                    NULL ? cur_active : pvar->NotificationWindow,
 		                    dlg_proc, (LPARAM) pvar) == -1) {
-			UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
-			                  "Unable to display authentication dialog box.\n"
-			                  "Connection terminated.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			char uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgU8("MSG_CREATEWINDOW_AUTH_ERROR", uimsg, _countof(uimsg),
+								"Unable to display authentication dialog box.\n"
+								"Connection terminated.",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 		}
 	}
 }
@@ -1559,9 +1577,11 @@
 		               cur_active != NULL ? cur_active
 		                                  : pvar->NotificationWindow,
 		               default_auth_dlg_proc, (LPARAM) pvar) == -1) {
-		UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
-		                  "Unable to display authentication setup dialog box.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_CREATEWINDOW_AUTHSETUP_ERROR", uimsg, _countof(uimsg),
+							"Unable to display authentication setup dialog box.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 	}
 }
 
@@ -1599,25 +1619,29 @@
 {
 	const char *method = "unknown";
 	char buf[256];
+	char uimsg[MAX_UIMSG];
 
 	if (pvar->auth_state.user == NULL) {
 		strncpy_s(dest, len, "None", _TRUNCATE);
 	} else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
 		if (SSHv1(pvar)) {
-			UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
-			_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
+			UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO", uimsg, _countof(uimsg),
+								"User '%s', using %s", pvar->ts->UILanguageFile);
+			_snprintf_s(dest, len, _TRUNCATE, uimsg,
 			            pvar->auth_state.user,
 			            get_auth_method_name(pvar->auth_state.cur_cred.method));
 
 			if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO2", pvar, " with %s key");
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO2", uimsg, _countof(uimsg),
+									" with %s key", pvar->ts->UILanguageFile);
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 				            "RSA");
 				strncat_s(dest, len, buf, _TRUNCATE);
 			}
 			else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO3", pvar, " with %s key from Pageant");
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO3", uimsg, _countof(uimsg),
+									" with %s key from Pageant", pvar->ts->UILanguageFile);
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 				            "RSA");
 				strncat_s(dest, len, buf, _TRUNCATE);
 			}
@@ -1632,19 +1656,22 @@
 				} else {
 					method = get_auth_method_name(pvar->auth_state.cur_cred.method);
 				}
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
-				_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO", uimsg, _countof(uimsg),
+									"User '%s', using %s", pvar->ts->UILanguageFile);
+				_snprintf_s(dest, len, _TRUNCATE, uimsg,
 				            pvar->auth_state.user, method);
 			}
 			else if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
 				method = get_auth_method_name(pvar->auth_state.cur_cred.method);
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
-				_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO", uimsg, _countof(uimsg),
+									"User '%s', using %s", pvar->ts->UILanguageFile);
+				_snprintf_s(dest, len, _TRUNCATE, uimsg,
 				            pvar->auth_state.user,
 				            get_auth_method_name(pvar->auth_state.cur_cred.method));
 
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO2", pvar, " with %s key");
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO2", uimsg, _countof(uimsg),
+									" with %s key", pvar->ts->UILanguageFile);
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 				            ssh_key_type(pvar->auth_state.cur_cred.key_pair->type));
 				strncat_s(dest, len, buf, _TRUNCATE);
 			}
@@ -1653,15 +1680,17 @@
 				char *s = (char *)malloc(key_len+1);
 
 				method = get_auth_method_name(pvar->auth_state.cur_cred.method);
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
-				_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO", uimsg, _countof(uimsg),
+									"User '%s', using %s", pvar->ts->UILanguageFile);
+				_snprintf_s(dest, len, _TRUNCATE, uimsg,
 				            pvar->auth_state.user,
 				            get_auth_method_name(pvar->auth_state.cur_cred.method));
 
 				memcpy(s, pvar->pageant_curkey+4+4, key_len);
 				s[key_len] = '\0';
-				UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO3", pvar, " with %s key from Pageant");
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+				UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO3", uimsg, _countof(uimsg),
+									" with %s key from Pageant", pvar->ts->UILanguageFile);
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 				            ssh_key_type(get_keytype_from_name(s)));
 				strncat_s(dest, len, buf, _TRUNCATE);
 
@@ -1670,8 +1699,9 @@
 		}
 
 	} else {
-		UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
-		_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
+		UTIL_get_lang_msgU8("DLG_ABOUT_AUTH_INFO",  uimsg, _countof(uimsg),
+							"User '%s', using %s", pvar->ts->UILanguageFile);
+		_snprintf_s(dest, len, _TRUNCATE, uimsg, pvar->auth_state.user,
 		            get_auth_method_name(pvar->auth_state.failed_method));
 	}
 

Modified: branches/cmake/ttssh2/ttxssh/crypt.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/crypt.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/crypt.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -202,6 +202,7 @@
 
 BOOL CRYPT_encrypt_aead(PTInstVar pvar, unsigned char *data, unsigned int bytes, unsigned int aadlen, unsigned int authlen)
 {
+	char uimsg[MAX_UIMSG];
 	unsigned char *newbuff = NULL;
 	unsigned int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
 	unsigned char lastiv[1];
@@ -212,8 +213,11 @@
 		return TRUE;
 
 	if (bytes % block_size) {
-		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar, "%s encrypt error(1): bytes %d (%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_ENCRYPT_ERROR1", uimsg, _countof(uimsg),
+							"%s encrypt error(1): bytes %d (%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 		            get_cipher_name(pvar->crypt_state.sender_cipher),
 		            bytes, block_size);
 		notify_fatal_error(pvar, tmp, TRUE);
@@ -247,8 +251,10 @@
 	return TRUE;
 
 err:
-	UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
-	_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+	UTIL_get_lang_msgU8("MSG_ENCRYPT_ERROR2", uimsg, _countof(uimsg),
+						"%s encrypt error(2)",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 	            get_cipher_name(pvar->crypt_state.sender_cipher));
 	notify_fatal_error(pvar, tmp, TRUE);
 	return FALSE;
@@ -261,13 +267,16 @@
 	unsigned char lastiv[1];
 	char tmp[80];
 	EVP_CIPHER_CTX *evp = &pvar->evpcip[MODE_IN];
+	char uimsg[MAX_UIMSG];
 
 	if (bytes == 0)
 		return TRUE;
 
 	if (bytes % block_size) {
-		UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar, "%s decrypt error(1): bytes %d (%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+		UTIL_get_lang_msgU8("MSG_DECRYPT_ERROR1", uimsg, _countof(uimsg),
+							"%s decrypt error(1): bytes %d (%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 		            get_cipher_name(pvar->crypt_state.receiver_cipher),
 		            bytes, block_size);
 		notify_fatal_error(pvar, tmp, TRUE);
@@ -301,8 +310,10 @@
 		return TRUE;
 
 err:
-	UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
-	_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+	UTIL_get_lang_msgU8("MSG_DECRYPT_ERROR2", uimsg, _countof(uimsg),
+						"%s decrypt error(2)",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 	            get_cipher_name(pvar->crypt_state.receiver_cipher));
 	notify_fatal_error(pvar, tmp, TRUE);
 	return FALSE;
@@ -317,14 +328,16 @@
 	unsigned char *newbuff;
 	int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
 	char tmp[80];
+	char uimsg[MAX_UIMSG];
 
 	if (bytes == 0)
 		return;
 
 	if (bytes % block_size) {
-		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
-		                  "%s encrypt error(1): bytes %d (%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+		UTIL_get_lang_msgU8("MSG_ENCRYPT_ERROR1", uimsg, _countof(uimsg),
+							"%s encrypt error(1): bytes %d (%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 		            get_cipher_name(pvar->crypt_state.sender_cipher),
 		            bytes, block_size);
 		notify_fatal_error(pvar, tmp, TRUE);
@@ -339,8 +352,10 @@
 	}
 
 	if (EVP_Cipher(&pvar->evpcip[MODE_OUT], encbuff, buf, bytes) == 0) {
-		UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+		UTIL_get_lang_msgU8("MSG_ENCRYPT_ERROR2", uimsg, _countof(uimsg),
+							"%s encrypt error(2)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 		            get_cipher_name(pvar->crypt_state.sender_cipher));
 		notify_fatal_error(pvar, tmp, TRUE);
 	} else {
@@ -353,14 +368,16 @@
 	unsigned char *newbuff;
 	int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
 	char tmp[80];
+	char uimsg[MAX_UIMSG];
 
 	if (bytes == 0)
 		return;
 
 	if (bytes % block_size) {
-		UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
-		                  "%s decrypt error(1): bytes %d (%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+		UTIL_get_lang_msgU8("MSG_DECRYPT_ERROR1", uimsg, _countof(uimsg),
+							"%s decrypt error(1): bytes %d (%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 		            get_cipher_name(pvar->crypt_state.receiver_cipher),
 		            bytes, block_size);
 		notify_fatal_error(pvar, tmp, TRUE);
@@ -375,8 +392,10 @@
 	}
 
 	if (EVP_Cipher(&pvar->evpcip[MODE_IN], encbuff, buf, bytes) == 0) {
-		UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
+		UTIL_get_lang_msgU8("MSG_DECRYPT_ERROR2", uimsg, _countof(uimsg),
+							"%s decrypt error(2)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg,
 		            get_cipher_name(pvar->crypt_state.receiver_cipher));
 		notify_fatal_error(pvar, tmp, TRUE);
 	} else {
@@ -493,9 +512,11 @@
 	}
 
 	if (key == NULL || key->e == NULL || key->n == NULL) {
-		UTIL_get_lang_msg("MSG_RSAKEY_SETUP_ERROR", pvar,
-		                  "Error setting up RSA keys");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_RSAKEY_SETUP_ERROR", uimsg, _countof(uimsg),
+							"Error setting up RSA keys",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 
 		if (key != NULL) {
 			if (key->e != NULL) {
@@ -553,6 +574,7 @@
                                  int receiver_ciphers)
 {
 	int cipher_mask;
+	char uimsg[MAX_UIMSG];
 
 	if (SSHv1(pvar)) {
 		cipher_mask = (1 << SSH_CIPHER_DES)
@@ -593,18 +615,20 @@
 	pvar->crypt_state.supported_receiver_ciphers = receiver_ciphers;
 
 	if (sender_ciphers == 0) {
-		UTIL_get_lang_msg("MSG_UNAVAILABLE_CIPHERS_ERROR", pvar,
-		                  "The server does not support any of the TTSSH encryption algorithms.\n"
-		                  "A secure connection cannot be made in the TTSSH-to-server direction.\n"
-		                  "The connection will be closed.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_UNAVAILABLE_CIPHERS_ERROR", uimsg, _countof(uimsg),
+							"The server does not support any of the TTSSH encryption algorithms.\n"
+							"A secure connection cannot be made in the TTSSH-to-server direction.\n"
+							"The connection will be closed.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return FALSE;
 	} else if (receiver_ciphers == 0) {
-		UTIL_get_lang_msg("MSG_UNAVAILABLE_CIPHERS_ERROR", pvar,
-		                  "The server does not support any of the TTSSH encryption algorithms.\n"
-		                  "A secure connection cannot be made in the TTSSH-to-server direction.\n"
-		                  "The connection will be closed.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_UNAVAILABLE_CIPHERS_ERROR", uimsg, _countof(uimsg),
+							"The server does not support any of the TTSSH encryption algorithms.\n"
+							"A secure connection cannot be made in the TTSSH-to-server direction.\n"
+							"The connection will be closed.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return FALSE;
 	} else {
 		return TRUE;
@@ -788,12 +812,14 @@
 
 	if (pvar->crypt_state.sender_cipher == SSH_CIPHER_NONE
 		|| pvar->crypt_state.receiver_cipher == SSH_CIPHER_NONE) {
-		UTIL_get_lang_msg("MSG_CIPHER_NONE_ERROR", pvar,
-		                  "All the encryption algorithms that this program and the server both understand have been disabled.\n"
-		                  "To communicate with this server, you will have to enable some more ciphers\n"
-		                  "in the TTSSH Setup dialog box when you run Tera Term again.\n"
-		                  "This connection will now close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_CIPHER_NONE_ERROR", uimsg, _countof(uimsg),
+							"All the encryption algorithms that this program and the server both understand have been disabled.\n"
+							"To communicate with this server, you will have to enable some more ciphers\n"
+							"in the TTSSH Setup dialog box when you run Tera Term again.\n"
+							"This connection will now close.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return FALSE;
 	} else {
 		return TRUE;
@@ -835,9 +861,11 @@
 	}
 
 	if (bit_delta < 128 || server_key_bits < 512 || host_key_bits < 512) {
-		UTIL_get_lang_msg("MSG_RSAKEY_TOOWEAK_ERROR", pvar,
-		                  "Server RSA keys are too weak. A secure connection cannot be established.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_RSAKEY_TOOWEAK_ERROR", uimsg, _countof(uimsg),
+							"Server RSA keys are too weak. A secure connection cannot be established.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return 0;
 	} else {
 		/* following Goldberg's code, I'm using MD5(servkey->n || hostkey->n || cookie)
@@ -1001,30 +1029,39 @@
 	int klen;
 	char tmp[80];
 	unsigned char *junk = NULL, *discard = NULL;
+	char uimsg[MAX_UIMSG];
 
 	EVP_CIPHER_CTX_init(evp);
 	if (EVP_CipherInit(evp, type, NULL, NULL, (encrypt == CIPHER_ENCRYPT)) == 0) {
-		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 1);
+		UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+							"Cipher initialize error(%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 1);
 		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
 
 	if (authlen > 0 && !EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_SET_IVLEN, ivlen, NULL)) {
-		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 2);
+		UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+							"Cipher initialize error(%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 2);
 		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
 	if (EVP_CipherInit(evp, NULL, NULL, (u_char *)iv, -1) == 0) {
-		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 3);
+		UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+							"Cipher initialize error(%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 3);
 		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
 	if (authlen > 0 && !EVP_CIPHER_CTX_ctrl(evp, EVP_CTRL_GCM_SET_IV_FIXED, -1, (u_char *)iv)) {
-		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 4);
+		UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+							"Cipher initialize error(%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 4);
 		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
@@ -1032,15 +1069,19 @@
 	klen = EVP_CIPHER_CTX_key_length(evp);
 	if (klen > 0 && keylen != klen) {
 		if (EVP_CIPHER_CTX_set_key_length(evp, keylen) == 0) {
-			UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-			_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 5);
+			UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+								"Cipher initialize error(%d)",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 5);
 			notify_fatal_error(pvar, tmp, TRUE);
 			return;
 		}
 	}
 	if (EVP_CipherInit(evp, NULL, (u_char *)key, NULL, -1) == 0) {
-		UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 6);
+		UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+							"Cipher initialize error(%d)",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 6);
 		notify_fatal_error(pvar, tmp, TRUE);
 		return;
 	}
@@ -1050,8 +1091,10 @@
 		discard = malloc(discard_len);
 		if (junk == NULL || discard == NULL ||
 		    EVP_Cipher(evp, discard, junk, discard_len) == 0) {
-			UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)");
-			_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 7);
+			UTIL_get_lang_msgU8("MSG_CIPHER_INIT_ERROR", uimsg, _countof(uimsg),
+								"Cipher initialize error(%d)",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(tmp, sizeof(tmp), _TRUNCATE, uimsg, 7);
 			notify_fatal_error(pvar, tmp, TRUE);
 		}
 		else {
@@ -1176,9 +1219,11 @@
 	}
 
 	if (!isOK) {
-		UTIL_get_lang_msg("MSG_CIPHER_NOTSELECTED_ERROR", pvar,
-		                  "No cipher selected!");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_CIPHER_NOTSELECTED_ERROR", uimsg, _countof(uimsg),
+							"No cipher selected!",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return FALSE;
 	} else {
 		SecureZeroMemory(encryption_key, CRYPT_KEY_LENGTH);
@@ -1268,33 +1313,40 @@
 
 void CRYPT_get_cipher_info(PTInstVar pvar, char *dest, int len)
 {
-	UTIL_get_lang_msg("DLG_ABOUT_CIPHER_INFO", pvar,
-	                  "%s to server, %s from server");
-	_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
-	          get_cipher_name(pvar->crypt_state.sender_cipher),
-	          get_cipher_name(pvar->crypt_state.receiver_cipher));
+	char uimsg[MAX_UIMSG];
+	UTIL_get_lang_msgU8("DLG_ABOUT_CIPHER_INFO", uimsg, _countof(uimsg),
+						"%s to server, %s from server",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(dest, len, _TRUNCATE, uimsg,
+				get_cipher_name(pvar->crypt_state.sender_cipher),
+				get_cipher_name(pvar->crypt_state.receiver_cipher));
 }
 
 void CRYPT_get_server_key_info(PTInstVar pvar, char *dest, int len)
 {
+	char uimsg[MAX_UIMSG];
 	if (SSHv1(pvar)) {
 		if (pvar->crypt_state.server_key.RSA_key == NULL
 		 || pvar->crypt_state.host_key.RSA_key == NULL) {
-			UTIL_get_lang_msg("DLG_ABOUT_KEY_NONE", pvar, "None");
-			strncpy_s(dest, len, pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_KEY_NONE", uimsg, _countof(uimsg),
+								"None",
+								pvar->ts->UILanguageFile);
+			strncpy_s(dest, len, uimsg, _TRUNCATE);
 		} else {
-			UTIL_get_lang_msg("DLG_ABOUT_KEY_INFO", pvar,
-			                  "%d-bit server key, %d-bit host key");
-			_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
+			UTIL_get_lang_msgU8("DLG_ABOUT_KEY_INFO", uimsg, _countof(uimsg),
+								"%d-bit server key, %d-bit host key",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(dest, len, _TRUNCATE, uimsg,
 			            BN_num_bits(pvar->crypt_state.server_key.RSA_key->n),
 			            BN_num_bits(pvar->crypt_state.host_key.RSA_key->n));
 		}
 	} else { // SSH2
-			UTIL_get_lang_msg("DLG_ABOUT_KEY_INFO2", pvar,
-			                  "%d-bit client key, %d-bit server key");
-			_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
-			            pvar->client_key_bits,
-			            pvar->server_key_bits);
+		UTIL_get_lang_msgU8("DLG_ABOUT_KEY_INFO2", uimsg, _countof(uimsg),
+							"%d-bit client key, %d-bit server key",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(dest, len, _TRUNCATE, uimsg,
+					pvar->client_key_bits,
+					pvar->server_key_bits);
 	}
 }
 

Modified: branches/cmake/ttssh2/ttxssh/fwd.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/fwd.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/fwd.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -39,6 +39,7 @@
 #include "ttcommon.h"
 
 #include <assert.h>
+#include <tchar.h>
 #include "WSAAsyncGetAddrInfo.h"
 
 #define WM_SOCK_ACCEPT (WM_APP+9999)
@@ -198,10 +199,13 @@
 {
 	if (local_num < 0 || local_num >= pvar->fwd_state.num_channels
 	 || pvar->fwd_state.channels[local_num].status == 0) {
-		UTIL_get_lang_msg("MSG_FWD_LOCAL_CHANNEL_ERROR", pvar,
-		                  "The server attempted to manipulate a forwarding channel that does not exist.\n"
-		                  "Either the server has a bug or is hostile. You should close this connection.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_FWD_LOCAL_CHANNEL_ERROR",
+							uimsg, _countof(uimsg),
+							"The server attempted to manipulate a forwarding channel that does not exist.\n"
+							"Either the server has a bug or is hostile. You should close this connection.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 		return 0;
 	} else {
 		return 1;
@@ -210,6 +214,7 @@
 
 static void request_error(PTInstVar pvar, int request_num, int err)
 {
+	char uimsg[MAX_UIMSG];
 	SOCKET *s =
 		pvar->fwd_state.requests[request_num].listening_sockets;
 	int i;
@@ -224,10 +229,12 @@
 		}
 	}
 
-	UTIL_get_lang_msg("MSG_FWD_REQUEST_ERROR", pvar,
-	                  "Communications error while listening for a connection to forward.\n"
-	                  "The listening port will be terminated.");
-	notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+	UTIL_get_lang_msgU8("MSG_FWD_REQUEST_ERROR",
+						uimsg, _countof(uimsg),
+						"Communications error while listening for a connection to forward.\n"
+						"The listening port will be terminated.",
+						pvar->ts->UILanguageFile);
+	notify_nonfatal_error(pvar, uimsg);
 }
 
 static void send_local_connection_closure(PTInstVar pvar, int channel_num)
@@ -343,35 +350,41 @@
 	}
 }
 
-static char *describe_socket_error(PTInstVar pvar, int code)
+static char *describe_socket_error(PTInstVar pvar, int code, char *uimsg, size_t len)
 {
+	const char *lang = pvar->ts->UILanguageFile;
 	switch (code) {
 	case WSAECONNREFUSED:
-		UTIL_get_lang_msg("MSG_FWD_REFUSED_ERROR", pvar,
-		                  "Connection refused (perhaps the service is not currently running)");
-		return pvar->ts->UIMsg;
+		UTIL_get_lang_msgU8("MSG_FWD_REFUSED_ERROR", uimsg, len,
+							"Connection refused (perhaps the service is not currently running)",
+							lang);
+		return uimsg;
 	case WSAENETDOWN:
 	case WSAENETUNREACH:
 	case WSAEHOSTUNREACH:
-		UTIL_get_lang_msg("MSG_FWD_NETDOWN_ERROR", pvar,
-		                  "The machine could not be contacted (possibly a network problem)");
-		return pvar->ts->UIMsg;
+		UTIL_get_lang_msgU8("MSG_FWD_NETDOWN_ERROR", uimsg, len,
+							"The machine could not be contacted (possibly a network problem)",
+							lang);
+		return uimsg;
 	case WSAETIMEDOUT:
 	case WSAEHOSTDOWN:
-		UTIL_get_lang_msg("MSG_FWD_MACHINEDOWN_ERROR", pvar,
-		                  "The machine could not be contacted (possibly the machine is down)");
-		return pvar->ts->UIMsg;
+		UTIL_get_lang_msgU8("MSG_FWD_MACHINEDOWN_ERROR", uimsg, len,
+							"The machine could not be contacted (possibly the machine is down)",
+							lang);
+		return uimsg;
 	case WSATRY_AGAIN:
 	case WSANO_RECOVERY:
 	case WSANO_ADDRESS:
 	case WSAHOST_NOT_FOUND:
-		UTIL_get_lang_msg("MSG_FWD_ADDRNOTFOUND_ERROR", pvar,
-		                  "No address was found for the machine");
-		return pvar->ts->UIMsg;
+		UTIL_get_lang_msgU8("MSG_FWD_ADDRNOTFOUND_ERROR", uimsg, len,
+							"No address was found for the machine",
+							lang);
+		return uimsg;
 	default:
-		UTIL_get_lang_msg("MSG_FWD_CONNECT_ERROR", pvar,
-		                  "The forwarding connection could not be established");
-		return pvar->ts->UIMsg;
+		UTIL_get_lang_msgU8("MSG_FWD_CONNECT_ERROR", uimsg, len,
+							"The forwarding connection could not be established",
+							lang);
+		return uimsg;
 	}
 }
 
@@ -389,7 +402,7 @@
 		err_msg = NULL;
 		break;
 	default:
-		strncpy_s(uimsg, sizeof(uimsg), describe_socket_error(pvar, err), _TRUNCATE);
+		describe_socket_error(pvar, err, uimsg, _countof(uimsg));
 		err_msg = uimsg;
 	}
 
@@ -396,12 +409,13 @@
 	if (err_msg != NULL) {
 		char buf[1024];
 
-		UTIL_get_lang_msg("MSG_FWD_CHANNEL_ERROR", pvar,
-		                  "Communications error %s forwarded local %s.\n"
-		                  "%s (code %d).\n"
-		                  "The forwarded connection will be closed.");
+		UTIL_get_lang_msgU8("MSG_FWD_CHANNEL_ERROR", buf, _countof(buf),
+							"Communications error %s forwarded local %s.\n"
+							"%s (code %d).\n"
+							"The forwarded connection will be closed.",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-		            pvar->ts->UIMsg, action,
+		            buf, action,
 		            pvar->fwd_state.requests[pvar->fwd_state.channels[channel_num].
 		                                     request_num].spec.from_port_name,
 		            err_msg, err);
@@ -418,23 +432,25 @@
 	char uimsg[MAX_UIMSG];
 
 	SSH_fail_channel_open(pvar, channel->remote_num);
-	strncpy_s(uimsg, sizeof(uimsg), describe_socket_error(pvar, err), _TRUNCATE);
+	describe_socket_error(pvar, err, uimsg, sizeof(uimsg));
 	if (request->spec.type == FWD_REMOTE_X11_TO_LOCAL) {
-		UTIL_get_lang_msg("MSG_FWD_CHANNEL_OPEN_X_ERROR", pvar,
-		                  "The server attempted to forward a connection through this machine.\n"
-		                  "It requested a connection to the X server on %s (display %d:%d).\n"
-		                  "%s(code %d).\n" "The forwarded connection will be closed.");
+		UTIL_get_lang_msgU8("MSG_FWD_CHANNEL_OPEN_X_ERROR", uimsg, _countof(uimsg),
+							"The server attempted to forward a connection through this machine.\n"
+							"It requested a connection to the X server on %s (display %d:%d).\n"
+							"%s(code %d).\n" "The forwarded connection will be closed.",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-		            pvar->ts->UIMsg,
+		            uimsg,
 		            request->spec.to_host, request->spec.to_port - 6000, request->spec.x11_screen,
 		            uimsg, err);
 	} else {
-		UTIL_get_lang_msg("MSG_FWD_CHANNEL_OPEN_ERROR", pvar,
-		                  "The server attempted to forward a connection through this machine.\n"
-		                  "It requested a connection to %s (port %s).\n" "%s(code %d).\n"
-		                  "The forwarded connection will be closed.");
+		UTIL_get_lang_msgU8("MSG_FWD_CHANNEL_OPEN_ERROR", uimsg, _countof(uimsg),
+							"The server attempted to forward a connection through this machine.\n"
+							"It requested a connection to %s (port %s).\n" "%s(code %d).\n"
+							"The forwarded connection will be closed.",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-		            pvar->ts->UIMsg,
+					uimsg,
 		            request->spec.to_host, request->spec.to_port_name,
 		            uimsg, err);
 	}
@@ -526,9 +542,12 @@
 static HWND make_accept_wnd(PTInstVar pvar)
 {
 	if (pvar->fwd_state.accept_wnd == NULL) {
-		UTIL_get_lang_msg("DLG_FWDMON_TITLE", pvar, "TTSSH Port Forwarding Monitor");
+		TCHAR uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgT("DLG_FWDMON_TITLE", uimsg, _countof(uimsg),
+						   _T("TTSSH Port Forwarding Monitor"),
+						   pvar->ts->UILanguageFile);
 		pvar->fwd_state.accept_wnd =
-			CreateWindowA("STATIC", pvar->ts->UIMsg,
+			CreateWindow(_T("STATIC"), uimsg,
 			             WS_DISABLED | WS_POPUP, 0, 0, 1, 1, NULL, NULL,
 			             hInst, NULL);
 		if (pvar->fwd_state.accept_wnd != NULL) {
@@ -1082,11 +1101,13 @@
 		}
 		if (s == INVALID_SOCKET) {
 			if (report_error) {
-				UTIL_get_lang_msg("MSG_FWD_SOCKET_ERROR", pvar,
-				                  "Some socket(s) required for port forwarding could not be initialized.\n"
-				                  "Some port forwarding services may not be available.\n"
-				                  "(errno %d)");
-				logprintf(LOG_LEVEL_WARNING, pvar->ts->UIMsg, WSAGetLastError());
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_FWD_SOCKET_ERROR", uimsg, _countof(uimsg),
+									"Some socket(s) required for port forwarding could not be initialized.\n"
+									"Some port forwarding services may not be available.\n"
+									"(errno %d)",
+									pvar->ts->UILanguageFile);
+				logprintf(LOG_LEVEL_WARNING, uimsg, WSAGetLastError());
 			}
 			freeaddrinfo(res0);
 			/* free(request->listening_sockets); /* DO NOT FREE HERE, listening_sockets'll be freed in FWD_end */
@@ -1189,10 +1210,12 @@
 
 	for (i = 0; i < num_specs - 1; i++) {
 		if (FWD_compare_specs(new_specs + i, new_specs + i + 1) == 0) {
-			UTIL_get_lang_msg("MSG_FWD_DUPLICATE_ERROR", pvar,
-			                  "TTSSH INTERNAL ERROR: Could not set port forwards "
-			                  "because duplicate type/port requests were found");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			char uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgU8("MSG_FWD_DUPLICATE_ERROR", uimsg, _countof(uimsg),
+								"TTSSH INTERNAL ERROR: Could not set port forwards "
+								"because duplicate type/port requests were found",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 			free(new_specs);
 			return;
 		}
@@ -1490,13 +1513,15 @@
 			                    &request->to_host_addrs);
 
 		if (task_handle == 0) {
+			char uimsg[MAX_UIMSG];
 			SSH_fail_channel_open(pvar, remote_channel_num);
-			UTIL_get_lang_msg("MSG_FWD_DENIED_HANDLE_ERROR", pvar,
-			                  "The server attempted to forward a connection through this machine.\n"
-			                  "It requested a connection to machine %s on port %s.\n"
-			                  "An error occurred while processing the request, and it has been denied.");
+			UTIL_get_lang_msgU8("MSG_FWD_DENIED_HANDLE_ERROR", uimsg, _countof(uimsg),
+								"The server attempted to forward a connection through this machine.\n"
+								"It requested a connection to machine %s on port %s.\n"
+								"An error occurred while processing the request, and it has been denied.",
+								pvar->ts->UILanguageFile);
 			_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-			            pvar->ts->UIMsg,
+			            uimsg,
 			            request->spec.to_host, request->spec.to_port_name);
 			notify_nonfatal_error(pvar, buf);
 			freeaddrinfo(request->to_host_addrs);
@@ -1533,6 +1558,7 @@
 {
 	int i;
 	char buf[1024];
+	char uimsg[MAX_UIMSG];
 
 	for (i = 0; i < pvar->fwd_state.num_requests; i++) {
 		FWDRequest *request = pvar->fwd_state.requests + i;
@@ -1574,12 +1600,13 @@
 	}
 
 	/* this forwarding was not prespecified */
-	UTIL_get_lang_msg("MSG_FWD_DENIED_ERROR", pvar,
-	                  "The server attempted to forward a connection through this machine.\n"
-	                  "It requested a connection to machine %s on port %d.\n"
-	                  "You did not specify this forwarding to TTSSH in advance, and therefore the request was denied.");
+	UTIL_get_lang_msgU8("MSG_FWD_DENIED_ERROR", uimsg, _countof(uimsg),
+						"The server attempted to forward a connection through this machine.\n"
+						"It requested a connection to machine %s on port %d.\n"
+						"You did not specify this forwarding to TTSSH in advance, and therefore the request was denied.",
+						pvar->ts->UILanguageFile);
 	_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-	            pvar->ts->UIMsg,
+	            uimsg,
 	            local_hostname, local_port);
 	notify_nonfatal_error(pvar, buf);
 }
@@ -1588,6 +1615,7 @@
                   char *originator, int originator_len,
                   int *chan_num)
 {
+	char uimsg[MAX_UIMSG];
 	int i;
 
 	for (i = 0; i < pvar->fwd_state.num_requests; i++) {
@@ -1619,11 +1647,12 @@
 	}
 
 	/* this forwarding was not prespecified */
-	UTIL_get_lang_msg("MSG_FWD_DENIED_X_ERROR", pvar,
-	                  "The server attempted to forward a connection through this machine.\n"
-	                  "It requested a connection to the local X server.\n"
-	                  "You did not specify this forwarding to TTSSH in advance, and therefore the request was denied.");
-	notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+	UTIL_get_lang_msgU8("MSG_FWD_DENIED_X_ERROR", uimsg, _countof(uimsg),
+						"The server attempted to forward a connection through this machine.\n"
+						"It requested a connection to the local X server.\n"
+						"You did not specify this forwarding to TTSSH in advance, and therefore the request was denied.",
+						pvar->ts->UILanguageFile);
+	notify_nonfatal_error(pvar, uimsg);
 }
 
 // agent forwarding \x82̗v\x8B\x81\x82ɑ΂\xB5\x81AFWDChannel \x82\xF0\x8D쐬\x82\xB7\x82\xE9
@@ -1680,6 +1709,7 @@
 {
 	FWDChannel *channel;
 	int r = reason;
+	char uimsg[MAX_UIMSG];
 
 	if (!FWD_check_local_channel_num(pvar, local_channel_num))
 		return;
@@ -1689,10 +1719,11 @@
 	// SSH2 \x82ł͌Ăяo\x82\xB5\x8C\xB3\x82Ŋ\xF9\x82Ƀ|\x83b\x83v\x83A\x83b\x83v\x82\xF0\x8Fo\x82\xB5\x82Ă\xA2\x82\xE9\x82̂ŁA
 	// \x82\xB1\x82\xB1\x82ł\xCD SSH1 \x82̎\x9E\x82̂݃|\x83b\x83v\x83A\x83b\x83v\x82\xF0\x8Fo\x82\xB7
 	if (SSHv1(pvar)) {
-		UTIL_get_lang_msg("MSG_FWD_DENIED_BY_SERVER_ERROR", pvar,
-		                  "A program on the local machine attempted to connect to a forwarded port.\n"
-		                  "The forwarding request was denied by the server. The connection has been closed.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		UTIL_get_lang_msgU8("MSG_FWD_DENIED_BY_SERVER_ERROR", uimsg, _countof(uimsg),
+							"A program on the local machine attempted to connect to a forwarded port.\n"
+							"The forwarding request was denied by the server. The connection has been closed.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 	}
 
 	if (channel->filter != NULL) {
@@ -1769,10 +1800,12 @@
 			// \x83|\x83b\x83v\x83A\x83b\x83v\x97}\x8E~\x8Ew\x92肠\x82\xEA\x82΁A\x8A֐\x94\x82\xF0\x8CĂяo\x82\xB3\x82Ȃ\xA2\x81B
 			// (2014.6.26 yutaka)
 			if ((pvar->settings.DisablePopupMessage & POPUP_MSG_FWD_received_data) == 0) {
-				UTIL_get_lang_msg("MSG_FWD_COMM_ERROR", pvar,
-				                  "A communications error occurred while sending forwarded data to a local port.\n"
-				                  "The forwarded connection will be closed.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_FWD_COMM_ERROR", uimsg, _countof(uimsg),
+									"A communications error occurred while sending forwarded data to a local port.\n"
+									"The forwarded connection will be closed.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 		}
 	}
@@ -1843,21 +1876,27 @@
 
 BOOL FWD_agent_forward_confirm(PTInstVar pvar)
 {
-	char title[MAX_UIMSG];
 	HWND cur_active = GetActiveWindow();
 
 	if (pvar->session_settings.ForwardAgentNotify) {
-		UTIL_get_lang_msg("MSG_FWD_AGENT_NOTIFY_TITLE", pvar, "Agent Forwarding");
-		strncpy_s(title, sizeof(title), pvar->ts->UIMsg, _TRUNCATE);
-		UTIL_get_lang_msg("MSG_FWD_AGENT_NOTIFY", pvar, "Remote host access to agent");
-		NotifyInfoMessage(pvar->cv, pvar->ts->UIMsg, title);
+		char title[MAX_UIMSG];
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_FWD_AGENT_NOTIFY_TITLE", title, _countof(title),
+							"Agent Forwarding",
+							pvar->ts->UILanguageFile);
+		UTIL_get_lang_msgU8("MSG_FWD_AGENT_NOTIFY", uimsg, _countof(uimsg),
+							"Remote host access to agent",
+							pvar->ts->UILanguageFile);
+		NotifyInfoMessage(pvar->cv, uimsg, title);
 	}
 
 	if (pvar->session_settings.ForwardAgentConfirm) {
-		UTIL_get_lang_msg("MSG_FWD_AGENT_FORWARDING_CONFIRM", pvar,
-		                  "Are you sure you want to accept agent-forwarding request?");
-		if (MessageBoxA(cur_active != NULL ? cur_active : pvar->NotificationWindow,
-		               pvar->ts->UIMsg, "TTSSH",
+		TCHAR uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgT("MSG_FWD_AGENT_FORWARDING_CONFIRM", uimsg, _countof(uimsg),
+						   _T("Are you sure you want to accept agent-forwarding request?"),
+						   pvar->ts->UILanguageFile);
+		if (MessageBox(cur_active != NULL ? cur_active : pvar->NotificationWindow,
+		               uimsg, _T("TTSSH"),
 		               MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES) {
 			return TRUE;
 		}

Modified: branches/cmake/ttssh2/ttxssh/fwdui.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/fwdui.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/fwdui.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -69,16 +69,21 @@
 
 static void make_X_forwarding_spec(FWDRequestSpec *spec, PTInstVar pvar)
 {
+	char uimsg[MAX_UIMSG];
 	spec->type = FWD_REMOTE_X11_TO_LOCAL;
 	spec->from_port = -1;
 	X11_get_DISPLAY_info(pvar, spec->to_host, sizeof(spec->to_host),
 	                     &spec->to_port, &spec->x11_screen);
-	UTIL_get_lang_msg("MSG_FWD_REMOTE_XSERVER", pvar, "remote X server");
-	strncpy_s(spec->from_port_name, sizeof(spec->from_port_name),
-	          pvar->ts->UIMsg, _TRUNCATE);
-	UTIL_get_lang_msg("MSG_FWD_REMOTE_XSCREEN", pvar, "X server (display %d:%d)");
+	UTIL_get_lang_msgU8("MSG_FWD_REMOTE_XSERVER",
+						spec->from_port_name, sizeof(spec->from_port_name),
+						"remote X server",
+						pvar->ts->UILanguageFile);
+	UTIL_get_lang_msgU8("MSG_FWD_REMOTE_XSCREEN",
+						uimsg, _countof(uimsg),
+						"X server (display %d:%d)",
+						pvar->ts->UILanguageFile);
 	_snprintf_s(spec->to_port_name, sizeof(spec->to_port_name), _TRUNCATE,
-	            pvar->ts->UIMsg, spec->to_port - 6000, spec->x11_screen);
+	            uimsg, spec->to_port - 6000, spec->x11_screen);
 }
 
 static BOOL parse_request(FWDRequestSpec *request, char *str, PTInstVar pvar)
@@ -685,7 +690,7 @@
 	const char *svc;
 
 	for (i=0; (svc = service_name(i)) != NULL; i++) {
-		SendMessage(cbox, CB_ADDSTRING, 0, (LPARAM) svc);
+		SendMessageA(cbox, CB_ADDSTRING, 0, (LPARAM) svc);
 	}
 }
 
@@ -825,8 +830,25 @@
 
 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" },
+	};
+	SetDlgTexts(dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 
+#if 0
 	GetWindowText(dlg, uimsg, sizeof(uimsg));
 	UTIL_get_lang_msg("DLG_FWD_TITLE", pvar, uimsg);
 	SetWindowText(dlg, pvar->ts->UIMsg);
@@ -869,7 +891,8 @@
 	GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
 	UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
 	SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
-
+#endif
+		
 	switch (spec->type) {
 	case FWD_REMOTE_TO_LOCAL:
 		setup_edit_controls(dlg, spec, IDC_SSHFWDREMOTETOLOCAL,

Modified: branches/cmake/ttssh2/ttxssh/hosts.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/hosts.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/hosts.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -40,6 +40,7 @@
 #include "hosts.h"
 #include "dns.h"
 #include "dlglib.h"
+#include "codeconv.h"
 
 #include <openssl/bn.h>
 #include <openssl/evp.h>
@@ -52,8 +53,9 @@
 #include <sys/stat.h>
 #include <direct.h>
 #include <memory.h>
+#include <tchar.h>
 
-#if defined(UNICODE)
+#if 0 //defined(UNICODE)
 #undef SetDlgItemText
 #define SetDlgItemText SetDlgItemTextA
 #undef GetDlgItemText
@@ -134,6 +136,7 @@
 	int length;
 	int amount_read;
 	char buf[2048];
+	char uimsg[MAX_UIMSG];
 
 	get_teraterm_dir_relative_name(buf, sizeof(buf), name);
 	fd = _open(buf, _O_RDONLY | _O_SEQUENTIAL | _O_BINARY);
@@ -140,14 +143,16 @@
 	if (fd == -1) {
 		if (!suppress_errors) {
 			if (errno == ENOENT) {
-				UTIL_get_lang_msg("MSG_HOSTS_READ_ENOENT_ERROR", pvar,
-				                  "An error occurred while trying to read a known_hosts file.\n"
-				                  "The specified filename does not exist.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_READ_ENOENT_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to read a known_hosts file.\n"
+									"The specified filename does not exist.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			} else {
-				UTIL_get_lang_msg("MSG_HOSTS_READ_ERROR", pvar,
-				                  "An error occurred while trying to read a known_hosts file.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_READ_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to read a known_hosts file.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 		}
 		return 0;
@@ -160,9 +165,10 @@
 		pvar->hosts_state.file_data = malloc(length + 1);
 		if (pvar->hosts_state.file_data == NULL) {
 			if (!suppress_errors) {
-				UTIL_get_lang_msg("MSG_HOSTS_ALLOC_ERROR", pvar,
-				                  "Memory ran out while trying to allocate space to read a known_hosts file.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_ALLOC_ERROR", uimsg, _countof(uimsg),
+									"Memory ran out while trying to allocate space to read a known_hosts file.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			_close(fd);
 			return 0;
@@ -169,9 +175,10 @@
 		}
 	} else {
 		if (!suppress_errors) {
-			UTIL_get_lang_msg("MSG_HOSTS_READ_ERROR", pvar,
-			                  "An error occurred while trying to read a known_hosts file.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_HOSTS_READ_ERROR", uimsg, _countof(uimsg),
+								"An error occurred while trying to read a known_hosts file.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 		}
 		_close(fd);
 		return 0;
@@ -184,9 +191,10 @@
 
 	if (amount_read != length) {
 		if (!suppress_errors) {
-			UTIL_get_lang_msg("MSG_HOSTS_READ_ERROR", pvar,
-			                  "An error occurred while trying to read a known_hosts file.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_HOSTS_READ_ERROR", uimsg, _countof(uimsg),
+								"An error occurred while trying to read a known_hosts file.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 		}
 		free(pvar->hosts_state.file_data);
 		pvar->hosts_state.file_data = NULL;
@@ -525,6 +533,7 @@
 {
 	int i;
 	int while_flg;
+	char uimsg[MAX_UIMSG];
 
 	for (i = 0; hostname[i] != 0; i++) {
 		int ch = hostname[i];
@@ -531,10 +540,11 @@
 
 		if (!is_pattern_char(ch) || ch == '*' || ch == '?') {
 			if (!suppress_errors) {
-				UTIL_get_lang_msg("MSG_HOSTS_HOSTNAME_INVALID_ERROR", pvar,
-				                  "The host name contains an invalid character.\n"
-				                  "This session will be terminated.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				UTIL_get_lang_msgU8("MSG_HOSTS_HOSTNAME_INVALID_ERROR", uimsg, _countof(uimsg),
+									"The host name contains an invalid character.\n"
+									"This session will be terminated.",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 			}
 			return 0;
 		}
@@ -542,10 +552,11 @@
 
 	if (i == 0) {
 		if (!suppress_errors) {
-			UTIL_get_lang_msg("MSG_HOSTS_HOSTNAME_EMPTY_ERROR", pvar,
-			                  "The host name should not be empty.\n"
-			                  "This session will be terminated.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			UTIL_get_lang_msgU8("MSG_HOSTS_HOSTNAME_EMPTY_ERROR", uimsg, _countof(uimsg),
+								"The host name should not be empty.\n"
+								"This session will be terminated.",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 		}
 		return 0;
 	}
@@ -974,22 +985,26 @@
 
 static void init_hosts_dlg(PTInstVar pvar, HWND dlg)
 {
-	char buf[1024];
-	char buf2[2048];
+	TCHAR buf[1024];
+	TCHAR buf2[2048];
 	int i, j;
 	int ch;
 
 	// static text\x82\xCC # \x95\x94\x95\xAA\x82\xF0\x83z\x83X\x83g\x96\xBC\x82ɒu\x8A\xB7\x82\xB7\x82\xE9
-	GetDlgItemText(dlg, IDC_HOSTWARNING, buf, sizeof(buf));
+	GetDlgItemText(dlg, IDC_HOSTWARNING, buf, _countof(buf));
 	for (i = 0; (ch = buf[i]) != 0 && ch != '#'; i++) {
 		buf2[i] = ch;
 	}
-	strncpy_s(buf2 + i, sizeof(buf2) - i,
-	          pvar->hosts_state.prefetched_hostname, _TRUNCATE);
-	j = i + strlen(buf2 + i);
+	{
+		const TCHAR *hostname = ToTcharU8(pvar->hosts_state.prefetched_hostname);
+		_tcsncpy_s(buf2 + i, sizeof(buf2) - i,
+				   hostname, _TRUNCATE);
+		free((void *)hostname);
+	}
+	j = i + _tcslen(buf2 + i);
 	for (; buf[i] == '#'; i++) {
 	}
-	strncpy_s(buf2 + j, sizeof(buf2) - j, buf + i, _TRUNCATE);
+	_tcsncpy_s(buf2 + j, sizeof(buf2) - j, buf + i, _TRUNCATE);
 
 	SetDlgItemText(dlg, IDC_HOSTWARNING, buf2);
 
@@ -1222,15 +1237,17 @@
 static void add_host_key(PTInstVar pvar)
 {
 	char *name = NULL;
+	char uimsg[MAX_UIMSG];
 
 	if ( pvar->hosts_state.file_names != NULL)
 		name = pvar->hosts_state.file_names[0];
 
 	if (name == NULL || name[0] == 0) {
-		UTIL_get_lang_msg("MSG_HOSTS_FILE_UNSPECIFY_ERROR", pvar,
-		                  "The host and its key cannot be added, because no known-hosts file has been specified.\n"
-		                  "Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		UTIL_get_lang_msgU8("MSG_HOSTS_FILE_UNSPECIFY_ERROR", uimsg, _countof(uimsg),
+							"The host and its key cannot be added, because no known-hosts file has been specified.\n"
+							"Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 	} else {
 		char *keydata = format_host_key(pvar);
 		int length = strlen(keydata);
@@ -1245,15 +1262,17 @@
 		          _S_IREAD | _S_IWRITE);
 		if (fd == -1) {
 			if (errno == EACCES) {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,
-				                  "An error occurred while trying to write the host key.\n"
-				                  "You do not have permission to write to the known-hosts file.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_EACCES_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"You do not have permission to write to the known-hosts file.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			} else {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-				                  "An error occurred while trying to write the host key.\n"
-				                  "The host key could not be written.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"The host key could not be written.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			return;
 		}
@@ -1263,10 +1282,11 @@
 		close_result = _close(fd);
 
 		if (amount_written != length || close_result == -1) {
-			UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-			                  "An error occurred while trying to write the host key.\n"
-			                  "The host key could not be written.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+								"An error occurred while trying to write the host key.\n"
+								"The host key could not be written.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 		}
 	}
 }
@@ -1277,6 +1297,7 @@
 	char *name = NULL;
 	char *hostname;
 	unsigned short tcpport;
+	char uimsg[MAX_UIMSG];
 
 	hostname = pvar->ssh_state.hostname;
 	tcpport = pvar->ssh_state.tcpport;
@@ -1285,10 +1306,11 @@
 		name = pvar->hosts_state.file_names[0];
 
 	if (name == NULL || name[0] == 0) {
-		UTIL_get_lang_msg("MSG_HOSTS_FILE_UNSPECIFY_ERROR", pvar,
-			"The host and its key cannot be added, because no known-hosts file has been specified.\n"
-			"Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		UTIL_get_lang_msgU8("MSG_HOSTS_FILE_UNSPECIFY_ERROR", uimsg, _countof(uimsg),
+							"The host and its key cannot be added, because no known-hosts file has been specified.\n"
+							"Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 	}
 	else {
 		char *keydata = format_specified_host_key(key, hostname, tcpport);
@@ -1304,16 +1326,18 @@
 			_S_IREAD | _S_IWRITE);
 		if (fd == -1) {
 			if (errno == EACCES) {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,
-					"An error occurred while trying to write the host key.\n"
-					"You do not have permission to write to the known-hosts file.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_EACCES_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"You do not have permission to write to the known-hosts file.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			else {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-					"An error occurred while trying to write the host key.\n"
-					"The host key could not be written.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"The host key could not be written.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			return;
 		}
@@ -1323,10 +1347,11 @@
 		close_result = _close(fd);
 
 		if (amount_written != length || close_result == -1) {
-			UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-				"An error occurred while trying to write the host key.\n"
-				"The host key could not be written.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+								"An error occurred while trying to write the host key.\n"
+								"The host key could not be written.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 		}
 	}
 }
@@ -1338,12 +1363,14 @@
 static void delete_different_key(PTInstVar pvar)
 {
 	char *name = pvar->hosts_state.file_names[0];
+	char uimsg[MAX_UIMSG];
 
 	if (name == NULL || name[0] == 0) {
-		UTIL_get_lang_msg("MSG_HOSTS_FILE_UNSPECIFY_ERROR", pvar,
-		                  "The host and its key cannot be added, because no known-hosts file has been specified.\n"
-		                  "Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		UTIL_get_lang_msgU8("MSG_HOSTS_FILE_UNSPECIFY_ERROR", uimsg, _countof(uimsg),
+							"The host and its key cannot be added, because no known-hosts file has been specified.\n"
+							"Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 	}
 	else {
 		Key key; // known_hosts\x82ɓo\x98^\x82\xB3\x82\xEA\x82Ă\xA2\x82錮
@@ -1366,15 +1393,18 @@
 
 		if (fd == -1) {
 			if (errno == EACCES) {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,
-				                  "An error occurred while trying to write the host key.\n"
-				                  "You do not have permission to write to the known-hosts file.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_EACCES_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"You do not have permission to write to the known-hosts file.",
+									pvar->ts->UILanguageFile);
+
+				notify_nonfatal_error(pvar, uimsg);
 			} else {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-				                  "An error occurred while trying to write the host key.\n"
-				                  "The host key could not be written.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"The host key could not be written.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			return;
 		}
@@ -1496,10 +1526,11 @@
 error1:
 		close_result = _close(fd);
 		if (amount_written != length || close_result == -1) {
-			UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-			                  "An error occurred while trying to write the host key.\n"
-			                  "The host key could not be written.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+								"An error occurred while trying to write the host key.\n"
+								"The host key could not be written.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 			goto error2;
 		}
 
@@ -1524,15 +1555,17 @@
 	char *name = pvar->hosts_state.file_names[0];
 	char *hostname;
 	unsigned short tcpport;
+	char uimsg[MAX_UIMSG];
 
 	hostname = pvar->ssh_state.hostname;
 	tcpport = pvar->ssh_state.tcpport;
 
 	if (name == NULL || name[0] == 0) {
-		UTIL_get_lang_msg("MSG_HOSTS_FILE_UNSPECIFY_ERROR", pvar,
-			"The host and its key cannot be added, because no known-hosts file has been specified.\n"
-			"Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.");
-		notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+		UTIL_get_lang_msgU8("MSG_HOSTS_FILE_UNSPECIFY_ERROR", uimsg, _countof(uimsg),
+							"The host and its key cannot be added, because no known-hosts file has been specified.\n"
+							"Restart Tera Term and specify a read/write known-hosts file in the TTSSH Setup dialog box.",
+							pvar->ts->UILanguageFile);
+		notify_nonfatal_error(pvar, uimsg);
 	}
 	else {
 		Key key; // known_hosts\x82ɓo\x98^\x82\xB3\x82\xEA\x82Ă\xA2\x82錮
@@ -1555,16 +1588,18 @@
 
 		if (fd == -1) {
 			if (errno == EACCES) {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,
-					"An error occurred while trying to write the host key.\n"
-					"You do not have permission to write to the known-hosts file.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_EACCES_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"You do not have permission to write to the known-hosts file.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			else {
-				UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-					"An error occurred while trying to write the host key.\n"
-					"The host key could not be written.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while trying to write the host key.\n"
+									"The host key could not be written.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 			}
 			return;
 		}
@@ -1683,10 +1718,11 @@
 	error1:
 		close_result = _close(fd);
 		if (amount_written != length || close_result == -1) {
-			UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
-				"An error occurred while trying to write the host key.\n"
-				"The host key could not be written.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_HOSTS_WRITE_ERROR", uimsg, _countof(uimsg),
+								"An error occurred while trying to write the host key.\n"
+								"The host key could not be written.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 			goto error2;
 		}
 
@@ -1728,6 +1764,7 @@
 	PTInstVar pvar;
 //	LOGFONT logfont;
 //	HFONT font;
+	TCHAR uimsg[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -1740,13 +1777,13 @@
 #if 0
 		GetWindowText(dlg, uimsg, sizeof(uimsg));
 		UTIL_get_lang_msg("DLG_UNKNOWNHOST_TITLE", pvar, uimsg);
-		SetWindowText(dlg, pvar->ts->UIMsg);
+		SetWindowText(dlg, uimsg);
 		GetDlgItemText(dlg, IDC_HOSTWARNING, uimsg, sizeof(uimsg));
 		UTIL_get_lang_msg("DLG_UNKNOWNHOST_WARNING", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING, pvar->ts->UIMsg);
+		SetDlgItemText(dlg, IDC_HOSTWARNING, uimsg);
 		GetDlgItemText(dlg, IDC_HOSTWARNING2, uimsg, sizeof(uimsg));
 		UTIL_get_lang_msg("DLG_UNKNOWNHOST_WARNING2", pvar, uimsg);
-		SetDlgItemText(dlg, IDC_HOSTWARNING2, pvar->ts->UIMsg);
+		SetDlgItemText(dlg, IDC_HOSTWARNING2, uimsg);
 		GetDlgItemText(dlg, IDC_HOSTFINGERPRINT, uimsg, sizeof(uimsg));
 		UTIL_get_lang_msg("DLG_UNKNOWNHOST_FINGERPRINT", pvar, uimsg);
 		SetDlgItemText(dlg, IDC_HOSTFINGERPRINT, pvar->ts->UIMsg);
@@ -1765,23 +1802,31 @@
 #endif
 		switch (pvar->dns_key_check) {
 		case DNS_VERIFY_NOTFOUND:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_NOTFOUND", pvar, "No host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_NOTFOUND", uimsg, _countof(uimsg),
+							   _T("No host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_MATCH:
 		case DNS_VERIFY_AUTH_MATCH:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_MATCH", pvar, "Matching host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_MATCH", uimsg, _countof(uimsg),
+							   _T("Matching host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_MISMATCH:
 		case DNS_VERIFY_AUTH_MISMATCH:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_MISMATCH", pvar, "Mismatching host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_MISMATCH", uimsg, _countof(uimsg),
+							   _T("Mismatching host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_DIFFERENTTYPE:
 		case DNS_VERIFY_AUTH_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_DIFFTYPE", pvar, "Mismatching host key type found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_DIFFTYPE", uimsg, _countof(uimsg),
+							   _T("Mismatching host key type found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		}
 
@@ -1789,14 +1834,18 @@
 		case DNS_VERIFY_MATCH:
 		case DNS_VERIFY_MISMATCH:
 		case DNS_VERIFY_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_DNSSEC_NG", pvar, "Found insecure fingerprint in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_DNSSEC_NG", uimsg, _countof(uimsg),
+							   _T("Found insecure fingerprint in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, uimsg);
 			break;
 		case DNS_VERIFY_AUTH_MATCH:
 		case DNS_VERIFY_AUTH_MISMATCH:
 		case DNS_VERIFY_AUTH_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_DNSSEC_OK", pvar, "Found secure fingerprint in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_DNSSEC_OK", uimsg, _countof(uimsg),
+							   _T("Found secure fingerprint in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, uimsg);
 			break;
 		}
 
@@ -1905,6 +1954,7 @@
 	PTInstVar pvar;
 //	LOGFONT logfont;
 //	HFONT font;
+	TCHAR uimsg[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -1942,23 +1992,31 @@
 #endif
 		switch (pvar->dns_key_check) {
 		case DNS_VERIFY_NOTFOUND:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_NOTFOUND", pvar, "No host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_NOTFOUND", uimsg, _countof(uimsg),
+							   _T("No host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_MATCH:
 		case DNS_VERIFY_AUTH_MATCH:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_MATCH", pvar, "Matching host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_MATCH", uimsg, _countof(uimsg),
+							   _T("Matching host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_MISMATCH:
 		case DNS_VERIFY_AUTH_MISMATCH:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_MISMATCH", pvar, "Mismatching host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_MISMATCH", uimsg, _countof(uimsg),
+							   _T("Mismatching host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_DIFFERENTTYPE:
 		case DNS_VERIFY_AUTH_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_DIFFTYPE", pvar, "Mismatching host key type found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_DIFFTYPE", uimsg, _countof(uimsg),
+							   _T("Mismatching host key type found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		}
 
@@ -1966,14 +2024,18 @@
 		case DNS_VERIFY_MATCH:
 		case DNS_VERIFY_MISMATCH:
 		case DNS_VERIFY_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_DNSSEC_NG", pvar, "Found insecure fingerprint in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_DNSSEC_NG", uimsg, _countof(uimsg),
+							   _T( "Found insecure fingerprint in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, uimsg);
 			break;
 		case DNS_VERIFY_AUTH_MATCH:
 		case DNS_VERIFY_AUTH_MISMATCH:
 		case DNS_VERIFY_AUTH_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_DNSSEC_OK", pvar, "Found secure fingerprint in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_DNSSEC_OK", uimsg, _countof(uimsg),
+							   _T("Found secure fingerprint in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, uimsg);
 			break;
 		}
 
@@ -2080,6 +2142,7 @@
 	PTInstVar pvar;
 //	LOGFONT logfont;
 //	HFONT font;
+	TCHAR uimsg[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -2117,23 +2180,31 @@
 #endif
 		switch (pvar->dns_key_check) {
 		case DNS_VERIFY_NOTFOUND:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_NOTFOUND", pvar, "No host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_NOTFOUND", uimsg, _countof(uimsg),
+							   _T("No host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_MATCH:
 		case DNS_VERIFY_AUTH_MATCH:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_MATCH", pvar, "Matching host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_MATCH", uimsg, _countof(uimsg),
+							   _T("Matching host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_MISMATCH:
 		case DNS_VERIFY_AUTH_MISMATCH:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_MISMATCH", pvar, "Mismatching host key fingerprint found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_MISMATCH", uimsg, _countof(uimsg),
+							   _T("Mismatching host key fingerprint found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		case DNS_VERIFY_DIFFERENTTYPE:
 		case DNS_VERIFY_AUTH_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_SSHFP_DIFFTYPE", pvar, "Mismatching host key type found in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_SSHFP_DIFFTYPE", uimsg, _countof(uimsg),
+							   _T("Mismatching host key type found in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPCHECK, uimsg);
 			break;
 		}
 
@@ -2141,14 +2212,18 @@
 		case DNS_VERIFY_MATCH:
 		case DNS_VERIFY_MISMATCH:
 		case DNS_VERIFY_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_DNSSEC_NG", pvar, "Found insecure fingerprint in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_DNSSEC_NG", uimsg, _countof(uimsg),
+							   _T("Found insecure fingerprint in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, uimsg);
 			break;
 		case DNS_VERIFY_AUTH_MATCH:
 		case DNS_VERIFY_AUTH_MISMATCH:
 		case DNS_VERIFY_AUTH_DIFFERENTTYPE:
-			UTIL_get_lang_msg("DLG_HOSTKEY_DNSSEC_OK", pvar, "Found secure fingerprint in DNS.");
-			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, pvar->ts->UIMsg);
+			UTIL_get_lang_msgT("DLG_HOSTKEY_DNSSEC_OK", uimsg, _countof(uimsg),
+							   _T("Found secure fingerprint in DNS."),
+							   pvar->ts->UILanguageFile);
+			SetDlgItemText(dlg, IDC_HOSTSSHFPDNSSEC, uimsg);
 			break;
 		}
 

Modified: branches/cmake/ttssh2/ttxssh/ssh.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/ssh.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/ssh.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -33,6 +33,7 @@
 #include "libputty.h"
 #include "key.h"
 #include "ttcommon.h"
+#include "codeconv.h"
 
 #include <openssl/bn.h>
 #include <openssl/evp.h>
@@ -63,6 +64,7 @@
 
 #include <direct.h>
 #include <io.h>
+#include <tchar.h>
 
 #if defined(UNICODE)
 #undef GetPrivateProfileString
@@ -71,8 +73,10 @@
 #define GetPrivateProfileInt GetPrivateProfileIntA
 #undef WritePrivateProfileString
 #define WritePrivateProfileString WritePrivateProfileStringA
+#if 0
 #undef MessageBox
 #define MessageBox MessageBoxA
+#endif
 #undef GetDlgItemText
 #define GetDlgItemText GetDlgItemTextA
 #undef SetDlgItemText
@@ -655,6 +659,7 @@
    We can return more than limit in some cases. */
 static int buffer_packet_data(PTInstVar pvar, int limit)
 {
+	char uimsg[MAX_UIMSG];
 	if (pvar->ssh_state.payloadlen >= 0) {
 		return pvar->ssh_state.payloadlen;
 	} else {
@@ -687,9 +692,10 @@
 				pvar->ssh_state.payloadlen = cur_decompressed_bytes;
 				return cur_decompressed_bytes;
 			default:
-				UTIL_get_lang_msg("MSG_SSH_INVALID_COMPDATA_ERROR", pvar,
-				                  "Invalid compressed data in received packet");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				UTIL_get_lang_msgU8("MSG_SSH_INVALID_COMPDATA_ERROR", uimsg, _countof(uimsg),
+									"Invalid compressed data in received packet",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 				return -1;
 			}
 		}
@@ -717,9 +723,11 @@
 		pvar->ssh_state.payload_grabbed += num_bytes;
 		if (pvar->ssh_state.payload_grabbed > in_buffer) {
 			char buf[128];
-			UTIL_get_lang_msg("MSG_SSH_TRUNCATED_PKT_ERROR", pvar,
-			                  "Received truncated packet (%ld > %d) @ grab_payload()");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+			char uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgU8("MSG_SSH_TRUNCATED_PKT_ERROR", uimsg, _countof(uimsg),
+								"Received truncated packet (%ld > %d) @ grab_payload()",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 			            pvar->ssh_state.payload_grabbed, in_buffer);
 			notify_fatal_error(pvar, buf, TRUE);
 			return FALSE;
@@ -741,9 +749,11 @@
 	} else {
 		if (pvar->ssh_state.payload_grabbed > in_buffer) {
 			char buf[128];
-			UTIL_get_lang_msg("MSG_SSH_TRUNCATED_PKT_LIM_ERROR", pvar,
-			                  "Received truncated packet (%ld > %d) @ grab_payload_limited()");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+			char uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgU8("MSG_SSH_TRUNCATED_PKT_LIM_ERROR", uimsg, _countof(uimsg),
+								"Received truncated packet (%ld > %d) @ grab_payload_limited()",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 			            pvar->ssh_state.payload_grabbed, in_buffer);
 			notify_fatal_error(pvar, buf, TRUE);
 			return FALSE;
@@ -866,19 +876,24 @@
  */
 static int prep_packet_ssh1(PTInstVar pvar, char *data, unsigned int len, unsigned int padding)
 {
+	char uimsg[MAX_UIMSG];
 	pvar->ssh_state.payload = data + 4;
 	pvar->ssh_state.payloadlen = len;
 
 	if (CRYPT_detect_attack(pvar, pvar->ssh_state.payload, len)) {
-		UTIL_get_lang_msg("MSG_SSH_COREINS_ERROR", pvar, "'CORE insertion attack' detected.  Aborting connection.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_SSH_COREINS_ERROR", uimsg, _countof(uimsg),
+							"'CORE insertion attack' detected.  Aborting connection.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 	}
 
 	CRYPT_decrypt(pvar, pvar->ssh_state.payload, len);
 	/* PKT guarantees that the data is always 4-byte aligned */
 	if (do_crc(pvar->ssh_state.payload, len - 4) != get_uint32_MSBfirst(pvar->ssh_state.payload + len - 4)) {
-		UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_SSH_CORRUPTDATA_ERROR",  uimsg, _countof(uimsg),
+							"Detected corrupted data; connection terminating.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return SSH_MSG_NONE;
 	}
 
@@ -889,10 +904,11 @@
 
 	if (pvar->ssh_state.decompressing) {
 		if (pvar->ssh_state.decompress_stream.avail_in != 0) {
-			UTIL_get_lang_msg("MSG_SSH_DECOMPRESS_ERROR", pvar,
-			                  "Internal error: a packet was not fully decompressed.\n"
-			                  "This is a bug, please report it.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_SSH_DECOMPRESS_ERROR", uimsg, _countof(uimsg),
+								"Internal error: a packet was not fully decompressed.\n"
+								  "This is a bug, please report it.",
+							   pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 		}
 
 		pvar->ssh_state.decompress_stream.next_in = pvar->ssh_state.payload;
@@ -929,11 +945,15 @@
 static int prep_packet_ssh2(PTInstVar pvar, char *data, unsigned int len, unsigned int aadlen, unsigned int authlen)
 {
 	unsigned int padding;
+	char uimsg[MAX_UIMSG];
 
 	if (authlen > 0) {
 		if (!CRYPT_decrypt_aead(pvar, data, len, aadlen, authlen)) {
-			UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			char uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgU8("MSG_SSH_CORRUPTDATA_ERROR", uimsg, _countof(uimsg),
+								"Detected corrupted data; connection terminating.",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 			return SSH_MSG_NONE;
 		}
 	}
@@ -940,8 +960,10 @@
 	else if (aadlen > 0) {
 		// EtM \x82̏ꍇ\x82͐\xE6\x82\xC9 MAC \x82̌\x9F\x8F؂\xF0\x8Ds\x82\xA4
 		if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) {
-			UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			UTIL_get_lang_msgU8("MSG_SSH_CORRUPTDATA_ERROR", uimsg, _countof(uimsg),
+								"Detected corrupted data; connection terminating.",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 			return SSH_MSG_NONE;
 		}
 
@@ -958,8 +980,10 @@
 
 		// E&M \x82ł͕\x9C\x8D\x86\x8C\xE3\x82\xC9 MAC \x82̌\x9F\x8F؂\xF0\x8Ds\x82\xA4\x81B
 		if (!CRYPT_verify_receiver_MAC(pvar, pvar->ssh_state.receiver_sequence_number, data, len + 4, data + len + 4)) {
-			UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			UTIL_get_lang_msgU8("MSG_SSH_CORRUPTDATA_ERROR", uimsg, _countof(uimsg),
+								"Detected corrupted data; connection terminating.",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 			return SSH_MSG_NONE;
 		}
 	}
@@ -1085,6 +1109,7 @@
 	u_long do_block = 0;
 	int code = 0;
 	char *kind = NULL, buf[256];
+	char uimsg[MAX_UIMSG];
 
 	if ((pvar->PWSAAsyncSelect) (pvar->socket, pvar->NotificationWindow, 0, 0) == SOCKET_ERROR) {
 		code = WSAGetLastError();
@@ -1111,10 +1136,11 @@
 	return TRUE;
 
 error:
-	UTIL_get_lang_msg("MSG_SSH_SEND_PKT_ERROR", pvar,
-	                  "A communications error occurred while sending an SSH packet.\n"
-	                  "The connection will close. (%s:%d)");
-	_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+	UTIL_get_lang_msgU8("MSG_SSH_SEND_PKT_ERROR", uimsg, _countof(uimsg),
+						"A communications error occurred while sending an SSH packet.\n"
+						"The connection will close. (%s:%d)",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 	            kind, code);
 	notify_fatal_error(pvar, buf, TRUE);
 	return FALSE;
@@ -1140,10 +1166,12 @@
 			pvar->ssh_state.compress_stream.avail_out = pvar->ssh_state.outbuflen - 12;
 
 			if (deflate(&pvar->ssh_state.compress_stream, Z_SYNC_FLUSH) != Z_OK) {
-				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
-				                  "An error occurred while compressing packet data.\n"
-				                  "The connection will close.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_SSH_COMP_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while compressing packet data.\n"
+									"The connection will close.",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 				return;
 			}
 		}
@@ -1206,10 +1234,12 @@
 			// \x88\xB3\x8Fk\x91Ώۂ̓w\x83b\x83_\x82\xF0\x8F\x9C\x82\xAD\x83y\x83C\x83\x8D\x81[\x83h\x82̂݁B
 			buffer_append(msg, "\0\0\0\0\0", 5);  // 5 = packet-length(4) + padding(1)
 			if (buffer_compress(&pvar->ssh_state.compress_stream, pvar->ssh_state.outbuf + 12, len, msg) == -1) {
-				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
-				                  "An error occurred while compressing packet data.\n"
-				                  "The connection will close.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_SSH_COMP_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while compressing packet data.\n"
+									"The connection will close.",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 				return;
 			}
 			data = buffer_ptr(msg);
@@ -1603,24 +1633,27 @@
 	}
 
 	if (get_handler(pvar, SSH_SMSG_FAILURE) == handle_forwarding_failure) {
-		UTIL_get_lang_msg("MSG_SSH_UNABLE_FWD_ERROR", pvar,
-		                  "\nIt may have disconnected because it was unable to forward a port you requested to be forwarded from the server.\n"
-		                  "This often happens when someone is already forwarding that port from the server.");
-		strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
+		UTIL_get_lang_msgU8("MSG_SSH_UNABLE_FWD_ERROR", uimsg, _countof(uimsg),
+							"\nIt may have disconnected because it was unable to forward a port you requested to be forwarded from the server.\n"
+							"This often happens when someone is already forwarding that port from the server.",
+							pvar->ts->UILanguageFile);
+		strncpy_s(uimsg, sizeof(uimsg), uimsg, _TRUNCATE);
 		explanation = uimsg;
 	}
 
 	if (description != NULL) {
-		UTIL_get_lang_msg("MSG_SSH_SERVER_DISCON_ERROR", pvar,
-		                  "Server disconnected with message '%s'%s");
+		UTIL_get_lang_msgU8("MSG_SSH_SERVER_DISCON_ERROR", uimsg, _countof(uimsg),
+							"Server disconnected with message '%s'%s",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-		            pvar->ts->UIMsg, description,
+		            uimsg, description,
 		            explanation);
 	} else {
-		UTIL_get_lang_msg("MSG_SSH_SERVER_DISCON_NORES_ERROR", pvar,
-		                  "Server disconnected (no reason given).%s");
+		UTIL_get_lang_msgU8("MSG_SSH_SERVER_DISCON_NORES_ERROR", uimsg, _countof(uimsg),
+							"Server disconnected (no reason given).%s",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
-		            pvar->ts->UIMsg, explanation);
+		            uimsg, explanation);
 	}
 
 	if (SSHv2(pvar)) {
@@ -1936,21 +1969,25 @@
 			pvar->ssh_state.server_ID = _strdup(ID);
 
 			if (!parse_protocol_ID(pvar, ID)) {
-				UTIL_get_lang_msg("MSG_SSH_VERSION_ERROR", pvar,
-				                  "This program does not understand the server's version of the protocol.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				UTIL_get_lang_msgU8("MSG_SSH_VERSION_ERROR", uimsg, _countof(uimsg),
+									"This program does not understand the server's version of the protocol.",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 			}
 			else if ((negotiate = negotiate_protocol(pvar)) == 1) {
-				UTIL_get_lang_msg("MSG_SSH_VERSION_ERROR", pvar,
-				                  "This program does not understand the server's version of the protocol.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				UTIL_get_lang_msgU8("MSG_SSH_VERSION_ERROR", uimsg, _countof(uimsg),
+									"This program does not understand the server's version of the protocol.",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 			}
 			else if (negotiate == -1) {
-				UTIL_get_lang_msg("MSG_SSH_VERSION_MISMATCH", pvar,
-				                  "Protocol version mismatch. server:%d.%d client:%d");
-				_snprintf_s(uimsg, sizeof(uimsg), _TRUNCATE, pvar->ts->UIMsg,
+				char buf[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_SSH_VERSION_MISMATCH", uimsg, _countof(uimsg),
+									"Protocol version mismatch. server:%d.%d client:%d",
+									pvar->ts->UILanguageFile);
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 				            pvar->protocol_major, pvar->protocol_minor, pvar->settings.ssh_protocol_version);
-				notify_fatal_error(pvar, uimsg, TRUE);
+				notify_fatal_error(pvar, buf, TRUE);
 			}
 			else {
 				char TTSSH_ID[1024];
@@ -1981,10 +2018,11 @@
 				server_version_check(pvar);
 
 				if ((pvar->Psend) (pvar->socket, TTSSH_ID, TTSSH_ID_len, 0) != TTSSH_ID_len) {
-					UTIL_get_lang_msg("MSG_SSH_SEND_ID_ERROR", pvar,
-					                  "An error occurred while sending the SSH ID string.\n"
-					                  "The connection will close.");
-					notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+					UTIL_get_lang_msgU8("MSG_SSH_SEND_ID_ERROR", uimsg, _countof(uimsg),
+										"An error occurred while sending the SSH ID string.\n"
+										"The connection will close.",
+										pvar->ts->UILanguageFile);
+					notify_fatal_error(pvar, uimsg, TRUE);
 				} else {
 					// \x89\xFC\x8Ds\x82̏\x9C\x8B\x8E
 					chop_newlines(pvar->client_version_string);
@@ -2215,6 +2253,7 @@
 {
 	int i;
 
+
 	for (i = 0 ; i < handle_message_count ; i++) {
 		if (handle_messages[i] == message)
 			return 1;
@@ -2263,9 +2302,12 @@
 
 		if (handler == NULL) {
 			char buf[1024];
+			char uimsg[MAX_UIMSG];
 
-			UTIL_get_lang_msg("MSG_SSH_UNEXP_MSG_ERROR", pvar, "Unexpected packet type received: %d");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, message, handle_message_stage);
+			UTIL_get_lang_msgU8("MSG_SSH_UNEXP_MSG_ERROR", uimsg, _countof(uimsg),
+								"Unexpected packet type received: %d",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg, message, handle_message_stage);
 			notify_fatal_error(pvar, buf, TRUE);
 		} else {
 			if (!handler(pvar)) {
@@ -2286,10 +2328,13 @@
 
 		// \x91z\x92\xE8\x8AO\x82̃\x81\x83b\x83Z\x81[\x83W\x83^\x83C\x83v\x82\xAA\x93\x9E\x92\x85\x82\xB5\x82\xBD\x82\xE7\x83A\x83{\x81[\x83g\x82\xB3\x82\xB9\x82\xE9\x81B
 		if (!SSH2_dispatch_enabled_check(message) || handler == NULL) {
+			char uimsg[MAX_UIMSG];
 			char buf[1024];
 
-			UTIL_get_lang_msg("MSG_SSH_UNEXP_MSG2_ERROR", pvar, "Unexpected SSH2 message(%d) on current stage(%d)");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, message, handle_message_stage);
+			UTIL_get_lang_msgU8("MSG_SSH_UNEXP_MSG2_ERROR", uimsg, _countof(uimsg),
+								"Unexpected SSH2 message(%d) on current stage(%d)",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg, message, handle_message_stage);
 			notify_fatal_error(pvar, buf, TRUE);
 			return;
 		}
@@ -2327,10 +2372,12 @@
 
 static BOOL handle_pty_failure(PTInstVar pvar)
 {
-	UTIL_get_lang_msg("MSG_SSH_ALLOC_TERMINAL_ERROR", pvar,
-	                  "The server cannot allocate a pseudo-terminal. "
-	                  "You may encounter some problems with the terminal.");
-	notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+	char uimsg[MAX_UIMSG];
+	UTIL_get_lang_msgU8("MSG_SSH_ALLOC_TERMINAL_ERROR", uimsg, _countof(uimsg),
+						"The server cannot allocate a pseudo-terminal. "
+						"You may encounter some problems with the terminal.",
+						pvar->ts->UILanguageFile);
+	notify_nonfatal_error(pvar, uimsg);
 	return handle_pty_success(pvar);
 }
 
@@ -2412,10 +2459,12 @@
 	pvar->ssh_state.compress_stream.zfree = NULL;
 	pvar->ssh_state.compress_stream.opaque = NULL;
 	if (deflateInit(&pvar->ssh_state.compress_stream, pvar->ssh_state.compression_level) != Z_OK) {
-		UTIL_get_lang_msg("MSG_SSH_SETUP_COMP_ERROR", pvar,
-		                  "An error occurred while setting up compression.\n"
-		                  "The connection will close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_SSH_SETUP_COMP_ERROR", uimsg, _countof(uimsg),
+							"An error occurred while setting up compression.\n"
+							"The connection will close.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return;
 	} else {
 		// SSH2\x82ł͈\xB3\x8Fk\x81E\x93W\x8AJ\x8F\x88\x97\x9D\x82\xF0SSH1\x82Ƃ͕ʂɍs\x82\xA4\x82̂ŁA\x89\xBA\x8BL\x83t\x83\x89\x83O\x82͗\x8E\x82Ƃ\xB5\x82Ă\xA8\x82\xAD\x81B(2005.7.9 yutaka)
@@ -2440,11 +2489,13 @@
 	pvar->ssh_state.decompress_stream.zfree = NULL;
 	pvar->ssh_state.decompress_stream.opaque = NULL;
 	if (inflateInit(&pvar->ssh_state.decompress_stream) != Z_OK) {
+		char uimsg[MAX_UIMSG];
 		deflateEnd(&pvar->ssh_state.compress_stream);
-		UTIL_get_lang_msg("MSG_SSH_SETUP_COMP_ERROR", pvar,
-		                  "An error occurred while setting up compression.\n"
-		                  "The connection will close.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_SSH_SETUP_COMP_ERROR", uimsg, _countof(uimsg),
+							"An error occurred while setting up compression.\n"
+							"The connection will close.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return;
 	} else {
 		// SSH2\x82ł͈\xB3\x8Fk\x81E\x93W\x8AJ\x8F\x88\x97\x9D\x82\xF0SSH1\x82Ƃ͕ʂɍs\x82\xA4\x82̂ŁA\x89\xBA\x8BL\x83t\x83\x89\x83O\x82͗\x8E\x82Ƃ\xB5\x82Ă\xA8\x82\xAD\x81B(2005.7.9 yutaka)
@@ -2542,10 +2593,12 @@
 
 				enque_simple_auth_handlers(pvar);
 			} else {
-				UTIL_get_lang_msg("MSG_SSH_DECRYPT_RSA_ERROR", pvar,
-								  "An error occurred while decrypting the RSA challenge.\n"
-								  "Perhaps the key file is corrupted.");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_SSH_DECRYPT_RSA_ERROR", uimsg, _countof(uimsg),
+									"An error occurred while decrypting the RSA challenge.\n"
+									"Perhaps the key file is corrupted.",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 			}
 		}
 		else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
@@ -2591,6 +2644,7 @@
 
 static void try_send_credentials(PTInstVar pvar)
 {
+	char uimsg[MAX_UIMSG];
 	if ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_CREDENTIALS) == 0) {
 		AUTHCred *cred = AUTH_get_cur_cred(pvar);
 		static const int RSA_msgs[] =
@@ -2742,9 +2796,10 @@
 				break;
 			}
 		default:
-			UTIL_get_lang_msg("MSG_SSH_UNSUPPORT_AUTH_METHOD_ERROR", pvar,
-			                  "Internal error: unsupported authentication method");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			UTIL_get_lang_msgU8("MSG_SSH_UNSUPPORT_AUTH_METHOD_ERROR", uimsg, _countof(uimsg),
+								"Internal error: unsupported authentication method",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 			return;
 		}
 
@@ -3122,6 +3177,8 @@
 
 void SSH_send(PTInstVar pvar, unsigned char const *buf, unsigned int buflen)
 {
+	char uimsg[MAX_UIMSG];
+
 	// RAW\x83p\x83P\x83b\x83g\x83_\x83\x93\x83v\x82\xF0\x92lj\xC1 (2008.8.15 yutaka)
 	if (LogLevel(pvar, LOG_LEVEL_SSHDUMP)) {
 		init_memdump();
@@ -3155,9 +3212,10 @@
 					pvar->ssh_state.outbuflen - 12;
 
 				if (deflate(&pvar->ssh_state.compress_stream, Z_NO_FLUSH) != Z_OK) {
-					UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
-									  "Error compressing packet data");
-					notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+					UTIL_get_lang_msgU8("MSG_SSH_COMP_ERROR", uimsg, _countof(uimsg),
+										"Error compressing packet data",
+										pvar->ts->UILanguageFile);
+					notify_fatal_error(pvar, uimsg, TRUE);
 					return;
 				}
 
@@ -3166,9 +3224,10 @@
 				pvar->ssh_state.compress_stream.avail_in = len;
 
 				if (deflate(&pvar->ssh_state.compress_stream, Z_SYNC_FLUSH) != Z_OK) {
-					UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
-					                  "Error compressing packet data");
-					notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+					UTIL_get_lang_msgU8("MSG_SSH_COMP_ERROR", uimsg, _countof(uimsg),
+										"Error compressing packet data",
+										pvar->ts->UILanguageFile);
+					notify_fatal_error(pvar, uimsg, TRUE);
 					return;
 				}
 			} else {
@@ -3195,6 +3254,7 @@
 
 int SSH_extract_payload(PTInstVar pvar, unsigned char *dest, int len)
 {
+	char uimsg[MAX_UIMSG];
 	int num_bytes = pvar->ssh_state.payload_datalen;
 
 	if (num_bytes > len) {
@@ -3211,9 +3271,10 @@
 		pvar->ssh_state.decompress_stream.avail_out = num_bytes;
 
 		if (inflate(&pvar->ssh_state.decompress_stream, Z_SYNC_FLUSH) != Z_OK) {
-			UTIL_get_lang_msg("MSG_SSH_INVALID_COMPDATA_ERROR", pvar,
-			                  "Invalid compressed data in received packet");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+			UTIL_get_lang_msgU8("MSG_SSH_INVALID_COMPDATA_ERROR", uimsg, _countof(uimsg),
+								"Invalid compressed data in received packet",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, TRUE);
 			return 0;
 		}
 	}
@@ -3227,6 +3288,7 @@
 {
 	char buf[1024];
 	char buf2[1024];
+	char uimsg[MAX_UIMSG];
 
 	// added support of SSH2 packet compression (2005.7.10 yutaka)
 	// support of "Compression delayed" (2006.6.23 maya)
@@ -3238,20 +3300,25 @@
 			pvar->ssh_state.compress_stream.total_out;
 
 		if (total_out > 0) {
-			UTIL_get_lang_msg("DLG_ABOUT_COMP_INFO", pvar,
-			                  "level %d; ratio %.1f (%ld:%ld)");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+			UTIL_get_lang_msgU8("DLG_ABOUT_COMP_INFO", uimsg, _countof(uimsg),
+								"level %d; ratio %.1f (%ld:%ld)",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 			            pvar->ssh_state.compression_level,
 			            ((double) total_in) / total_out, total_in,
 			            total_out);
 		} else {
-			UTIL_get_lang_msg("DLG_ABOUT_COMP_INFO2", pvar, "level %d");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
+			UTIL_get_lang_msgU8("DLG_ABOUT_COMP_INFO2", uimsg, _countof(uimsg),
+								"level %d",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg,
 			            pvar->ssh_state.compression_level);
 		}
 	} else {
-		UTIL_get_lang_msg("DLG_ABOUT_COMP_NONE", pvar, "none");
-		strncpy_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
+		UTIL_get_lang_msgU8("DLG_ABOUT_COMP_NONE", uimsg, _countof(uimsg),
+							"none",
+							pvar->ts->UILanguageFile);
+		strncpy_s(buf, sizeof(buf), uimsg, _TRUNCATE);
 	}
 
 	// support of "Compression delayed" (2006.6.23 maya)
@@ -3264,25 +3331,31 @@
 			pvar->ssh_state.decompress_stream.total_out;
 
 		if (total_in > 0) {
-			UTIL_get_lang_msg("DLG_ABOUT_COMP_INFO", pvar,
-			                  "level %d; ratio %.1f (%ld:%ld)");
-			_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, pvar->ts->UIMsg,
+			UTIL_get_lang_msgU8("DLG_ABOUT_COMP_INFO", uimsg, _countof(uimsg),
+								"level %d; ratio %.1f (%ld:%ld)",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, uimsg,
 			            pvar->ssh_state.compression_level,
 			            ((double) total_out) / total_in, total_out,
 			            total_in);
 		} else {
-			UTIL_get_lang_msg("DLG_ABOUT_COMP_INFO2", pvar, "level %d");
-			_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, pvar->ts->UIMsg,
+			UTIL_get_lang_msgU8("DLG_ABOUT_COMP_INFO2", uimsg, _countof(uimsg),
+								"level %d",
+								pvar->ts->UILanguageFile);
+			_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, uimsg,
 			            pvar->ssh_state.compression_level);
 		}
 	} else {
-		UTIL_get_lang_msg("DLG_ABOUT_COMP_NONE", pvar, "none");
-		strncpy_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+		UTIL_get_lang_msgU8("DLG_ABOUT_COMP_NONE", uimsg, _countof(uimsg),
+							"none",
+							pvar->ts->UILanguageFile);
+		strncpy_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 	}
 
-	UTIL_get_lang_msg("DLG_ABOUT_COMP_UPDOWN", pvar,
-	                  "Upstream %s; Downstream %s");
-	_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, buf, buf2);
+	UTIL_get_lang_msgU8("DLG_ABOUT_COMP_UPDOWN", uimsg, _countof(uimsg),
+						"Upstream %s; Downstream %s",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(dest, len, _TRUNCATE, uimsg, buf, buf2);
 }
 
 void SSH_get_server_ID_info(PTInstVar pvar, char *dest, int len)
@@ -3306,9 +3379,11 @@
 
 void SSH_get_mac_info(PTInstVar pvar, char *dest, int len)
 {
-	UTIL_get_lang_msg("DLG_ABOUT_MAC_INFO", pvar,
-	                  "%s to server, %s from server");
-	_snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
+	char uimsg[MAX_UIMSG];
+	UTIL_get_lang_msgU8("DLG_ABOUT_MAC_INFO", uimsg, _countof(uimsg),
+						"%s to server, %s from server",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(dest, len, _TRUNCATE, uimsg,
 	            get_ssh2_mac_name(pvar->macs[MODE_OUT]),
 	            get_ssh2_mac_name(pvar->macs[MODE_IN]));
 }
@@ -3507,6 +3582,7 @@
                       uint32 remote_channel_num,
                       unsigned char *buf, int len, int retry)
 {
+	char uimsg[MAX_UIMSG];
 	if (SSHv1(pvar)) {
 		unsigned char *outmsg =
 			begin_send_packet(pvar, SSH_MSG_CHANNEL_DATA, 8 + len);
@@ -3526,9 +3602,10 @@
 				pvar->ssh_state.outbuflen - 12;
 
 			if (deflate(&pvar->ssh_state.compress_stream, Z_NO_FLUSH) != Z_OK) {
-				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
-				                  "Error compressing packet data");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				UTIL_get_lang_msgU8("MSG_SSH_COMP_ERROR", uimsg, _countof(uimsg),
+									"Error compressing packet data",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 				return;
 			}
 
@@ -3538,9 +3615,10 @@
 
 			if (deflate(&pvar->ssh_state.compress_stream, Z_SYNC_FLUSH) !=
 				Z_OK) {
-				UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar,
-				                  "Error compressing packet data");
-				notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+				UTIL_get_lang_msgU8("MSG_SSH_COMP_ERROR", uimsg, _countof(uimsg),
+									"Error compressing packet data",
+									pvar->ts->UILanguageFile);
+				notify_fatal_error(pvar, uimsg, TRUE);
 				return;
 			}
 		} else {
@@ -3958,10 +4036,12 @@
 			c = ssh2_channel_new(CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, TYPE_PORTFWD, local_channel_num);
 			if (c == NULL) {
 				// \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)
+				char uimsg[MAX_UIMSG];
 				FWD_free_channel(pvar, local_channel_num);
-				UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-				                  "Could not open new channel. TTSSH is already opening too many channels.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+									"Could not open new channel. TTSSH is already opening too many channels.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 				return;
 			}
 
@@ -4013,6 +4093,19 @@
 //
 // (2007.12.21 yutaka)
 //
+static int MessageBoxU8(HWND hWnd, const char *textU8, const char *captionU8, UINT uType)
+{
+	const TCHAR *textT = ToTcharU8(textU8);
+	const TCHAR *captionT = ToTcharU8(captionU8);
+	int r = MessageBox(hWnd, textT, captionT, uType);
+	free((void *)captionT);
+	free((void *)textT);
+	return r;
+}
+
+#undef MessageBox
+#define MessageBox(p1,p2,p3,p4) MessageBoxU8(p1,p2,p3,p4)
+
 int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction)
 {
 	buffer_t *msg;
@@ -4033,9 +4126,11 @@
 	// \x83`\x83\x83\x83l\x83\x8B\x90ݒ\xE8
 	c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT, TYPE_SCP, -1);
 	if (c == NULL) {
-		UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-		                  "Could not open new channel. TTSSH is already opening too many channels.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+							"Could not open new channel. TTSSH is already opening too many channels.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		goto error;
 	}
 
@@ -4173,9 +4268,11 @@
 	// \x83`\x83\x83\x83l\x83\x8B\x90ݒ\xE8
 	c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT, TYPE_SFTP, -1);
 	if (c == NULL) {
-		UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-		                  "Could not open new channel. TTSSH is already opening too many channels.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+							"Could not open new channel. TTSSH is already opening too many channels.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		goto error;
 	}
 
@@ -5520,6 +5617,7 @@
 	buffer_t *msg = NULL;
 	unsigned char *outmsg;
 	char tmpbuf[256];
+	char uimsg[MAX_UIMSG];
 
 	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_KEX_DH_GEX_GROUP was received.");
 
@@ -5542,9 +5640,10 @@
 	//
 	if (grp_bits < GEX_GRP_LIMIT_MIN || grp_bits > GEX_GRP_LIMIT_MAX) {
 	// (1), (6) \x83v\x83\x8D\x83g\x83R\x83\x8B\x82ŔF\x82߂\xE7\x82\xEA\x82Ă\xA2\x82\xE9\x94͈\xCD(1024 <= grp_bits <= 8192)\x82̊O\x81B\x8B\xAD\x90\xA7\x90ؒf\x81B
-		UTIL_get_lang_msg("MSG_SSH_GEX_SIZE_OUTOFRANGE", pvar,
-		                  "Received group size is out of range: %d");
-		_snprintf_s(tmpbuf, sizeof(tmpbuf), _TRUNCATE, pvar->ts->UIMsg, grp_bits);
+		UTIL_get_lang_msgU8("MSG_SSH_GEX_SIZE_OUTOFRANGE", uimsg, _countof(uimsg),
+							"Received group size is out of range: %d",
+							pvar->ts->UILanguageFile);
+		_snprintf_s(tmpbuf, sizeof(tmpbuf), _TRUNCATE, uimsg, grp_bits);
 		notify_fatal_error(pvar, tmpbuf, FALSE);
 		goto error;
 	}
@@ -5552,10 +5651,11 @@
 	// (2) \x83v\x83\x8D\x83g\x83R\x83\x8B\x82ŔF\x82߂\xE7\x82\xEA\x82Ă\xA2\x82\xE9\x94͈͓\xE0\x82\xBE\x82\xAA\x81A\x82\xB1\x82\xBF\x82\xE7\x82̐ݒ肵\x82\xBD\x8Dŏ\xAC\x92l\x82\xE6\x82菬\x82\xB3\x82\xA2\x81B\x8Am\x94F\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8Fo\x82\xB7\x81B
 		logprintf(LOG_LEVEL_WARNING,
 		    "DH-GEX: grp_bits(%d) < kexgex_min(%d)", grp_bits, pvar->kexgex_min);
-		UTIL_get_lang_msg("MSG_SSH_GEX_SIZE_SMALLER", pvar,
-		                  "Received group size is smaller than the requested minimal size.\nrequested: %d, received: %d\nAre you sure that you want to accecpt received group?");
+		UTIL_get_lang_msgU8("MSG_SSH_GEX_SIZE_SMALLER", uimsg, _countof(uimsg),
+							"Received group size is smaller than the requested minimal size.\nrequested: %d, received: %d\nAre you sure that you want to accecpt received group?",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(tmpbuf, sizeof(tmpbuf), _TRUNCATE,
-			pvar->ts->UIMsg, pvar->kexgex_min, grp_bits);
+					uimsg, pvar->kexgex_min, grp_bits);
 	}
 	else if (grp_bits < pvar->kexgex_bits) {
 	// (3) \x97v\x8B\x81\x82̍ŏ\xAC\x92l\x82͖\x9E\x82\xBD\x82\xB7\x82\xAA\x81A\x97v\x8B\x81\x92l\x82\xE6\x82\xE8\x82͏\xAC\x82\xB3\x82\xA2\x81B\x8Am\x94F\x83_\x83C\x83A\x83\x8D\x83O\x82͏o\x82\xB3\x82Ȃ\xA2\x81B
@@ -5572,19 +5672,22 @@
 	//     \x82\xBD\x82\xBE\x82\xB5\x8C\xBB\x8F\xF3\x82ł\xCD kexgex_max == GEX_GRP_LIMIT_MAX(8192) \x82ł\xA0\x82\xE9\x88ׂ\xB1\x82̏󋵂ɂȂ鎖\x82͖\xB3\x82\xA2\x81B
 		logprintf(LOG_LEVEL_WARNING,
 			"DH-GEX: grp_bits(%d) > kexgex_max(%d)", grp_bits, pvar->kexgex_max);
-		UTIL_get_lang_msg("MSG_SSH_GEX_SIZE_LARGER", pvar,
-		                  "Received group size is larger than the requested maximal size.\nrequested: %d, received: %d\nAre you sure that you want to accecpt received group?");
+		UTIL_get_lang_msgU8("MSG_SSH_GEX_SIZE_LARGER", uimsg, _countof(uimsg),
+							"Received group size is larger than the requested maximal size.\nrequested: %d, received: %d\nAre you sure that you want to accecpt received group?",
+							pvar->ts->UILanguageFile);
 		_snprintf_s(tmpbuf, sizeof(tmpbuf), _TRUNCATE,
-			pvar->ts->UIMsg, pvar->kexgex_max, grp_bits);
+					uimsg, pvar->kexgex_max, grp_bits);
 	}
 	
 	if (tmpbuf[0] != 0) {
-		UTIL_get_lang_msg("MSG_SSH_GEX_SIZE_TITLE", pvar,
-		                  "TTSSH: Confirm GEX group size");
-		if (MessageBox(NULL, tmpbuf, pvar->ts->UIMsg, MB_YESNO | MB_ICONERROR) == IDNO) {
-			UTIL_get_lang_msg("MSG_SSH_GEX_SIZE_CANCEL", pvar,
-			                  "New connection is cancelled.");
-			notify_fatal_error(pvar, pvar->ts->UIMsg, FALSE);
+		UTIL_get_lang_msgU8("MSG_SSH_GEX_SIZE_TITLE", uimsg, _countof(uimsg),
+							"TTSSH: Confirm GEX group size",
+							pvar->ts->UILanguageFile);
+		if (MessageBox(NULL, tmpbuf, uimsg, MB_YESNO | MB_ICONERROR) == IDNO) {
+			UTIL_get_lang_msgU8("MSG_SSH_GEX_SIZE_CANCEL", uimsg, _countof(uimsg),
+								"New connection is cancelled.",
+								pvar->ts->UILanguageFile);
+			notify_fatal_error(pvar, uimsg, FALSE);
 			goto error;
 		}
 	}
@@ -6809,9 +6912,11 @@
 	}
 
 	if (c == NULL) {
-		UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-		                  "Could not open new channel. TTSSH is already opening too many channels.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		char uimsg[MAX_UIMSG];
+		UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+							"Could not open new channel. TTSSH is already opening too many channels.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return FALSE;
 	}
 	// \x83V\x83F\x83\x8B\x82\xCCID\x82\xF0\x8E\xE6\x82\xC1\x82Ă\xA8\x82\xAD
@@ -6855,6 +6960,7 @@
 	char *data;
 	char *cstring;
 	int partial;
+	char uimsg[MAX_UIMSG];
 
 	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_USERAUTH_FAILURE was received.");
 
@@ -6869,9 +6975,10 @@
 
 	// \x97L\x8C\xF8\x82ȔF\x8Fؕ\x{33AE0AA}\x82Ȃ\xA2\x8Fꍇ
 	if (cstring == NULL) {
-		UTIL_get_lang_msg("MSG_SSH_SERVER_NO_AUTH_METHOD_ERROR", pvar,
-		                  "The server doesn't have valid authentication method.");
-		notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
+		UTIL_get_lang_msgU8("MSG_SSH_SERVER_NO_AUTH_METHOD_ERROR", uimsg, _countof(uimsg),
+							"The server doesn't have valid authentication method.",
+							pvar->ts->UILanguageFile);
+		notify_fatal_error(pvar, uimsg, TRUE);
 		return FALSE;
 	}
 
@@ -6937,18 +7044,17 @@
 	}
 
 	if (pvar->ssh2_autologin == 1) {
-		char uimsg[MAX_UIMSG];
 		// SSH2\x8E\xA9\x93\xAE\x83\x8D\x83O\x83C\x83\x93\x82\xAA\x97L\x8C\xF8\x82̏ꍇ\x82́A\x83\x8A\x83g\x83\x89\x83C\x82͍s\x82\xED\x82Ȃ\xA2\x81B(2004.12.4 yutaka)
-		UTIL_get_lang_msg("MSG_SSH_AUTH_FAILURE_ERROR", pvar,
-		                  "SSH2 auto-login error: user authentication failed.");
-		strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
+		UTIL_get_lang_msgU8("MSG_SSH_AUTH_FAILURE_ERROR", uimsg, _countof(uimsg),
+							"SSH2 auto-login error: user authentication failed.",
+							pvar->ts->UILanguageFile);
 
 		if (pvar->ssh2_authlist != NULL || strlen(pvar->ssh2_authlist) != 0) {
 			if ((pvar->auth_state.supported_types & (1 << pvar->ssh2_authmethod)) == 0) {
 				// \x8Eg\x97p\x82\xB5\x82\xBD\x94F\x8F؃\x81\x83\\x83b\x83h\x82̓T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82Ă\xA2\x82Ȃ\xA9\x82\xC1\x82\xBD
-				UTIL_get_lang_msg("MSG_SSH_SERVER_UNSUPPORT_AUTH_METHOD_ERROR", pvar,
-				                  "\nAuthentication method is not supported by server.");
-				strncat_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
+				UTIL_get_lang_msgU8("MSG_SSH_SERVER_UNSUPPORT_AUTH_METHOD_ERROR", uimsg, _countof(uimsg),
+									"\nAuthentication method is not supported by server.",
+									pvar->ts->UILanguageFile);
 			}
 		}
 		notify_fatal_error(pvar, uimsg, TRUE);
@@ -7371,7 +7477,6 @@
 //	LOGFONT logfont;
 //	HFONT font;
 //	static HFONT DlgChgPassFont;
-//	char uimsg[MAX_UIMSG];
 	static PTInstVar pvar;
 
 
@@ -7394,7 +7499,7 @@
 		SetDlgTexts(dlg, text_info, _countof(text_info), pvar->ts->UILanguageFile);
 #if 0
 		GetWindowText(dlg, uimsg, sizeof(uimsg));
-		UTIL_get_lang_msg("DLG_PASSCHG_TITLE", pvar, uimsg);
+		UTIL_get_lang_msg("DLG_PASSCHG_TITLE", pvar, uimsg)
 		SetWindowText(dlg, pvar->ts->UIMsg);
 
 		GetDlgItemText(dlg, IDC_PASSWD_CHANGEREQ_MSG, uimsg, sizeof(uimsg));
@@ -7425,8 +7530,11 @@
 			GetDlgItemTextA(dlg, IDC_CONFIRM_PASSWD, retype_passwd, sizeof(retype_passwd));
 
 			if (strcmp(new_passwd, retype_passwd) == 1) {
-				UTIL_get_lang_msg("MSG_PASSCHG_MISMATCH", pvar, "Mismatch; try again.");
-				MessageBox(NULL, pvar->ts->UIMsg, "ERROR", MB_OK | MB_ICONEXCLAMATION);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_PASSCHG_MISMATCH", uimsg, _countof(uimsg),
+									"Mismatch; try again.",
+									pvar->ts->UILanguageFile);
+				MessageBox(NULL, uimsg, "ERROR", MB_OK | MB_ICONEXCLAMATION);
 				return FALSE;
 			}
 
@@ -7807,6 +7915,7 @@
 	char *cstring;
 	char tmpbuf[256];
 	char *rmsg;
+	char uimsg[MAX_UIMSG];
 
 	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_CHANNEL_OPEN_FAILURE was received.");
 
@@ -7845,9 +7954,10 @@
 	if (cstring == NULL) {
 		logputs(LOG_LEVEL_ERROR, __FUNCTION__ ": buffer_get_string returns NULL");
 	}
-	UTIL_get_lang_msg("MSG_SSH_CHANNEL_OPEN_ERROR", pvar,
-	                  "SSH2_MSG_CHANNEL_OPEN_FAILURE was received.\r\nchannel [%d]: reason: %s(%d) message: %s");
-	_snprintf_s(tmpbuf, sizeof(tmpbuf), _TRUNCATE, pvar->ts->UIMsg,
+	UTIL_get_lang_msgU8("MSG_SSH_CHANNEL_OPEN_ERROR", uimsg, _countof(uimsg),
+						"SSH2_MSG_CHANNEL_OPEN_FAILURE was received.\r\nchannel [%d]: reason: %s(%d) message: %s",
+						pvar->ts->UILanguageFile);
+	_snprintf_s(tmpbuf, sizeof(tmpbuf), _TRUNCATE, uimsg,
 	            id, rmsg, reason, NonNull(cstring));
 	notify_nonfatal_error(pvar, tmpbuf);
 
@@ -8024,8 +8134,10 @@
 		if (c->type == TYPE_SUBSYSTEM_GEN) {
 			// \x83T\x83u\x83V\x83X\x83e\x83\x80\x82̋N\x93\xAE\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x82̂Ő؂\xE9\x81B
 			char errmsg[MAX_UIMSG];
-			UTIL_get_lang_msg("MSG_SSH_SUBSYSTEM_REQUEST_ERROR", pvar, "subsystem request failed. (%s)");
-			_snprintf_s(errmsg, sizeof(errmsg), _TRUNCATE, pvar->ts->UIMsg, pvar->subsystem_name);
+			UTIL_get_lang_msgU8("MSG_SSH_SUBSYSTEM_REQUEST_ERROR",
+								errmsg, _countof(errmsg),
+								"subsystem request failed. (%s)",
+								pvar->ts->UILanguageFile);
 			notify_fatal_error(pvar, errmsg, TRUE);
 			return TRUE;
 		}
@@ -9025,10 +9137,12 @@
 			c = ssh2_channel_new(CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, TYPE_PORTFWD, chan_num);
 			if (c == NULL) {
 				// \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)
+				char uimsg[MAX_UIMSG];
 				FWD_free_channel(pvar, chan_num);
-				UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-				                  "Could not open new channel. TTSSH is already opening too many channels.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+									"Could not open new channel. TTSSH is already opening too many channels.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 				return FALSE;
 			}
 			c->remote_id = remote_id;
@@ -9067,10 +9181,12 @@
 		c = ssh2_channel_new(CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, TYPE_PORTFWD, chan_num);
 		if (c == NULL) {
 			// \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)
+			char uimsg[MAX_UIMSG];
 			FWD_free_channel(pvar, chan_num);
-			UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-			                  "Could not open new channel. TTSSH is already opening too many channels.");
-			notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+								"Could not open new channel. TTSSH is already opening too many channels.",
+								pvar->ts->UILanguageFile);
+			notify_nonfatal_error(pvar, uimsg);
 			return FALSE;
 		}
 		c->remote_id = remote_id;
@@ -9081,9 +9197,11 @@
 		if (pvar->agentfwd_enable && FWD_agent_forward_confirm(pvar)) {
 			c = ssh2_channel_new(CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, TYPE_AGENT, -1);
 			if (c == NULL) {
-				UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar,
-				                  "Could not open new channel. TTSSH is already opening too many channels.");
-				notify_nonfatal_error(pvar, pvar->ts->UIMsg);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_SSH_NO_FREE_CHANNEL", uimsg, _countof(uimsg),
+									"Could not open new channel. TTSSH is already opening too many channels.",
+									pvar->ts->UILanguageFile);
+				notify_nonfatal_error(pvar, uimsg);
 				return FALSE;
 			}
 			c->remote_id = remote_id;
@@ -9347,11 +9465,14 @@
 				"size=%u, allowd max=%u.", req_len, AGENT_MAX_MSGLEN-4);
 			if (pvar->session_settings.ForwardAgentNotify) {
 				char title[MAX_UIMSG];
-				UTIL_get_lang_msg("MSG_SSH_AGENTERROR_TITLE", pvar, "Bad agent request");
-				strncpy_s(title, sizeof(title), pvar->ts->UIMsg, _TRUNCATE);
-				UTIL_get_lang_msg("MSG_SSH_AGENTERROR_TOOLARGE", pvar,
-					"Agent request size is too large, ignore it.");
-				NotifyInfoMessage(pvar->cv, pvar->ts->UIMsg, title);
+				char uimsg[MAX_UIMSG];
+				UTIL_get_lang_msgU8("MSG_SSH_AGENTERROR_TITLE", title, _countof(title),
+									"Bad agent request",
+									pvar->ts->UILanguageFile);
+				UTIL_get_lang_msgU8("MSG_SSH_AGENTERROR_TOOLARGE", uimsg, _countof(uimsg),
+									"Agent request size is too large, ignore it.",
+									pvar->ts->UILanguageFile);
+				NotifyInfoMessage(pvar->cv, uimsg, title);
 			}
 
 			goto error;

Modified: branches/cmake/ttssh2/ttxssh/ttxssh.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/ttxssh.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/ttxssh.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -77,6 +77,7 @@
 #include "cipher.h"
 #include "key.h"
 #include "dlglib.h"
+#include "codeconv.h"
 
 #include "sftp.h"
 
@@ -91,12 +92,12 @@
 #define GetPrivateProfileInt GetPrivateProfileIntA
 #undef WritePrivateProfileString
 #define WritePrivateProfileString WritePrivateProfileStringA
-#undef MessageBox
-#define MessageBox MessageBoxA
 #undef GetDlgItemText
 #define GetDlgItemText GetDlgItemTextA
+#if 0
 #undef SetDlgItemText
 #define SetDlgItemText SetDlgItemTextA
+#endif
 #undef GetWindowText
 #define GetWindowText GetWindowTextA
 #undef SetWindowText
@@ -103,6 +104,12 @@
 #define SetWindowText SetWindowTextA
 #endif
 
+#if defined(UNICODE)
+#define GetDlgItemTextT GetDlgItemTextW
+#else
+#define GetDlgItemTextT GetDlgItemTextA
+#endif
+
 #undef DialogBoxParam
 #define DialogBoxParam(p1,p2,p3,p4,p5) \
 	TTDialogBoxParam(p1,p2,p3,p4,p5)
@@ -971,9 +978,12 @@
 		// 未接続の状態では通知先ウィンドウがないので、デスクトップをオーナーとして
 		// メッセージボックスを出現させる。(2006.6.11 yutaka)
 		if (pvar->NotificationWindow == NULL) {
-			UTIL_get_lang_msg("MSG_NONFATAL_ERROR", pvar,
-			                  "Tera Term: not fatal error");
-			MessageBox(NULL, msg, pvar->ts->UIMsg, MB_OK|MB_ICONINFORMATION);
+			const TCHAR *msgT = ToTcharU8(msg);
+			TCHAR uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgT("MSG_NONFATAL_ERROR", uimsg, _countof(uimsg),
+							   _T("Tera Term: not fatal error"), pvar->ts->UILanguageFile);
+			MessageBox(NULL, msgT, uimsg, MB_OK|MB_ICONINFORMATION);
+			free((void *)msgT);
 			msg[0] = '\0';
 
 		} else {
@@ -1590,10 +1600,11 @@
 					if (Ok) {
 						GetHNRec->TCPPort = i;
 					} else {
-						UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
-						                  "The TCP port must be a number.");
-						MessageBox(dlg, pvar->ts->UIMsg,
-						           "Tera Term", MB_OK | MB_ICONEXCLAMATION);
+						TCHAR uimsg[MAX_UIMSG];
+						UTIL_get_lang_msgT("MSG_TCPPORT_NAN_ERROR", uimsg, _countof(uimsg),
+										   _T("The TCP port must be a number."), pvar->ts->UILanguageFile);
+						MessageBox(dlg, uimsg,
+						           _T("Tera Term"), MB_OK | MB_ICONEXCLAMATION);
 						return TRUE;
 					}
 #define getaf(str) \
@@ -1984,13 +1995,14 @@
 					pvar->settings.ssh_protocol_version = 2;
 
 				} else {
-					char buf[1024];
+					TCHAR buf[1024];
+					TCHAR uimsg[MAX_UIMSG];
 
-					UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
-					                  "Unrecognized command-line option: %s");
-					_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
+					UTIL_get_lang_msgT("MSG_UNKNOWN_OPTION_ERROR", uimsg, _countof(uimsg),
+									   _T("Unrecognized command-line option: %s"), pvar->ts->UILanguageFile);
+					_sntprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg, option);
 
-					MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
+					MessageBox(NULL, buf, _T("TTSSH"), MB_OK | MB_ICONEXCLAMATION);
 				}
 
 			// ttermpro.exe の /T= 指定の流用なので、大文字も許す (2006.10.19 maya)
@@ -2272,7 +2284,8 @@
 	pvar->FileMenu = GetFileMenu(menu);
 
 	/* inserts before ID_HELP_ABOUT */
-	UTIL_get_lang_msgT("MENU_ABOUT", uimsg, _countof(uimsg), _T("About &TTSSH..."), UILanguageFile);
+	UTIL_get_lang_msgT("MENU_ABOUT", uimsg, _countof(uimsg),
+					   _T("About &TTSSH..."), UILanguageFile);
 	insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, uimsg);
 
 	/* inserts before ID_SETUP_TCPIP */
@@ -2303,8 +2316,10 @@
 
 static void about_dlg_set_abouttext(PTInstVar pvar, HWND dlg, digest_algorithm dgst_alg)
 {
+	char uimsg[MAX_UIMSG];
 	char buf[1024], buf2[2048];
 	char *fp = NULL;
+	const char *lang = pvar->ts->UILanguageFile;
 
 	// TTSSHダイアログに表示するSSHに関する情報 (2004.10.30 yutaka)
 	if (pvar->socket != INVALID_SOCKET) {
@@ -2311,43 +2326,43 @@
 		buf2[0] = '\0';
 
 		if (SSHv1(pvar)) {
-			UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_SERVERID", uimsg, _countof(uimsg), "Server ID:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_server_ID_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_PROTOCOL", uimsg, _countof(uimsg), "Using protocol:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_ENCRYPTION", uimsg, _countof(uimsg), "Encryption:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_SERVERKEY", uimsg, _countof(uimsg), "Server keys:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_AUTH", uimsg, _countof(uimsg), "Authentication:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			AUTH_get_auth_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_COMP", uimsg, _countof(uimsg), "Compression:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_compression_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
@@ -2354,47 +2369,47 @@
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
 		} else { // SSH2
-			UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_SERVERID", uimsg, _countof(uimsg), "Server ID:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_server_ID_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_CLIENTID", uimsg, _countof(uimsg), "Client ID:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), pvar->client_version_string, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_PROTOCOL", uimsg, _countof(uimsg), "Using protocol:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_KEX", pvar, "Key exchange algorithm:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_KEX", uimsg, _countof(uimsg), "Key exchange algorithm:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), get_kex_algorithm_name(pvar->kex_type), _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_HOSTKEY", uimsg, _countof(uimsg), "Host Key:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), get_ssh_keytype_name(pvar->hostkey_type), _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_ENCRYPTION", uimsg, _countof(uimsg), "Encryption:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_MAC", pvar, "MAC algorithm:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_MAC", uimsg, _countof(uimsg), "MAC algorithm:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_mac_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
@@ -2401,26 +2416,26 @@
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
 			if (pvar->ctos_compression == COMP_DELAYED) { // 遅延パケット圧縮の場合 (2006.6.23 yutaka)
-				UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression:");
+				UTIL_get_lang_msgU8("DLG_ABOUT_COMPDELAY", uimsg, _countof(uimsg), "Delayed Compression:", lang);
 			}
 			else {
-				UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
+				UTIL_get_lang_msgU8("DLG_ABOUT_COMP", uimsg, _countof(uimsg), "Compression:", lang);
 			}
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			SSH_get_compression_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_KEXKEY", pvar, "Key exchange keys:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_KEXKEY", uimsg, _countof(uimsg), "Key exchange keys:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
-			UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
-			strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("DLG_ABOUT_AUTH", uimsg, _countof(uimsg), "Authentication:", lang);
+			strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 			strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
 			AUTH_get_auth_info(pvar, buf, sizeof(buf));
 			strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
@@ -2429,8 +2444,8 @@
 
 		// ホスト公開鍵のfingerprintを表示する。
 		// (2014.5.1 yutaka)
-		UTIL_get_lang_msg("DLG_ABOUT_FINGERPRINT", pvar, "Host key's fingerprint:");
-		strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
+		UTIL_get_lang_msgU8("DLG_ABOUT_FINGERPRINT", uimsg, _countof(uimsg), "Host key's fingerprint:", lang);
+		strncat_s(buf2, sizeof(buf2), uimsg, _TRUNCATE);
 		strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
 
 		switch (dgst_alg) {
@@ -2455,7 +2470,12 @@
 		strncat_s(buf2, sizeof(buf2), fp, _TRUNCATE);
 		free(fp);
 
-		SetDlgItemTextA(dlg, IDC_ABOUTTEXT, buf2);
+
+		{
+			const TCHAR *strT = ToTcharU8(buf2);
+			SetDlgItemText(dlg, IDC_ABOUTTEXT, strT);
+			free((void *)strT);
+		}
 	}
 }
 
@@ -2553,7 +2573,7 @@
 static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,
                                  LPARAM lParam)
 {
-	LOGFONTA logfont;
+//	LOGFONTA logfont;
 //	HFONT font;
 
 	switch (msg) {
@@ -2580,8 +2600,10 @@
 			DlgAboutFont = NULL;
 		}
 #endif
+
 		// Edit controlは等幅フォントで表示したいので、別設定情報からフォントをセットする。
 		// (2014.5.5. yutaka)
+#if 0
 		if (UTIL_get_lang_font("DLG_ABOUT_FONT", dlg, &logfont, &DlgAboutTextFont, pvar)) {
 			SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETFONT, (WPARAM)DlgAboutTextFont, MAKELPARAM(TRUE,0));
 		} else {
@@ -2599,6 +2621,9 @@
 				DlgAboutTextFont = NULL;
 			}
 		}
+#else
+		DlgAboutTextFont = NULL;
+#endif
 
 		// アイコンを動的にセット
 		{
@@ -2663,13 +2688,14 @@
 	return FALSE;
 }
 
-static char *get_cipher_name(int cipher)
+static char *get_cipher_name(int cipher, char *name, int len)
 {
 	switch (cipher) {
 	case SSH_CIPHER_NONE:
-		UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_BORDER", pvar,
-		                  "<ciphers below this line are disabled>");
-		return pvar->ts->UIMsg;
+		UTIL_get_lang_msgU8("DLG_SSHSETUP_CIPHER_BORDER", name, len,
+							"<ciphers below this line are disabled>",
+							pvar->ts->UILanguageFile);
+		return name;
 	case SSH_CIPHER_3DES:
 		return "3DES(SSH1)";
 	case SSH_CIPHER_DES:
@@ -2754,12 +2780,12 @@
 	HWND hostkeyRotationControlList = GetDlgItem(dlg, IDC_HOSTKEY_ROTATION_COMBO);
 	int i;
 	int ch;
-	char *rotationItem[SSH_UPDATE_HOSTKEYS_MAX] = {
-		"No",
-		"Yes",
-		"Ask",
+	static const TCHAR *rotationItem[SSH_UPDATE_HOSTKEYS_MAX] = {
+		_T("No"),
+		_T("Yes"),
+		_T("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",
@@ -2931,10 +2957,12 @@
 
 	for (i = 0; pvar->settings.CipherOrder[i] != 0; i++) {
 		int cipher = pvar->settings.CipherOrder[i] - '0';
-		char *name = get_cipher_name(cipher);
-
+		char buf[64];
+		char *name = get_cipher_name(cipher, buf, _countof(buf));
 		if (name != NULL) {
-			SendMessageA(cipherControl, LB_ADDSTRING, 0, (LPARAM) name);
+			const TCHAR *strT = ToTcharU8(name);
+			SendMessage(cipherControl, LB_ADDSTRING, 0, (LPARAM)strT);
+			free((void *)strT);
 		}
 	}
 
@@ -2946,17 +2974,21 @@
 	for (i = 0; pvar->settings.KexOrder[i] != 0; i++) {
 		int index = pvar->settings.KexOrder[i] - '0';
 		char *name = NULL;
+		char b[64];
 
 		if (index == 0)	{
-			UTIL_get_lang_msg("DLG_SSHSETUP_KEX_BORDER", pvar,
-							  "<KEXs below this line are disabled>");
-			name = pvar->ts->UIMsg;
+			UTIL_get_lang_msgU8("DLG_SSHSETUP_KEX_BORDER", b, _countof(b),
+								"<KEXs below this line are disabled>",
+								pvar->ts->UILanguageFile);
+			name = b;
 		} else {
 			name = get_kex_algorithm_name(index);
 		}
 
 		if (name != NULL) {
-			SendMessageA(kexControl, LB_ADDSTRING, 0, (LPARAM) name);
+			const TCHAR *strT = ToTcharU8(name);
+			SendMessage(kexControl, LB_ADDSTRING, 0, (LPARAM) strT);
+			free((void *)strT);
 		}
 	}
 	SendMessage(kexControl, LB_SETCURSEL, 0, 0);
@@ -2967,17 +2999,21 @@
 	for (i = 0; pvar->settings.HostKeyOrder[i] != 0; i++) {
 		int index = pvar->settings.HostKeyOrder[i] - '0';
 		char *name = NULL;
+		char b[64];
 
 		if (index == 0)	{
-			UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY_BORDER", pvar,
-							  "<Host Keys below this line are disabled>");
-			name = pvar->ts->UIMsg;
+			UTIL_get_lang_msgU8("DLG_SSHSETUP_HOST_KEY_BORDER", b, _countof(b),
+								"<Host Keys below this line are disabled>",
+								pvar->ts->UILanguageFile);
+			name = b;
 		} else {
 			name = get_ssh_keytype_name(index);
 		}
 
 		if (name != NULL) {
-			SendMessageA(hostkeyControl, LB_ADDSTRING, 0, (LPARAM) name);
+			const TCHAR *strT = ToTcharU8(name);
+			SendMessage(hostkeyControl, LB_ADDSTRING, 0, (LPARAM) name);
+			free((void *)strT);
 		}
 	}
 	SendMessage(hostkeyControl, LB_SETCURSEL, 0, 0);
@@ -2988,17 +3024,21 @@
 	for (i = 0; pvar->settings.MacOrder[i] != 0; i++) {
 		int index = pvar->settings.MacOrder[i] - '0';
 		char *name = NULL;
+		char b[64];
 
 		if (index == 0)	{
-			UTIL_get_lang_msg("DLG_SSHSETUP_MAC_BORDER", pvar,
-							  "<MACs below this line are disabled>");
-			name = pvar->ts->UIMsg;
+			UTIL_get_lang_msgU8("DLG_SSHSETUP_MAC_BORDER", b, _countof(b),
+								"<MACs below this line are disabled>",
+								pvar->ts->UILanguageFile);
+			name = b;
 		} else {
 			name = get_ssh2_mac_name_by_id(index);
 		}
 
 		if (name != NULL) {
-			SendMessageA(macControl, LB_ADDSTRING, 0, (LPARAM) name);
+			const TCHAR *strT = ToTcharU8(name);
+			SendMessage(macControl, LB_ADDSTRING, 0, (LPARAM) name);
+			free((void *)strT);
 		}
 	}
 	SendMessage(macControl, LB_SETCURSEL, 0, 0);
@@ -3009,17 +3049,21 @@
 	for (i = 0; pvar->settings.CompOrder[i] != 0; i++) {
 		int index = pvar->settings.CompOrder[i] - '0';
 		char *name = NULL;
+		char b[64];
 
 		if (index == 0)	{
-			UTIL_get_lang_msg("DLG_SSHSETUP_COMP_BORDER", pvar,
-							  "<Compression methods below this line are disabled>");
-			name = pvar->ts->UIMsg;
+			UTIL_get_lang_msgU8("DLG_SSHSETUP_COMP_BORDER", b, _countof(b),
+								"<Compression methods below this line are disabled>",
+								pvar->ts->UILanguageFile);
+			name = b;
 		} else {
 			name = get_ssh2_comp_name(index);
 		}
 
 		if (name != NULL) {
+			const TCHAR *strT = ToTcharU8(name);
 			SendMessageA(compControl, LB_ADDSTRING, 0, (LPARAM) name);
+			free((void *)strT);
 		}
 	}
 	SendMessage(compControl, LB_SETCURSEL, 0, 0);
@@ -3030,13 +3074,13 @@
 	}
 	if (ch != 0) {
 		pvar->settings.KnownHostsFiles[i] = 0;
-		SetDlgItemText(dlg, IDC_READWRITEFILENAME,
+		SetDlgItemTextA(dlg, IDC_READWRITEFILENAME,
 		               pvar->settings.KnownHostsFiles);
 		pvar->settings.KnownHostsFiles[i] = ch;
-		SetDlgItemText(dlg, IDC_READONLYFILENAME,
+		SetDlgItemTextA(dlg, IDC_READONLYFILENAME,
 		               pvar->settings.KnownHostsFiles + i + 1);
 	} else {
-		SetDlgItemText(dlg, IDC_READWRITEFILENAME,
+		SetDlgItemTextA(dlg, IDC_READWRITEFILENAME,
 		               pvar->settings.KnownHostsFiles);
 	}
 
@@ -3045,7 +3089,7 @@
 		char buf[10];
 		_snprintf_s(buf, sizeof(buf), _TRUNCATE,
 		            "%d", pvar->settings.ssh_heartbeat_overtime);
-		SetDlgItemText(dlg, IDC_HEARTBEAT_EDIT, buf);
+		SetDlgItemTextA(dlg, IDC_HEARTBEAT_EDIT, buf);
 	}
 
 	if (pvar->settings.remember_password) {
@@ -3075,8 +3119,9 @@
 
 	// hostkey rotation(OpenSSH 6.8)
 	for (i = 0; i < SSH_UPDATE_HOSTKEYS_MAX; i++) {
-		UTIL_get_lang_msg(rotationItemKey[i], pvar, rotationItem[i]);
-		SendMessage(hostkeyRotationControlList, CB_INSERTSTRING, i, (LPARAM)pvar->ts->UIMsg);
+		TCHAR uimsg[128];
+		UTIL_get_lang_msgT(rotationItemKey[i], uimsg, _countof(uimsg), rotationItem[i], pvar->ts->UILanguageFile);
+		SendMessage(hostkeyRotationControlList, CB_INSERTSTRING, i, (LPARAM)uimsg);
 	}
 	ch = pvar->settings.UpdateHostkeys;
 	if (!(ch >= 0 && ch < SSH_UPDATE_HOSTKEYS_MAX))
@@ -3111,7 +3156,7 @@
 }
 
 int copy_teraterm_dir_relative_path(char *dest, int destsize,
-                                    char *basename)
+                                    const char *basename)
 {
 	char buf[1024];
 	int filename_start = 0;
@@ -3173,7 +3218,8 @@
 			buf[0] = 0;
 			SendMessage(cipherControl, LB_GETTEXT, i, (LPARAM) buf);
 			for (j = 0; j <= SSH_CIPHER_MAX; j++) {
-				char *cipher_name = get_cipher_name(j);
+				char b[64];
+				char *cipher_name = get_cipher_name(j, b, _countof(b));
 				if (cipher_name != NULL && strcmp(buf, cipher_name) == 0) {
 					break;
 				}
@@ -3371,8 +3417,9 @@
 static int get_keys_file_name(HWND parent, char *buf, int bufsize,
                               int readonly)
 {
-	OPENFILENAMEA params;
-	char fullname_buf[2048] = "ssh_known_hosts";
+	OPENFILENAME params;
+	TCHAR fullname_buf[2048] = _T("ssh_known_hosts");
+	TCHAR title[MAX_UIMSG];
 
 	params.lStructSize = sizeof(OPENFILENAME);
 	params.hwndOwner = parent;
@@ -3385,30 +3432,35 @@
 	params.lpstrFileTitle = NULL;
 	params.lpstrInitialDir = NULL;
 	if (readonly) {
-		UTIL_get_lang_msg("MSG_OPEN_KNOWNHOSTS_RO_TITLE", pvar,
-		                  "Choose a read-only known-hosts file to add");
+		UTIL_get_lang_msgT("MSG_OPEN_KNOWNHOSTS_RO_TITLE", title, _countof(title),
+						   _T("Choose a read-only known-hosts file to add"),
+						   pvar->ts->UILanguageFile);
 	}
 	else {
-		UTIL_get_lang_msg("MSG_OPEN_KNOWNHOSTS_RW_TITLE", pvar,
-		                  "Choose a read/write known-hosts file");
+		UTIL_get_lang_msgT("MSG_OPEN_KNOWNHOSTS_RW_TITLE",  title, _countof(title),
+						   _T("Choose a read/write known-hosts file"),
+						   pvar->ts->UILanguageFile);
 	}
-	params.lpstrTitle = pvar->ts->UIMsg;
+	params.lpstrTitle = title;
 	params.Flags = (readonly ? OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST : 0)
 	             | OFN_HIDEREADONLY | (!readonly ? OFN_NOREADONLYRETURN : 0);
 	params.lpstrDefExt = NULL;
 
-	if (GetOpenFileNameA(&params) != 0) {
-		copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
+	if (GetOpenFileName(&params) != 0) {
+		const char *astr = ToCharT(fullname_buf);
+		copy_teraterm_dir_relative_path(buf, bufsize, astr);
+		free((void *)astr);
 		return 1;
 	} else {
 		int err = CommDlgExtendedError();
 
 		if (err != 0) {
-			char buf[1024];
-			UTIL_get_lang_msg("MSG_OPEN_FILEDLG_KNOWNHOSTS_ERROR", pvar,
-			                  "Unable to display file dialog box: error %d");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, err);
-			MessageBox(parent, buf, "TTSSH Error",
+			TCHAR buf[1024];
+			TCHAR uimsg[MAX_UIMSG];
+			UTIL_get_lang_msgT("MSG_OPEN_FILEDLG_KNOWNHOSTS_ERROR", uimsg, _countof(uimsg),
+							   _T("Unable to display file dialog box: error %d"), pvar->ts->UILanguageFile);
+			_sntprintf_s(buf, sizeof(buf), _TRUNCATE, uimsg, err);
+			MessageBox(parent, buf, _T("TTSSH Error"),
 			           MB_OK | MB_ICONEXCLAMATION);
 		}
 
@@ -3421,7 +3473,7 @@
 	char buf[1024];
 
 	if (get_keys_file_name(dlg, buf, sizeof(buf), 0)) {
-		SetDlgItemText(dlg, IDC_READWRITEFILENAME, buf);
+		SetDlgItemTextA(dlg, IDC_READWRITEFILENAME, buf);
 	}
 }
 
@@ -3432,12 +3484,12 @@
 
 	if (get_keys_file_name(dlg, buf, sizeof(buf), 1)) {
 		buf2[0] = 0;
-		GetDlgItemText(dlg, IDC_READONLYFILENAME, buf2, sizeof(buf2));
+		GetDlgItemTextA(dlg, IDC_READONLYFILENAME, buf2, sizeof(buf2));
 		if (buf2[0] != 0 && buf2[strlen(buf2) - 1] != ';') {
 			strncat_s(buf2, sizeof(buf2), ";", _TRUNCATE);
 		}
 		strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
-		SetDlgItemText(dlg, IDC_READONLYFILENAME, buf2);
+		SetDlgItemTextA(dlg, IDC_READONLYFILENAME, buf2);
 	}
 }
 
@@ -3752,11 +3804,13 @@
 	case KEY_ECDSA384:
 	case KEY_ECDSA521:
 	{
+		TCHAR uimsg[MAX_UIMSG];
 		EC_KEY *priv = NULL;
 		EC_KEY *pub = NULL;
 
-		UTIL_get_lang_msg("MSG_KEYGEN_GENERATING", pvar, "generating key");
-		SetDlgItemText(((cbarg_t *)cbarg)->dlg, IDC_KEYGEN_PROGRESS_LABEL, pvar->ts->UIMsg);
+		UTIL_get_lang_msgT("MSG_KEYGEN_GENERATING", uimsg, _countof(uimsg),
+						   _T("generating key"), pvar->ts->UILanguageFile);
+		SetDlgItemText(((cbarg_t *)cbarg)->dlg, IDC_KEYGEN_PROGRESS_LABEL, uimsg);
 
 		priv = EC_KEY_new_by_curve_name(keytype_to_cipher_nid(type));
 		pub = EC_KEY_new_by_curve_name(keytype_to_cipher_nid(type));
@@ -3777,8 +3831,9 @@
 		}
 		public_key.ecdsa = pub;
 
-		UTIL_get_lang_msg("MSG_KEYGEN_GENERATED", pvar, "key generated");
-		SetDlgItemText(((cbarg_t *)cbarg)->dlg, IDC_KEYGEN_PROGRESS_LABEL, pvar->ts->UIMsg);
+		UTIL_get_lang_msgT("MSG_KEYGEN_GENERATED", uimsg, _countof(uimsg),
+						   _T("key generated"), pvar->ts->UILanguageFile);
+		SetDlgItemText(((cbarg_t *)cbarg)->dlg, IDC_KEYGEN_PROGRESS_LABEL, uimsg);
 
 		break;
 	}
@@ -4236,8 +4291,8 @@
 	switch (phase) {
 	case 0:
 		if (count == 0) {
-			UTIL_get_lang_msg("MSG_KEYGEN_GENERATING", pvar, "generating key");
-			strncpy_s(msg, sizeof(msg), pvar->ts->UIMsg, _TRUNCATE);
+			UTIL_get_lang_msgU8("MSG_KEYGEN_GENERATING", msg, _countof(msg),
+								"generating key", pvar->ts->UILanguageFile);
 		}
 		if (cbarg->type == KEY_DSA && count %10 != 0) {
 			return;
@@ -4259,8 +4314,7 @@
 			return;
 		}
 		else {
-			UTIL_get_lang_msg("MSG_KEYGEN_GENERATED", pvar, "key generated");
-			_snprintf_s(buff, sizeof(buff), _TRUNCATE, "%s", pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_KEYGEN_GENERATED", buff, sizeof(buff), "key generated", pvar->ts->UILanguageFile);
 		}
 		break;
 	default:
@@ -4267,7 +4321,11 @@
 		return;
 	}
 
-	SetDlgItemText(cbarg->dlg, IDC_KEYGEN_PROGRESS_LABEL, buff);
+	{
+		const TCHAR *strT = ToTcharU8(buff);
+		SetDlgItemText(cbarg->dlg, IDC_KEYGEN_PROGRESS_LABEL, strT);
+		free((void *)strT);
+	}
 	return;
 }
 
@@ -4282,7 +4340,7 @@
 
 // bcrypt KDF形式で秘密鍵を保存する
 // based on OpenSSH 6.5:key_save_private(), key_private_to_blob2()
-static void save_bcrypt_private_key(char *passphrase, char *filename, char *comment, HWND dlg, PTInstVar pvar, int rounds)
+ static void save_bcrypt_private_key(char *passphrase, const TCHAR *filename, char *comment, HWND dlg, PTInstVar pvar, int rounds)
 {
 	SSH2Cipher *cipher = NULL;
 	char *ciphername = DEFAULT_CIPHERNAME;
@@ -4298,7 +4356,8 @@
 	unsigned char *cp = NULL;
 	unsigned int len, check;
 	FILE *fp;
-	char uimsg[MAX_UIMSG];
+	TCHAR uimsg1[MAX_UIMSG];
+	TCHAR uimsg2[MAX_UIMSG];
 
 	b = buffer_init();
 	kdf = buffer_init();
@@ -4405,22 +4464,24 @@
 	len = buffer_len(blob);
 
 	// 秘密鍵をファイルに保存する。
-	fp = fopen(filename, "wb");
+	fp = _tfopen(filename, _T("wb"));
 	if (fp == NULL) {
-		UTIL_get_lang_msg("MSG_SAVE_KEY_OPENFILE_ERROR", pvar,
-		                  "Can't open key file");
-		strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-		UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-		MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+		UTIL_get_lang_msgT("MSG_SAVE_KEY_OPENFILE_ERROR", uimsg1, _countof(uimsg1),
+						   _T("Can't open key file"), pvar->ts->UILanguageFile);
+		UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+						   _T("ERROR"), pvar->ts->UILanguageFile);
+		MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 		goto ed25519_error;
 	}
 	n = fwrite(buffer_ptr(blob), buffer_len(blob), 1, fp);
 	if (n != 1) {
-		UTIL_get_lang_msg("MSG_SAVE_KEY_WRITEFILE_ERROR", pvar,
-		                  "Can't open key file");
-		strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-		UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-		MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+		TCHAR uimsg1[MAX_UIMSG];
+		TCHAR uimsg2[MAX_UIMSG];
+		UTIL_get_lang_msgT("MSG_SAVE_KEY_WRITEFILE_ERROR", uimsg1, _countof(uimsg1),
+						   _T("Can't open key file"), pvar->ts->UILanguageFile);
+		UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+						   _T("ERROR"), pvar->ts->UILanguageFile);
+		MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 	}
 	fclose(fp);
 
@@ -4437,9 +4498,11 @@
 {
 	static ssh_keytype key_type;
 	static int saved_key_bits;
-	char uimsg[MAX_UIMSG];
+//	char uimsg[MAX_UIMSG];
 //	LOGFONT logfont;
 //	HFONT font;
+	TCHAR uimsg1[MAX_UIMSG];
+	TCHAR uimsg2[MAX_UIMSG];
 
 	switch (msg) {
 	case WM_INITDIALOG:
@@ -4583,10 +4646,10 @@
 				case KEY_RSA:
 				case KEY_DSA:
 					if (bits < ((key_type==KEY_DSA)?SSH_DSA_MINIMUM_KEY_SIZE:SSH_RSA_MINIMUM_KEY_SIZE)) {
-						UTIL_get_lang_msg("MSG_KEYBITS_MIN_ERROR", pvar,
-						                  "The key bits is too small.");
-						MessageBox(dlg, pvar->ts->UIMsg,
-						           "Tera Term", MB_OK | MB_ICONEXCLAMATION);
+						UTIL_get_lang_msgT("MSG_KEYBITS_MIN_ERROR", uimsg1, _countof(uimsg1),
+										  _T("The key bits is too small."), pvar->ts->UILanguageFile);
+						MessageBox(dlg, uimsg1,
+						           _T("Tera Term"), MB_OK | MB_ICONEXCLAMATION);
 						return TRUE;
 					}
 					break;
@@ -4650,7 +4713,7 @@
 				// enable comment edit box
 				EnableWindow(GetDlgItem(dlg, IDC_COMMENT_EDIT), TRUE);
 				ssh_make_comment(comment, sizeof(comment));
-				SetDlgItemText(dlg, IDC_COMMENT_EDIT, comment);
+				SetDlgItemTextA(dlg, IDC_COMMENT_EDIT, comment);
 
 				// file saving dialog disabled(default)
 				EnableWindow(GetDlgItem(dlg, IDC_SAVE_PUBLIC_KEY), TRUE);
@@ -4810,10 +4873,12 @@
 		case IDC_SAVE_PUBLIC_KEY:
 			{
 			int ret;
-			OPENFILENAMEA ofn;
-			char filename[MAX_PATH];
+			OPENFILENAME ofn;
+			TCHAR filename[MAX_PATH];
 			FILE *fp;
-			char comment[1024]; // comment string in private key
+			TCHAR comment[1024]; // comment string in private key
+			TCHAR filter[128];
+			TCHAR title[128];
 
 			arc4random_stir();
 
@@ -4823,65 +4888,68 @@
 			ofn.hwndOwner = dlg;
 			switch (public_key.type) {
 			case KEY_RSA1:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PUBLICKEY_RSA1_FILTER", pvar,
-				                  "SSH1 RSA key(identity.pub)\\0identity.pub\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "identity.pub", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PUBLICKEY_RSA1_FILTER", filter, _countof(filter),
+								   _T("SSH1 RSA key(identity.pub)\\0identity.pub\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("identity.pub"), _TRUNCATE);
 				break;
 			case KEY_RSA:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PUBLICKEY_RSA_FILTER", pvar,
-				                  "SSH2 RSA key(id_rsa.pub)\\0id_rsa.pub\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_rsa.pub", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PUBLICKEY_RSA_FILTER", filter, _countof(filter),
+								   _T("SSH2 RSA key(id_rsa.pub)\\0id_rsa.pub\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_rsa.pub"), _TRUNCATE);
 				break;
 			case KEY_DSA:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PUBLICKEY_DSA_FILTER", pvar,
-				                  "SSH2 DSA key(id_dsa.pub)\\0id_dsa.pub\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_dsa.pub", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PUBLICKEY_DSA_FILTER", filter, _countof(filter),
+								   _T("SSH2 DSA key(id_dsa.pub)\\0id_dsa.pub\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_dsa.pub"), _TRUNCATE);
 				break;
 			case KEY_ECDSA256:
 			case KEY_ECDSA384:
 			case KEY_ECDSA521:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PUBLICKEY_ECDSA_FILTER", pvar,
-				                  "SSH2 ECDSA key(id_ecdsa.pub)\\0id_ecdsa.pub\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_ecdsa.pub", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PUBLICKEY_ECDSA_FILTER", filter, _countof(filter),
+								   _T("SSH2 ECDSA key(id_ecdsa.pub)\\0id_ecdsa.pub\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_ecdsa.pub"), _TRUNCATE);
 				break;
 			case KEY_ED25519:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PUBLICKEY_ED25519_FILTER", pvar,
-				                  "SSH2 ED25519 key(id_ed25519.pub)\\0id_ed25519.pub\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_ed25519.pub", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PUBLICKEY_ED25519_FILTER", filter, _countof(filter),
+								   _T("SSH2 ED25519 key(id_ed25519.pub)\\0id_ed25519.pub\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_ed25519.pub"), _TRUNCATE);
 				break;
 			default:
 				break;
 			}
 			ofn.lpstrFile = filename;
-			ofn.nMaxFile = sizeof(filename);
-			UTIL_get_lang_msg("FILEDLG_SAVE_PUBLICKEY_TITLE", pvar,
-			                  "Save public key as:");
-			ofn.lpstrTitle = pvar->ts->UIMsg;
-			if (GetSaveFileNameA(&ofn) == 0) { // failure
+			ofn.nMaxFile = _countof(filename);
+			UTIL_get_lang_msgT("FILEDLG_SAVE_PUBLICKEY_TITLE", title, _countof(title),
+							   _T("Save public key as:"),
+							   pvar->ts->UILanguageFile);
+			ofn.lpstrTitle = title;
+			if (GetSaveFileName(&ofn) == 0) { // failure
 				ret = CommDlgExtendedError();
 				break;
 			}
 
-			GetDlgItemText(dlg, IDC_COMMENT_EDIT, comment, sizeof(comment));
+			GetDlgItemTextT(dlg, IDC_COMMENT_EDIT, comment, _countof(comment));
 
 			// saving public key file
-			fp = fopen(filename, "wb");
+			fp = _tfopen(filename, _T("wb"));
 			if (fp == NULL) {
-				UTIL_get_lang_msg("MSG_SAVE_KEY_OPENFILE_ERROR", pvar,
-				                  "Can't open key file");
-				strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-				UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-				MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+				TCHAR uimsg1[MAX_UIMSG];
+				TCHAR uimsg2[MAX_UIMSG];
+				UTIL_get_lang_msgT("MSG_SAVE_KEY_OPENFILE_ERROR", uimsg1, _countof(uimsg1),
+								   _T("Can't open key file"), pvar->ts->UILanguageFile);
+				UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+								   _T("ERROR"), pvar->ts->UILanguageFile);
+				MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 				break;
 			}
 
@@ -4968,7 +5036,9 @@
 
 			// writing a comment(+LF)
 			if (comment[0] != 0) {
-				fprintf(fp, " %s", comment);
+				const char *commentU8 = ToU8T(comment);
+				fprintf(fp, " %s", commentU8);
+				free((void *)commentU8);
 			}
 			fputc(0x0a, fp);
 
@@ -4983,9 +5053,11 @@
 			{
 			char buf[1024], buf_conf[1024];  // passphrase
 			int ret, rounds;
-			OPENFILENAMEA ofn;
-			char filename[MAX_PATH];
+			OPENFILENAME ofn;
+			TCHAR filename[MAX_PATH];
 			char comment[1024]; // comment string in private key
+			TCHAR filter[128];
+			TCHAR title[128];
 
 			// パスフレーズのチェックを行う。パスフレーズは秘密鍵ファイルに付ける。
 			GetDlgItemTextA(dlg, IDC_KEY_EDIT, buf, sizeof(buf));
@@ -4993,21 +5065,22 @@
 
 			// check matching
 			if (strcmp(buf, buf_conf) != 0) {
-				UTIL_get_lang_msg("MSG_SAVE_PRIVATE_KEY_MISMATCH_ERROR", pvar,
-				                  "Two passphrases don't match.");
-				strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-				UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-				MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+				UTIL_get_lang_msgT("MSG_SAVE_PRIVATE_KEY_MISMATCH_ERROR", uimsg1, _countof(uimsg1),
+								   _T("Two passphrases don't match."), pvar->ts->UILanguageFile);
+				UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+								   _T("ERROR"), pvar->ts->UILanguageFile);
+				MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 				break;
 			}
 
 			// check empty-passphrase (this is warning level)
 			if (buf[0] == '\0') {
-				UTIL_get_lang_msg("MSG_SAVE_PRIVATEKEY_EMPTY_WARN", pvar,
-				                  "Are you sure that you want to use a empty passphrase?");
-				strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-				UTIL_get_lang_msg("MSG_WARNING", pvar, "WARNING");
-				ret = MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_YESNO | MB_ICONWARNING);
+				UTIL_get_lang_msgT("MSG_SAVE_PRIVATEKEY_EMPTY_WARN", uimsg1, _countof(uimsg1),
+								   _T("Are you sure that you want to use a empty passphrase?"),
+								   pvar->ts->UILanguageFile);
+				UTIL_get_lang_msgT("MSG_WARNING", uimsg2, _countof(uimsg2),
+								   _T("WARNING"), pvar->ts->UILanguageFile);
+				ret = MessageBox(dlg, uimsg1, uimsg2, MB_YESNO | MB_ICONWARNING);
 				if (ret == IDNO)
 					break;
 			}
@@ -5016,17 +5089,17 @@
 			if (SendMessage(GetDlgItem(dlg, IDC_BCRYPT_KDF_CHECK), BM_GETCHECK, 0, 0) == BST_CHECKED) {
 				rounds = GetDlgItemInt(dlg, IDC_BCRYPT_KDF_ROUNDS, NULL, FALSE);
 				if (rounds < SSH_KEYGEN_MINIMUM_ROUNDS) {
-					UTIL_get_lang_msg("MSG_BCRYPT_ROUNDS_MIN_ERROR", pvar,
-					                  "The number of rounds is too small.");
-					MessageBox(dlg, pvar->ts->UIMsg,
-					           "Tera Term", MB_OK | MB_ICONEXCLAMATION);
+					UTIL_get_lang_msgT("MSG_BCRYPT_ROUNDS_MIN_ERROR", uimsg1, _countof(uimsg1),
+									   _T("The number of rounds is too small."), pvar->ts->UILanguageFile);
+					MessageBox(dlg, uimsg1,
+					           _T("Tera Term"), MB_OK | MB_ICONEXCLAMATION);
 					break;
 				}
 				if (rounds > SSH_KEYGEN_MAXIMUM_ROUNDS) {
-					UTIL_get_lang_msg("MSG_BCRYPT_ROUNDS_MAX_ERROR", pvar,
-					                  "The number of rounds is too large.");
-					MessageBox(dlg, pvar->ts->UIMsg,
-					           "Tera Term", MB_OK | MB_ICONEXCLAMATION);
+					UTIL_get_lang_msgT("MSG_BCRYPT_ROUNDS_MAX_ERROR", uimsg1, _countof(uimsg1),
+									   _T("The number of rounds is too large."), pvar->ts->UILanguageFile);
+					MessageBox(dlg, uimsg1,
+					           _T("Tera Term"), MB_OK | MB_ICONEXCLAMATION);
 					break;
 				}
 			}
@@ -5039,51 +5112,52 @@
 			ofn.hwndOwner = dlg;
 			switch (private_key.type) {
 			case KEY_RSA1:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_RSA1_FILTER", pvar,
-				                  "SSH1 RSA key(identity)\\0identity\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "identity", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PRIVATEKEY_RSA1_FILTER", filter, _countof(filter),
+								   _T("SSH1 RSA key(identity)\\0identity\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("identity"), _TRUNCATE);
 				break;
 			case KEY_RSA:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_RSA_FILTER", pvar,
-				                  "SSH2 RSA key(id_rsa)\\0id_rsa\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_rsa", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PRIVATEKEY_RSA_FILTER", filter, _countof(filter),
+								   _T("SSH2 RSA key(id_rsa)\\0id_rsa\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_rsa"), _TRUNCATE);
 				break;
 			case KEY_DSA:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_DSA_FILTER", pvar,
-				                  "SSH2 DSA key(id_dsa)\\0id_dsa\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_dsa", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PRIVATEKEY_DSA_FILTER", filter, _countof(filter),
+								   _T("SSH2 DSA key(id_dsa)\\0id_dsa\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_dsa"), _TRUNCATE);
 				break;
 			case KEY_ECDSA256:
 			case KEY_ECDSA384:
 			case KEY_ECDSA521:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_ECDSA_FILTER", pvar,
-				                  "SSH2 ECDSA key(id_ecdsa)\\0id_ecdsa\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_ecdsa", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PRIVATEKEY_ECDSA_FILTER", filter, _countof(filter),
+								   _T("SSH2 ECDSA key(id_ecdsa)\\0id_ecdsa\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_ecdsa"), _TRUNCATE);
 				break;
 			case KEY_ED25519:
-				UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_ED25519_FILTER", pvar,
-				                  "SSH2 ED25519 key(id_ed25519)\\0id_ed25519\\0All Files(*.*)\\0*.*\\0\\0");
-				memcpy(uimsg, pvar->ts->UIMsg, sizeof(uimsg));
-				ofn.lpstrFilter = uimsg;
-				strncpy_s(filename, sizeof(filename), "id_ed25519", _TRUNCATE);
+				UTIL_get_lang_msgT("FILEDLG_SAVE_PRIVATEKEY_ED25519_FILTER", filter, _countof(filter),
+								   _T("SSH2 ED25519 key(id_ed25519)\\0id_ed25519\\0All Files(*.*)\\0*.*\\0\\0"),
+								   pvar->ts->UILanguageFile);
+				ofn.lpstrFilter = filter;
+				_tcsncpy_s(filename, _countof(filename), _T("id_ed25519"), _TRUNCATE);
 				break;
 			default:
 				break;
 			}
 			ofn.lpstrFile = filename;
-			ofn.nMaxFile = sizeof(filename);
-			UTIL_get_lang_msg("FILEDLG_SAVE_PRIVATEKEY_TITLE", pvar,
-			                  "Save private key as:");
-			ofn.lpstrTitle = pvar->ts->UIMsg;
-			if (GetSaveFileNameA(&ofn) == 0) { // failure
+			ofn.nMaxFile = _countof(filename);
+			UTIL_get_lang_msgT("FILEDLG_SAVE_PRIVATEKEY_TITLE", title, _countof(title),
+							   _T("Save private key as:"),
+							   pvar->ts->UILanguageFile);
+			ofn.lpstrTitle = title;
+			if (GetSaveFileName(&ofn) == 0) { // failure
 				ret = CommDlgExtendedError();
 				break;
 			}
@@ -5189,13 +5263,13 @@
 				buffer_append(enc, wrapped, len);
 
 				// saving private key file (binary mode)
-				fp = fopen(filename, "wb");
+				fp = _tfopen(filename, _T("wb"));
 				if (fp == NULL) {
-					UTIL_get_lang_msg("MSG_SAVE_KEY_OPENFILE_ERROR", pvar,
-					                  "Can't open key file");
-					strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-					UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-					MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+					UTIL_get_lang_msgT("MSG_SAVE_KEY_OPENFILE_ERROR", uimsg1, _countof(uimsg1),
+									   _T("Can't open key file"), pvar->ts->UILanguageFile);
+					UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+									   _T("ERROR"), pvar->ts->UILanguageFile);
+					MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 					break;
 				}
 				fwrite(buffer_ptr(enc), buffer_len(enc), 1, fp);
@@ -5206,7 +5280,7 @@
 				buffer_free(b);
 				buffer_free(enc);
 
-			} else if (private_key.type == KEY_ED25519) { // SSH2 ED25519 
+			} else if (private_key.type == KEY_ED25519) { // SSH2 ED25519
 				save_bcrypt_private_key(buf, filename, comment, dlg, pvar, rounds);
 
 			} else { // SSH2 RSA, DSA, ECDSA			
@@ -5227,13 +5301,13 @@
 					cipher = EVP_aes_128_cbc();
 				}
 
-				fp = fopen(filename, "w");
+				fp = _tfopen(filename, _T("w"));
 				if (fp == NULL) {
-					UTIL_get_lang_msg("MSG_SAVE_KEY_OPENFILE_ERROR", pvar,
-					                  "Can't open key file");
-					strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-					UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-					MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+					UTIL_get_lang_msgT("MSG_SAVE_KEY_OPENFILE_ERROR", uimsg1, _countof(uimsg1),
+									   _T("Can't open key file"), pvar->ts->UILanguageFile);
+					UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+									   _T("ERROR"), pvar->ts->UILanguageFile);
+					MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 					break;
 				}
  
@@ -5251,11 +5325,11 @@
 					break;
 				}
 				if (ret == 0) {
-					UTIL_get_lang_msg("MSG_SAVE_KEY_WRITEFILE_ERROR", pvar,
-					                  "Can't open key file");
-					strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-					UTIL_get_lang_msg("MSG_ERROR", pvar, "ERROR");
-					MessageBox(dlg, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+					UTIL_get_lang_msgT("MSG_SAVE_KEY_WRITEFILE_ERROR", uimsg1, _countof(uimsg1),
+									   _T("Can't open key file"), pvar->ts->UILanguageFile);
+					UTIL_get_lang_msgT("MSG_ERROR", uimsg2, _countof(uimsg2),
+									   _T("ERROR"), pvar->ts->UILanguageFile);
+					MessageBox(dlg, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 				}
 				fclose(fp);
 			}
@@ -5274,7 +5348,9 @@
 
 static int PASCAL TTXProcessCommand(HWND hWin, WORD cmd)
 {
-	char uimsg[MAX_UIMSG];
+	TCHAR uimsg1[MAX_UIMSG];
+	TCHAR uimsg2[MAX_UIMSG];
+	const char *UILanguageFile = pvar->ts->UILanguageFile;
 
 	if (pvar->fatal_error) {
 		return 0;
@@ -5290,11 +5366,11 @@
 	case ID_SSHSCPMENU:
 		if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHSCP), hWin, TTXScpDialog,
 			(LPARAM) pvar) == -1) {
-			UTIL_get_lang_msg("MSG_CREATEWINDOW_SCP_ERROR", pvar,
-			                  "Unable to display SCP dialog box.");
-			strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-			UTIL_get_lang_msg("MSG_TTSSH_ERROR", pvar, "TTSSH Error");
-			MessageBox(hWin, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+			UTIL_get_lang_msgT("MSG_CREATEWINDOW_SCP_ERROR", uimsg1, _countof(uimsg1),
+			                  _T("Unable to display SCP dialog box."), UILanguageFile);
+			UTIL_get_lang_msgT("MSG_TTSSH_ERROR", uimsg2, _countof(uimsg2),
+							   _T("TTSSH Error"), UILanguageFile);
+			MessageBox(hWin, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 		}
 		return 1;
 
@@ -5301,11 +5377,11 @@
 	case ID_SSHKEYGENMENU:
 		if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHKEYGEN), hWin, TTXKeyGenerator,
 			(LPARAM) pvar) == -1) {
-			UTIL_get_lang_msg("MSG_CREATEWINDOW_KEYGEN_ERROR", pvar,
-			                  "Unable to display Key Generator dialog box.");
-			strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-			UTIL_get_lang_msg("MSG_TTSSH_ERROR", pvar, "TTSSH Error");
-			MessageBox(hWin, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+			UTIL_get_lang_msgT("MSG_CREATEWINDOW_KEYGEN_ERROR", uimsg1, _countof(uimsg1),
+							   _T("Unable to display Key Generator dialog box."), UILanguageFile);
+			UTIL_get_lang_msgT("MSG_TTSSH_ERROR", uimsg2, _countof(uimsg2),
+							   _T("TTSSH Error"), UILanguageFile);
+			MessageBox(hWin, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 		}
 		return 1;
 
@@ -5312,11 +5388,11 @@
 	case ID_ABOUTMENU:
 		if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ABOUTDIALOG),
 		                   hWin, TTXAboutDlg, (LPARAM) pvar) == -1) {
-			UTIL_get_lang_msg("MSG_CREATEWINDOW_ABOUT_ERROR", pvar,
-			                  "Unable to display About dialog box.");
-			strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-			UTIL_get_lang_msg("MSG_TTSSH_ERROR", pvar, "TTSSH Error");
-			MessageBox(hWin, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+			UTIL_get_lang_msgT("MSG_CREATEWINDOW_ABOUT_ERROR", uimsg1, _countof(uimsg1),
+							   _T("Unable to display About dialog box."), UILanguageFile);
+			UTIL_get_lang_msgT("MSG_TTSSH_ERROR", uimsg2, _countof(uimsg2),
+							   _T("TTSSH Error"), UILanguageFile);
+			MessageBox(hWin, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 		}
 		return 1;
 	case ID_SSHAUTH:
@@ -5325,11 +5401,11 @@
 	case ID_SSHSETUPMENU:
 		if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHSETUP),
 		                   hWin, TTXSetupDlg, (LPARAM) pvar) == -1) {
-			UTIL_get_lang_msg("MSG_CREATEWINDOW_SETUP_ERROR", pvar,
-			                  "Unable to display TTSSH Setup dialog box.");
-			strncpy_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE);
-			UTIL_get_lang_msg("MSG_TTSSH_ERROR", pvar, "TTSSH Error");
-			MessageBox(hWin, uimsg, pvar->ts->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+			UTIL_get_lang_msgT("MSG_CREATEWINDOW_SETUP_ERROR", uimsg1, _countof(uimsg1),
+							   _T("Unable to display TTSSH Setup dialog box."), UILanguageFile);
+			UTIL_get_lang_msgT("MSG_TTSSH_ERROR", uimsg2, _countof(uimsg2),
+							   _T("TTSSH Error"), UILanguageFile);
+			MessageBox(hWin, uimsg1, uimsg2, MB_OK | MB_ICONEXCLAMATION);
 		}
 		return 1;
 	case ID_SSHAUTHSETUPMENU:
@@ -5356,8 +5432,12 @@
 
 			pvar->showing_err = TRUE;
 			pvar->err_msg = NULL;
-			MessageBox(NULL, msg, "TTSSH",
-					   MB_TASKMODAL | MB_ICONEXCLAMATION);
+			{
+				const TCHAR *strT = ToTcharU8(msg);
+				MessageBox(NULL, strT, _T("TTSSH"),
+						   MB_TASKMODAL | MB_ICONEXCLAMATION);
+				free((void *)strT);
+			}
 			free(msg);
 			pvar->showing_err = FALSE;
 
@@ -5576,8 +5656,12 @@
 			pvar->err_msg[2048] = 0;
 		}
 
-		MessageBox(NULL, pvar->err_msg, "TTSSH",
-		           MB_TASKMODAL | MB_ICONEXCLAMATION);
+		{
+			const TCHAR *strT = ToTcharU8(pvar->err_msg);
+			MessageBox(NULL, strT, _T("TTSSH"),
+					   MB_TASKMODAL | MB_ICONEXCLAMATION);
+			free((void *)strT);
+		}
 
 		free(pvar->err_msg);
 		pvar->err_msg = NULL;

Modified: branches/cmake/ttssh2/ttxssh/ttxssh.h
===================================================================
--- branches/cmake/ttssh2/ttxssh/ttxssh.h	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/ttxssh.h	2018-12-10 15:01:44 UTC (rev 7319)
@@ -356,7 +356,7 @@
 void logprintf_hexdump(int level, char *data, int len, char *fmt, ...);
 
 void get_teraterm_dir_relative_name(char *buf, int bufsize, char *basename);
-int copy_teraterm_dir_relative_path(char *dest, int destsize, char *basename);
+int copy_teraterm_dir_relative_path(char *dest, int destsize, const char *basename);
 int uuencode(unsigned char *src, int srclen, unsigned char *target, int targsize);
 
 #endif

Modified: branches/cmake/ttssh2/ttxssh/util.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/util.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/util.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -319,6 +319,11 @@
 	get_lang_msg(key, buf, buf_len, def, iniFile);
 }
 
+void UTIL_get_lang_msgU8(const char *key, char *buf, size_t buf_len, const char *def, const char *iniFile)
+{
+	get_lang_msgU8(key, buf, buf_len, def, iniFile);
+}
+
 #if defined(_UNICODE)
 void UTIL_get_lang_msgW(const char *key, wchar_t *buf, size_t buf_len, const wchar_t *def, const char *iniFile)
 {

Modified: branches/cmake/ttssh2/ttxssh/util.h
===================================================================
--- branches/cmake/ttssh2/ttxssh/util.h	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/util.h	2018-12-10 15:01:44 UTC (rev 7319)
@@ -88,6 +88,7 @@
 void UTIL_get_lang_msgW(const char *key, wchar_t *buf, size_t buf_len, const wchar_t *def, const char *iniFile);
 #endif
 void UTIL_get_lang_msgA(const char *key, char *buf, size_t buf_len, const char *def, const char *iniFile);
+void UTIL_get_lang_msgU8(const char *key, char *buf, size_t buf_len, const char *def, const char *iniFile);
 int UTIL_get_lang_font(const char *key, HWND dlg, PLOGFONTA logfont, HFONT *font, PTInstVar pvar);
 
 void UTIL_get_lang_msg(const char *key, PTInstVar pvar, const char *def);

Modified: branches/cmake/ttssh2/ttxssh/x11util.c
===================================================================
--- branches/cmake/ttssh2/ttxssh/x11util.c	2018-12-10 15:01:30 UTC (rev 7318)
+++ branches/cmake/ttssh2/ttxssh/x11util.c	2018-12-10 15:01:44 UTC (rev 7319)
@@ -32,6 +32,7 @@
 #include <openssl/rand.h>
 #include "util.h"
 #include <stdlib.h>
+#include <tchar.h>
 
 typedef struct {
 	PTInstVar pvar;
@@ -251,6 +252,7 @@
 
 FwdFilterResult X11_unspoofing_filter(void *void_closure, FwdFilterEvent event, int *length, unsigned char **buf)
 {
+	char uimsg[MAX_UIMSG];
 	X11UnspoofingFilterClosure *closure =
 		(X11UnspoofingFilterClosure *) void_closure;
 
@@ -270,10 +272,11 @@
 			return FWD_FILTER_REMOVE;
 		default:
 		case MERGE_GOT_BAD_DATA:
-			UTIL_get_lang_msg("MSG_X_AUTH_ERROR", closure->pvar,
-			                  "Remote X application sent incorrect authentication data.\n"
-			                  "Its X session is being cancelled.");
-			notify_nonfatal_error(closure->pvar, closure->pvar->ts->UIMsg);
+			UTIL_get_lang_msgU8("MSG_X_AUTH_ERROR", uimsg, _countof(uimsg),
+								"Remote X application sent incorrect authentication data.\n"
+								"Its X session is being cancelled.",
+								closure->pvar->ts->UILanguageFile);
+			notify_nonfatal_error(closure->pvar, uimsg);
 			*length = 0;
 			return FWD_FILTER_CLOSECHANNEL;
 		}


Ttssh2-commit メーリングリストの案内
Back to archive index