]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0866: MS-Windows: ":language messages" only works once v9.2.0866
authorHirohito Higashi <h.east.727@gmail.com>
Mon, 27 Jul 2026 21:55:27 +0000 (21:55 +0000)
committerChristian Brabandt <cb@256bit.org>
Mon, 27 Jul 2026 21:55:27 +0000 (21:55 +0000)
Problem:  On MS-Windows ":language messages" has no effect once messages
          have been translated, the previous language keeps being used.
Solution: Make gettext drop the translations it cached.

related: #18622
closes:  #20862

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/locale.c
src/os_win32.c
src/version.c
src/vim.h

index db2dfa1af51ff3529fae38d1a826709006ca880e..eb1845fce523e6b4db25cd79e10093d9742908c4 100644 (file)
@@ -348,6 +348,10 @@ ex_language(exarg_T *eap)
            extern int _nl_msg_cat_cntr;
 
            ++_nl_msg_cat_cntr;
+# elif defined(DYNAMIC_GETTEXT)
+           // Same thing when gettext is loaded at runtime.
+           if (dyn_libintl_nl_msg_cat_cntr != NULL)
+               ++*dyn_libintl_nl_msg_cat_cntr;
 # endif
            // Reset $LC_ALL, otherwise it would overrule everything.
            vim_setenv((char_u *)"LC_ALL", (char_u *)"");
index 4797eed426240dd731637970bf08372321775cf3..53b600f809467328507084925c8329a5b008a6fe 100644 (file)
@@ -696,6 +696,7 @@ char *(*dyn_libintl_bindtextdomain)(const char *, const char *)
 char *(*dyn_libintl_bind_textdomain_codeset)(const char *, const char *)
                                       = null_libintl_bind_textdomain_codeset;
 int (*dyn_libintl_wputenv)(const wchar_t *) = null_libintl_wputenv;
+int *dyn_libintl_nl_msg_cat_cntr = NULL;
 
     int
 dyn_libintl_init(void)
@@ -770,6 +771,11 @@ dyn_libintl_init(void)
     if (dyn_libintl_wputenv == NULL || dyn_libintl_wputenv == _wputenv)
        dyn_libintl_wputenv = null_libintl_wputenv;
 
+    // The _nl_msg_cat_cntr variable is optional.  It is used to make gettext
+    // drop the translations it cached.
+    dyn_libintl_nl_msg_cat_cntr = (int *)GetProcAddress(hLibintlDLL,
+                                                        "_nl_msg_cat_cntr");
+
     return 1;
 }
 
@@ -785,6 +791,7 @@ dyn_libintl_end(void)
     dyn_libintl_bindtextdomain = null_libintl_bindtextdomain;
     dyn_libintl_bind_textdomain_codeset = null_libintl_bind_textdomain_codeset;
     dyn_libintl_wputenv                = null_libintl_wputenv;
+    dyn_libintl_nl_msg_cat_cntr        = NULL;
 }
 
     static char *
index 3f239da856fd70a2cd40d16ea4a374871753b2ac..48389e931f18c009a863d968d3988e920d78dfc8 100644 (file)
@@ -758,6 +758,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    866,
 /**/
     865,
 /**/
index 408cf711d1184b04790dc85baaa983a875b72503..0caf437408150a1b11b691f4cf8619fcaed6e00f 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -577,6 +577,7 @@ extern char *(*dyn_libintl_bindtextdomain)(const char *domainname, const char *d
 extern char *(*dyn_libintl_bind_textdomain_codeset)(const char *domainname, const char *codeset);
 extern char *(*dyn_libintl_textdomain)(const char *domainname);
 extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
+extern int *dyn_libintl_nl_msg_cat_cntr;
 #endif