summaryrefslogtreecommitdiff
path: root/tools/check-po.awk
diff options
context:
space:
mode:
Diffstat (limited to 'tools/check-po.awk')
-rwxr-xr-xtools/check-po.awk173
1 files changed, 173 insertions, 0 deletions
diff --git a/tools/check-po.awk b/tools/check-po.awk
new file mode 100755
index 0000000..25e0728
--- /dev/null
+++ b/tools/check-po.awk
@@ -0,0 +1,173 @@
+#!/bin/awk -f
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+# MA 02111-1307, USA.
+
+
+# This script will (hopefully!) check the completeness of a .po
+# translation file. It will report untranslated strings, as well
+# as fuzzy ones. It will print a summarry at the end of the check
+# that says how many strings there are, how many are translated
+# (and the percentage it represents), how many are fuzzy (and the
+# percentage it represents amongst translated strings), and how
+# many aree un-translated (and the percentage it represents).
+# It will _not_ tell you wether your file is syntactically correct
+# (eg. check for terminating double quotes!). And of course it
+# will _not_ tell you wether the translations are correct! ;-]
+#
+# It was originaly been written for SANE backends translations, but
+# shall be able to check any .po file.
+#
+# Originally writen by Yann E. MORIN
+# <yann dot morin dot 1998 at anciens dot enib dot fr>
+#
+# Output will look like :
+# [./src/foobar.c:2345](321)- "This is the string"
+# \____________/ \__/ \_/ | \________________/
+# | | | | |
+# | | | | \-> Original untranslated string
+# | | | |
+# | | | \-> flag telling wether it is
+# | | | fuzzy (F) or not (-)
+# | | |
+# | | \-> line number in the .po file
+# | |
+# | \-> line number in the source file
+# |
+# \-> filename where the original string lies
+#
+#
+# Last four lines will look like :
+# Translated : 23 (23.0%)
+# of which : 2 fuzzy ( 8.6%)
+# Not translated : 77 (77.0%)
+# Total : 100
+#
+#
+# TODO:
+# - Print the fuzzy translated string at the same level as the
+# untranslated one;
+# - basic checks about syntax (missing terminating double quotes);
+# - option for brief mode (only last four lines);
+# - other?
+
+
+BEGIN \
+{
+ count = 0;
+ fuzzy = 0;
+ is_fuzzy = 0;
+ missing = 0;
+ first = 1;
+}
+
+# Is this translation fuzzy? If so count it
+$1 == "#," && $2 ~ /^fuzzy(|,)$/ \
+{
+ fuzzy++;
+ # Next translation will be fuzzy!
+ is_fuzzy = 1;
+}
+
+$1 == "#:" \
+{
+ file = $2;
+}
+
+# Skip the first msgid as it is no true translation
+$1 ~ /msgid/ && first == 1 \
+{
+ first = 0;
+ next;
+}
+
+$1 ~ /msgid/ && first == 0 \
+{
+ # One more translation
+ count++;
+ line = NR;
+
+ # Gets the untranslated string (with double quotes :-( )
+ $1 = "";
+ original = $0;
+ getline;
+ while( $1 != "msgstr" )
+ {
+ original = original $0
+ getline;
+ }
+
+ # Now extract the translated string (with double quotes as well :-( )
+ $1 = "";
+ translation = $0;
+ # In case we have no blank line after the last translation (EOF),
+ # we need to stop this silly loop. Allowing a 10-line message.
+ len = 10;
+ getline;
+ while( $0 != "" && $0 !~ /^#/ && len != 0 )
+ {
+ translation = translation $0
+ getline;
+ len--;
+ }
+
+ # Remove double quotes from multi-line messages and translations
+ msg = ""
+ n = split( original, a, "\"" );
+ # start at 2 to get rid of the preceding space
+ for( i=2; i<=n; i++ )
+ {
+ msg = msg a[i];
+ }
+ trans = "";
+ n = split( translation, a, "\"" );
+ # start at 2 to get rid of the preceding space
+ for( i=2; i<=n; i++ )
+ {
+ trans = trans a[i]
+ }
+
+ # Checks wether we have a translation or not, wether it is fuzzy or not
+ if( ( trans == "" ) || ( is_fuzzy == 1 ) )
+ {
+ # Enclose original messages between double quotes
+ printf( "[%s](%d)", file, line );
+ if( is_fuzzy == 1 )
+ {
+ printf( "F" );
+ }
+ else
+ {
+ printf( "-" );
+ }
+ printf( " \"%s\"\n", msg );
+ if( trans == "" )
+ {
+ missing++;
+ }
+ }
+
+ is_fuzzy = 0;
+}
+
+END \
+{
+ # Lines are longer than 80 chars, but I won't cut them
+ printf( "\n" );
+ printf( "Translated : %4d (%4.1f%%)\n", count-missing, 100.0*(count-missing)/count );
+ printf( " of which : %4d fuzzy (%4.1f%%)\n", fuzzy, 100*fuzzy/(count-missing) );
+ printf( "Not translated : %4d (%4.1f%%)\n", missing, 100.0*missing/count );
+ printf( "Total : %4d\n", count );
+}