1" Vim script for checking .po files. 2" 3" 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". 6 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 23 " remove '%', not used for formatting. 24 let idline = substitute(idline, "'%'", '', 'g') 25 26 " remove '%' used for plural forms. 27 let idline = substitute(idline, '\\nPlural-Forms: .\+;\\n', '', '') 28 29 " remove everything but % items. 30 return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g') 31endfunc 32 33" This only works when 'wrapscan' is set. 34let s:save_wrapscan = &wrapscan 35set wrapscan 36 37" Start at the first "msgid" line. 381 39/^msgid 40let startline = line('.') 41let error = 0 42 43while 1 44 if getline(line('.') - 1) !~ "no-c-format" 45 let fromline = GetMline() 46 if getline('.') !~ '^msgstr' 47 echo 'Missing "msgstr" in line ' . line('.') 48 let error = 1 49 endif 50 let toline = GetMline() 51 if fromline != toline 52 echo 'Mismatching % in line ' . (line('.') - 1) 53 echo 'msgid: ' . fromline 54 echo 'msgstr: ' . toline 55 let error = 1 56 endif 57 endif 58 59 " Find next msgid. 60 " Wrap around at the end of the file, quit when back at the first one. 61 /^msgid 62 if line('.') == startline 63 break 64 endif 65endwhile 66 67" Check that error code in msgid matches the one in msgstr. 68" 69" Examples of mismatches found with msgid "E123: ..." 70" - msgstr "E321: ..." error code mismatch 71" - msgstr "W123: ..." warning instead of error 72" - msgstr "E123 ..." missing colon 73" - msgstr "..." missing error code 74" 751 76if search('msgid "\("\n"\)\?\([EW][0-9]\+:\).*\nmsgstr "\("\n"\)\?[^"]\@=\2\@!') > 0 77 echo 'Mismatching error/warning code in line ' . line('.') 78 let error = 1 79endif 80 81if error == 0 82 echo "OK" 83endif 84 85let &wrapscan = s:save_wrapscan 86unlet s:save_wrapscan 87 88endif 89