From 7ebd7ab2a9e806a0479b006cec13fdff37407814 Mon Sep 17 00:00:00 2001 From: Takayuki Shimizukawa Date: Tue, 5 Feb 2013 12:47:08 +0900 Subject: [PATCH] fix: roles' reftarget ware swapped if there are some roles in 1 line and translation exchange rthat roles position. refs #1090 --- sphinx/transforms.py | 11 +++++++++-- tests/roots/test-intl/contents.txt | 3 +++ tests/roots/test-intl/role_xref.po | 23 +++++++++++++++++++++++ tests/roots/test-intl/role_xref.txt | 9 +++++++++ tests/test_intl.py | 18 ++++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 tests/roots/test-intl/role_xref.po create mode 100644 tests/roots/test-intl/role_xref.txt diff --git a/sphinx/transforms.py b/sphinx/transforms.py index 43ec97cbc..845b17acc 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 932a58dd6..88f7be5bd 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 000000000..e7a348b36 --- /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 , 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 \n" +"Language-Team: LANGUAGE \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 000000000..382b740c9 --- /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 0cb43202e..4dec84646 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -293,6 +293,24 @@ def test_i18n_glossary_terms(app): assert 'term not in glossary' not in warnings +@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