summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@gnome.org>2011-04-25 09:45:16 -0400
committerShaun McCance <shaunm@gnome.org>2011-04-25 09:45:16 -0400
commitaeec20e8f3d7f0e2fc00b9e47c7e7331be6d588b (patch)
tree428031d1b4ddbb041d26689134d286fddd1d0ada
parent26d4de24ba90a96c33328f1a59a1204ed891ff11 (diff)
downloaditstool-aeec20e8f3d7f0e2fc00b9e47c7e7331be6d588b.tar.gz
Implement external refs, also msgctxt "_" for auto stuff
-rw-r--r--its/docbook.its5
-rw-r--r--its/mallard.its2
-rwxr-xr-xitstool43
3 files changed, 48 insertions, 2 deletions
diff --git a/its/docbook.its b/its/docbook.its
index fb3e579..80b652d 100644
--- a/its/docbook.its
+++ b/its/docbook.its
@@ -215,6 +215,11 @@
<!-- Some hacks -->
<its:translateRule translate="no" selector="//releaseinfo[@role = 'CVS' and normalize-space(.) = '$Id$']"/>
+ <!-- External media files -->
+ <itst:externalRefRule selector="//audiodata" refPointer="@fileref"/>
+ <itst:externalRefRule selector="//imagedata" refPointer="@fileref"/>
+ <itst:externalRefRule selector="//videodata" refPointer="@fileref"/>
+
<!-- FIXME below -->
<!-- abstract -->
diff --git a/its/mallard.its b/its/mallard.its
index c922b38..8d18aa0 100644
--- a/its/mallard.its
+++ b/its/mallard.its
@@ -34,4 +34,6 @@
<its:translateRule translate="no" selector="//mal:comment/descendant-or-self::*"/>
<its:translateRule translate="no" selector="//mal:credit/mal:email"/>
+
+ <itst:externalRefRule selector="//mal:media" refPointer="@src"/>
</its:rules>
diff --git a/itstool b/itstool
index f022092..efef0a7 100755
--- a/itstool
+++ b/itstool
@@ -1,6 +1,7 @@
#!/usr/bin/env python
import gettext
+import hashlib
import libxml2
import optparse
import os
@@ -41,12 +42,14 @@ class MessageList (object):
def add_message (self, message, node):
self._messages.append (message)
- self._by_node[node] = message
+ if node is not None:
+ self._by_node[node] = message
def add_credits(self):
if self._has_credits:
return
msg = Message()
+ msg.set_context('_')
msg.add_text('translator-credits')
msg.add_comment('Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2')
self._messages.append(msg)
@@ -234,6 +237,7 @@ class Document (object):
ctxt.lineNumbers(1)
ctxt.replaceEntities(1)
ctxt.parseDocument()
+ self._filename = filename
self._doc = ctxt.doc()
self._localrules = []
def pre_process (node):
@@ -261,6 +265,7 @@ class Document (object):
self._its_lang = {}
self._itst_lang_attr = {}
self._itst_credits = None
+ self._itst_externals = []
def apply_its_rule(self, rule, xpath):
if rule.type != 'element':
@@ -334,6 +339,18 @@ class Document (object):
for node in xpath.xpathEval(rule.prop('appendTo')):
self._itst_credits = (node, rule)
break
+ elif xml_is_ns_name(rule, NS_ITST, 'externalRefRule'):
+ if rule.prop('selector') is not None and rule.prop('refPointer') is not None:
+ for node in xpath.xpathEval(rule.prop('selector')):
+ try:
+ oldnode = xpath.contextNode()
+ except:
+ oldnode = None
+ xpath.setContextNode(node)
+ res = xpath.xpathEval(rule.prop('refPointer'))
+ if len(res) > 0:
+ self._itst_externals.append((node, res[0].content))
+ xpath.setContextNode(oldnode)
def apply_its_rules (self):
dirs = []
@@ -449,7 +466,10 @@ class Document (object):
def merge_credits(self, translations, language, node):
if self._itst_credits is None:
return
- trans = translations.ugettext('translator-credits')
+ # Dear Python, please implement pgettext.
+ # http://bugs.python.org/issue2504
+ # Sincerely, Shaun
+ trans = translations.ugettext('_\x04translator-credits')
if trans is None or trans == 'translator-credits':
return
regex = re.compile('(.*) \<(.*)\>, (.*)')
@@ -567,6 +587,25 @@ class Document (object):
def generate_messages(self, comments=True):
if self._itst_credits is not None:
self._msgs.add_credits()
+ for ext in self._itst_externals:
+ msg = Message()
+ try:
+ fullfile = os.path.join(os.path.dirname(self._filename), ext[1])
+ filefp = open(fullfile)
+ filemd5 = hashlib.md5(filefp.read()).hexdigest()
+ filefp.close()
+ except:
+ filemd5 = '__failed__'
+ txt = "external ref='%s' md5='%s'" % (ext[1], filemd5)
+ msg.set_context('_')
+ msg.add_text(txt)
+ msg.add_source('%s:%i(%s)' % (self._doc.name, ext[0].lineNo(), ext[0].name))
+ msg.add_comment('This is a reference to an external file such as an image or'
+ ' video. When the file changes, the md5 hash will change to'
+ ' let you know you need to update your localized copy. The'
+ ' msgstr is not used at all. Set it to whatever you like'
+ ' once you have updated your copy of the file.')
+ self._msgs.add_message(msg, None)
self._in_translatable = True
for child in xml_child_iter(self._doc):
if child.type == 'element':