https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e3e520d15402eebe2e20edad8a0b54973057daf3

commit e3e520d15402eebe2e20edad8a0b54973057daf3
Author:     Marcin Jabłoński <nnxcomput...@gmail.com>
AuthorDate: Thu Jan 16 18:24:04 2025 +0100
Commit:     GitHub <nore...@github.com>
CommitDate: Thu Jan 16 18:24:04 2025 +0100

    [TELNET] Fix Unicode character printing (#7597)
    
    CORE-18304
    
    The included Telnet client does not support displaying messages with 
Unicode characters in them.
    This is a problem, because even though localisation for the program was 
made for ReactOS,
    it doesn't work properly.
    
    - Make the `printm` function load and format messages using wide character 
APIs instead of the narrow ones.
    - Add format specifiers to the resource files (this is necessary, as there 
are a lot of places, where narrow strings
      are used in the program, and passed as parameters to `printm`).
---
 base/applications/network/telnet/lang/en-US.rc   | 52 +++++++++----------
 base/applications/network/telnet/lang/pl-PL.rc   | 52 +++++++++----------
 base/applications/network/telnet/lang/ro-RO.rc   | 52 +++++++++----------
 base/applications/network/telnet/lang/ru-RU.rc   | 52 +++++++++----------
 base/applications/network/telnet/lang/tr-TR.rc   | 52 +++++++++----------
 base/applications/network/telnet/lang/zh-CN.rc   | 52 +++++++++----------
 base/applications/network/telnet/lang/zh-TW.rc   | 52 +++++++++----------
 base/applications/network/telnet/precomp.h       |  1 +
 base/applications/network/telnet/src/tnerror.cpp | 63 +++++++++++++++++++++++-
 9 files changed, 245 insertions(+), 183 deletions(-)

diff --git a/base/applications/network/telnet/lang/en-US.rc 
b/base/applications/network/telnet/lang/en-US.rc
index a13ad7f4144..edac1d7d5c1 100644
--- a/base/applications/network/telnet/lang/en-US.rc
+++ b/base/applications/network/telnet/lang/en-US.rc
@@ -9,25 +9,25 @@ BEGIN
     MSG_HELP "Commands may be abbreviated.  Commands are:\n\ncl[ose]         
close current connection\nop[en]          connect to a site\nq[uit]          
exit telnet\n"
     MSG_HELP_1 "ke[ys]          changes/displays keymaps (write keys to see 
the options)\nse[t]           displays/alters configuration options\nz          
     suspend\n? h[elp]        print help information\n"
     MSG_INVCMD "Invalid command.  Type ? for help.\n"
-    MSG_ERROR "%1 failed.\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "Trying %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "Connected to %1.  Escape key is ALT-%2.\n"
+    MSG_ERROR "%1!hs! failed.\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "Trying %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "Connected to %1!hs!.  Escape key is ALT-%2!hs!.\n"
     MSG_TERMBYREM "Connection terminated.\n"
-    MSG_KEYMAP "Loading %1 from %2.\n"
+    MSG_KEYMAP "Loading %1!hs! from %2!hs!.\n"
     MSG_ERRKEYMAP "Error loading keymap.\n"
-    MSG_DUMPFILE "Writing output to file %1.\n"
-    MSG_CONFIG "Loading configuration options from %1.\n"
-    MSG_NOINI "Error loading configuration file %1.\nLoading default 
options.\n"
-    MSG_BADVAL "Warning: invalid variable %1.\n"
+    MSG_DUMPFILE "Writing output to file %1!hs!.\n"
+    MSG_CONFIG "Loading configuration options from %1!hs!.\n"
+    MSG_NOINI "Error loading configuration file %1!hs!.\nLoading default 
options.\n"
+    MSG_BADVAL "Warning: invalid variable %1!hs!.\n"
     MSG_NOSPAWN "Unable to spawn process.\n"
-    MSG_RESOLVING "Looking up host: %1..."
-    MSG_NOSERVICE "Could not find TCP service %1.\n"
-    MSG_SIZEALIAS "Warning: size of alias %1 is too big, ignoring.\n"
+    MSG_RESOLVING "Looking up host: %1!hs!..."
+    MSG_NOSERVICE "Could not find TCP service %1!hs!.\n"
+    MSG_SIZEALIAS "Warning: size of alias %1!hs! is too big, ignoring.\n"
     MSG_ERRPIPE "Error: unable to spawn process for pipe.\n"
     MSG_BADUSAGE "Error: invalid usage of command.\n"
-    MSG_ALREADYCONNECTED "Already connected to %1.\n"
+    MSG_ALREADYCONNECTED "Already connected to %1!hs!.\n"
     MSG_WSAEINTR "Interrupted function call.\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "Permission denied.\n"
@@ -72,25 +72,25 @@ BEGIN
     MSG_WSATRY_AGAIN "Non-authoritative host not found.\n"
     MSG_WSANO_RECOVERY "This is a non-recoverable error.\n"
     MSG_WSANO_DATA "Valid name, no data record of requested type.\n"
-    MSG_KEYNOVAL "[GLOBAL]: No value for %1.\n"
-    MSG_KEYBADVAL "[GLOBAL]: Bad value for %1.\n"
-    MSG_KEYBADSTRUCT "%1: Bad structure.\n"
-    MSG_KEYBADCHARS "%1: Bad chars? %1 -> %3.\n"
-    MSG_KEYUNEXPLINE "Unexpected line ""%1"".\n"
+    MSG_KEYNOVAL "[GLOBAL]: No value for %1!hs!.\n"
+    MSG_KEYBADVAL "[GLOBAL]: Bad value for %1!hs!.\n"
+    MSG_KEYBADSTRUCT "%1!hs!: Bad structure.\n"
+    MSG_KEYBADCHARS "%1!hs!: Bad chars? %1!hs! -> %3!hs!.\n"
+    MSG_KEYUNEXPLINE "Unexpected line ""%1!hs!"".\n"
     MSG_KEYUNEXPEOF "Unexpended end of file.\n"
-    MSG_KEYUNEXPTOK "Unexpected token %1.\n"
-    MSG_KEYUNEXPTOKIN "Unexpected token in %1.\n"
+    MSG_KEYUNEXPTOK "Unexpected token %1!hs!.\n"
+    MSG_KEYUNEXPTOKIN "Unexpected token in %1!hs!.\n"
     MSG_KEYUNEXP "Unexpected end of file or token.\n"
     MSG_KEYNOGLOBAL "No [GLOBAL] definition!\n"
-    MSG_KEYNOCONFIG "No [CONFIG %1].\n"
-    MSG_KEYUSECONFIG "Use configuration: %1.\n"
-    MSG_KEYNOSWKEY "No switch key for ""%1"".\n"
+    MSG_KEYNOCONFIG "No [CONFIG %1!hs!].\n"
+    MSG_KEYUSECONFIG "Use configuration: %1!hs!.\n"
+    MSG_KEYNOSWKEY "No switch key for ""%1!hs!"".\n"
     MSG_KEYCANNOTDEF "You cannot define switch key for default keymap - 
ignored.\n"
     MSG_KEYDUPSWKEY "Duplicate switching key.\n"
-    MSG_KEYUNKNOWNMAP "Unknown keymap %1.\n"
+    MSG_KEYUNKNOWNMAP "Unknown keymap %1!hs!.\n"
     MSG_KEYNOCHARMAPS "No charmaps loaded.\n"
     MSG_KEYNOKEYMAPS "No keymaps loaded.\n"
-    MSG_KEYNUMMAPS "There are %1 maps.\n"
+    MSG_KEYNUMMAPS "There are %1!hs! maps.\n"
     MSG_KEYBADMAP "Bad keymap number - try 'keys display'\n"
     MSG_KEYMAPSWITCHED "keymap switched.\n"
 END
diff --git a/base/applications/network/telnet/lang/pl-PL.rc 
b/base/applications/network/telnet/lang/pl-PL.rc
index c75e95e825a..9cb42a47f85 100644
--- a/base/applications/network/telnet/lang/pl-PL.rc
+++ b/base/applications/network/telnet/lang/pl-PL.rc
@@ -9,25 +9,25 @@ BEGIN
     MSG_HELP "Polecenia mogą być skracane.  Dostępne polecenia:\n\ncl[ose]     
    zamknij bieżące połączenie\nop[en]          połącz z witryną\nq[uit]        
  zakończ telnet\n"
     MSG_HELP_1 "ke[ys]          zmienia/wyświetla mapy klawiszy (wpisz 
klawisze,\naby zobaczyć opcje)\nse[t]           wyświetla/zmienia opcje 
konfiguracji\nz               wstrzymaj\n? h[elp]        wypisz informacje 
pomocy\n"
     MSG_INVCMD "Nieprawidłowe polecenie.  Wpisz ?, aby uzyskać pomoc.\n"
-    MSG_ERROR "%1 nie powiodło się.\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "Podejmowanie próby %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "Podłączono do %1.  Klawisze wyjścia to ALT-%2.\n"
+    MSG_ERROR "%1!hs! nie powiodło się.\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "Podejmowanie próby %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "Podłączono do %1!hs!.  Klawisze wyjścia to ALT-%2!hs!.\n"
     MSG_TERMBYREM "Połączenie zakończone.\n"
-    MSG_KEYMAP "Ładowanie %1 z %2.\n"
+    MSG_KEYMAP "Ładowanie %1!hs! z %2!hs!.\n"
     MSG_ERRKEYMAP "Błąd podczas ładowania mapy klawiszy.\n"
-    MSG_DUMPFILE "Zapisywanie danych wyjściowych do pliku %1.\n"
-    MSG_CONFIG "Ładowanie opcji konfiguracji z %1.\n"
-    MSG_NOINI "Błąd podczas ładowania pliku konfiguracyjnego %1.\nŁadowanie 
domyślnych opcji.\n"
-    MSG_BADVAL "Ostrzeżenie: nieprawidłowa zmienna %1.\n"
+    MSG_DUMPFILE "Zapisywanie danych wyjściowych do pliku %1!hs!.\n"
+    MSG_CONFIG "Ładowanie opcji konfiguracji z %1!hs!.\n"
+    MSG_NOINI "Błąd podczas ładowania pliku konfiguracyjnego 
%1!hs!.\nŁadowanie domyślnych opcji.\n"
+    MSG_BADVAL "Ostrzeżenie: nieprawidłowa zmienna %1!hs!.\n"
     MSG_NOSPAWN "Nie można zduplikować procesu.\n"
-    MSG_RESOLVING "Wyszukiwanie hosta: %1..."
-    MSG_NOSERVICE "Nie odnaleziono usługi TCP %1.\n"
-    MSG_SIZEALIAS "Ostrzeżenie: rozmiar aliasu %1 jest zbyt duży, 
ignorowanie.\n"
+    MSG_RESOLVING "Wyszukiwanie hosta: %1!hs!..."
+    MSG_NOSERVICE "Nie odnaleziono usługi TCP %1!hs!.\n"
+    MSG_SIZEALIAS "Ostrzeżenie: rozmiar aliasu %1!hs! jest zbyt duży, 
ignorowanie.\n"
     MSG_ERRPIPE "Błąd: nie można zduplikować procesu dla potoku.\n"
     MSG_BADUSAGE "Błąd: nieprawidłowe użycie polecenia.\n"
-    MSG_ALREADYCONNECTED "Już połączono z %1.\n"
+    MSG_ALREADYCONNECTED "Już połączono z %1!hs!.\n"
     MSG_WSAEINTR "Przerwano wywołanie funkcji.\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "Odmowa uprawnień.\n"
@@ -72,25 +72,25 @@ BEGIN
     MSG_WSATRY_AGAIN "Nie odnaleziono nieautorytatywnego hosta.\n"
     MSG_WSANO_RECOVERY "Ten błąd jest niemożliwy do naprawienia.\n"
     MSG_WSANO_DATA "Nazwa jest  prawidłowa, brak rekordu danych żądanego 
typu.\n"
-    MSG_KEYNOVAL "[GLOBAL]: Brak wartości dla %1.\n"
-    MSG_KEYBADVAL "[GLOBAL]: Zła wartość dla %1.\n"
-    MSG_KEYBADSTRUCT "%1: Zła struktura.\n"
-    MSG_KEYBADCHARS "%1: Złe znaki? %1 -> %3.\n"
-    MSG_KEYUNEXPLINE "Nieoczekiwany wiersz ""%1"".\n"
+    MSG_KEYNOVAL "[GLOBAL]: Brak wartości dla %1!hs!.\n"
+    MSG_KEYBADVAL "[GLOBAL]: Zła wartość dla %1!hs!.\n"
+    MSG_KEYBADSTRUCT "%1!hs!: Zła struktura.\n"
+    MSG_KEYBADCHARS "%1!hs!: Złe znaki? %1!hs! -> %3!hs!.\n"
+    MSG_KEYUNEXPLINE "Nieoczekiwany wiersz ""%1!hs!"".\n"
     MSG_KEYUNEXPEOF "Nieoczekiwany koniec pliku.\n"
-    MSG_KEYUNEXPTOK "Nieoczekiwany token %1.\n"
-    MSG_KEYUNEXPTOKIN "Nieoczekiwany token w %1.\n"
+    MSG_KEYUNEXPTOK "Nieoczekiwany token %1!hs!.\n"
+    MSG_KEYUNEXPTOKIN "Nieoczekiwany token w %1!hs!.\n"
     MSG_KEYUNEXP "Nieoczekiwany koniec pliku lub tokena.\n"
     MSG_KEYNOGLOBAL "Brak definicji [GLOBAL]!\n"
-    MSG_KEYNOCONFIG "Brak [CONFIG %1].\n"
-    MSG_KEYUSECONFIG "Użyj konfiguracji: %1.\n"
-    MSG_KEYNOSWKEY "Brak klawisza przełączającego dla ""%1"".\n"
+    MSG_KEYNOCONFIG "Brak [CONFIG %1!hs!].\n"
+    MSG_KEYUSECONFIG "Użyj konfiguracji: %1!hs!.\n"
+    MSG_KEYNOSWKEY "Brak klawisza przełączającego dla ""%1!hs!"".\n"
     MSG_KEYCANNOTDEF "Nie można zdefiniować klawisza przełączającego dla 
domyślnej mapy klawiszy - zignorowano.\n"
     MSG_KEYDUPSWKEY "Duplikuj klawisz przełączający.\n"
-    MSG_KEYUNKNOWNMAP "Nieznana mapa klawiszy %1.\n"
+    MSG_KEYUNKNOWNMAP "Nieznana mapa klawiszy %1!hs!.\n"
     MSG_KEYNOCHARMAPS "Nie załadowano żadnych tablic znaków.\n"
     MSG_KEYNOKEYMAPS "Nie załadowano żadnych map klawiszy.\n"
-    MSG_KEYNUMMAPS "Istnieje %1 map.\n"
+    MSG_KEYNUMMAPS "Istnieje %1!hs! map.\n"
     MSG_KEYBADMAP "Zły numer mapy klawiszy - sróbuj 'keys display'\n"
     MSG_KEYMAPSWITCHED "mapa klawiszy przełączona.\n"
 END
diff --git a/base/applications/network/telnet/lang/ro-RO.rc 
b/base/applications/network/telnet/lang/ro-RO.rc
index 4e22517242b..05ac44a9620 100644
--- a/base/applications/network/telnet/lang/ro-RO.rc
+++ b/base/applications/network/telnet/lang/ro-RO.rc
@@ -10,25 +10,25 @@ BEGIN
     MSG_HELP "Comenzile pot fi abreviate. Acestea sunt:\n\ncl[ose]         
Închide conexiunea curentă.\nop[en]          Conectează la un sit.\nq[uit]      
    Ieșire din telnet.\n"
     MSG_HELP_1 "ke[ys]          Afișează/alterează configurații de 
taste.\nse[t]           Afișează/alterează opțiunile de configurare.\nz         
      Suspendă.\n? h[elp]        Afișează informațiile de utilizare.\n"
     MSG_INVCMD "Comandă nevalidă. Tastați ? pentru informații.\n"
-    MSG_ERROR "%1 a eșuat.\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "Este încearcată %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "Conectat la %1. Pentru ieșire apăsați ALT-%2.\n"
+    MSG_ERROR "%1!hs! a eșuat.\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "Este încearcată %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "Conectat la %1!hs!. Pentru ieșire apăsați ALT-%2!hs!.\n"
     MSG_TERMBYREM "Conexiune încheiată.\n"
-    MSG_KEYMAP "Este încarcată %1 de la %2.\n"
+    MSG_KEYMAP "Este încarcată %1!hs! de la %2!hs!.\n"
     MSG_ERRKEYMAP "Eșec la încărcarea configurației de taste.\n"
-    MSG_DUMPFILE "Sunt scrise informații de ieșire în fișierul %1.\n"
-    MSG_CONFIG "Este încarcată din %1 opțiunile de configurare.\n"
-    MSG_NOINI "Eroare la încărcarea fișierului de configurare %1.\nSunt 
încărcate opțiunile implicite.\n"
-    MSG_BADVAL "Avertisment: variabila %1 nu este validă.\n"
+    MSG_DUMPFILE "Sunt scrise informații de ieșire în fișierul %1!hs!.\n"
+    MSG_CONFIG "Este încarcată din %1!hs! opțiunile de configurare.\n"
+    MSG_NOINI "Eroare la încărcarea fișierului de configurare %1!hs!.\nSunt 
încărcate opțiunile implicite.\n"
+    MSG_BADVAL "Avertisment: variabila %1!hs! nu este validă.\n"
     MSG_NOSPAWN "Lansarea procesului a eșuat.\n"
-    MSG_RESOLVING "Este căutată gazda: %1..."
-    MSG_NOSERVICE "Serviciul TCP %1 nu a fost găsit.\n"
-    MSG_SIZEALIAS "Avertisment: dimensiunea de alias %1 este prea mare, va fi 
ignorată.\n"
+    MSG_RESOLVING "Este căutată gazda: %1!hs!..."
+    MSG_NOSERVICE "Serviciul TCP %1!hs! nu a fost găsit.\n"
+    MSG_SIZEALIAS "Avertisment: dimensiunea de alias %1!hs! este prea mare, va 
fi ignorată.\n"
     MSG_ERRPIPE "Eroare: lansarea procesului pentru conexiune a eșuat.\n"
     MSG_BADUSAGE "Eroare: utilizare nevalidă a comenzii.\n"
-    MSG_ALREADYCONNECTED "Conexiunea la %1 a fost deja stabilită.\n"
+    MSG_ALREADYCONNECTED "Conexiunea la %1!hs! a fost deja stabilită.\n"
     MSG_WSAEINTR "Apel de funcție întrerupt.\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "Acces respins.\n"
@@ -73,25 +73,25 @@ BEGIN
     MSG_WSATRY_AGAIN "Gazda ne-autoritată nu a fost găsită.\n"
     MSG_WSANO_RECOVERY "Eroare, stare nerecuperabilă.\n"
     MSG_WSANO_DATA "Numeele este valid, nu există date de tipul solicitat.\n"
-    MSG_KEYNOVAL "[GLOBAL]: Nu există valoare pentru %1.\n"
-    MSG_KEYBADVAL "[GLOBAL]: Valoarea pentru %1 este eronată.\n"
-    MSG_KEYBADSTRUCT "%1: Structură eronată.\n"
-    MSG_KEYBADCHARS "%1: Caractere eronate? %1 -> %3.\n"
-    MSG_KEYUNEXPLINE "Rând neprevăzut «%1».\n"
+    MSG_KEYNOVAL "[GLOBAL]: Nu există valoare pentru %1!hs!.\n"
+    MSG_KEYBADVAL "[GLOBAL]: Valoarea pentru %1!hs! este eronată.\n"
+    MSG_KEYBADSTRUCT "%1!hs!: Structură eronată.\n"
+    MSG_KEYBADCHARS "%1!hs!: Caractere eronate? %1!hs! -> %3!hs!.\n"
+    MSG_KEYUNEXPLINE "Rând neprevăzut «%1!hs!».\n"
     MSG_KEYUNEXPEOF "Sfârșit neprevăzut de fișier.\n"
-    MSG_KEYUNEXPTOK "Simbol neprevăzut %1.\n"
-    MSG_KEYUNEXPTOKIN "Simbol neprevăzut la %1.\n"
+    MSG_KEYUNEXPTOK "Simbol neprevăzut %1!hs!.\n"
+    MSG_KEYUNEXPTOKIN "Simbol neprevăzut la %1!hs!.\n"
     MSG_KEYUNEXP "Sfârșit neprevăzut de fișier sau simbol.\n"
     MSG_KEYNOGLOBAL "Nu există definiție pentru [GLOBAL]!\n"
-    MSG_KEYNOCONFIG "Nu există [CONFIG %1].\n"
-    MSG_KEYUSECONFIG "Utilizare configurație: %1.\n"
-    MSG_KEYNOSWKEY "Nu există tastă de comutare pentru «%1».\n"
+    MSG_KEYNOCONFIG "Nu există [CONFIG %1!hs!].\n"
+    MSG_KEYUSECONFIG "Utilizare configurație: %1!hs!.\n"
+    MSG_KEYNOSWKEY "Nu există tastă de comutare pentru «%1!hs!».\n"
     MSG_KEYCANNOTDEF "În configurația implicită nu pot fi definite taste de 
comutare, vor fi ignorate.\n"
     MSG_KEYDUPSWKEY "Duplicare tastă de comutare.\n"
-    MSG_KEYUNKNOWNMAP "%1 este o configurație de taste necunoscută.\n"
+    MSG_KEYUNKNOWNMAP "%1!hs! este o configurație de taste necunoscută.\n"
     MSG_KEYNOCHARMAPS "Nu au fost încărcate configurații de caractere.\n"
     MSG_KEYNOKEYMAPS "Nu au fost încărcate configurații de taste.\n"
-    MSG_KEYNUMMAPS "În total există %1 configurații.\n"
+    MSG_KEYNUMMAPS "În total există %1!hs! configurații.\n"
     MSG_KEYBADMAP "Număr de configurație de taste nevalid, încercați «keys 
display»\n"
     MSG_KEYMAPSWITCHED "Configurația de taste a fost comutată.\n"
 END
diff --git a/base/applications/network/telnet/lang/ru-RU.rc 
b/base/applications/network/telnet/lang/ru-RU.rc
index 007c60c1f78..423f3f58105 100644
--- a/base/applications/network/telnet/lang/ru-RU.rc
+++ b/base/applications/network/telnet/lang/ru-RU.rc
@@ -9,25 +9,25 @@ BEGIN
     MSG_HELP "Команды можно сократить.  Команды:\n\ncl[ose]         закрыть 
текущее соединение\nop[en]          подключиться к узлу\nq[uit]          выйти 
из telnet\n"
     MSG_HELP_1 "ke[ys]          изменить/показать раскладку\nse[t]           
изменить/показать опции\nz               приостановить\n? h[elp]        
отобразить справку\n"
     MSG_INVCMD "Неверная команда.  Введите ? для справки.\n"
-    MSG_ERROR "%1 не удалось.\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "Попытка %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "Подключение к %1.  Для выхода нажмите ALT-%2.\n"
+    MSG_ERROR "%1!hs! не удалось.\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "Попытка %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "Подключение к %1!hs!.  Для выхода нажмите ALT-%2!hs!.\n"
     MSG_TERMBYREM "Соединение прервано.\n"
-    MSG_KEYMAP "Загрузка %1 из %2.\n"
+    MSG_KEYMAP "Загрузка %1!hs! из %2!hs!.\n"
     MSG_ERRKEYMAP "Ошибка при загрузке раскладки.\n"
-    MSG_DUMPFILE "Запись вывода в файл %1.\n"
-    MSG_CONFIG "Загрузка параметров из %1.\n"
-    MSG_NOINI "Ошибка загрузки параметров из %1.\nЗагрузка параметров по 
умолчанию.\n"
-    MSG_BADVAL "Предупреждение: неправильная переменная %1.\n"
+    MSG_DUMPFILE "Запись вывода в файл %1!hs!.\n"
+    MSG_CONFIG "Загрузка параметров из %1!hs!.\n"
+    MSG_NOINI "Ошибка загрузки параметров из %1!hs!.\nЗагрузка параметров по 
умолчанию.\n"
+    MSG_BADVAL "Предупреждение: неправильная переменная %1!hs!.\n"
     MSG_NOSPAWN "Невозможно породить процесс.\n"
-    MSG_RESOLVING "Поиск узла: %1..."
-    MSG_NOSERVICE "TCP служба не найдена: %1.\n"
-    MSG_SIZEALIAS "Внимание: Размер псевдонима %1 слишком большой, 
игнорирование.\n"
+    MSG_RESOLVING "Поиск узла: %1!hs!..."
+    MSG_NOSERVICE "TCP служба не найдена: %1!hs!.\n"
+    MSG_SIZEALIAS "Внимание: Размер псевдонима %1!hs! слишком большой, 
игнорирование.\n"
     MSG_ERRPIPE "Ошибка: невозможно породить процесс для пайпа.\n"
     MSG_BADUSAGE "Ошибка: недопустимое использование команды.\n"
-    MSG_ALREADYCONNECTED "Уже подключен к %1.\n"
+    MSG_ALREADYCONNECTED "Уже подключен к %1!hs!.\n"
     MSG_WSAEINTR "Вызов функции прерван.\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "Отказано в доступе.\n"
@@ -72,25 +72,25 @@ BEGIN
     MSG_WSATRY_AGAIN "Ненадежный узел не найден.\n"
     MSG_WSANO_RECOVERY "Это неустранимая ошибка.\n"
     MSG_WSANO_DATA "Действительное имя, без записи данных требуемого типаe.\n"
-    MSG_KEYNOVAL "[GLOBAL]: Нет значения для %1.\n"
-    MSG_KEYBADVAL "[GLOBAL]: Неверное значение для %1.\n"
-    MSG_KEYBADSTRUCT "%1: Неправильная структура.\n"
-    MSG_KEYBADCHARS "%1: Неверные символы? %1 -> %3.\n"
-    MSG_KEYUNEXPLINE "Неожиданная строка ""%1"".\n"
+    MSG_KEYNOVAL "[GLOBAL]: Нет значения для %1!hs!.\n"
+    MSG_KEYBADVAL "[GLOBAL]: Неверное значение для %1!hs!.\n"
+    MSG_KEYBADSTRUCT "%1!hs!: Неправильная структура.\n"
+    MSG_KEYBADCHARS "%1!hs!: Неверные символы? %1!hs! -> %3!hs!.\n"
+    MSG_KEYUNEXPLINE "Неожиданная строка ""%1!hs!"".\n"
     MSG_KEYUNEXPEOF "Неожиданный конец файла.\n"
-    MSG_KEYUNEXPTOK "Неожиданный символ %1.\n"
-    MSG_KEYUNEXPTOKIN "Неожиданный символ в %1.\n"
+    MSG_KEYUNEXPTOK "Неожиданный символ %1!hs!.\n"
+    MSG_KEYUNEXPTOKIN "Неожиданный символ в %1!hs!.\n"
     MSG_KEYUNEXP "Неожиданный конец файла или символ.\n"
     MSG_KEYNOGLOBAL "[GLOBAL] Не определено!\n"
-    MSG_KEYNOCONFIG "Нет [CONFIG %1].\n"
-    MSG_KEYUSECONFIG "Используются настройки: %1.\n"
-    MSG_KEYNOSWKEY "Нет клавиши переключения для ""%1"".\n"
+    MSG_KEYNOCONFIG "Нет [CONFIG %1!hs!].\n"
+    MSG_KEYUSECONFIG "Используются настройки: %1!hs!.\n"
+    MSG_KEYNOSWKEY "Нет клавиши переключения для ""%1!hs!"".\n"
     MSG_KEYCANNOTDEF "Нельзя указать клавишу изменения раскладки клавиатуры по 
умолчанию – игнорирование.\n"
     MSG_KEYDUPSWKEY "Эта кнопка уже назначина.\n"
-    MSG_KEYUNKNOWNMAP "Неизвестная раскладка %1.\n"
+    MSG_KEYUNKNOWNMAP "Неизвестная раскладка %1!hs!.\n"
     MSG_KEYNOCHARMAPS "Не загружена таблица символов.\n"
     MSG_KEYNOKEYMAPS "Не загружена раскладка.\n"
-    MSG_KEYNUMMAPS "Раскладка %1 уже существует.\n"
+    MSG_KEYNUMMAPS "Раскладка %1!hs! уже существует.\n"
     MSG_KEYBADMAP "Неправильный номер раскладки - попробуйте 'keys display'\n"
     MSG_KEYMAPSWITCHED "раскладка переключена.\n"
 END
diff --git a/base/applications/network/telnet/lang/tr-TR.rc 
b/base/applications/network/telnet/lang/tr-TR.rc
index 77c29b4c856..c051774738c 100644
--- a/base/applications/network/telnet/lang/tr-TR.rc
+++ b/base/applications/network/telnet/lang/tr-TR.rc
@@ -11,25 +11,25 @@ BEGIN
     MSG_HELP "Komutlar kısaltılmış olabilir.  Komutlar:\n\ncl[ose]         
Şimdiki bağlantıyı kapat.\nop[en]          Bir siteye bağlan.\nq[uit]          
Telnet'ten çık.\n"
     MSG_HELP_1 "ke[ys]          Tuş haritasını değiştirir ya da görüntüler. 
(Seçenekleri görmek için keys yazınız.)\nse[t]           Yapılandırma 
seçeneklerini görüntüler ya da değiştirir.\nz               Askıya al.\n? 
h[elp]        Yardım bilgisini yazdır.\n"
     MSG_INVCMD "Geçersiz komut. Yardım için ? yazınız.\n"
-    MSG_ERROR "%1 başarısız.\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "Deneniyor: %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "%1 anabilgisayarına bağlandı. Çıkış tuş kombinasyonu 
ALT-%2.\n"
+    MSG_ERROR "%1!hs! başarısız.\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "Deneniyor: %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "%1!hs! anabilgisayarına bağlandı. Çıkış tuş kombinasyonu 
ALT-%2!hs!.\n"
     MSG_TERMBYREM "Bağlantı sonlandırıldı.\n"
-    MSG_KEYMAP "%2'den %1 yükleniyor.\n"
+    MSG_KEYMAP "%2!hs!'den %1!hs! yükleniyor.\n"
     MSG_ERRKEYMAP "Klavye yerleşimi yüklemede hata.\n"
-    MSG_DUMPFILE "%1 dosyasına çıktı yazdırılıyor.\n"
-    MSG_CONFIG "%1'den yapılandırma ayarları yükleniyor.\n"
-    MSG_NOINI "%1 yapılandırma dosyasına yüklemede hata.\nVarsayılan ayarlar 
yükleniyor.\n"
-    MSG_BADVAL "Uyarı: Geçersiz değişken (%1).\n"
+    MSG_DUMPFILE "%1!hs! dosyasına çıktı yazdırılıyor.\n"
+    MSG_CONFIG "%1!hs!'den yapılandırma ayarları yükleniyor.\n"
+    MSG_NOINI "%1!hs! yapılandırma dosyasına yüklemede hata.\nVarsayılan 
ayarlar yükleniyor.\n"
+    MSG_BADVAL "Uyarı: Geçersiz değişken (%1!hs!).\n"
     MSG_NOSPAWN "İşlem oluşturulamıyor.\n"
-    MSG_RESOLVING "Anabilgisayara bakılıyor: %1..."
-    MSG_NOSERVICE "%1 TCP hizmeti bulunamadı.\n"
-    MSG_SIZEALIAS "Uyarı: %1 takma adının büyüklüğü çok büyük, yok 
sayılıyor.\n"
+    MSG_RESOLVING "Anabilgisayara bakılıyor: %1!hs!..."
+    MSG_NOSERVICE "%1!hs! TCP hizmeti bulunamadı.\n"
+    MSG_SIZEALIAS "Uyarı: %1!hs! takma adının büyüklüğü çok büyük, yok 
sayılıyor.\n"
     MSG_ERRPIPE "Hata: Boru için işlem oluşturulamıyor.\n"
     MSG_BADUSAGE "Hata: Komutun kullanımı geçersiz.\n"
-    MSG_ALREADYCONNECTED "%1'e zaten bağlanılmış.\n"
+    MSG_ALREADYCONNECTED "%1!hs!'e zaten bağlanılmış.\n"
     MSG_WSAEINTR "Fonksiyon çağrısı kesildi.\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "İzin geri çevrildi.\n"
@@ -74,25 +74,25 @@ BEGIN
     MSG_WSATRY_AGAIN "Yetkili olmayan anabilgisayar bulunamadı.\n"
     MSG_WSANO_RECOVERY "Bu bir karşılanamayan hatadır.\n"
     MSG_WSANO_DATA "Geçerli ad, istenilen tür kaydı verisi yok.\n"
-    MSG_KEYNOVAL "[GENEL]: %1 için değer yok.\n"
-    MSG_KEYBADVAL "[GENEL]: %1 için geçersiz değer.\n"
-    MSG_KEYBADSTRUCT "%1: Geçersiz yapı.\n"
-    MSG_KEYBADCHARS "%1: Geçersiz karakterler? %1 -> %3.\n"
-    MSG_KEYUNEXPLINE "Beklenmeyen satır: ""%1"".\n"
+    MSG_KEYNOVAL "[GENEL]: %1!hs! için değer yok.\n"
+    MSG_KEYBADVAL "[GENEL]: %1!hs! için geçersiz değer.\n"
+    MSG_KEYBADSTRUCT "%1!hs!: Geçersiz yapı.\n"
+    MSG_KEYBADCHARS "%1!hs!: Geçersiz karakterler? %1!hs! -> %3!hs!.\n"
+    MSG_KEYUNEXPLINE "Beklenmeyen satır: ""%1!hs!"".\n"
     MSG_KEYUNEXPEOF "Beklemeyen dosya sonu.\n"
-    MSG_KEYUNEXPTOK "Beklenmeyen simge: %1.\n"
-    MSG_KEYUNEXPTOKIN "%1'de beklenmeyen simge.\n"
+    MSG_KEYUNEXPTOK "Beklenmeyen simge: %1!hs!.\n"
+    MSG_KEYUNEXPTOKIN "%1!hs!'de beklenmeyen simge.\n"
     MSG_KEYUNEXP "Beklenmeyen dosya sonu ya da simge.\n"
     MSG_KEYNOGLOBAL "[GENEL] tanımlama yok!\n"
-    MSG_KEYNOCONFIG "[CONFIG %1] yok.\n"
-    MSG_KEYUSECONFIG "Yapılandırmayı kullan: %1.\n"
-    MSG_KEYNOSWKEY """%1"" için geçiş anahtarı yok.\n"
+    MSG_KEYNOCONFIG "[CONFIG %1!hs!] yok.\n"
+    MSG_KEYUSECONFIG "Yapılandırmayı kullan: %1!hs!.\n"
+    MSG_KEYNOSWKEY """%1!hs!"" için geçiş anahtarı yok.\n"
     MSG_KEYCANNOTDEF "Varsayılan anahtar haritası için geçiş anahtarı 
tanımlayamazsınız - yok sayıldı.\n"
     MSG_KEYDUPSWKEY "Aynı geçiş anahtarı.\n"
-    MSG_KEYUNKNOWNMAP "Bilinmeyen anahtar haritası: %1.\n"
+    MSG_KEYUNKNOWNMAP "Bilinmeyen anahtar haritası: %1!hs!.\n"
     MSG_KEYNOCHARMAPS "Bir karakter haritası yüklenmedi.\n"
     MSG_KEYNOKEYMAPS "Bir anahtar haritası yüklenmedi.\n"
-    MSG_KEYNUMMAPS "Burada %1 harita var.\n"
+    MSG_KEYNUMMAPS "Burada %1!hs! harita var.\n"
     MSG_KEYBADMAP "Geçersiz anahtar haritası numarası, ""keys display""ı 
deneyiniz.\n"
     MSG_KEYMAPSWITCHED "Anahtar haritasına geçildi.\n"
 END
diff --git a/base/applications/network/telnet/lang/zh-CN.rc 
b/base/applications/network/telnet/lang/zh-CN.rc
index b9d70f10a9a..e96ce2b7b8b 100644
--- a/base/applications/network/telnet/lang/zh-CN.rc
+++ b/base/applications/network/telnet/lang/zh-CN.rc
@@ -17,25 +17,25 @@ BEGIN
     MSG_HELP "命令可以被简写。命令有:\n\ncl[ose]         关闭当前连接\nop[en]          
连接到一个站点\nq[uit]          退出 telnet\n"
     MSG_HELP_1 "ke[ys]          修改或显示按键映射(写入一些键来查看选项)\nse[t]           
显示或修改配置选项\nz               暂停\n? h[elp]        打印帮助信息\n"
     MSG_INVCMD "无效命令。输入 ? 获得帮助。\n"
-    MSG_ERROR "%1 失败。\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "正在尝试 %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "已连接到 %1。Escape 键是 ALT-%2。\n"
+    MSG_ERROR "%1!hs! 失败。\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "正在尝试 %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "已连接到 %1!hs!。Escape 键是 ALT-%2!hs!。\n"
     MSG_TERMBYREM "连接结束。\n"
-    MSG_KEYMAP "正在从 %2 加载 %1。\n"
+    MSG_KEYMAP "正在从 %2!hs! 加载 %1!hs!。\n"
     MSG_ERRKEYMAP "加载按键映射时发生错误。\n"
-    MSG_DUMPFILE "正在将输出写入到文件 %1 中。\n"
-    MSG_CONFIG "正在从 %1 中加载配置选项。\n"
-    MSG_NOINI "从配置文件 %1 中加载发生错误。\n正在加载默认选项。\n"
-    MSG_BADVAL "警告:无效变量 %1。\n"
+    MSG_DUMPFILE "正在将输出写入到文件 %1!hs! 中。\n"
+    MSG_CONFIG "正在从 %1!hs! 中加载配置选项。\n"
+    MSG_NOINI "从配置文件 %1!hs! 中加载发生错误。\n正在加载默认选项。\n"
+    MSG_BADVAL "警告:无效变量 %1!hs!。\n"
     MSG_NOSPAWN "无法创建进程。\n"
-    MSG_RESOLVING "正在查找主机:%1..."
-    MSG_NOSERVICE "无法找到 TCP 服务 %1。\n"
-    MSG_SIZEALIAS "警告:别名 %1 过大,已忽略。\n"
+    MSG_RESOLVING "正在查找主机:%1!hs!..."
+    MSG_NOSERVICE "无法找到 TCP 服务 %1!hs!。\n"
+    MSG_SIZEALIAS "警告:别名 %1!hs! 过大,已忽略。\n"
     MSG_ERRPIPE "错误:无法为管道创建进程。\n"
     MSG_BADUSAGE "错误:命令的用法无效。\n"
-    MSG_ALREADYCONNECTED "已经连接到 %1。\n"
+    MSG_ALREADYCONNECTED "已经连接到 %1!hs!。\n"
     MSG_WSAEINTR "函数调用已被中断。\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "拒绝访问。\n"
@@ -80,25 +80,25 @@ BEGIN
     MSG_WSATRY_AGAIN "未找到非授权主机。\n"
     MSG_WSANO_RECOVERY "这是一个无法恢复的错误。\n"
     MSG_WSANO_DATA "名称有效,但是没有与请求类型相同的数据记录。\n"
-    MSG_KEYNOVAL "[全局]:没有 %1 的值。\n"
-    MSG_KEYBADVAL "[全局]:%1 的值有错误。\n"
-    MSG_KEYBADSTRUCT "%1:错误的结构。\n"
-    MSG_KEYBADCHARS "%1:错误的字符?%1 -> %3。\n"
-    MSG_KEYUNEXPLINE "未预料的行 ""%1""。\n"
+    MSG_KEYNOVAL "[全局]:没有 %1!hs! 的值。\n"
+    MSG_KEYBADVAL "[全局]:%1!hs! 的值有错误。\n"
+    MSG_KEYBADSTRUCT "%1!hs!:错误的结构。\n"
+    MSG_KEYBADCHARS "%1!hs!:错误的字符?%1!hs! -> %3!hs!。\n"
+    MSG_KEYUNEXPLINE "未预料的行 ""%1!hs!""。\n"
     MSG_KEYUNEXPEOF "未预料的文件结束。\n"
-    MSG_KEYUNEXPTOK "未预料的令牌 %1。\n"
-    MSG_KEYUNEXPTOKIN "未预料的 %1 中的令牌。\n"
+    MSG_KEYUNEXPTOK "未预料的令牌 %1!hs!。\n"
+    MSG_KEYUNEXPTOKIN "未预料的 %1!hs! 中的令牌。\n"
     MSG_KEYUNEXP "未预料的文件或令牌结束。\n"
     MSG_KEYNOGLOBAL "没有 [全局] 定义!\n"
-    MSG_KEYNOCONFIG "没有 [配置 %1]。\n"
-    MSG_KEYUSECONFIG "使用配置:%1。\n"
-    MSG_KEYNOSWKEY "没有“%1”的切换键。\n"
+    MSG_KEYNOCONFIG "没有 [配置 %1!hs!]。\n"
+    MSG_KEYUSECONFIG "使用配置:%1!hs!。\n"
+    MSG_KEYNOSWKEY "没有“%1!hs!”的切换键。\n"
     MSG_KEYCANNOTDEF "您不能定义默认按键映射的切换键 - 已忽略。\n"
     MSG_KEYDUPSWKEY "重复的切换键。\n"
-    MSG_KEYUNKNOWNMAP "未知的按键映射 %1。\n"
+    MSG_KEYUNKNOWNMAP "未知的按键映射 %1!hs!。\n"
     MSG_KEYNOCHARMAPS "没有加载的字符映射。\n"
     MSG_KEYNOKEYMAPS "没有加载的按键映射。\n"
-    MSG_KEYNUMMAPS "有 %1 个映射。\n"
+    MSG_KEYNUMMAPS "有 %1!hs! 个映射。\n"
     MSG_KEYBADMAP "错误的按键映射码 - 请尝试“keys display”\n"
     MSG_KEYMAPSWITCHED "按键映射已经切换。\n"
 END
diff --git a/base/applications/network/telnet/lang/zh-TW.rc 
b/base/applications/network/telnet/lang/zh-TW.rc
index 8be539d105d..56cd84ecbf8 100644
--- a/base/applications/network/telnet/lang/zh-TW.rc
+++ b/base/applications/network/telnet/lang/zh-TW.rc
@@ -16,25 +16,25 @@ BEGIN
     MSG_HELP "命令可以被簡寫。  命令有:\n\ncl[ose]         關閉目前連線\nop[en]          
連線到一個網站\nq[uit]          退出 telnet\n"
     MSG_HELP_1 "ke[ys]          修改或顯示按鍵映射 (寫入一些鍵來查看選項)\nse[t]           
顯示或修改配置選項\nz               暫停\n? h[elp]        列印說明資訊\n"
     MSG_INVCMD "無效的命令。輸入 ? 以取得說明。\n"
-    MSG_ERROR "%1 失敗。\n"
-    MSG_INFO "%1\n"
-    MSG_WARNING "%1\n"
-    MSG_TRYING "正在嘗試 %1.%2.%3.%4:%5...\n"
-    MSG_CONNECTED "已經連線到 %1。Escape 鍵是 ALT-%2.\n"
+    MSG_ERROR "%1!hs! 失敗。\n"
+    MSG_INFO "%1!hs!\n"
+    MSG_WARNING "%1!hs!\n"
+    MSG_TRYING "正在嘗試 %1!hs!.%2!hs!.%3!hs!.%4!hs!:%5!hs!...\n"
+    MSG_CONNECTED "已經連線到 %1!hs!。Escape 鍵是 ALT-%2!hs!.\n"
     MSG_TERMBYREM "連線結束。\n"
-    MSG_KEYMAP "正在從 %2 載入 %1。\n"
+    MSG_KEYMAP "正在從 %2!hs! 載入 %1!hs!。\n"
     MSG_ERRKEYMAP "載入按鍵映射時發生錯誤。\n"
-    MSG_DUMPFILE "正在將輸出寫入到檔案 %1 中。\n"
-    MSG_CONFIG "正在從 %1 中載入配置選項。\n"
-    MSG_NOINI "從配置檔案 %1 中載入發生錯誤。\n正在載入預設選項。\n"
-    MSG_BADVAL "警告: 無效的變量 %1。\n"
+    MSG_DUMPFILE "正在將輸出寫入到檔案 %1!hs! 中。\n"
+    MSG_CONFIG "正在從 %1!hs! 中載入配置選項。\n"
+    MSG_NOINI "從配置檔案 %1!hs! 中載入發生錯誤。\n正在載入預設選項。\n"
+    MSG_BADVAL "警告: 無效的變量 %1!hs!。\n"
     MSG_NOSPAWN "無法建立進程。\n"
-    MSG_RESOLVING "正在查找主機: %1..."
-    MSG_NOSERVICE "無法找到 TCP 服務 %1。\n"
-    MSG_SIZEALIAS "警告: 别名 %1 太大了,正在忽略。\n"
+    MSG_RESOLVING "正在查找主機: %1!hs!..."
+    MSG_NOSERVICE "無法找到 TCP 服務 %1!hs!。\n"
+    MSG_SIZEALIAS "警告: 别名 %1!hs! 太大了,正在忽略。\n"
     MSG_ERRPIPE "錯誤: 無法為管道建立進程。\n"
     MSG_BADUSAGE "錯誤: 無效的命令用法。\n"
-    MSG_ALREADYCONNECTED "已經連線到 %1。\n"
+    MSG_ALREADYCONNECTED "已經連線到 %1!hs!。\n"
     MSG_WSAEINTR "中斷的函數調用。\n"
     MSG_WSAEBADF "WSAEBADF\n"
     MSG_WSAEACCESS "拒絕存取。\n"
@@ -79,25 +79,25 @@ BEGIN
     MSG_WSATRY_AGAIN "找不到非授權主機。\n"
     MSG_WSANO_RECOVERY "這是一個無法恢復的錯誤。\n"
     MSG_WSANO_DATA "名稱有效,但沒有請求數據記錄的類型。\n"
-    MSG_KEYNOVAL "[全域]: 沒有 %1 的值。\n"
-    MSG_KEYBADVAL "[全域]: %1 的值有錯誤。\n"
-    MSG_KEYBADSTRUCT "%1: 錯誤的結構。\n"
-    MSG_KEYBADCHARS "%1: 錯誤的字符?%1 -> %3。\n"
-    MSG_KEYUNEXPLINE "未預期的行 ""%1""。\n"
+    MSG_KEYNOVAL "[全域]: 沒有 %1!hs! 的值。\n"
+    MSG_KEYBADVAL "[全域]: %1!hs! 的值有錯誤。\n"
+    MSG_KEYBADSTRUCT "%1!hs!: 錯誤的結構。\n"
+    MSG_KEYBADCHARS "%1!hs!: 錯誤的字符?%1!hs! -> %3!hs!。\n"
+    MSG_KEYUNEXPLINE "未預期的行 ""%1!hs!""。\n"
     MSG_KEYUNEXPEOF "未預期的檔案結尾。\n"
-    MSG_KEYUNEXPTOK "未預期的權杖 %1。\n"
-    MSG_KEYUNEXPTOKIN "在 %1 中出現未預期的權杖。\n"
+    MSG_KEYUNEXPTOK "未預期的權杖 %1!hs!。\n"
+    MSG_KEYUNEXPTOKIN "在 %1!hs! 中出現未預期的權杖。\n"
     MSG_KEYUNEXP "未預期的檔案結尾或權杖。\n"
     MSG_KEYNOGLOBAL "沒有 [全域] 定義!\n"
-    MSG_KEYNOCONFIG "沒有 [配置 %1]。\n"
-    MSG_KEYUSECONFIG "使用配置: %1。\n"
-    MSG_KEYNOSWKEY "沒有 ""%1"" 的切換鍵。\n"
+    MSG_KEYNOCONFIG "沒有 [配置 %1!hs!]。\n"
+    MSG_KEYUSECONFIG "使用配置: %1!hs!。\n"
+    MSG_KEYNOSWKEY "沒有 ""%1!hs!"" 的切換鍵。\n"
     MSG_KEYCANNOTDEF "您不能定義預設按鍵映射的切換鍵 - 已略過。\n"
     MSG_KEYDUPSWKEY "重複的切換鍵。\n"
-    MSG_KEYUNKNOWNMAP "未知的按鍵映射 %1。\n"
+    MSG_KEYUNKNOWNMAP "未知的按鍵映射 %1!hs!。\n"
     MSG_KEYNOCHARMAPS "沒有已載入的字符映射。\n"
     MSG_KEYNOKEYMAPS "沒有已載入的按鍵映射。\n"
-    MSG_KEYNUMMAPS "有 %1 個映射。\n"
+    MSG_KEYNUMMAPS "有 %1!hs! 個映射。\n"
     MSG_KEYBADMAP "錯誤的按鍵映射碼 - 請嘗試 'keys display'\n"
     MSG_KEYMAPSWITCHED "按鍵映射已經切換。\n"
 END
diff --git a/base/applications/network/telnet/precomp.h 
b/base/applications/network/telnet/precomp.h
index c678b12c462..bb215f3f71d 100644
--- a/base/applications/network/telnet/precomp.h
+++ b/base/applications/network/telnet/precomp.h
@@ -9,6 +9,7 @@
 #include <winbase.h>
 #include <winuser.h>
 #include <wincon.h>
+#include <winnls.h>
 #define _INC_WINDOWS
 #include <winsock.h>
 
diff --git a/base/applications/network/telnet/src/tnerror.cpp 
b/base/applications/network/telnet/src/tnerror.cpp
index 5278cd266cf..82fda0b2180 100644
--- a/base/applications/network/telnet/src/tnerror.cpp
+++ b/base/applications/network/telnet/src/tnerror.cpp
@@ -81,6 +81,47 @@ int printit(const char * it){
        return 0;
 }
 
+#ifdef __REACTOS__
+int wprintit(LPCWSTR it)
+{
+    DWORD numwritten;
+    if (!ini.get_output_redir())
+    {
+        if (!WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
+                           it, wcslen(it), &numwritten, NULL))
+        {
+            return -1;
+        }
+    }
+    else
+    {
+        // calculate the number of bytes needed to store the UTF-8 string
+        int cbMultibyte = WideCharToMultiByte(CP_UTF8, 0, it, -1, NULL, 0, 
NULL, NULL);
+        if (cbMultibyte == 0)
+            return 0;
+        if (cbMultibyte < 0)
+            return -1;
+        // allocate the buffer for the UTF-8 string
+        char* szBuffer = new char[cbMultibyte];
+        if (!szBuffer)
+            return -1;
+
+        bool bSuccess = false;
+        if (WideCharToMultiByte(CP_UTF8, 0, it, -1, szBuffer, cbMultibyte, 
NULL, NULL) &&
+            WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
+                      szBuffer, cbMultibyte, &numwritten, NULL))
+        {
+            bSuccess = true;
+        }
+
+        delete[] szBuffer;
+        if (!bSuccess)
+            return -1;
+    }
+    return 0;
+}
+#endif
+
 int printm(LPTSTR szModule, BOOL fSystem, DWORD dwMessageId, ...)
 {
        int Result = 0;
@@ -91,7 +132,23 @@ int printm(LPTSTR szModule, BOOL fSystem, DWORD 
dwMessageId, ...)
 
        va_list Ellipsis;
        va_start(Ellipsis, dwMessageId);
+#ifdef __REACTOS__
+       LPWSTR pszMessage = NULL;
+       DWORD dwMessage = 0;
 
+       if(fSystem) {
+               dwMessage = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                       FORMAT_MESSAGE_FROM_SYSTEM, hModule, dwMessageId,
+                       LANG_USER_DEFAULT, (LPWSTR)&pszMessage, 128, &Ellipsis);
+       } else {
+               // we will use a string table.
+               WCHAR wszString[256];
+               if(LoadStringW(0, dwMessageId, wszString, sizeof(wszString) / 
sizeof(*wszString)))
+                       dwMessage = 
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                               FORMAT_MESSAGE_FROM_STRING, wszString, 
dwMessageId,
+                               LANG_USER_DEFAULT, (LPWSTR)&pszMessage, 
sizeof(wszString) / sizeof(*wszString), &Ellipsis);
+       }
+#else
        LPTSTR pszMessage = 0;
        DWORD dwMessage = 0;
        if(fSystem) {
@@ -106,6 +163,7 @@ int printm(LPTSTR szModule, BOOL fSystem, DWORD 
dwMessageId, ...)
                                FORMAT_MESSAGE_FROM_STRING, szString, 
dwMessageId,
                                LANG_USER_DEFAULT, (LPTSTR)&pszMessage, 256, 
&Ellipsis);
        }
+#endif
 
        va_end(Ellipsis);
 
@@ -113,8 +171,11 @@ int printm(LPTSTR szModule, BOOL fSystem, DWORD 
dwMessageId, ...)
                FreeLibrary(hModule);
 
        if (dwMessage) {
-
+#ifdef __REACTOS__
+               Result = wprintit(pszMessage);
+#else
                Result = printit(pszMessage);
+#endif
                LocalFree(pszMessage);
        }
 

Reply via email to