patch 8.2.1544: cannot translate messages in a Vim script

Problem:    Cannot translate messages in a Vim script.
Solution:   Add gettext().  Try it out for a few messages in the options
            window.
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 62bbb88..fff7a89 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -97,6 +97,7 @@
 static void f_getreginfo(typval_T *argvars, typval_T *rettv);
 static void f_getregtype(typval_T *argvars, typval_T *rettv);
 static void f_gettagstack(typval_T *argvars, typval_T *rettv);
+static void f_gettext(typval_T *argvars, typval_T *rettv);
 static void f_haslocaldir(typval_T *argvars, typval_T *rettv);
 static void f_hasmapto(typval_T *argvars, typval_T *rettv);
 static void f_hlID(typval_T *argvars, typval_T *rettv);
@@ -667,6 +668,7 @@
     {"gettabvar",	2, 3, FEARG_1,	  ret_any,	f_gettabvar},
     {"gettabwinvar",	3, 4, FEARG_1,	  ret_any,	f_gettabwinvar},
     {"gettagstack",	0, 1, FEARG_1,	  ret_dict_any,	f_gettagstack},
+    {"gettext",		1, 1, FEARG_1,	  ret_string,	f_gettext},
     {"getwininfo",	0, 1, FEARG_1,	  ret_list_dict_any,	f_getwininfo},
     {"getwinpos",	0, 1, FEARG_1,	  ret_list_number,	f_getwinpos},
     {"getwinposx",	0, 0, 0,	  ret_number,	f_getwinposx},
@@ -3437,6 +3439,26 @@
     get_tagstack(wp, rettv->vval.v_dict);
 }
 
+/*
+ * "gettext()" function
+ */
+    static void
+f_gettext(typval_T *argvars, typval_T *rettv)
+{
+    if (argvars[0].v_type != VAR_STRING
+	    || argvars[0].vval.v_string == NULL
+	    || *argvars[0].vval.v_string == NUL)
+    {
+	semsg(_(e_invarg2), tv_get_string(&argvars[0]));
+    }
+    else
+    {
+	rettv->v_type = VAR_STRING;
+	rettv->vval.v_string = vim_strsave(
+					(char_u *)_(argvars[0].vval.v_string));
+    }
+}
+
 // for VIM_VERSION_ defines
 #include "version.h"
 
diff --git a/src/po/Makefile b/src/po/Makefile
index cce14a9..8ef93e6 100644
--- a/src/po/Makefile
+++ b/src/po/Makefile
@@ -36,6 +36,7 @@
 
 check: $(CHECKFILES)
 
+# installing for real
 install: $(MOFILES) $(MOCONVERTED)
 	@$(MAKE) prefixcheck
 	for lang in $(LANGUAGES); do \
@@ -61,6 +62,24 @@
 	  rm -f $(LOCALEDIR)/$$lang/LC_MESSAGES/$(PACKAGE).mo; \
 	done
 
+# installing for local tryout into ../../runtime/lang
+tryoutinstall: $(MOFILES) $(MOCONVERTED)
+	@$(MAKE) prefixcheck
+	for lang in $(LANGUAGES); do \
+	  dir=../../runtime/lang/$$lang/; \
+	  if test ! -x "$$dir"; then \
+	    mkdir $$dir; chmod 755 $$dir; \
+	  fi; \
+	  dir=../../runtime/lang/$$lang/LC_MESSAGES; \
+	  if test ! -x "$$dir"; then \
+	    mkdir $$dir; chmod 755 $$dir; \
+	  fi; \
+	  if test -r $$lang.mo; then \
+	    cp $$lang.mo $$dir/$(PACKAGE).mo; \
+	    chmod 644 $$dir/$(PACKAGE).mo; \
+	  fi; \
+	done
+
 converted: $(MOCONVERTED)
 
 # nl.po was added later, if it does not exist use a file with just a # in it
@@ -158,12 +177,34 @@
 checkclean:
 	rm -f *.ck
 
-$(PACKAGE).pot: ../*.c ../if_perl.xs ../GvimExt/gvimext.cpp ../globals.h ../if_py_both.h ../vim.h gvim.desktop.in vim.desktop.in
-	cd ..; $(XGETTEXT) --default-domain=$(PACKAGE) \
-		--add-comments --keyword=_ --keyword=N_ --keyword=NGETTEXT:1,2 \
-		*.c if_perl.xs GvimExt/gvimext.cpp globals.h if_py_both.h vim.h \
-		po/gvim.desktop.in po/vim.desktop.in
-	mv -f ../$(PACKAGE).po $(PACKAGE).pot
+PO_INPUTLIST = \
+	../*.c \
+	../if_perl.xs \
+	../GvimExt/gvimext.cpp \
+	../globals.h \
+	../if_py_both.h \
+	../vim.h \
+	gvim.desktop.in \
+	vim.desktop.in
+
+PO_VIM_INPUTLIST = \
+	../../runtime/optwin.vim
+
+PO_VIM_JSLIST = \
+	optwin.js
+
+$(PACKAGE).pot: $(PO_INPUTLIST) $(PO_VIM_INPUTLIST)
+	# Convert the Vim scripts to (what looks like) Javascript
+	$(VIM) -u NONE --not-a-term -S tojavascript.vim $(PACKAGE).pot $(PO_VIM_INPUTLIST)
+	# create vim.pot
+	$(XGETTEXT) --default-domain=$(PACKAGE) --add-comments \
+		--keyword=_ --keyword=N_ --keyword=NGETTEXT:1,2 \
+		$(PO_INPUTLIST) $(PO_VIM_JSLIST)
+	mv -f $(PACKAGE).po $(PACKAGE).pot
+	# Fix Vim scripts names, so that "gf" works
+	$(VIM) -u NONE --not-a-term -S fixfilenames.vim  $(PACKAGE).pot $(PO_VIM_INPUTLIST)
+	# Delete the temporary files
+	rm *.js
 
 vim.desktop: vim.desktop.in $(POFILES)
 	echo $(LANGUAGES) | tr " " "\n" |sed -e '/\./d' | sort > LINGUAS
diff --git a/src/po/README.txt b/src/po/README.txt
index e60d1d2..68d267a 100644
--- a/src/po/README.txt
+++ b/src/po/README.txt
@@ -78,7 +78,8 @@
 
 (2) Translate
     See the gettext documentation on how to do this.  You can also find
-    examples in the other po files.
+    examples in the other po files.  You can use "gF" on the file name to see
+    the context of the message.
     Search the po file for items that require translation:
 
 	/fuzzy\|^msgstr ""\(\n"\)\@!
@@ -123,6 +124,13 @@
 
     Look out for syntax errors and fix them.
 
+(6) Local tryout:
+    Vim normally picks up the .mo files from:
+	    $VIMRUNTIME/lang/{lang}/LC_MESSAGES/vim.mo
+    To try out the messages with Vim use:
+    	    make tryoutinstall
+    And run Vim with $VIMRUNTIME set to ../runtime
+
 
 USING GETTEXT WITHOUT ICONV
 
diff --git a/src/po/fixfilenames.vim b/src/po/fixfilenames.vim
new file mode 100644
index 0000000..65d448c
--- /dev/null
+++ b/src/po/fixfilenames.vim
@@ -0,0 +1,13 @@
+" Invoked with the name "vim.pot" and a list of Vim script names.
+" Converts them to a .js file, stripping comments, so that xgettext works.
+
+set shortmess+=A
+
+for name in argv()[1:]
+  let jsname = fnamemodify(name, ":t:r") .. ".js"
+  exe "%s+" .. jsname .. "+" .. name .. "+"
+endfor
+
+write
+last
+quit
diff --git a/src/po/tojavascript.vim b/src/po/tojavascript.vim
new file mode 100644
index 0000000..7868570
--- /dev/null
+++ b/src/po/tojavascript.vim
@@ -0,0 +1,18 @@
+" Invoked with the name "vim.pot" and a list of Vim script names.
+" Converts them to a .js file, stripping comments, so that xgettext works.
+" Javascript is used because, like Vim, it accepts both single and double
+" quoted strings.
+
+set shortmess+=A
+
+for name in argv()[1:]
+  exe 'edit ' .. fnameescape(name)
+
+  " Strip comments
+  g/^\s*"/s/.*//
+
+  " Write as .js file, xgettext recognizes them
+  exe 'w! ' .. fnamemodify(name, ":t:r") .. ".js"
+endfor
+
+quit
diff --git a/src/version.c b/src/version.c
index 8eaf484..1fe5b26 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1544,
+/**/
     1543,
 /**/
     1542,