From e746a95969d4921628102d91ee9a4f73277bdf2b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 7 Apr 2013 15:05:21 -0400 Subject: [PATCH] L10N - A new 'verify_l10n' utility ensures the localizations are in sync (thanks to Wim Schuermann). --- ChangeLog.230 | 2 ++ scripts/utils/verify_l10n | 59 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100755 scripts/utils/verify_l10n diff --git a/ChangeLog.230 b/ChangeLog.230 index 5f5a57c56..ef51f9fe7 100644 --- a/ChangeLog.230 +++ b/ChangeLog.230 @@ -13,6 +13,8 @@ Features + Adds a new 'sync' verbosity token, which will reminds when a backlog builds up and needs a sync. + Supports IPv4 and IPv6 server addresses. + + A new 'verify_l10n' utility ensures the localizations are in sync (thanks to + Wim Schuermann). Bugs + #1197 Now 'tasksh' recognizes Ctrl-D to exit. diff --git a/scripts/utils/verify_l10n b/scripts/utils/verify_l10n new file mode 100755 index 000000000..a148e36c2 --- /dev/null +++ b/scripts/utils/verify_l10n @@ -0,0 +1,59 @@ +#!/usr/bin/env python +################################################################################ +## taskwarrior - a command line task list manager. +## +## Copyright 2006-2013, Paul Beckingham, Federico Hernandez. +## +## Permission is hereby granted, free of charge, to any person obtaining a copy +## of this software and associated documentation files (the "Software"), to deal +## in the Software without restriction, including without limitation the rights +## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +## copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included +## in all copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +## OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +## THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +## SOFTWARE. +## +## http://www.opensource.org/licenses/mit-license.php +## +################################################################################ + +import sys +import re + +if len(sys.argv) < 3: + print "Usage:", sys.argv[0], "file1 file2 ..." + sys.exit() + +translations = {} +missing = {} +for file in sys.argv[1:]: + with open(file, 'r') as f: + translations[file] = set() + missing[file] = set() + # Treat empty strings ("") as a missing entry - because they are just that. + for m in re.findall(r'^\s*#define\s(STRING_[^\s]+)(\s|\\)+"([^"]+)"', f.read(), re.MULTILINE): + translations[file].add(m[0]) + +for file in translations: + for entry in translations[file]: + for other_translation in translations: + if entry not in translations[other_translation]: + missing[other_translation].add(entry) + +for file in missing: + if len(missing[file]) > 0: + print "--- %s --- missing defines:" % file + for i in sorted(list(missing[file])): + print i + else: + print "--- %s --- is ok." % file +