diff options
Diffstat (limited to 'sphinx/builders/gettext.py')
-rw-r--r-- | sphinx/builders/gettext.py | 67 |
1 files changed, 40 insertions, 27 deletions
diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py index 250bef8c..1962545d 100644 --- a/sphinx/builders/gettext.py +++ b/sphinx/builders/gettext.py @@ -9,7 +9,7 @@ :license: BSD, see LICENSE for details. """ -from __future__ import with_statement +from __future__ import unicode_literals from os import path, walk from codecs import open @@ -18,6 +18,8 @@ from datetime import datetime, tzinfo, timedelta from collections import defaultdict from uuid import uuid4 +from six import iteritems + from sphinx.builders import Builder from sphinx.util import split_index_msg from sphinx.util.nodes import extract_messages, traverse_translatable_index @@ -25,7 +27,7 @@ from sphinx.util.osutil import safe_relpath, ensuredir, find_catalog, SEP from sphinx.util.console import darkgreen, purple, bold from sphinx.locale import pairindextypes -POHEADER = ur""" +POHEADER = r""" # SOME DESCRIPTIVE TITLE. # Copyright (C) %(copyright)s # This file is distributed under the same license as the %(project)s package. @@ -82,6 +84,11 @@ class I18nBuilder(Builder): """ name = 'i18n' versioning_method = 'text' + versioning_compare = None # be set by `gettext_uuid` + + def __init__(self, app): + self.versioning_compare = app.env.config.gettext_uuid + super(I18nBuilder, self).__init__(app) def init(self): Builder.init(self) @@ -96,6 +103,9 @@ class I18nBuilder(Builder): def prepare_writing(self, docnames): return + def compile_catalogs(self, catalogs, message): + return + def write_doc(self, docname, doctree): catalog = self.catalogs[find_catalog(docname, self.config.gettext_compact)] @@ -103,15 +113,16 @@ class I18nBuilder(Builder): for node, msg in extract_messages(doctree): catalog.add(msg, node) - # Extract translatable messages from index entries. - for node, entries in traverse_translatable_index(doctree): - for typ, msg, tid, main in entries: - for m in split_index_msg(typ, msg): - if typ == 'pair' and m in pairindextypes.values(): - # avoid built-in translated message was incorporated - # in 'sphinx.util.nodes.process_index_entry' - continue - catalog.add(m, node) + if 'index' in self.env.config.gettext_enables: + # Extract translatable messages from index entries. + for node, entries in traverse_translatable_index(doctree): + for typ, msg, tid, main in entries: + for m in split_index_msg(typ, msg): + if typ == 'pair' and m in pairindextypes.values(): + # avoid built-in translated message was incorporated + # in 'sphinx.util.nodes.process_index_entry' + continue + catalog.add(m, node) # determine tzoffset once to remain unaffected by DST change during build @@ -164,8 +175,8 @@ class MessageCatalogBuilder(I18nBuilder): extract_translations = self.templates.environment.extract_translations - for template in self.status_iterator(files, - 'reading templates... ', purple, len(files)): + for template in self.app.status_iterator( + files, 'reading templates... ', purple, len(files)): with open(template, 'r', encoding='utf-8') as f: context = f.read() for line, meth, msg in extract_translations(context): @@ -185,10 +196,10 @@ class MessageCatalogBuilder(I18nBuilder): ctime = datetime.fromtimestamp( timestamp, ltz).strftime('%Y-%m-%d %H:%M%z'), ) - for textdomain, catalog in self.status_iterator( - self.catalogs.iteritems(), "writing message catalogs... ", + for textdomain, catalog in self.app.status_iterator( + iteritems(self.catalogs), "writing message catalogs... ", darkgreen, len(self.catalogs), - lambda (textdomain, _): textdomain): + lambda textdomain__: textdomain__[0]): # noop if config.gettext_compact is set ensuredir(path.join(self.outdir, path.dirname(textdomain))) @@ -200,19 +211,21 @@ class MessageCatalogBuilder(I18nBuilder): for message in catalog.messages: positions = catalog.metadata[message] - # generate "#: file1:line1\n#: file2:line2 ..." - pofile.write(u"#: %s\n" % "\n#: ".join("%s:%s" % - (safe_relpath(source, self.outdir), line) - for source, line, _ in positions)) - # generate "# uuid1\n# uuid2\n ..." - pofile.write(u"# %s\n" % "\n# ".join(uid for _, _, uid - in positions)) + if self.config.gettext_location: + # generate "#: file1:line1\n#: file2:line2 ..." + pofile.write("#: %s\n" % "\n#: ".join("%s:%s" % + (safe_relpath(source, self.outdir), line) + for source, line, _ in positions)) + if self.config.gettext_uuid: + # generate "# uuid1\n# uuid2\n ..." + pofile.write("# %s\n" % "\n# ".join( + uid for _, _, uid in positions)) # message contains *one* line of text ready for translation - message = message.replace(u'\\', ur'\\'). \ - replace(u'"', ur'\"'). \ - replace(u'\n', u'\\n"\n"') - pofile.write(u'msgid "%s"\nmsgstr ""\n\n' % message) + message = message.replace('\\', r'\\'). \ + replace('"', r'\"'). \ + replace('\n', '\\n"\n"') + pofile.write('msgid "%s"\nmsgstr ""\n\n' % message) finally: pofile.close() |