Re: [PATCH][PR server/24377] Fix mixing English and system default languages in error messages on Windows

Владимир Мартьянов
2019-03-31T19:39:19Z

[-- Attachment #1: Type: text/plain, Size: 858 bytes --]

вс, 31 мар. 2019 г. в 17:45, Eli Zaretskii <eliz@gnu.org>:

> Bother: do we want to behave like a Posix platform here, or like a
> Windows system? Windows doesn't have LC_MESSAGES as a locale
> category.

I just saw LC_MESSAGES usage in gettext...

> Finally, a more general point: I'm not sure I understand the purpose
> of this change. Is the purpose to let users control the language of
> the gdbserver system error messages?

Yes, it's the purprose.

> If so, would they need to
> control that by setting environment variables? It sounds less
> convenient than it could have been, I think. Why not a GDB variable
> instead?

Environment variables are used in gettext anyway, I think single
source for localisation language is convenient.

I corrected issues you mentioned (I hope!) and made a function to get locale ID.

[-- Attachment #2: 0001-gettext-like-localisation-of-error-messages-added-to.patch --]
[-- Type: application/octet-stream, Size: 3285 bytes --]

From 85f46d36a2043c58248d2d6cb01e03acb66202fa Mon Sep 17 00:00:00 2001
From: Vladimir Martyanov <vilgeforce@gmail.com>
Date: Sun, 31 Mar 2019 22:18:24 +0300
Subject: [PATCH] gettext-like localisation of error messages added to
strwinerror

---
gdb/gdbserver/win32-low.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 69 insertions(+), 1 deletion(-)

diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c
index 1a50141c12..fe8c1453a3 100644
--- a/gdb/gdbserver/win32-low.c
+++ b/gdb/gdbserver/win32-low.c
@@ -496,6 +496,73 @@ child_store_inferior_registers (struct regcache *regcache, int r)
(*the_low_target.store_inferior_register) (regcache, th, regno);
}

+/* Return locale ID from environment variables (LC_ALL and LANG)
+ or 0 (which means system default). */
+LCID
+get_lcid(void)
+{
+ typedef HRESULT (WINAPI *RFC1766TOLCID)(LCID *pLocale, LPTSTR pszRfc1766);
+ typedef LCID (WINAPI *LOCALENAMETOLCID)(LPCWSTR lpName, DWORD dwFlags);
+
+ static HMODULE hMlang = LoadLibrary ("Mlang.dll");
+ HMODULE hKernel32 = GetModuleHandle ("kernel32.dll");
+
+ LCID lcid = 0; /* System default */
+ char buf[256];
+ WCHAR wbuf[256];
+ char *localeName = NULL;
+ char *ptr = NULL;
+ RFC1766TOLCID Rfc1766ToLcid = NULL;
+ LOCALENAMETOLCID LocaleNameToLCID = NULL;
+
+ LocaleNameToLCID = (LOCALENAMETOLCID) GetProcAddress (hKernel32,
+ "LocaleNameToLCID");
+ if (LocaleNameToLCID == NULL)
+ {
+ if (hMlang != NULL)
+ Rfc1766ToLcid = (RFC1766TOLCID) GetProcAddress (hMlang,
+ "Rfc1766ToLcidW");
+ if (Rfc1766ToLcid == NULL)
+ return lcid; /* No conversion funcions - return system default */
+ }
+
+ /* Setting of LC_ALL overwrites all other. */
+ localeName = getenv ("LC_ALL");
+ if (localeName == NULL || localeName[0] == '\0')
+ localeName = getenv ("LANG");
+
+
+ if (localeName == NULL || localeName[0] == '\0')
+ return lcid;
+
+ if (!strcmp (localeName, "C"))
+ return MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_US);
+
+ strncpy (buf, localeName, COUNTOF (buf) - 1);
+ ptr = strchr (buf, '.'); /* cut at "." */
+ if (ptr != NULL)
+ *ptr = 0x00;
+
+ ptr = strchr (buf, '_'); /* replace "_" */
+ if (ptr != NULL)
+ *ptr = '-';
+
+ if (LocaleNameToLCID != NULL)
+ {
+ MultiByteToWideChar (CP_ACP,
+ 0,
+ buf,
+ -1,
+ wbuf,
+ COUNTOF (wbuf) - 1);
+ lcid = LocaleNameToLCID (wbuf, 0);
+ }
+ else
+ Rfc1766ToLcid (&lcid, buf);
+
+ return lcid;
+}
+
/* Map the Windows error number in ERROR to a locale-dependent error
message string and return a pointer to it. Typically, the values
for ERROR come from GetLastError.
@@ -512,11 +579,12 @@ strwinerror (DWORD error)
static char buf[1024];
TCHAR *msgbuf;
DWORD lasterr = GetLastError ();
+
DWORD chars = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
error,
- 0, /* Default language */
+ get_lcid (),
(LPTSTR) &msgbuf,
0,
NULL);
--
2.16.2.windows.1