From 0b39c3fd4c5d1c8ebd2efa85fced7df5e17efd3b Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 30 Aug 2020 15:52:10 +0200 Subject: 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. --- src/evalfunc.c | 22 ++++++++++++++++++++ src/po/Makefile | 53 +++++++++++++++++++++++++++++++++++++++++++------ src/po/README.txt | 10 +++++++++- src/po/fixfilenames.vim | 13 ++++++++++++ src/po/tojavascript.vim | 18 +++++++++++++++++ src/version.c | 2 ++ 6 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/po/fixfilenames.vim create mode 100644 src/po/tojavascript.vim (limited to 'src') diff --git a/src/evalfunc.c b/src/evalfunc.c index 62bbb8888d..fff7a89a9a 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -97,6 +97,7 @@ static void f_getreg(typval_T *argvars, typval_T *rettv); 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 @@ static funcentry_T global_functions[] = {"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 @@ f_gettagstack(typval_T *argvars, typval_T *rettv) 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 cce14a94a3..8ef93e6eb0 100644 --- a/src/po/Makefile +++ b/src/po/Makefile @@ -36,6 +36,7 @@ all: $(MOFILES) $(MOCONVERTED) $(MSGFMT_DESKTOP) check: $(CHECKFILES) +# installing for real install: $(MOFILES) $(MOCONVERTED) @$(MAKE) prefixcheck for lang in $(LANGUAGES); do \ @@ -61,6 +62,24 @@ uninstall: 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 @@ distclean: clean 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 e60d1d2168..68d267af17 100644 --- a/src/po/README.txt +++ b/src/po/README.txt @@ -78,7 +78,8 @@ language. (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 @@ language. 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 0000000000..65d448ce41 --- /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 0000000000..7868570be7 --- /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 8eaf484477..1fe5b26dfd 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1544, /**/ 1543, /**/ -- cgit v1.2.3