blob: abe999a4f13933df16128d3a813af99083764577 [file] [log] [blame]
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001" Vim script for checking .po files.
2"
Bram Moolenaar595f51c2008-06-09 12:46:00 +00003" Go through the file and verify that:
4" - All %...s items in "msgid" are identical to the ones in "msgstr".
5" - An error or warning code in "msgid" matches the one in "msgstr".
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00006
7if 1 " Only execute this if the eval feature is available.
8
9" Function to get a split line at the cursor.
10" Used for both msgid and msgstr lines.
11" Removes all text except % items and returns the result.
12func! GetMline()
13 let idline = substitute(getline('.'), '"\(.*\)"$', '\1', '')
14 while line('.') < line('$')
15 +
16 let line = getline('.')
17 if line[0] != '"'
18 break
19 endif
20 let idline .= substitute(line, '"\(.*\)"$', '\1', '')
21 endwhile
22
Bram Moolenaara5792f52005-11-23 21:25:05 +000023 " remove '%', not used for formatting.
24 let idline = substitute(idline, "'%'", '', 'g')
25
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000026 " remove everything but % items.
27 return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g')
28endfunc
29
30" Start at the first "msgid" line.
311
32/^msgid
33let startline = line('.')
34let error = 0
35
36while 1
37 if getline(line('.') - 1) !~ "no-c-format"
38 let fromline = GetMline()
39 if getline('.') !~ '^msgstr'
40 echo 'Missing "msgstr" in line ' . line('.')
41 let error = 1
42 endif
43 let toline = GetMline()
44 if fromline != toline
45 echo 'Mismatching % in line ' . (line('.') - 1)
Bram Moolenaara5792f52005-11-23 21:25:05 +000046 echo 'msgid: ' . fromline
47 echo 'msgstr: ' . toline
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000048 let error = 1
49 endif
50 endif
51
52 " Find next msgid.
53 " Wrap around at the end of the file, quit when back at the first one.
54 /^msgid
55 if line('.') == startline
56 break
57 endif
58endwhile
59
Bram Moolenaar595f51c2008-06-09 12:46:00 +000060" Check that error code in msgid matches the one in msgstr.
61"
62" Examples of mismatches found with msgid "E123: ..."
63" - msgstr "E321: ..." error code mismatch
64" - msgstr "W123: ..." warning instead of error
65" - msgstr "E123 ..." missing colon
66" - msgstr "..." missing error code
67"
681
69if search('msgid "\("\n"\)\?\([EW][0-9]\+:\).*\nmsgstr "\("\n"\)\?[^"]\@=\2\@!') > 0
70 echo 'Mismatching error/warning code in line ' . line('.')
71 let error = 1
72endif
73
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000074if error == 0
75 echo "OK"
76endif
77
78endif