0
0
mirror of https://github.com/vim/vim.git synced 2025-10-06 05:44:14 -04:00

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.
This commit is contained in:
Bram Moolenaar
2020-08-30 15:52:10 +02:00
parent 25859dd74c
commit 0b39c3fd4c
10 changed files with 136 additions and 15 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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

13
src/po/fixfilenames.vim Normal file
View File

@@ -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

18
src/po/tojavascript.vim Normal file
View File

@@ -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

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1544,
/**/
1543,
/**/