Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1# SPDX-License-Identifier: GPL-2.0
2#
3# Copyright © 2023, Oracle and/or its affiliates.
4# Author: Vegard Nossum <vegard.nossum@oracle.com>
5#
6# Add translation links to the top of the document.
7#
8
9import os
10
11from docutils import nodes
12from docutils.transforms import Transform
13
14import sphinx
15from sphinx import addnodes
16from sphinx.errors import NoUri
17
18all_languages = {
19 # English is always first
20 None: 'English',
21
22 # Keep the rest sorted alphabetically
23 'zh_CN': 'Chinese (Simplified)',
24 'zh_TW': 'Chinese (Traditional)',
25 'it_IT': 'Italian',
26 'ja_JP': 'Japanese',
27 'ko_KR': 'Korean',
28 'pt_BR': 'Portuguese (Brazilian)',
29 'sp_SP': 'Spanish',
30}
31
32class LanguagesNode(nodes.Element):
33 pass
34
35class TranslationsTransform(Transform):
36 default_priority = 900
37
38 def apply(self):
39 app = self.document.settings.env.app
40 docname = self.document.settings.env.docname
41
42 this_lang_code = None
43 components = docname.split(os.sep)
44 if components[0] == 'translations' and len(components) > 2:
45 this_lang_code = components[1]
46
47 # normalize docname to be the untranslated one
48 docname = os.path.join(*components[2:])
49
50 new_nodes = LanguagesNode()
51 new_nodes['current_language'] = all_languages[this_lang_code]
52
53 for lang_code, lang_name in all_languages.items():
54 if lang_code == this_lang_code:
55 continue
56
57 if lang_code is None:
58 target_name = docname
59 else:
60 target_name = os.path.join('translations', lang_code, docname)
61
62 pxref = addnodes.pending_xref('', refdomain='std',
63 reftype='doc', reftarget='/' + target_name, modname=None,
64 classname=None, refexplicit=True)
65 pxref += nodes.Text(lang_name)
66 new_nodes += pxref
67
68 self.document.insert(0, new_nodes)
69
70def process_languages(app, doctree, docname):
71 for node in doctree.traverse(LanguagesNode):
72 if app.builder.format not in ['html']:
73 node.parent.remove(node)
74 continue
75
76 languages = []
77
78 # Iterate over the child nodes; any resolved links will have
79 # the type 'nodes.reference', while unresolved links will be
80 # type 'nodes.Text'.
81 languages = list(filter(lambda xref:
82 isinstance(xref, nodes.reference), node.children))
83
84 html_content = app.builder.templates.render('translations.html',
85 context={
86 'current_language': node['current_language'],
87 'languages': languages,
88 })
89
90 node.replace_self(nodes.raw('', html_content, format='html'))
91
92def setup(app):
93 app.add_node(LanguagesNode)
94 app.add_transform(TranslationsTransform)
95 app.connect('doctree-resolved', process_languages)
96
97 return {
98 'parallel_read_safe': True,
99 'parallel_write_safe': True,
100 }