diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py index 896319f56..793264777 100644 --- a/sphinx/util/docfields.py +++ b/sphinx/util/docfields.py @@ -67,7 +67,9 @@ class Field(object): fieldname += nodes.Text(' ') fieldname += self.make_xref(self.rolename, domain, fieldarg, nodes.Text) - fieldbody = nodes.field_body('', nodes.paragraph('', '', *content)) + par = nodes.paragraph() + par += content + fieldbody = nodes.field_body('', par) return nodes.field('', fieldname, fieldbody) @@ -255,6 +257,11 @@ class DocFieldTransformer(object): [nodes.Text(argtype)] fieldarg = argname + translatable_content = addnodes.translatable(fieldbody.rawsource) + translatable_content.source = fieldbody.parent.source + translatable_content.line = fieldbody.parent.line + translatable_content += content + # grouped entries need to be collected in one entry, while others # get one entry per field if typedesc.is_grouped: @@ -264,10 +271,11 @@ class DocFieldTransformer(object): groupindices[typename] = len(entries) group = [typedesc, []] entries.append(group) - group[1].append(typedesc.make_entry(fieldarg, content)) + entry = typedesc.make_entry(fieldarg, translatable_content) + group[1].append(entry) else: - entries.append([typedesc, - typedesc.make_entry(fieldarg, content)]) + entry = typedesc.make_entry(fieldarg, translatable_content) + entries.append([typedesc, entry]) # step 2: all entries are collected, construct the new field list new_list = nodes.field_list() diff --git a/tests/root/i18n/docfields.po b/tests/root/i18n/docfields.po new file mode 100644 index 000000000..f906ca19e --- /dev/null +++ b/tests/root/i18n/docfields.po @@ -0,0 +1,39 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2010, Georg Brandl & Team +# This file is distributed under the same license as the Sphinx package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Sphinx 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-12-16 14:11\n" +"PO-Revision-Date: 2012-12-18 06:14+0900\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 with docfields" +msgstr "I18N WITH DOCFIELDS" + +msgid "description of parameter param" +msgstr "DESCRIPTION OF PARAMETER param" + +msgid "description of parameter foo" +msgstr "DESCRIPTION OF PARAMETER foo" + +msgid "description of parameter bar" +msgstr "DESCRIPTION OF PARAMETER bar" + +msgid "if the values are not valid" +msgstr "IF THE VALUES ARE NOT VALID" + +msgid "if the values are out of range" +msgstr "IF THE VALUES ARE OUT OF RANGE" + +msgid "a new :class:`Cls3` instance" +msgstr "A NEW :class:`Cls3` INSTANCE" + diff --git a/tests/root/i18n/docfields.txt b/tests/root/i18n/docfields.txt new file mode 100644 index 000000000..e4dab8e55 --- /dev/null +++ b/tests/root/i18n/docfields.txt @@ -0,0 +1,46 @@ +:tocdepth: 2 + +i18n with docfields +=================== + +.. single TypedField + +.. class:: Cls1 + :noindex: + + :param param: description of parameter param + +.. grouped TypedFields + +.. class:: Cls2 + :noindex: + + :param foo: description of parameter foo + :param bar: description of parameter bar + + +.. single GroupedField + +.. class:: Cls3(values) + :noindex: + + :raises ValueError: if the values are out of range + +.. grouped GroupedFields + +.. class:: Cls4(values) + :noindex: + + :raises TypeError: if the values are not valid + :raises ValueError: if the values are out of range + + +.. single Field + +.. class:: Cls5 + :noindex: + + :returns: a new :class:`Cls3` instance + +.. Field is never grouped + diff --git a/tests/root/i18n/index.txt b/tests/root/i18n/index.txt index ee2d1c5f4..3f98cff6e 100644 --- a/tests/root/i18n/index.txt +++ b/tests/root/i18n/index.txt @@ -6,3 +6,4 @@ external_links refs_inconsistency literalblock + docfields diff --git a/tests/test_intl.py b/tests/test_intl.py index 67507ed11..1cb5333a1 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -206,3 +206,40 @@ def test_i18n_literalblock_warning(app): expected_warning_expr = u'.*/i18n/literalblock.txt:\\d+: ' \ u'WARNING: Literal block expected; none found.' assert re.search(expected_warning_expr, warnings) + + +@with_app(buildername='text', cleanenv=True, + confoverrides={'language': 'xx', 'locale_dirs': ['.'], + 'gettext_compact': False}) +def test_i18n_docfields(app): + app.builder.build(['i18n/docfields']) + result = (app.outdir / 'i18n' / 'docfields.txt').text(encoding='utf-8') + expect = (u"\nI18N WITH DOCFIELDS" + u"\n*******************\n" + u"\nclass class Cls1\n" + u"\n Parameters:" + u"\n **param** -- DESCRIPTION OF PARAMETER param\n" + u"\nclass class Cls2\n" + u"\n Parameters:" + u"\n * **foo** -- DESCRIPTION OF PARAMETER foo\n" + u"\n * **bar** -- DESCRIPTION OF PARAMETER bar\n" + u"\nclass class Cls3(values)\n" + u"\n Raises ValueError:" + u"\n IF THE VALUES ARE OUT OF RANGE\n" + u"\nclass class Cls4(values)\n" + u"\n Raises:" + u"\n * **TypeError** -- IF THE VALUES ARE NOT VALID\n" + u"\n * **ValueError** -- IF THE VALUES ARE OUT OF RANGE\n" + u"\nclass class Cls5\n" + u"\n Returns:" + u'\n A NEW "Cls3" INSTANCE\n') + assert result == expect + + +@with_app(buildername='html', cleanenv=True, + confoverrides={'language': 'xx', 'locale_dirs': ['.'], + 'gettext_compact': False}) +def test_i18n_docfields_html(app): + app.builder.build(['i18n/docfields']) + result = (app.outdir / 'i18n' / 'docfields.html').text(encoding='utf-8') + # expect no error by build