Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Work on loading UI translations#2969

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
gnestor merged 8 commits intojupyter:masterfromtakluyver:i18n-loading
Oct 31, 2017
Merged
Show file tree
Hide file tree
Changes from1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
NextNext commit
Load translations for Javascript in page template
  • Loading branch information
@takluyver
takluyver committedOct 23, 2017
commit9dd5d5c1f81e5a08013f83f831deca8b82203f8b
3 changes: 3 additions & 0 deletionsnotebook/base/handlers.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,6 +34,7 @@

import notebook
from notebook._tz import utcnow
from notebook.i18n import combine_translations
from notebook.utils import is_hidden, url_path_join, url_is_absolute, url_escape
from notebook.services.security import csp_report_uri

Expand DownExpand Up@@ -409,6 +410,8 @@ def template_namespace(self):
xsrf_form_html=self.xsrf_form_html,
token=self.token,
xsrf_token=self.xsrf_token.decode('utf8'),
nbjs_translations=json.dumps(combine_translations(
self.request.headers.get('Accept-Language', ''))),
**self.jinja_template_vars
)

Expand Down
95 changes: 95 additions & 0 deletionsnotebook/i18n/__init__.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
"""Server functions for loading translations
"""
from collections import defaultdict
import errno
import json
from os.path import dirname, join as pjoin
import re

I18N_DIR = pjoin(dirname(dirname(__file__)), 'i18n')
# Cache structure:
# {'nbjs': { # Domain
# 'zh-CN': { # Language code
# <english string>: <translated string>
# ...
# }
# }}
TRANSLATIONS_CACHE = {'nbjs': {}}


_accept_lang_re = re.compile(r'''
(?P<lang>[a-zA-Z]{1,8}(-[a-zA-Z]{1,8})?)
(\s*;\s*q\s*=\s*
(?P<qvalue>[01](.\d+)?)
)?''', re.VERBOSE)

def parse_accept_lang_header(accept_lang):
"""Parses the 'Accept-Language' HTTP header.

Returns a list of language codes in *ascending* order of preference
(with the most preferred language last).
"""
by_q = defaultdict(list)
for part in accept_lang.split(','):
m = _accept_lang_re.match(part.strip())
if not m:
continue
lang, qvalue = m.group('lang', 'qvalue')
if qvalue is None:
qvalue = 1.
else:
qvalue = float(qvalue)
if qvalue == 0:
continue # 0 means not accepted
by_q[qvalue].append(lang)

res = []
for qvalue, langs in sorted(by_q.items()):
res.extend(sorted(langs))
return res

def load(language, domain='nbjs'):
"""Load translations from an nbjs.json file"""
try:
f = open(pjoin(I18N_DIR, language, 'LC_MESSAGES', 'nbjs.json'), encoding='utf-8')
except OSError as e:
if e.errno != errno.ENOENT:
raise
return {}

with f:
data = json.load(f)
return data["locale_data"][domain]

def cached_load(language, domain='nbjs'):
"""Load translations for one language, using in-memory cache if available"""
domain_cache = TRANSLATIONS_CACHE[domain]
try:
return domain_cache[language]
except KeyError:
data = load(language, domain)
domain_cache[language] = data
return data

def combine_translations(accept_language, domain='nbjs'):
"""Combine translations for multiple accepted languages.

Returns data re-packaged in jed1.x format.
"""
lang_codes = parse_accept_lang_header(accept_language)
combined = {}
for language in lang_codes:
if language == 'en':
# en is default, all translations are in frontend.
combined.clear()
else:
combined.update(cached_load(language, domain))

combined[''] = {"domain":"nbjs"}

return {
"domain": domain,
"locale_data": {
domain: combined
}
}
37 changes: 3 additions & 34 deletionsnotebook/static/base/js/i18n.js
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,48 +7,17 @@ define([
'jed',
'moment',
'json!../../../i18n/nbjs.json',
'base/js/i18nload',
], function(Jed, moment, nbjs, i18nload) {
], function(Jed, moment, nbjs) {
"use strict";

// Setup language related stuff
var ui_lang = navigator.languages && navigator.languages[0] || // Chrome / Firefox
navigator.language || // All browsers
navigator.userLanguage; // IE <= 10

var init = function() {
var msg_promise;
if (nbjs.supported_languages.indexOf(ui_lang) >= 0) {
moment.locale(ui_lang);
msg_promise = new Promise( function (resolve, reject) {
require([i18nload.id+"!"+ui_lang], function (data) {
var newi18n = new Jed(data);
newi18n._ = newi18n.gettext;
resolve(newi18n);
}, function (error) {
console.log("Error loading translations for language: "+ui_lang);
var newi18n = new Jed(nbjs);
newi18n._ = newi18n.gettext;
resolve(newi18n);
});
});
} else {
msg_promise = new Promise( function (resolve, reject) {
var newi18n = new Jed(nbjs);
newi18n._ = newi18n.gettext;
resolve(newi18n);
});
}
return msg_promise;
}
var i18n = new Jed(nbjs);
var i18n = new Jed(document.nbjs_translations);
i18n._ = i18n.gettext;
i18n.msg = i18n; // Just a place holder until the init promise resolves.

init().then(function (msg) {
i18n.msg = msg;
i18n.msg._ = i18n.msg.gettext;
});


return i18n;
});
26 changes: 0 additions & 26 deletionsnotebook/static/base/js/i18nload.js
View file
Open in desktop

This file was deleted.

2 changes: 2 additions & 0 deletionsnotebook/templates/page.html
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -97,6 +97,8 @@
return {};
}
})

document.nbjs_translations = {{ nbjs_translations|safe }};
</script>

{% block meta %}
Expand Down
10 changes: 10 additions & 0 deletionsnotebook/tests/test_i18n.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
import nose.tools as nt

from notebook import i18n

def test_parse_accept_lang_header():
palh = i18n.parse_accept_lang_header
nt.assert_equal(palh(''), [])
nt.assert_equal(palh('zh-CN,en-GB;q=0.7,en;q=0.3'),
['en', 'en-GB', 'zh-CN'])
nt.assert_equal(palh('nl,fr;q=0'), ['nl'])

[8]ページ先頭

©2009-2025 Movatter.jp