From b404a29e10b79deb67c75dafa7db2fa0d218a0e5 Mon Sep 17 00:00:00 2001 From: Igor Chubin Date: Thu, 31 Jan 2019 00:36:14 +0000 Subject: [PATCH] added initial support for multilingual answers --- bin/srv.py | 50 ++++++++++++++++++++++++++++++++++++++++ lib/adapter_learnxiny.py | 2 +- lib/get_answer.py | 13 +++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/bin/srv.py b/bin/srv.py index 2c8499b..40270d0 100644 --- a/bin/srv.py +++ b/bin/srv.py @@ -107,6 +107,52 @@ def get_request_ip(req): return ip_addr +def get_answer_language(request): + """ + Return preferred answer language based on + domain name, query arguments and headers + """ + + def _parse_accept_language(accept_language): + languages = accept_language.split(",") + locale_q_pairs = [] + + for language in languages: + try: + if language.split(";")[0] == language: + # no q => q = 1 + locale_q_pairs.append((language.strip(), "1")) + else: + locale = language.split(";")[0].strip() + weight = language.split(";")[1].split("=")[1] + locale_q_pairs.append((locale, weight)) + except IndexError: + pass + + return locale_q_pairs + + def _find_supported_language(accepted_languages): + for lang_tuple in accepted_languages: + lang = lang_tuple[0] + if '-' in lang: + lang = lang.split('-', 1)[0] + return lang + return None + + lang = None + hostname = request.headers['Host'] + if hostname.endswith('.cheat.sh'): + lang = hostname[:-9] + + if 'lang' in request.args: + lang = request.args.get('lang') + + header_accept_language = request.headers.get('Accept-Language', '') + if lang is None and header_accept_language: + lang = _find_supported_language( + _parse_accept_language(header_accept_language)) + + return lang def _proxy(*args, **kwargs): # print "method=", request.method, @@ -190,6 +236,10 @@ def answer(topic=None): return _proxy() #return requests.get('http://127.0.0.1:3000'+topic[8:]).text + lang = get_answer_language(request) + if lang: + options['lang'] = lang + ip_address = get_request_ip(request) if '+' in topic: not_allowed = LIMITS.check_ip(ip_address) diff --git a/lib/adapter_learnxiny.py b/lib/adapter_learnxiny.py index 180b997..5094fc5 100644 --- a/lib/adapter_learnxiny.py +++ b/lib/adapter_learnxiny.py @@ -788,7 +788,7 @@ class LearnVisualBasicAdapter(LearnXYAdapter): ADAPTERS = {cls.prefix: cls() for cls in vars()['LearnXYAdapter'].__subclasses__()} -def get_learnxiny(topic): +def get_learnxiny(topic, request_options=None): """ Return cheat sheet for `topic` or empty string if nothing found diff --git a/lib/get_answer.py b/lib/get_answer.py index fb4c1df..b4529f7 100644 --- a/lib/get_answer.py +++ b/lib/get_answer.py @@ -423,7 +423,20 @@ def get_answer(topic, keyword, options="", request_options=None): # pylint: disa return query section_name, rest = query.split('/', 1) + + if ':' in section_name: + # if ':' is in section_name, it means, that we want to + # translate the answer in the specified human language + # (experimental) + language, section_name = section_name.split(':', 1) + else: + language = "" + section_name = LANGUAGE_ALIAS.get(section_name, section_name) + + if language: + section_name = language + ":" + section_name + return "%s/%s" % (section_name, rest) def _rewrite_section_name_for_q(query):