[FIX] tools: do not crash on wrong translations in view
During the construction a xml/html_translate content, in case of a wrongly translated part (e.g. not correctly escaped char or bad xml tag), escape the translation. The verification is done during the rendering on the view which is not the most optimal solution but has the advantage of working on system with some broken translations and does not requires to reload the translations. In master version, the verification could be done when loading the .po files.
This commit is contained in:
committed by
Martin Trigaux
parent
6a6827e85b
commit
6872aae8ef
@@ -169,9 +169,10 @@ class XMLTranslator(object):
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self, callback, method):
|
def __init__(self, callback, method, parser=None):
|
||||||
self.callback = callback # callback function to translate terms
|
self.callback = callback # callback function to translate terms
|
||||||
self.method = method # serialization method ('xml' or 'html')
|
self.method = method # serialization method ('xml' or 'html')
|
||||||
|
self.parser = parser # parser for validating translations
|
||||||
self._done = [] # translated strings
|
self._done = [] # translated strings
|
||||||
self._todo = [] # todo strings that come after _done
|
self._todo = [] # todo strings that come after _done
|
||||||
self.needs_trans = False # whether todo needs translation
|
self.needs_trans = False # whether todo needs translation
|
||||||
@@ -208,7 +209,15 @@ class XMLTranslator(object):
|
|||||||
""" Translate text.strip(), but keep the surrounding spaces from text. """
|
""" Translate text.strip(), but keep the surrounding spaces from text. """
|
||||||
term = text.strip()
|
term = text.strip()
|
||||||
trans = term and self.callback(term)
|
trans = term and self.callback(term)
|
||||||
return text.replace(term, trans) if trans else text
|
if trans:
|
||||||
|
try:
|
||||||
|
# parse the translation to validate it
|
||||||
|
etree.fromstring("<div>%s</div>" % encode(trans), parser=self.parser)
|
||||||
|
except etree.ParseError:
|
||||||
|
# fallback: escape the translation
|
||||||
|
trans = escape(trans)
|
||||||
|
text = text.replace(term, trans)
|
||||||
|
return text
|
||||||
|
|
||||||
def process(self, node):
|
def process(self, node):
|
||||||
""" Process the given xml `node`: collect `todo` and `done` items. """
|
""" Process the given xml `node`: collect `todo` and `done` items. """
|
||||||
@@ -284,9 +293,10 @@ def html_translate(callback, value):
|
|||||||
if not value:
|
if not value:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
trans = XMLTranslator(callback, 'html')
|
parser = etree.HTMLParser(encoding='utf-8')
|
||||||
|
trans = XMLTranslator(callback, 'html', parser)
|
||||||
wrapped = "<div>%s</div>" % encode(value)
|
wrapped = "<div>%s</div>" % encode(value)
|
||||||
root = etree.fromstring(wrapped, etree.HTMLParser(encoding='utf-8'))
|
root = etree.fromstring(wrapped, parser)
|
||||||
trans.process(root[0][0]) # html > body > div
|
trans.process(root[0][0]) # html > body > div
|
||||||
return trans.get_done()[5:-6] # remove tags <div> and </div>
|
return trans.get_done()[5:-6] # remove tags <div> and </div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user