summaryrefslogtreecommitdiff
path: root/sphinx/transforms.py
diff options
context:
space:
mode:
authorshimizukawa <shimizukawa@gmail.com>2015-02-22 13:51:02 +0900
committershimizukawa <shimizukawa@gmail.com>2015-02-22 13:51:02 +0900
commitc53fa4b369919875e5da423ef0a93c097398bc76 (patch)
tree085f877b990df38ce7ea383d1f8b488df4ee95f6 /sphinx/transforms.py
parentd5dca56ff8231940f69e99ca272fab8f611d7b89 (diff)
downloadsphinx-git-c53fa4b369919875e5da423ef0a93c097398bc76.tar.gz
refs #1235: i18n: 'literal-block' node can be translated if 'literal-block' is set to `gettext_additional_targets`.
Diffstat (limited to 'sphinx/transforms.py')
-rw-r--r--sphinx/transforms.py41
1 files changed, 38 insertions, 3 deletions
diff --git a/sphinx/transforms.py b/sphinx/transforms.py
index c2e30022a..598427d4e 100644
--- a/sphinx/transforms.py
+++ b/sphinx/transforms.py
@@ -20,8 +20,11 @@ from docutils.transforms.parts import ContentsFilter
from sphinx import addnodes
from sphinx.locale import _, init as init_locale
from sphinx.util import split_index_msg
-from sphinx.util.nodes import traverse_translatable_index, extract_messages
+from sphinx.util.nodes import (
+ traverse_translatable_index, extract_messages, LITERAL_TYPE_NODES,
+)
from sphinx.util.osutil import ustrftime, find_catalog
+from sphinx.util.pycompat import indent
from sphinx.domains.std import (
make_term_from_paragraph_node,
make_termnodes_from_paragraph_node,
@@ -156,6 +159,28 @@ class CitationReferences(Transform):
citnode.parent.replace(citnode, refnode)
+TRANSLATABLE_NODES = {
+ 'literal-block': nodes.literal_block,
+}
+class ExtraTranslatableNodes(Transform):
+ """
+ make nodes translatable
+ """
+ default_priority = 10
+
+ def apply(self):
+ targets = self.document.settings.env.config.gettext_additional_targets
+ target_nodes = [v for k, v in TRANSLATABLE_NODES.items() if k in targets]
+ if not target_nodes:
+ return
+
+ def is_translatable_node(node):
+ return isinstance(node, tuple(target_nodes))
+
+ for node in self.document.traverse(is_translatable_node):
+ node['translatable'] = True
+
+
class CustomLocaleReporter(object):
"""
Replacer for document.reporter.get_source_and_line method.
@@ -177,7 +202,7 @@ class Locale(Transform):
"""
Replace translatable nodes with their translated doctree.
"""
- default_priority = 0
+ default_priority = 20
def apply(self):
env = self.document.settings.env
@@ -331,6 +356,11 @@ class Locale(Transform):
msgstr += '\n\n dummy literal'
# dummy literal node will discard by 'patch = patch[0]'
+ # literalblock need literal block notation to avoid it become
+ # paragraph.
+ if isinstance(node, LITERAL_TYPE_NODES):
+ msgstr = '::\n\n' + indent(msgstr, ' '*3)
+
patch = new_document(source, settings)
CustomLocaleReporter(node.source, node.line).set_reporter(patch)
parser.parse(msgstr, patch)
@@ -339,7 +369,7 @@ class Locale(Transform):
except IndexError: # empty node
pass
# XXX doctest and other block markup
- if not isinstance(patch, nodes.paragraph):
+ if not isinstance(patch, (nodes.paragraph,) + LITERAL_TYPE_NODES):
continue # skip for now
# auto-numbered foot note reference should use original 'ids'.
@@ -466,6 +496,11 @@ class Locale(Transform):
for child in patch.children:
child.parent = node
node.children = patch.children
+
+ # for highlighting that expects .rawsource and .astext() are same.
+ if isinstance(node, LITERAL_TYPE_NODES):
+ node.rawsource = node.astext()
+
node['translated'] = True
if 'index' in env.config.gettext_additional_targets: