Skip to content

Commit 21b7719

Browse files
committed
Adding language switch.
1 parent 7f74c22 commit 21b7719

File tree

1 file changed

+82
-26
lines changed

1 file changed

+82
-26
lines changed

Doc/tools/static/switchers.js

Lines changed: 82 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
'2.7': '2.7',
1111
};
1212

13-
function build_select(current_version, current_release) {
13+
var all_languages = {
14+
'en': 'English',
15+
'fr': 'Français',
16+
};
17+
18+
function build_version_select(current_version, current_release) {
1419
var buf = ['<select>'];
1520

1621
$.each(all_versions, function(version, title) {
@@ -25,43 +30,94 @@
2530
return buf.join('');
2631
}
2732

28-
function patch_url(url, new_version) {
29-
var url_re = /\.org\/(\d|py3k|dev|((release\/)?\d\.\d[\w\d\.]*))\//,
30-
new_url = url.replace(url_re, '.org/' + new_version + '/');
33+
function build_language_select(current_language) {
34+
var buf = ['<select>'];
3135

32-
if (new_url == url && !new_url.match(url_re)) {
33-
// python 2 url without version?
34-
new_url = url.replace(/\.org\//, '.org/' + new_version + '/');
35-
}
36-
return new_url;
36+
$.each(all_languages, function(language, title) {
37+
if (language == current_language)
38+
buf.push('<option value="' + language + '" selected="selected">' +
39+
all_languages[current_language] + '</option>');
40+
else
41+
buf.push('<option value="' + language + '">' + title + '</option>');
42+
});
43+
buf.push('</select>');
44+
return buf.join('');
3745
}
3846

39-
function on_switch() {
40-
var selected = $(this).children('option:selected').attr('value');
47+
function naviagate_if_exists(url, default_url) {
48+
// check beforehand if url exists, else redirect to default_url.
49+
$.ajax({
50+
url: url,
51+
success: function() {
52+
window.location.href = url;
53+
},
54+
error: function() {
55+
window.location.href = default_url;
56+
}
57+
});
58+
}
4159

42-
var url = window.location.href,
43-
new_url = patch_url(url, selected);
60+
function on_version_switch() {
61+
var selected_version = $(this).children('option:selected').attr('value') + '/';
62+
var url = window.location.href;
63+
var current_language = find_language_in_url(url);
64+
var current_version = find_version_in_url(url);
65+
var new_url = url.replace('.org/' + current_language + current_version,
66+
'.org/' + current_language + selected_version);
67+
if (new_url != url) {
68+
naviagate_if_exists(new_url, 'https://docs.python.org/' +
69+
current_language + selected_version);
70+
}
71+
}
4472

73+
function on_language_switch() {
74+
var selected_language = $(this).children('option:selected').attr('value') + '/';
75+
var url = window.location.href;
76+
var current_language = find_language_in_url(url);
77+
var current_version = find_version_in_url(url);
78+
if (selected_language == 'en/') // Special 'default' case for english.
79+
selected_language = '';
80+
var new_url = url.replace('.org/' + current_language + current_version,
81+
'.org/' + selected_language + current_version);
4582
if (new_url != url) {
46-
// check beforehand if url exists, else redirect to version's start page
47-
$.ajax({
48-
url: new_url,
49-
success: function() {
50-
window.location.href = new_url;
51-
},
52-
error: function() {
53-
window.location.href = 'https://docs.python.org/' + selected;
54-
}
55-
});
83+
naviagate_if_exists(new_url, 'https://docs.python.org/' +
84+
selected_language + current_version);
5685
}
5786
}
5887

88+
// Returns the path segment as a string, like 'fr/' or '' if not found.
89+
function find_language_in_url(url) {
90+
var language_regexp = '\.org/(' + Object.keys(all_languages).join('|') + '/)';
91+
var match = url.match(language_regexp);
92+
if (match !== null)
93+
return match[1];
94+
return '';
95+
}
96+
97+
// Returns the path segment as a string, like '3.6/' or '' if not found.
98+
function find_version_in_url(url) {
99+
var language_segment = '(?:(?:' + Object.keys(all_languages).join('|') + ')/)';
100+
var version_segment = '(?:(?:\\d|py3k|dev|(?:(?:release/)?\\d\\.\\d[\\w\\d\\.]*))/)';
101+
var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')';
102+
var match = url.match(version_regexp);
103+
if (match !== null)
104+
return match[1];
105+
return ''
106+
}
107+
59108
$(document).ready(function() {
60109
var release = DOCUMENTATION_OPTIONS.VERSION;
110+
var current_language = find_language_in_url(window.location.href).replace(
111+
/\/+$/g, '') || 'en';
61112
var version = release.substr(0, 3);
62-
var select = build_select(version, release);
113+
var version_select = build_version_select(version, release);
114+
115+
$('.version_switcher_placeholder').html(version_select);
116+
$('.version_switcher_placeholder select').bind('change', on_version_switch);
117+
118+
var language_select = build_language_select(current_language);
63119

64-
$('.version_switcher_placeholder').html(select);
65-
$('.version_switcher_placeholder select').bind('change', on_switch);
120+
$('.language_switcher_placeholder').html(language_select);
121+
$('.language_switcher_placeholder select').bind('change', on_language_switch);
66122
});
67123
})();

0 commit comments

Comments
 (0)