| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- # SPDX-License-Identifier: GPL-2.0
- #
- # Copyright © 2023, Oracle and/or its affiliates.
- # Author: Vegard Nossum <vegard.nossum@oracle.com>
- #
- # Add translation links to the top of the document.
- #
- import os
- from docutils import nodes
- from docutils.transforms import Transform
- import sphinx
- from sphinx import addnodes
- from sphinx.errors import NoUri
- all_languages = {
- # English is always first
- None: 'English',
- # Keep the rest sorted alphabetically
- 'zh_CN': 'Chinese (Simplified)',
- 'zh_TW': 'Chinese (Traditional)',
- 'it_IT': 'Italian',
- 'ja_JP': 'Japanese',
- 'ko_KR': 'Korean',
- 'sp_SP': 'Spanish',
- }
- class LanguagesNode(nodes.Element):
- pass
- class TranslationsTransform(Transform):
- default_priority = 900
- def apply(self):
- app = self.document.settings.env.app
- docname = self.document.settings.env.docname
- this_lang_code = None
- components = docname.split(os.sep)
- if components[0] == 'translations' and len(components) > 2:
- this_lang_code = components[1]
- # normalize docname to be the untranslated one
- docname = os.path.join(*components[2:])
- new_nodes = LanguagesNode()
- new_nodes['current_language'] = all_languages[this_lang_code]
- for lang_code, lang_name in all_languages.items():
- if lang_code == this_lang_code:
- continue
- if lang_code is None:
- target_name = docname
- else:
- target_name = os.path.join('translations', lang_code, docname)
- pxref = addnodes.pending_xref('', refdomain='std',
- reftype='doc', reftarget='/' + target_name, modname=None,
- classname=None, refexplicit=True)
- pxref += nodes.Text(lang_name)
- new_nodes += pxref
- self.document.insert(0, new_nodes)
- def process_languages(app, doctree, docname):
- for node in doctree.traverse(LanguagesNode):
- if app.builder.format not in ['html']:
- node.parent.remove(node)
- continue
- languages = []
- # Iterate over the child nodes; any resolved links will have
- # the type 'nodes.reference', while unresolved links will be
- # type 'nodes.Text'.
- languages = list(filter(lambda xref:
- isinstance(xref, nodes.reference), node.children))
- html_content = app.builder.templates.render('translations.html',
- context={
- 'current_language': node['current_language'],
- 'languages': languages,
- })
- node.replace_self(nodes.raw('', html_content, format='html'))
- def setup(app):
- app.add_node(LanguagesNode)
- app.add_transform(TranslationsTransform)
- app.connect('doctree-resolved', process_languages)
- return {
- 'parallel_read_safe': True,
- 'parallel_write_safe': True,
- }
|