summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshimizukawa <shimizukawa@gmail.com>2013-02-05 12:47:08 +0900
committershimizukawa <shimizukawa@gmail.com>2013-02-05 12:47:08 +0900
commitb7e6f092216663c7829bbb20eb80d6a5ce407064 (patch)
tree5731407870b887248d8bb4bd46cc412c6d0cf16a
parentbd942df4f41830a9b7de1f21f2c187fd971de85d (diff)
downloadsphinx-b7e6f092216663c7829bbb20eb80d6a5ce407064.tar.gz
fix: roles' reftarget ware swapped if there are some roles in 1 line and translation exchange rthat roles position. refs #1090
-rw-r--r--sphinx/transforms.py11
-rw-r--r--tests/roots/test-intl/contents.txt3
-rw-r--r--tests/roots/test-intl/role_xref.po23
-rw-r--r--tests/roots/test-intl/role_xref.txt9
-rw-r--r--tests/test_intl.py18
5 files changed, 62 insertions, 2 deletions
diff --git a/sphinx/transforms.py b/sphinx/transforms.py
index 43ec97cb..845b17ac 100644
--- a/sphinx/transforms.py
+++ b/sphinx/transforms.py
@@ -255,13 +255,20 @@ class Locale(Transform):
# Original pending_xref['reftarget'] contain not-translated
# target name, new pending_xref must use original one.
+ # This code restricts to change ref-targets in the translation.
old_refs = node.traverse(addnodes.pending_xref)
new_refs = patch.traverse(addnodes.pending_xref)
+ xref_reftarget_map = {}
if len(old_refs) != len(new_refs):
env.warn_node('inconsistent term references in '
'translated message', node)
- for old, new in zip(old_refs, new_refs):
- new['reftarget'] = old['reftarget']
+ for old in old_refs:
+ key = old["reftype"], old["refdomain"]
+ xref_reftarget_map[key] = old["reftarget"]
+ for new in new_refs:
+ key = new["reftype"], new["refdomain"]
+ if key in xref_reftarget_map:
+ new['reftarget'] = xref_reftarget_map[key]
# update leaves
for child in patch.children:
diff --git a/tests/roots/test-intl/contents.txt b/tests/roots/test-intl/contents.txt
index 932a58dd..88f7be5b 100644
--- a/tests/roots/test-intl/contents.txt
+++ b/tests/roots/test-intl/contents.txt
@@ -1,3 +1,6 @@
+CONTENTS
+========
+
.. toctree::
:maxdepth: 2
:numbered:
diff --git a/tests/roots/test-intl/role_xref.po b/tests/roots/test-intl/role_xref.po
new file mode 100644
index 00000000..e7a348b3
--- /dev/null
+++ b/tests/roots/test-intl/role_xref.po
@@ -0,0 +1,23 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-04 14:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "i18n role xref"
+msgstr "I18N ROCK'N ROLE XREF"
+
+msgid "link to :term:`Some term`, :ref:`i18n-role-xref`, :doc:`contents`."
+msgstr "LINK TO :ref:`i18n-role-xref`, :doc:`contents`, :term:`SOME NEW TERM`."
diff --git a/tests/roots/test-intl/role_xref.txt b/tests/roots/test-intl/role_xref.txt
new file mode 100644
index 00000000..382b740c
--- /dev/null
+++ b/tests/roots/test-intl/role_xref.txt
@@ -0,0 +1,9 @@
+:tocdepth: 2
+
+.. _i18n-role-xref:
+
+i18n role xref
+==============
+
+link to :term:`Some term`, :ref:`i18n-role-xref`, :doc:`contents`.
+
diff --git a/tests/test_intl.py b/tests/test_intl.py
index 0cb43202..4dec8464 100644
--- a/tests/test_intl.py
+++ b/tests/test_intl.py
@@ -294,6 +294,24 @@ def test_i18n_glossary_terms(app):
@with_intl_app(buildername='text', warning=warnfile)
+def test_i18n_role_xref(app):
+ # regression test for #1090
+ app.builddir.rmtree(True) #for warnings acceleration
+ app.builder.build(['role_xref'])
+ result = (app.outdir / 'role_xref.txt').text(encoding='utf-8')
+ expect = (u"\nI18N ROCK'N ROLE XREF"
+ u"\n*********************\n"
+ u"\nLINK TO *I18N ROCK'N ROLE XREF*, *CONTENTS*, *SOME NEW TERM*.\n")
+
+ warnings = warnfile.getvalue().replace(os.sep, '/')
+ assert 'term not in glossary' not in warnings
+ assert 'undefined label' not in warnings
+ assert 'unknown document' not in warnings
+
+ assert result == expect
+
+
+@with_intl_app(buildername='text', warning=warnfile)
def test_i18n_glossary_terms_inconsistency(app):
# regression test for #1090
app.builddir.rmtree(True) #for warnings acceleration