#86 Merged
Repository
shimizukawa/sphinx-fix-i18n-fork sphinx-fix-i18n-fork
Branch
#955
Repository
birkenfeld/sphinx sphinx
Branch
default

fixed #955: footnote i18n translation cause KeyError and 'Only update text nodes in translation' change at b7b808e46851 break translation.

Author
  1. Takayuki Shimizukawa avatarTakayuki Shimizukawa
Reviewers
Description

considerations:

  • original node.children count and translated patch.children count is not equal.
  • original node.children include registered auto numbered footnote_reference but patch.children is not.
  • named-footnote and numbered footnote are not same as auto-numbered footnote.
  • if patch.children has duplicated auto numbered footnote [#] then don't care because it is wrong msgstr.
  • also fix #1044: External links don't work in localized HTML

Comments (7)

  1. Dmitry Shachnev

    I'm not sure if this is a side-effect of your branch, but I now get lots of warnings when I try to build text containing literal blocks, like this one:

    some text::
    
       this is
       a literal block
    
    more text
    

    Warnings are similar to this one:

    /path/to/file.rst:2: WARNING: Literal block expected; none found.
    

    Do you know what may cause this? A test case is lp:ubuntu-packaging-guide with Spanish translation.

    P.S. Thanks a lot for your work here (again)!

  2. Jon Waltman

    I think the code still has some issues in how it handles references and footnote_references that are present in one case but not the other.

    What about checking whether the number of references is equal in both the translated form and the untranslated form? If they're not equal, emit a warning and don't bother trying to transfer the references.

  3. Jon Waltman

    I think this looks alright.

    One thing I'd suggest though is slightly re-wording the warning message.
    (the "skip translation" part is no longer correct right?)

    diff --git a/sphinx/environment.py b/sphinx/environment.py
    --- a/sphinx/environment.py
    +++ b/sphinx/environment.py
    @@ -234,9 +234,8 @@ class Locale(Transform):
                 old_foot_refs = node.traverse(is_autonumber_footnote_ref)
                 new_foot_refs = patch.traverse(is_autonumber_footnote_ref)
                 if len(old_foot_refs) != len(new_foot_refs):
    -                env.warn_node('The number of reference are inconsistent '
    -                              'in both the translated form and the '
    -                              'untranslated form. skip translation.', node)
    +                env.warn_node('inconsistent footnote references in '
    +                              'translated message', node)
                 for old, new in zip(old_foot_refs, new_foot_refs):
                     new['ids'] = old['ids']
                     self.document.autofootnote_refs.remove(old)
    @@ -253,9 +252,8 @@ class Locale(Transform):
                 new_refs = patch.traverse(is_refnamed_ref)
                 applied_refname_map = {}
                 if len(old_refs) != len(new_refs):
    -                env.warn_node('The number of reference are inconsistent '
    -                              'in both the translated form and the '
    -                              'untranslated form. skip translation.', node)
    +                env.warn_node('inconsistent references in '
    +                              'translated message', node)
                 for new in new_refs:
                     if new['refname'] in applied_refname_map:
                         # 2nd appearance of the reference
    @@ -1813,4 +1811,3 @@ class BuildEnvironment:
                     if 'orphan' in self.metadata[docname]:
                         continue
                     self.warn(docname, 'document isn\'t included in any toctree')
    -
    diff --git a/tests/test_intl.py b/tests/test_intl.py
    --- a/tests/test_intl.py
    +++ b/tests/test_intl.py
    @@ -120,8 +120,13 @@ def test_i18n_warn_for_number_of_referen
         assert result == expect
    
         warnings = warnfile.getvalue().replace(os.sep, '/')
    -    expected_warning_expr = "i18n/refs_inconsistency.txt:\d+: WARNING: The number of reference are inconsistent in both the translated form and the untranslated form. skip translation."
    -    assert len(re.findall(expected_warning_expr, warnings)) == 3
    +    warning_fmt = u'.*/i18n/refs_inconsistency.txt:\\d+: ' \
    +          u'WARNING: inconsistent %s in translated message\n'
    +    expected_warning_expr = (
    +        warning_fmt % 'footnote references' +
    +        warning_fmt % 'references' +
    +        warning_fmt % 'references')
    +    assert re.search(expected_warning_expr, warnings)
    
    
     @with_app(buildername='html', cleanenv=True,
    
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.