diff options
238 files changed, 5192 insertions, 2480 deletions
diff --git a/.travis.yml b/.travis.yml index 65f8ef235..0a174ff66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,8 @@ cache: - npm - directories: - $HOME/.cache/pip +addons: + firefox: "latest" language: python python: - "2.7" @@ -12,6 +14,9 @@ before_install: - "sh -e /etc/init.d/xvfb start" - npm install less grunt-cli - ( cd searx/static/themes/oscar;npm install; cd - ) + - mkdir -p ~/drivers; export PATH=~/drivers:$PATH; + - GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-linux64.tar.gz"; + - FILE=`mktemp`; wget "$GECKODRIVER_URL" -qO $FILE && tar xz -C ~/drivers -f $FILE geckodriver; rm $FILE; chmod 777 ~/drivers/geckodriver; install: - ./manage.sh update_dev_packages - pip install coveralls diff --git a/AUTHORS.rst b/AUTHORS.rst index f3e875ada..0c224088f 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -1,4 +1,4 @@ -Searx was created by Adam Tauber and is maintained by Adam Tauber and Alexandre Flament. +Searx was created by Adam Tauber and is maintained by Adam Tauber, Alexandre Flament and Noémi Ványi. Major contributing authors: @@ -7,6 +7,7 @@ Major contributing authors: - Thomas Pointhuber - Alexandre Flament `@dalf <https://github.com/dalf>`_ - @Cqoicebordel +- Noémi Ványi People who have submitted patches/translates, reported bugs, consulted features or generally made searx better: @@ -39,12 +40,10 @@ generally made searx better: - @underr - Emmanuel Benazera - @GreenLunar -- Noemi Vanyi - Kang-min Liu - Kirill Isakov - Guilhem Bonnefille - Marc Abonce Seguin - - @jibe-b - Christian Pietsch @pietsch - @Maxqia @@ -52,3 +51,12 @@ generally made searx better: - YuLun Shih @imZack - Dmitry Mikhirev @mikhirev - David A Roberts `@davidar <https://github.com/davidar>`_ +- Jan Verbeek @blyxxyz +- Ammar Najjar @ammarnajjar +- @stepshal +- François Revol @mmuman +- marc @a01200356 +- Harry Wood @harry-wood +- Thomas Renard @threnard +- Pydo `<https://github.com/pydo>`_ +- Athemis `<https://github.com/Athemis>`_ diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8907ab403..999570eb5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,38 @@ +0.10.0 2016.09.06 +================= + +- New engines + + - Archive.is (general) + - INA (videos) + - Scanr (science) + - Google Scholar (science) + - Crossref (science) + - Openrepos (files) + - Microsoft Academic Search Engine (science) + - Hoogle (it) + - Diggbt (files) + - Dictzone (general - dictionary) + - Translated (general - translation) +- New Plugins + + - Infinite scroll on results page + - DOAI rewrite +- Full theme redesign +- Display the number of results +- Filter searches by date range +- Instance config API endpoint +- Dependency version updates +- Socks proxy support for outgoing requests +- 404 page + + +News +~~~~ + +@kvch joined the maintainer team + + 0.9.0 2016.05.24 ================ @@ -36,6 +71,7 @@ - Multilingual autocompleter - Qwant autocompleter backend + 0.8.1 2015.12.22 ================ @@ -53,8 +53,8 @@ build_style() { styles() { echo '[!] Building styles' - build_style themes/default/less/style.less themes/default/css/style.css - build_style themes/default/less/style-rtl.less themes/default/css/style-rtl.css + build_style themes/legacy/less/style.less themes/legacy/css/style.css + build_style themes/legacy/less/style-rtl.less themes/legacy/css/style-rtl.css build_style themes/courgette/less/style.less themes/courgette/css/style.css build_style themes/courgette/less/style-rtl.less themes/courgette/css/style-rtl.css build_style less/bootstrap/bootstrap.less css/bootstrap.min.css diff --git a/requirements-dev.txt b/requirements-dev.txt index 580ef63e5..543521895 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -3,8 +3,8 @@ mock==2.0.0 nose2[coverage-plugin] pep8==1.7.0 plone.testing==5.0.0 -robotframework-selenium2library==1.7.4 +robotframework-selenium2library==1.8.0 robotsuite==1.7.0 -transifex-client==0.11 +transifex-client==0.12.2 unittest2==1.1.0 -zope.testrunner==4.4.10 +zope.testrunner==4.5.1 diff --git a/requirements.txt b/requirements.txt index 0d2f61b00..c4cbe4e04 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -certifi==2016.2.28 +certifi==2016.9.26 flask==0.11.1 flask-babel==0.11.1 lxml==3.6.0 @@ -9,4 +9,4 @@ pygments==2.1.3 pyopenssl==0.15.1 python-dateutil==2.5.3 pyyaml==3.11 -requests==2.10.0 +requests[socks]==2.10.0 diff --git a/searx/__init__.py b/searx/__init__.py index 7b67a394f..b3abc61ae 100644 --- a/searx/__init__.py +++ b/searx/__init__.py @@ -42,7 +42,26 @@ else: with open(settings_path) as settings_yaml: settings = load(settings_yaml) -if settings.get('general', {}).get('debug'): +''' +enable debug if +the environnement variable SEARX_DEBUG is 1 or true +(whatever the value in settings.yml) +or general.debug=True in settings.yml + +disable debug if +the environnement variable SEARX_DEBUG is 0 or false +(whatever the value in settings.yml) +or general.debug=False in settings.yml +''' +searx_debug_env = environ.get('SEARX_DEBUG', '').lower() +if searx_debug_env == 'true' or searx_debug_env == '1': + searx_debug = True +elif searx_debug_env == 'false' or searx_debug_env == '0': + searx_debug = False +else: + searx_debug = settings.get('general', {}).get('debug') + +if searx_debug: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.WARNING) diff --git a/searx/answerers/__init__.py b/searx/answerers/__init__.py new file mode 100644 index 000000000..8f5951c75 --- /dev/null +++ b/searx/answerers/__init__.py @@ -0,0 +1,46 @@ +from os import listdir +from os.path import realpath, dirname, join, isdir +from searx.utils import load_module +from collections import defaultdict + + +answerers_dir = dirname(realpath(__file__)) + + +def load_answerers(): + answerers = [] + for filename in listdir(answerers_dir): + if not isdir(join(answerers_dir, filename)): + continue + module = load_module('answerer.py', join(answerers_dir, filename)) + if not hasattr(module, 'keywords') or not isinstance(module.keywords, tuple) or not len(module.keywords): + exit(2) + answerers.append(module) + return answerers + + +def get_answerers_by_keywords(answerers): + by_keyword = defaultdict(list) + for answerer in answerers: + for keyword in answerer.keywords: + for keyword in answerer.keywords: + by_keyword[keyword].append(answerer.answer) + return by_keyword + + +def ask(query): + results = [] + query_parts = filter(None, query.query.split()) + + if query_parts[0] not in answerers_by_keywords: + return results + + for answerer in answerers_by_keywords[query_parts[0]]: + result = answerer(query) + if result: + results.append(result) + return results + + +answerers = load_answerers() +answerers_by_keywords = get_answerers_by_keywords(answerers) diff --git a/searx/answerers/random/answerer.py b/searx/answerers/random/answerer.py new file mode 100644 index 000000000..510d9f5be --- /dev/null +++ b/searx/answerers/random/answerer.py @@ -0,0 +1,50 @@ +import random +import string +from flask_babel import gettext + +# required answerer attribute +# specifies which search query keywords triggers this answerer +keywords = ('random',) + +random_int_max = 2**31 + +random_string_letters = string.lowercase + string.digits + string.uppercase + + +def random_string(): + return u''.join(random.choice(random_string_letters) + for _ in range(random.randint(8, 32))) + + +def random_float(): + return unicode(random.random()) + + +def random_int(): + return unicode(random.randint(-random_int_max, random_int_max)) + + +random_types = {u'string': random_string, + u'int': random_int, + u'float': random_float} + + +# required answerer function +# can return a list of results (any result type) for a given query +def answer(query): + parts = query.query.split() + if len(parts) != 2: + return [] + + if parts[1] not in random_types: + return [] + + return [{'answer': random_types[parts[1]]()}] + + +# required answerer function +# returns information about the answerer +def self_info(): + return {'name': gettext('Random value generator'), + 'description': gettext('Generate different random values'), + 'examples': [u'random {}'.format(x) for x in random_types]} diff --git a/searx/answerers/statistics/answerer.py b/searx/answerers/statistics/answerer.py new file mode 100644 index 000000000..a04695f56 --- /dev/null +++ b/searx/answerers/statistics/answerer.py @@ -0,0 +1,51 @@ +from functools import reduce +from operator import mul + +from flask_babel import gettext + +keywords = ('min', + 'max', + 'avg', + 'sum', + 'prod') + + +# required answerer function +# can return a list of results (any result type) for a given query +def answer(query): + parts = query.query.split() + + if len(parts) < 2: + return [] + + try: + args = map(float, parts[1:]) + except: + return [] + + func = parts[0] + answer = None + + if func == 'min': + answer = min(args) + elif func == 'max': + answer = max(args) + elif func == 'avg': + answer = sum(args) / len(args) + elif func == 'sum': + answer = sum(args) + elif func == 'prod': + answer = reduce(mul, args, 1) + + if answer is None: + return [] + + return [{'answer': unicode(answer)}] + + +# required answerer function +# returns information about the answerer +def self_info(): + return {'name': gettext('Statistics functions'), + 'description': gettext('Compute {functions} of the arguments').format(functions='/'.join(keywords)), + 'examples': ['avg 123 548 2.04 24.2']} diff --git a/searx/engines/__init__.py b/searx/engines/__init__.py index 782b622b0..87b1b0eb4 100644 --- a/searx/engines/__init__.py +++ b/searx/engines/__init__.py @@ -16,13 +16,13 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >. (C) 2013- by Adam Tauber, <asciimoo@gmail.com> ''' -from os.path import realpath, dirname, splitext, join +from os.path import realpath, dirname import sys -from imp import load_source from flask_babel import gettext from operator import itemgetter from searx import settings from searx import logger +from searx.utils import load_module logger = logger.getChild('engines') @@ -32,6 +32,7 @@ engine_dir = dirname(realpath(__file__)) engines = {} categories = {'general': []} +_initialized = False engine_shortcuts = {} engine_default_args = {'paging': False, @@ -46,22 +47,18 @@ engine_default_args = {'paging': False, 'time_range_support': False} -def load_module(filename): - modname = splitext(filename)[0] - if modname in sys.modules: - del sys.modules[modname] - filepath = join(engine_dir, filename) - module = load_source(modname, filepath) - module.name = modname - return module +def load_engine(engine_data): + + if '_' in engine_data['name']: + logger.error('Engine name conains underscore: "{}"'.format(engine_data['name'])) + sys.exit(1) + engine_module = engine_data['engine'] -def load_engine(engine_data): - engine_name = engine_data['engine'] try: - engine = load_module(engine_name + '.py') + engine = load_module(engine_module + '.py', engine_dir) except: - logger.exception('Cannot load engine "{}"'.format(engine_name)) + logger.exception('Cannot load engine "{}"'.format(engine_module)) return None for param_name in engine_data: @@ -93,6 +90,9 @@ def load_engine(engine_data): 'result_count': 0, 'search_count': 0, 'page_load_time': 0, + 'page_load_count': 0, + 'engine_time': 0, + 'engine_time_count': 0, 'score_count': 0, 'errors': 0 } @@ -109,32 +109,56 @@ def load_engine(engine_data): return engine +def to_percentage(stats, maxvalue): + for engine_stat in stats: + if maxvalue: + engine_stat['percentage'] = int(engine_stat['avg'] / maxvalue * 100) + else: + engine_stat['percentage'] = 0 + return stats + + def get_engines_stats(): # TODO refactor pageloads = [] + engine_times = [] results = [] scores = [] errors = [] scores_per_result = [] - max_pageload = max_results = max_score = max_errors = max_score_per_result = 0 # noqa + max_pageload = max_engine_times = max_results = max_score = max_errors = max_score_per_result = 0 # noqa for engine in engines.values(): if engine.stats['search_count'] == 0: continue results_num = \ engine.stats['result_count'] / float(engine.stats['search_count']) - load_times = engine.stats['page_load_time'] / float(engine.stats['search_count']) # noqa + + if engine.stats['page_load_count'] != 0: + load_times = engine.stats['page_load_time'] / float(engine.stats['page_load_count']) # noqa + else: + load_times = 0 + + if engine.stats['engine_time_count'] != 0: + this_engine_time = engine.stats['engine_time'] / float(engine.stats['engine_time_count']) # noqa + else: + this_engine_time = 0 + if results_num: score = engine.stats['score_count'] / float(engine.stats['search_count']) # noqa score_per_result = score / results_num else: score = score_per_result = 0.0 - max_results = max(results_num, max_results) + max_pageload = max(load_times, max_pageload) + max_engine_times = max(this_engine_time, max_engine_times) + max_results = max(results_num, max_results) max_score = max(score, max_score) max_score_per_result = max(score_per_result, max_score_per_result) max_errors = max(max_errors, engine.stats['errors']) + pageloads.append({'avg': load_times, 'name': engine.name}) + engine_times.append({'avg': this_engine_time, 'name': engine.name}) results.append({'avg': results_num, 'name': engine.name}) scores.append({'avg': score, 'name': engine.name}) errors.append({'avg': engine.stats['errors'], 'name': engine.name}) @@ -143,39 +167,19 @@ def get_engines_stats(): 'name': engine.name }) - for engine in pageloads: - if max_pageload: - engine['percentage'] = int(engine['avg'] / max_pageload * 100) - else: - engine['percentage'] = 0 - - for engine in results: - if max_results: - engine['percentage'] = int(engine['avg'] / max_results * 100) - else: - engine['percentage'] = 0 - - for engine in scores: - if max_score: - engine['percentage'] = int(engine['avg'] / max_score * 100) - else: - engine['percentage'] = 0 - - for engine in scores_per_result: - if max_score_per_result: - engine['percentage'] = int(engine['avg'] - / max_score_per_result * 100) - else: - engine['percentage'] = 0 - - for engine in errors: - if max_errors: - engine['percentage'] = int(float(engine['avg']) / max_errors * 100) - else: - engine['percentage'] = 0 + pageloads = to_percentage(pageloads, max_pageload) + engine_times = to_percentage(engine_times, max_engine_times) + results = to_percentage(results, max_results) + scores = to_percentage(scores, max_score) + scores_per_result = to_percentage(scores_per_result, max_score_per_result) + erros = to_percentage(errors, max_errors) return [ ( + gettext('Engine time (sec)'), + sorted(engine_times, key=itemgetter('avg')) + ), + ( gettext('Page loads (sec)'), sorted(pageloads, key=itemgetter('avg')) ), diff --git a/searx/engines/archlinux.py b/searx/engines/archlinux.py index b846934f7..5ba512766 100644 --- a/searx/engines/archlinux.py +++ b/searx/engines/archlinux.py @@ -12,7 +12,6 @@ """ from urlparse import urljoin -from cgi import escape from urllib import urlencode from lxml import html from searx.engines.xpath import extract_text @@ -135,7 +134,7 @@ def response(resp): for result in dom.xpath(xpath_results): link = result.xpath(xpath_link)[0] href = urljoin(base_url, link.attrib.get('href')) - title = escape(extract_text(link)) + title = extract_text(link) results.append({'url': href, 'title': title}) diff --git a/searx/engines/base.py b/searx/engines/base.py index 66491d395..a552453ce 100755 --- a/searx/engines/base.py +++ b/searx/engines/base.py @@ -16,7 +16,6 @@ from lxml import etree from urllib import urlencode from searx.utils import searx_useragent -from cgi import escape from datetime import datetime import re @@ -94,7 +93,7 @@ def response(resp): url = item.text elif item.attrib["name"] == "dcdescription": - content = escape(item.text[:300]) + content = item.text[:300] if len(item.text) > 300: content += "..." diff --git a/searx/engines/bing.py b/searx/engines/bing.py index 6bdfd378b..58db61251 100644 --- a/searx/engines/bing.py +++ b/searx/engines/bing.py @@ -14,7 +14,6 @@ """ from urllib import urlencode -from cgi import escape from lxml import html from searx.engines.xpath import extract_text @@ -32,18 +31,14 @@ search_string = 'search?{query}&first={offset}' def request(query, params): offset = (params['pageno'] - 1) * 10 + 1 - if params['language'] == 'all': - language = 'en-US' - else: - language = params['language'].replace('_', '-') + if params['language'] != 'all': + query = u'language:{} {}'.format(params['language'].split('_')[0].upper(), + query.decode('utf-8')).encode('utf-8') search_path = search_string.format( - query=urlencode({'q': query, 'setmkt': language}), + query=urlencode({'q': query}), offset=offset) - params['cookies']['SRCHHPGUSR'] = \ - 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0] - params['url'] = base_url + search_path return params @@ -65,7 +60,7 @@ def response(resp): link = result.xpath('.//h3/a')[0] url = link.attrib.get('href') title = extract_text(link) - content = escape(extract_text(result.xpath('.//p'))) + content = extract_text(result.xpath('.//p')) # append result results.append({'url': url, @@ -77,7 +72,7 @@ def response(resp): link = result.xpath('.//h2/a')[0] url = link.attrib.get('href') title = extract_text(link) - content = escape(extract_text(result.xpath('.//p'))) + content = extract_text(result.xpath('.//p')) # append result results.append({'url': url, diff --git a/searx/engines/bing_images.py b/searx/engines/bing_images.py index 384520392..4dd362cb3 100644 --- a/searx/engines/bing_images.py +++ b/searx/engines/bing_images.py @@ -24,11 +24,17 @@ import re categories = ['images'] paging = True safesearch = True +time_range_support = True # search-url base_url = 'https://www.bing.com/' search_string = 'images/search?{query}&count=10&first={offset}' +time_range_string = '&qft=+filterui:age-lt{interval}' thumb_url = "https://www.bing.com/th?id={ihk}" +time_range_dict = {'day': '1440', + 'week': '10080', + 'month': '43200', + 'year': '525600'} # safesearch definitions safesearch_types = {2: 'STRICT', @@ -58,6 +64,8 @@ def request(query, params): '&ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') params['url'] = base_url + search_path + if params['time_range'] in time_range_dict: + params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']]) return params diff --git a/searx/engines/bing_news.py b/searx/engines/bing_news.py index a2397c48e..4e7c33129 100644 --- a/searx/engines/bing_news.py +++ b/searx/engines/bing_news.py @@ -22,10 +22,15 @@ from searx.utils import list_get categories = ['news'] paging = True language_support = True +time_range_support = True # search-url base_url = 'https://www.bing.com/' search_string = 'news/search?{query}&first={offset}&format=RSS' +search_string_with_time = 'news/search?{query}&first={offset}&qft=interval%3d"{interval}"&format=RSS' +time_range_dict = {'day': '7', + 'week': '8', + 'month': '9'} # remove click @@ -46,8 +51,24 @@ def image_url_cleanup(url_string): return url_string +def _get_url(query, language, offset, time_range): + if time_range in time_range_dict: + search_path = search_string_with_time.format( + query=urlencode({'q': query, 'setmkt': language}), + offset=offset, + interval=time_range_dict[time_range]) + else: + search_path = search_string.format( + query=urlencode({'q': query, 'setmkt': language}), + offset=offset) + return base_url + search_path + + # do search-request def request(query, params): + if params['time_range'] and params['time_range'] not in time_range_dict: + return params + offset = (params['pageno'] - 1) * 10 + 1 if params['language'] == 'all': @@ -55,11 +76,7 @@ def request(query, params): else: language = params['language'].replace('_', '-') - search_path = search_string.format( - query=urlencode({'q': query, 'setmkt': language}), - offset=offset) - - params['url'] = base_url + search_path + params['url'] = _get_url(query, language, offset, params['time_range']) return params diff --git a/searx/engines/btdigg.py b/searx/engines/btdigg.py index c2b22f003..33c8355de 100644 --- a/searx/engines/btdigg.py +++ b/searx/engines/btdigg.py @@ -11,11 +11,11 @@ """ from urlparse import urljoin -from cgi import escape from urllib import quote from lxml import html from operator import itemgetter from searx.engines.xpath import extract_text +from searx.utils import get_torrent_size # engine dependent config categories = ['videos', 'music', 'files'] @@ -50,8 +50,8 @@ def response(resp): for result in search_res: link = result.xpath('.//td[@class="torrent_name"]//a')[0] href = urljoin(url, link.attrib.get('href')) - title = escape(extract_text(link)) - content = escape(extract_text(result.xpath('.//pre[@class="snippet"]')[0])) + title = extract_text(link) + content = extract_text(result.xpath('.//pre[@class="snippet"]')[0]) content = "<br />".join(content.split("\n")) filesize = result.xpath('.//span[@class="attr_val"]/text()')[0].split()[0] @@ -68,20 +68,7 @@ def response(resp): leech = 0 # convert filesize to byte if possible - try: - filesize = float(filesize) - - # convert filesize to byte - if filesize_multiplier == 'TB': - filesize = int(filesize * 1024 * 1024 * 1024 * 1024) - elif filesize_multiplier == 'GB': - filesize = int(filesize * 1024 * 1024 * 1024) - elif filesize_multiplier == 'MB': - filesize = int(filesize * 1024 * 1024) - elif filesize_multiplier == 'KB': - filesize = int(filesize * 1024) - except: - filesize = None + filesize = get_torrent_size(filesize, filesize_multiplier) # convert files to int if possible if files.isdigit(): diff --git a/searx/engines/dailymotion.py b/searx/engines/dailymotion.py index 4eb894725..317f34f59 100644 --- a/searx/engines/dailymotion.py +++ b/searx/engines/dailymotion.py @@ -14,7 +14,6 @@ from urllib import urlencode from json import loads -from cgi import escape from datetime import datetime # engine dependent config @@ -57,7 +56,7 @@ def response(resp): for res in search_res['list']: title = res['title'] url = res['url'] - content = escape(res['description']) + content = res['description'] thumbnail = res['thumbnail_360_url'] publishedDate = datetime.fromtimestamp(res['created_time'], None) embedded = embedded_url.format(videoid=res['id']) diff --git a/searx/engines/deezer.py b/searx/engines/deezer.py index 0530bc072..3db1af3d2 100644 --- a/searx/engines/deezer.py +++ b/searx/engines/deezer.py @@ -51,10 +51,11 @@ def response(resp): if url.startswith('http://'): url = 'https' + url[4:] - content = result['artist']['name'] +\ - " • " +\ - result['album']['title'] +\ - " • " + result['title'] + content = u'{} - {} - {}'.format( + result['artist']['name'], + result['album']['title'], + result['title']) + embedded = embedded_url.format(audioid=result['id']) # append result diff --git a/searx/engines/deviantart.py b/searx/engines/deviantart.py index d893fc7fe..a24b75b8a 100644 --- a/searx/engines/deviantart.py +++ b/searx/engines/deviantart.py @@ -34,6 +34,9 @@ time_range_dict = {'day': 11, # do search-request def request(query, params): + if params['time_range'] and params['time_range'] not in time_range_dict: + return params + offset = (params['pageno'] - 1) * 24 params['url'] = search_url.format(offset=offset, diff --git a/searx/engines/dictzone.py b/searx/engines/dictzone.py new file mode 100644 index 000000000..20a9a8980 --- /dev/null +++ b/searx/engines/dictzone.py @@ -0,0 +1,68 @@ +""" + Dictzone + + @website https://dictzone.com/ + @provide-api no + @using-api no + @results HTML (using search portal) + @stable no (HTML can change) + @parse url, title, content +""" + +import re +from urlparse import urljoin +from lxml import html +from searx.utils import is_valid_lang + +categories = ['general'] +url = u'http://dictzone.com/{from_lang}-{to_lang}-dictionary/{query}' +weight = 100 + +parser_re = re.compile(u'.*?([a-z]+)-([a-z]+) ([^ ]+)$', re.I) +results_xpath = './/table[@id="r"]/tr' + + +def request(query, params): + m = parser_re.match(unicode(query, 'utf8')) + if not m: + return params + + from_lang, to_lang, query = m.groups() + + from_lang = is_valid_lang(from_lang) + to_lang = is_valid_lang(to_lang) + + if not from_lang or not to_lang: + return params + + params['url'] = url.format(from_lang=from_lang[2], + to_lang=to_lang[2], + query=query) + + return params + + +def response(resp): + results = [] + + dom = html.fromstring(resp.text) + + for k, result in enumerate(dom.xpath(results_xpath)[1:]): + try: + from_result, to_results_raw = result.xpath('./td') + except: + continue + + to_results = [] + for to_result in to_results_raw.xpath('./p/a'): + t = to_result.text_content() + if t.strip(): + to_results.append(to_result.text_content()) + + results.append({ + 'url': urljoin(resp.url, '?%d' % k), + 'title': from_result.text_content(), + 'content': '; '.join(to_results) + }) + + return results diff --git a/searx/engines/digbt.py b/searx/engines/digbt.py new file mode 100644 index 000000000..b55d7747a --- /dev/null +++ b/searx/engines/digbt.py @@ -0,0 +1,58 @@ +""" + DigBT (Videos, Music, Files) + + @website https://digbt.org + @provide-api no + + @using-api no + @results HTML (using search portal) + @stable no (HTML can change) + @parse url, title, content, magnetlink +""" + +from urlparse import urljoin +from lxml import html +from searx.engines.xpath import extract_text +from searx.utils import get_torrent_size + +categories = ['videos', 'music', 'files'] +paging = True + +URL = 'https://digbt.org' +SEARCH_URL = URL + '/search/{query}-time-{pageno}' +FILESIZE = 3 +FILESIZE_MULTIPLIER = 4 + + +def request(query, params): + params['url'] = SEARCH_URL.format(query=query, pageno=params['pageno']) + + return params + + +def response(resp): + dom = html.fromstring(resp.content) + search_res = dom.xpath('.//td[@class="x-item"]') + + if not search_res: + return list() + + results = list() + for result in search_res: + url = urljoin(URL, result.xpath('.//a[@title]/@href')[0]) + title = extract_text(result.xpath('.//a[@title]')) + content = extract_text(result.xpath('.//div[@class="files"]')) + files_data = extract_text(result.xpath('.//div[@class="tail"]')).split() + filesize = get_torrent_size(files_data[FILESIZE], files_data[FILESIZE_MULTIPLIER]) + magnetlink = result.xpath('.//div[@class="tail"]//a[@class="title"]/@href')[0] + + results.append({'url': url, + 'title': title, + 'content': content, + 'filesize': filesize, + 'magnetlink': magnetlink, + 'seed': 'N/A', + 'leech': 'N/A', + 'template': 'torrent.html'}) + + return results diff --git a/searx/engines/digg.py b/searx/engines/digg.py index a10b38bb6..238b466a0 100644 --- a/searx/engines/digg.py +++ b/searx/engines/digg.py @@ -13,7 +13,6 @@ from urllib import quote_plus from json import loads from lxml import html -from cgi import escape from dateutil import parser # engine dependent config @@ -56,7 +55,7 @@ def response(resp): url = result.attrib.get('data-contenturl') thumbnail = result.xpath('.//img')[0].attrib.get('src') title = ''.join(result.xpath(title_xpath)) - content = escape(''.join(result.xpath(content_xpath))) + content = ''.join(result.xpath(content_xpath)) pubdate = result.xpath(pubdate_xpath)[0].attrib.get('datetime') publishedDate = parser.parse(pubdate) diff --git a/searx/engines/duckduckgo.py b/searx/engines/duckduckgo.py index 2153492e9..9959a52e6 100644 --- a/searx/engines/duckduckgo.py +++ b/searx/engines/duckduckgo.py @@ -41,6 +41,9 @@ content_xpath = './/a[@class="result__snippet"]' # do search-request def request(query, params): + if params['time_range'] and params['time_range'] not in time_range_dict: + return params + offset = (params['pageno'] - 1) * 30 if params['language'] == 'all': diff --git a/searx/engines/fdroid.py b/searx/engines/fdroid.py index 0b16773e3..6d470a4eb 100644 --- a/searx/engines/fdroid.py +++ b/searx/engines/fdroid.py @@ -9,7 +9,6 @@ @parse url, title, content """ -from cgi import escape from urllib import urlencode from searx.engines.xpath import extract_text from lxml import html @@ -43,7 +42,7 @@ def response(resp): img_src = app.xpath('.//img/@src')[0] content = extract_text(app.xpath('./p')[0]) - content = escape(content.replace(title, '', 1).strip()) + content = content.replace(title, '', 1).strip() results.append({'url': url, 'title': title, diff --git a/searx/engines/flickr.py b/searx/engines/flickr.py index 68d45bc17..5ce1160e9 100644 --- a/searx/engines/flickr.py +++ b/searx/engines/flickr.py @@ -77,21 +77,13 @@ def response(resp): url = build_flickr_url(photo['owner'], photo['id']) - title = photo['title'] - - content = '<span class="photo-author">' +\ - photo['ownername'] +\ - '</span><br />' +\ - '<span class="description">' +\ - photo['description']['_content'] +\ - '</span>' - # append result results.append({'url': url, - 'title': title, + 'title': photo['title'], 'img_src': img_src, 'thumbnail_src': thumbnail_src, - 'content': content, + 'content': photo['description']['_content'], + 'author': photo['ownername'], 'template': 'images.html'}) # return results diff --git a/searx/engines/flickr_noapi.py b/searx/engines/flickr_noapi.py index 87b912eb3..3c0ec7b70 100644 --- a/searx/engines/flickr_noapi.py +++ b/searx/engines/flickr_noapi.py @@ -14,6 +14,7 @@ from urllib import urlencode from json import loads +from time import time import re from searx.engines import logger @@ -24,21 +25,32 @@ categories = ['images'] url = 'https://www.flickr.com/' search_url = url + 'search?{query}&page={page}' +time_range_url = '&min_upload_date={start}&max_upload_date={end}' photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}' regex = re.compile(r"\"search-photos-lite-models\",\"photos\":(.*}),\"totalItems\":", re.DOTALL) image_sizes = ('o', 'k', 'h', 'b', 'c', 'z', 'n', 'm', 't', 'q', 's') paging = True +time_range_support = True +time_range_dict = {'day': 60 * 60 * 24, + 'week': 60 * 60 * 24 * 7, + 'month': 60 * 60 * 24 * 7 * 4, + 'year': 60 * 60 * 24 * 7 * 52} def build_flickr_url(user_id, photo_id): return photo_url.format(userid=user_id, photoid=photo_id) -def request(query, params): - params['url'] = search_url.format(query=urlencode({'text': query}), - page=params['pageno']) +def _get_time_range_url(time_range): + if time_range in time_range_dict: + return time_range_url.format(start=time(), end=str(int(time()) - time_range_dict[time_range])) + return '' + +def request(query, params): + params['url'] = (search_url.format(query=urlencode({'text': query}), page=params['pageno']) + + _get_time_range_url(params['time_range'])) return params @@ -91,16 +103,15 @@ def response(resp): title = photo.get('title', '') - content = '<span class="photo-author">' +\ - photo['username'] +\ - '</span><br />' + author = photo['username'] # append result results.append({'url': url, 'title': title, 'img_src': img_src, 'thumbnail_src': thumbnail_src, - 'content': content, + 'content': '', + 'author': author, 'template': 'images.html'}) return results diff --git a/searx/engines/gigablast.py b/searx/engines/gigablast.py index 6e4e24b68..5430eb3ba 100644 --- a/searx/engines/gigablast.py +++ b/searx/engines/gigablast.py @@ -10,7 +10,6 @@ @parse url, title, content """ -from cgi import escape from json import loads from random import randint from time import time @@ -78,8 +77,8 @@ def response(resp): for result in response_json['results']: # append result results.append({'url': result['url'], - 'title': escape(result['title']), - 'content': escape(result['sum'])}) + 'title': result['title'], + 'content': result['sum']}) # return results return results diff --git a/searx/engines/github.py b/searx/engines/github.py index cc1fc470c..7adef3be9 100644 --- a/searx/engines/github.py +++ b/searx/engines/github.py @@ -12,7 +12,6 @@ from urllib import urlencode from json import loads -from cgi import escape # engine dependent config categories = ['it'] @@ -48,7 +47,7 @@ def response(resp): url = res['html_url'] if res['description']: - content = escape(res['description'][:500]) + content = res['description'][:500] else: content = '' diff --git a/searx/engines/google.py b/searx/engines/google.py index ea93bc94f..a02b6940e 100644 --- a/searx/engines/google.py +++ b/searx/engines/google.py @@ -9,7 +9,6 @@ # @parse url, title, content, suggestion import re -from cgi import escape from urllib import urlencode from urlparse import urlparse, parse_qsl from lxml import html, etree @@ -96,7 +95,8 @@ search_url = ('https://{hostname}' + time_range_search = "&tbs=qdr:{range}" time_range_dict = {'day': 'd', 'week': 'w', - 'month': 'm'} + 'month': 'm', + 'year': 'y'} # other URLs map_hostname_start = 'maps.google.' @@ -155,7 +155,7 @@ def parse_url(url_string, google_hostname): def extract_text_from_dom(result, xpath): r = result.xpath(xpath) if len(r) > 0: - return escape(extract_text(r[0])) + return extract_text(r[0]) return None @@ -264,7 +264,7 @@ def response(resp): # parse suggestion for suggestion in dom.xpath(suggestion_xpath): # append suggestion - results.append({'suggestion': escape(extract_text(suggestion))}) + results.append({'suggestion': extract_text(suggestion)}) # return results return results diff --git a/searx/engines/google_images.py b/searx/engines/google_images.py index 77bdc13b2..9a3c71c7e 100644 --- a/searx/engines/google_images.py +++ b/searx/engines/google_images.py @@ -10,10 +10,12 @@ @parse url, title, img_src """ +from datetime import date, timedelta from urllib import urlencode from json import loads from lxml import html + # engine dependent config categories = ['images'] paging = True @@ -29,6 +31,7 @@ search_url = 'https://www.google.com/search'\ '&yv=2'\ '&{search_options}' time_range_attr = "qdr:{range}" +time_range_custom_attr = "cdr:1,cd_min:{start},cd_max{end}" time_range_dict = {'day': 'd', 'week': 'w', 'month': 'm'} @@ -36,7 +39,6 @@ time_range_dict = {'day': 'd', # do search-request def request(query, params): - search_options = { 'ijn': params['pageno'] - 1, 'start': (params['pageno'] - 1) * number_of_results @@ -44,6 +46,12 @@ def request(query, params): if params['time_range'] in time_range_dict: search_options['tbs'] = time_range_attr.format(range=time_range_dict[params['time_range']]) + elif params['time_range'] == 'year': + now = date.today() + then = now - timedelta(days=365) + start = then.strftime('%m/%d/%Y') + end = now.strftime('%m/%d/%Y') + search_options['tbs'] = time_range_custom_attr.format(start=start, end=end) if safesearch and params['safesearch']: search_options['safe'] = 'on' diff --git a/searx/engines/google_news.py b/searx/engines/google_news.py index 95d15cfb9..37253c6a7 100644 --- a/searx/engines/google_news.py +++ b/searx/engines/google_news.py @@ -1,41 +1,57 @@ """ Google (News) - @website https://www.google.com - @provide-api yes (https://developers.google.com/web-search/docs/), - deprecated! + @website https://news.google.com + @provide-api no - @using-api yes - @results JSON - @stable yes (but deprecated) + @using-api no + @results HTML + @stable no @parse url, title, content, publishedDate """ +from lxml import html from urllib import urlencode -from json import loads -from dateutil import parser # search-url categories = ['news'] paging = True language_support = True - -# engine dependent config -url = 'https://ajax.googleapis.com/' -search_url = url + 'ajax/services/search/news?v=2.0&start={offset}&rsz=large&safe=off&filter=off&{query}&hl={lang}' +safesearch = True +time_range_support = True +number_of_results = 10 + +search_url = 'https://www.google.com/search'\ + '?{query}'\ + '&tbm=nws'\ + '&gws_rd=cr'\ + '&{search_options}' +time_range_attr = "qdr:{range}" +time_range_dict = {'day': 'd', + 'week': 'w', + 'month': 'm', + 'year': 'y'} # do search-request def request(query, params): - offset = (params['pageno'] - 1) * 8 - language = 'en-US' - if params['language'] != 'all': - language = params['language'].replace('_', '-') + search_options = { + 'start': (params['pageno'] - 1) * number_of_results + } + + if params['time_range'] in time_range_dict: + search_options['tbs'] = time_range_attr.format(range=time_range_dict[params['time_range']]) + + if safesearch and params['safesearch']: + search_options['safe'] = 'on' - params['url'] = search_url.format(offset=offset, - query=urlencode({'q': query}), - lang=language) + params['url'] = search_url.format(query=urlencode({'q': query}), + search_options=urlencode(search_options)) + + if params['language'] != 'all': + language_array = params['language'].lower().split('_') + params['url'] += '&lr=lang_' + language_array[0] return params @@ -44,24 +60,21 @@ def request(query, params): def response(resp): results = [] - search_res = loads(resp.text) - - # return empty array if there are no results - if not search_res.get('responseData', {}).get('results'): - return [] + dom = html.fromstring(resp.text) # parse results - for result in search_res['responseData']['results']: - # parse publishedDate - publishedDate = parser.parse(result['publishedDate']) - if 'url' not in result: - continue - - # append result - results.append({'url': result['unescapedUrl'], - 'title': result['titleNoFormatting'], - 'publishedDate': publishedDate, - 'content': result['content']}) + for result in dom.xpath('//div[@class="g"]|//div[@class="g _cy"]'): + r = { + 'url': result.xpath('.//div[@class="_cnc"]//a/@href')[0], + 'title': ''.join(result.xpath('.//div[@class="_cnc"]//h3//text()')), + 'content': ''.join(result.xpath('.//div[@class="st"]//text()')), + } + + img = result.xpath('.//img/@src')[0] + if img and not img.startswith('data'): + r['img_src'] = img + + results.append(r) # return results return results diff --git a/searx/engines/json_engine.py b/searx/engines/json_engine.py index a824c38e5..4604c3cac 100644 --- a/searx/engines/json_engine.py +++ b/searx/engines/json_engine.py @@ -81,7 +81,7 @@ def request(query, params): fp = {'query': query} if paging and search_url.find('{pageno}') >= 0: - fp['pageno'] = (params['pageno'] + first_page_num - 1) * page_size + fp['pageno'] = (params['pageno'] - 1) * page_size + first_page_num params['url'] = search_url.format(**fp) params['query'] = query diff --git a/searx/engines/kickass.py b/searx/engines/kickass.py index 4c5d24008..059fa2a66 100644 --- a/searx/engines/kickass.py +++ b/searx/engines/kickass.py @@ -11,18 +11,18 @@ """ from urlparse import urljoin -from cgi import escape from urllib import quote from lxml import html from operator import itemgetter from searx.engines.xpath import extract_text +from searx.utils import get_torrent_size, convert_str_to_int # engine dependent config categories = ['videos', 'music', 'files'] paging = True # search-url -url = 'https://kickass.to/' +url = 'https://kickass.cd/' search_url = url + 'search/{search_term}/{pageno}/' # specific xpath variables @@ -56,42 +56,17 @@ def response(resp): link = result.xpath('.//a[@class="cellMainLink"]')[0] href = urljoin(url, link.attrib['href']) title = extract_text(link) - content = escape(extract_text(result.xpath(content_xpath))) - seed = result.xpath('.//td[contains(@class, "green")]/text()')[0] - leech = result.xpath('.//td[contains(@class, "red")]/text()')[0] - filesize = result.xpath('.//td[contains(@class, "nobr")]/text()')[0] - filesize_multiplier = result.xpath('.//td[contains(@class, "nobr")]//span/text()')[0] - files = result.xpath('.//td[contains(@class, "center")][2]/text()')[0] - - # convert seed to int if possible - if seed.isdigit(): - seed = int(seed) - else: - seed = 0 + content = extract_text(result.xpath(content_xpath)) + seed = extract_text(result.xpath('.//td[contains(@class, "green")]')) + leech = extract_text(result.xpath('.//td[contains(@class, "red")]')) + filesize_info = extract_text(result.xpath('.//td[contains(@class, "nobr")]')) + files = extract_text(result.xpath('.//td[contains(@class, "center")][2]')) - # convert leech to int if possible - if leech.isdigit(): - leech = int(leech) - else: - leech = 0 - - # convert filesize to byte if possible - try: - filesize = float(filesize) - - # convert filesize to byte - if filesize_multiplier == 'TB': - filesize = int(filesize * 1024 * 1024 * 1024 * 1024) - elif filesize_multiplier == 'GB': - filesize = int(filesize * 1024 * 1024 * 1024) - elif filesize_multiplier == 'MB': - filesize = int(filesize * 1024 * 1024) - elif filesize_multiplier == 'KB': - filesize = int(filesize * 1024) - except: - filesize = None - - # convert files to int if possible + seed = convert_str_to_int(seed) + leech = convert_str_to_int(leech) + + filesize, filesize_multiplier = filesize_info.split() + filesize = get_torrent_size(filesize, filesize_multiplier) if files.isdigit(): files = int(files) else: diff --git a/searx/engines/nyaa.py b/searx/engines/nyaa.py index cda8231f7..4ca5b3171 100644 --- a/searx/engines/nyaa.py +++ b/searx/engines/nyaa.py @@ -9,7 +9,6 @@ @parse url, title, content, seed, leech, torrentfile """ -from cgi import escape from urllib import urlencode from lxml import html from searx.engines.xpath import extract_text @@ -78,7 +77,7 @@ def response(resp): # torrent title page_a = result.xpath(xpath_title)[0] - title = escape(extract_text(page_a)) + title = extract_text(page_a) # link to the page href = page_a.attrib.get('href') @@ -90,7 +89,7 @@ def response(resp): try: file_size, suffix = result.xpath(xpath_filesize)[0].split(' ') file_size = int(float(file_size) * get_filesize_mul(suffix)) - except Exception as e: + except: file_size = None # seed count @@ -105,7 +104,6 @@ def response(resp): # content string contains all information not included into template content = 'Category: "{category}". Downloaded {downloads} times.' content = content.format(category=category, downloads=downloads) - content = escape(content) results.append({'url': href, 'title': title, diff --git a/searx/engines/openstreetmap.py b/searx/engines/openstreetmap.py index 38baaada9..01ca7d42d 100644 --- a/searx/engines/openstreetmap.py +++ b/searx/engines/openstreetmap.py @@ -43,7 +43,7 @@ def response(resp): if 'display_name' not in r: continue - title = r['display_name'] + title = r['display_name'] or u'' osm_type = r.get('osm_type', r.get('type')) url = result_base_url.format(osm_type=osm_type, osm_id=r['osm_id']) diff --git a/searx/engines/pdbe.py b/searx/engines/pdbe.py new file mode 100644 index 000000000..f784e106f --- /dev/null +++ b/searx/engines/pdbe.py @@ -0,0 +1,109 @@ +""" + PDBe (Protein Data Bank in Europe) + + @website https://www.ebi.ac.uk/pdbe + @provide-api yes (https://www.ebi.ac.uk/pdbe/api/doc/search.html), + unlimited + @using-api yes + @results python dictionary (from json) + @stable yes + @parse url, title, content, img_src +""" + +from json import loads +from flask_babel import gettext + +categories = ['science'] + +hide_obsolete = False + +# status codes of unpublished entries +pdb_unpublished_codes = ['HPUB', 'HOLD', 'PROC', 'WAIT', 'AUTH', 'AUCO', 'REPL', 'POLC', 'REFI', 'TRSF', 'WDRN'] +# url for api query +pdbe_solr_url = 'https://www.ebi.ac.uk/pdbe/search/pdb/select?' +# base url for results +pdbe_entry_url = 'https://www.ebi.ac.uk/pdbe/entry/pdb/{pdb_id}' +# link to preview image of structure +pdbe_preview_url = 'https://www.ebi.ac.uk/pdbe/static/entry/{pdb_id}_deposited_chain_front_image-200x200.png' + + +def request(query, params): + + params['url'] = pdbe_solr_url + params['method'] = 'POST' + params['data'] = { + 'q': query, + 'wt': "json" # request response in parsable format + } + return params + + +def construct_body(result): + # set title + title = result['title'] + + # construct content body + content = """{title}<br />{authors} {journal} <strong>{volume}</strong> {page} ({year})""" + + # replace placeholders with actual content + try: + if result['journal']: + content = content.format( + title=result['citation_title'], + authors=result['entry_author_list'][0], journal=result['journal'], volume=result['journal_volume'], + page=result['journal_page'], year=result['citation_year']) + else: + content = content.format( + title=result['citation_title'], + authors=result['entry_author_list'][0], journal='', volume='', page='', year=result['release_year']) + img_src = pdbe_preview_url.format(pdb_id=result['pdb_id']) + except (KeyError): + content = None + img_src = None + + # construct url for preview image + try: + img_src = pdbe_preview_url.format(pdb_id=result['pdb_id']) + except (KeyError): + img_src = None + + return [title, content, img_src] + + +def response(resp): + + results = [] + json = loads(resp.text)['response']['docs'] + + # parse results + for result in json: + # catch obsolete entries and mark them accordingly + if result['status'] in pdb_unpublished_codes: + continue + if hide_obsolete: + continue + if result['status'] == 'OBS': + # expand title to add some sort of warning message + title = gettext('{title} (OBSOLETE)').format(title=result['title']) + superseded_url = pdbe_entry_url.format(pdb_id=result['superseded_by']) + + # since we can't construct a proper body from the response, we'll make up our own + msg_superseded = gettext("This entry has been superseded by") + content = '<em>{msg_superseded} \<a href="{url}">{pdb_id}</a></em>'.format( + msg_superseded=msg_superseded, + url=superseded_url, + pdb_id=result['superseded_by'], ) + + # obsoleted entries don't have preview images + img_src = None + else: + title, content, img_src = construct_body(result) + + results.append({ + 'url': pdbe_entry_url.format(pdb_id=result['pdb_id']), + 'title': title, + 'content': content, + 'img_src': img_src + }) + + return results diff --git a/searx/engines/piratebay.py b/searx/engines/piratebay.py index 55446b410..ca21a3bb2 100644 --- a/searx/engines/piratebay.py +++ b/searx/engines/piratebay.py @@ -9,7 +9,6 @@ # @parse url, title, content, seed, leech, magnetlink from urlparse import urljoin -from cgi import escape from urllib import quote from lxml import html from operator import itemgetter @@ -62,7 +61,7 @@ def response(resp): link = result.xpath('.//div[@class="detName"]//a')[0] href = urljoin(url, link.attrib.get('href')) title = extract_text(link) - content = escape(extract_text(result.xpath(content_xpath))) + content = extract_text(result.xpath(content_xpath)) seed, leech = result.xpath('.//td[@align="right"]/text()')[:2] # convert seed to int if possible diff --git a/searx/engines/qwant.py b/searx/engines/qwant.py index 872bd4e95..d8b084292 100644 --- a/searx/engines/qwant.py +++ b/searx/engines/qwant.py @@ -10,9 +10,11 @@ @parse url, title, content """ -from urllib import urlencode -from json import loads from datetime import datetime +from json import loads +from urllib import urlencode + +from searx.utils import html_to_text # engine dependent config categories = None @@ -66,9 +68,9 @@ def response(resp): # parse results for result in res.get('items', {}): - title = result['title'] + title = html_to_text(result['title']) res_url = result['url'] - content = result['desc'] + content = html_to_text(result['desc']) if category_to_keyword.get(categories[0], '') == 'web': results.append({'title': title, diff --git a/searx/engines/reddit.py b/searx/engines/reddit.py index 3ca7e44f6..b29792a3a 100644 --- a/searx/engines/reddit.py +++ b/searx/engines/reddit.py @@ -11,7 +11,6 @@ """ import json -from cgi import escape from urllib import urlencode from urlparse import urlparse, urljoin from datetime import datetime @@ -68,7 +67,7 @@ def response(resp): img_results.append(params) else: created = datetime.fromtimestamp(data['created_utc']) - content = escape(data['selftext']) + content = data['selftext'] if len(content) > 500: content = content[:500] + '...' params['content'] = content diff --git a/searx/engines/searchcode_code.py b/searx/engines/searchcode_code.py index de8cd43be..be7a6d385 100644 --- a/searx/engines/searchcode_code.py +++ b/searx/engines/searchcode_code.py @@ -34,11 +34,6 @@ def request(query, params): params['url'] = search_url.format(query=urlencode({'q': query}), pageno=params['pageno'] - 1) - # Disable SSL verification - # error: (60) SSL certificate problem: unable to get local issuer - # certificate - params['verify'] = False - return params diff --git a/searx/engines/searchcode_doc.py b/searx/engines/searchcode_doc.py index f24fe6f90..99e10be62 100644 --- a/searx/engines/searchcode_doc.py +++ b/searx/engines/searchcode_doc.py @@ -27,11 +27,6 @@ def request(query, params): params['url'] = search_url.format(query=urlencode({'q': query}), pageno=params['pageno'] - 1) - # Disable SSL verification - # error: (60) SSL certificate problem: unable to get local issuer - # certificate - params['verify'] = False - return params @@ -44,20 +39,12 @@ def response(resp): # parse results for result in search_results.get('results', []): href = result['url'] - title = "[" + result['type'] + "] " +\ - result['namespace'] +\ - " " + result['name'] - content = '<span class="highlight">[' +\ - result['type'] + "] " +\ - result['name'] + " " +\ - result['synopsis'] +\ - "</span><br />" +\ - result['description'] + title = "[{}] {} {}".format(result['type'], result['namespace'], result['name']) # append result results.append({'url': href, 'title': title, - 'content': content}) + 'content': result['description']}) # return results return results diff --git a/searx/engines/seedpeer.py b/searx/engines/seedpeer.py new file mode 100644 index 000000000..e1309a9b5 --- /dev/null +++ b/searx/engines/seedpeer.py @@ -0,0 +1,77 @@ +# Seedpeer (Videos, Music, Files) +# +# @website http://seedpeer.eu +# @provide-api no (nothing found) +# +# @using-api no +# @results HTML (using search portal) +# @stable yes (HTML can change) +# @parse url, title, content, seed, leech, magnetlink + +from urlparse import urljoin +from urllib import quote +from lxml import html +from operator import itemgetter +from searx.engines.xpath import extract_text + + +url = 'http://www.seedpeer.eu/' +search_url = url + 'search/{search_term}/7/{page_no}.html' +# specific xpath variables +torrent_xpath = '//*[@id="body"]/center/center/table[2]/tr/td/a' +alternative_torrent_xpath = '//*[@id="body"]/center/center/table[1]/tr/td/a' +title_xpath = '//*[@id="body"]/center/center/table[2]/tr/td/a/text()' +alternative_title_xpath = '//*[@id="body"]/center/center/table/tr/td/a' +seeds_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[4]/font/text()' +alternative_seeds_xpath = '//*[@id="body"]/center/center/table/tr/td[4]/font/text()' +peers_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[5]/font/text()' +alternative_peers_xpath = '//*[@id="body"]/center/center/table/tr/td[5]/font/text()' +age_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[2]/text()' +alternative_age_xpath = '//*[@id="body"]/center/center/table/tr/td[2]/text()' +size_xpath = '//*[@id="body"]/center/center/table[2]/tr/td[3]/text()' +alternative_size_xpath = '//*[@id="body"]/center/center/table/tr/td[3]/text()' + + +# do search-request +def request(query, params): + params['url'] = search_url.format(search_term=quote(query), + page_no=params['pageno'] - 1) + return params + + +# get response from search-request +def response(resp): + results = [] + dom = html.fromstring(resp.text) + torrent_links = dom.xpath(torrent_xpath) + if len(torrent_links) > 0: + seeds = dom.xpath(seeds_xpath) + peers = dom.xpath(peers_xpath) + titles = dom.xpath(title_xpath) + sizes = dom.xpath(size_xpath) + ages = dom.xpath(age_xpath) + else: # under ~5 results uses a different xpath + torrent_links = dom.xpath(alternative_torrent_xpath) + seeds = dom.xpath(alternative_seeds_xpath) + peers = dom.xpath(alternative_peers_xpath) + titles = dom.xpath(alternative_title_xpath) + sizes = dom.xpath(alternative_size_xpath) + ages = dom.xpath(alternative_age_xpath) + # return empty array if nothing is found + if not torrent_links: + return [] + + # parse results + for index, result in enumerate(torrent_links): + link = result.attrib.get('href') + href = urljoin(url, link) + results.append({'url': href, + 'title': titles[index].text_content(), + 'content': '{}, {}'.format(sizes[index], ages[index]), + 'seed': seeds[index], + 'leech': peers[index], + + 'template': 'torrent.html'}) + + # return results sorted by seeder + return sorted(results, key=itemgetter('seed'), reverse=True) diff --git a/searx/engines/spotify.py b/searx/engines/spotify.py index f75796e83..249ba91ef 100644 --- a/searx/engines/spotify.py +++ b/searx/engines/spotify.py @@ -46,10 +46,11 @@ def response(resp): if result['type'] == 'track': title = result['name'] url = result['external_urls']['spotify'] - content = result['artists'][0]['name'] +\ - " • " +\ - result['album']['name'] +\ - " • " + result['name'] + content = u'{} - {} - {}'.format( + result['artists'][0]['name'], + result['album']['name'], + result['name']) + embedded = embedded_url.format(audioid=result['id']) # append result diff --git a/searx/engines/stackoverflow.py b/searx/engines/stackoverflow.py index fdd3711a9..5e7ab2901 100644 --- a/searx/engines/stackoverflow.py +++ b/searx/engines/stackoverflow.py @@ -11,7 +11,6 @@ """ from urlparse import urljoin -from cgi import escape from urllib import urlencode from lxml import html from searx.engines.xpath import extract_text @@ -48,8 +47,8 @@ def response(resp): for result in dom.xpath(results_xpath): link = result.xpath(link_xpath)[0] href = urljoin(url, link.attrib.get('href')) - title = escape(extract_text(link)) - content = escape(extract_text(result.xpath(content_xpath))) + title = extract_text(link) + content = extract_text(result.xpath(content_xpath)) # append result results.append({'url': href, diff --git a/searx/engines/startpage.py b/searx/engines/startpage.py index d8b702c4d..6f6eae1cf 100644 --- a/searx/engines/startpage.py +++ b/searx/engines/startpage.py @@ -11,7 +11,6 @@ # @todo paging from lxml import html -from cgi import escape from dateutil import parser from datetime import datetime, timedelta import re @@ -79,10 +78,10 @@ def response(resp): if re.match(r"^http(s|)://(www\.)?ixquick\.com/do/search\?.*$", url): continue - title = escape(extract_text(link)) + title = extract_text(link) if result.xpath('./p[@class="desc clk"]'): - content = escape(extract_text(result.xpath('./p[@class="desc clk"]'))) + content = extract_text(result.xpath('./p[@class="desc clk"]')) else: content = '' diff --git a/searx/engines/subtitleseeker.py b/searx/engines/subtitleseeker.py index 47d27d0b2..daba68be7 100644 --- a/searx/engines/subtitleseeker.py +++ b/searx/engines/subtitleseeker.py @@ -10,7 +10,6 @@ @parse url, title, content """ -from cgi import escape from urllib import quote_plus from lxml import html from searx.languages import language_codes @@ -59,7 +58,7 @@ def response(resp): elif search_lang: href = href + search_lang + '/' - title = escape(extract_text(link)) + title = extract_text(link) content = extract_text(result.xpath('.//div[contains(@class,"red")]')) content = content + " - " @@ -75,7 +74,7 @@ def response(resp): # append result results.append({'url': href, 'title': title, - 'content': escape(content)}) + 'content': content}) # return results return results diff --git a/searx/engines/swisscows.py b/searx/engines/swisscows.py index 1a94ed64e..72184e428 100644 --- a/searx/engines/swisscows.py +++ b/searx/engines/swisscows.py @@ -10,7 +10,6 @@ @parse url, title, content """ -from cgi import escape from json import loads from urllib import urlencode, unquote import re @@ -78,7 +77,7 @@ def response(resp): # append result results.append({'url': result['SourceUrl'], - 'title': escape(result['Title']), + 'title': result['Title'], 'content': '', 'img_src': img_url, 'template': 'images.html'}) @@ -90,8 +89,8 @@ def response(resp): # append result results.append({'url': result_url, - 'title': escape(result_title), - 'content': escape(result_content)}) + 'title': result_title, + 'content': result_content}) # parse images for result in json.get('Images', []): @@ -100,7 +99,7 @@ def response(resp): # append result results.append({'url': result['SourceUrl'], - 'title': escape(result['Title']), + 'title': result['Title'], 'content': '', 'img_src': img_url, 'template': 'images.html'}) diff --git a/searx/engines/tokyotoshokan.py b/searx/engines/tokyotoshokan.py index e2990e153..52b2cbe07 100644 --- a/searx/engines/tokyotoshokan.py +++ b/searx/engines/tokyotoshokan.py @@ -11,7 +11,6 @@ """ import re -from cgi import escape from urllib import urlencode from lxml import html from searx.engines.xpath import extract_text diff --git a/searx/engines/torrentz.py b/searx/engines/torrentz.py index 92fbe7013..f9c832651 100644 --- a/searx/engines/torrentz.py +++ b/searx/engines/torrentz.py @@ -12,7 +12,6 @@ """ import re -from cgi import escape from urllib import urlencode from lxml import html from searx.engines.xpath import extract_text diff --git a/searx/engines/translated.py b/searx/engines/translated.py new file mode 100644 index 000000000..e78db0d8e --- /dev/null +++ b/searx/engines/translated.py @@ -0,0 +1,64 @@ +""" + MyMemory Translated + + @website https://mymemory.translated.net/ + @provide-api yes (https://mymemory.translated.net/doc/spec.php) + @using-api yes + @results JSON + @stable yes + @parse url, title, content +""" +import re +from searx.utils import is_valid_lang + +categories = ['general'] +url = u'http://api.mymemory.translated.net/get?q={query}&langpair={from_lang}|{to_lang}{key}' +web_url = u'http://mymemory.translated.net/en/{from_lang}/{to_lang}/{query}' +weight = 100 + +parser_re = re.compile(u'.*?([a-z]+)-([a-z]+) (.{2,})$', re.I) +api_key = '' + + +def request(query, params): + m = parser_re.match(unicode(query, 'utf8')) + if not m: + return params + + from_lang, to_lang, query = m.groups() + + from_lang = is_valid_lang(from_lang) + to_lang = is_valid_lang(to_lang) + + if not from_lang or not to_lang: + return params + + if api_key: + key_form = '&key=' + api_key + else: + key_form = '' + params['url'] = url.format(from_lang=from_lang[1], + to_lang=to_lang[1], + query=query, + key=key_form) + params['query'] = query + params['from_lang'] = from_lang + params['to_lang'] = to_lang + + return params + + +def response(resp): + results = [] + results.append({ + 'url': web_url.format( + from_lang=resp.search_params['from_lang'][2], + to_lang=resp.search_params['to_lang'][2], + query=resp.search_params['query']), + 'title': '[{0}-{1}] {2}'.format( + resp.search_params['from_lang'][1], + resp.search_params['to_lang'][1], + resp.search_params['query']), + 'content': resp.json()['responseData']['translatedText'] + }) + return results diff --git a/searx/engines/vimeo.py b/searx/engines/vimeo.py index 517ac1c44..5d5310544 100644 --- a/searx/engines/vimeo.py +++ b/searx/engines/vimeo.py @@ -12,10 +12,8 @@ # @todo rewrite to api # @todo set content-parameter with correct data +from json import loads from urllib import urlencode -from lxml import html -from HTMLParser import HTMLParser -from searx.engines.xpath import extract_text from dateutil import parser # engine dependent config @@ -23,17 +21,10 @@ categories = ['videos'] paging = True # search-url -base_url = 'https://vimeo.com' +base_url = 'https://vimeo.com/' search_url = base_url + '/search/page:{pageno}?{query}' -# specific xpath variables -results_xpath = '//div[contains(@class,"results_grid")]/ul/li' -url_xpath = './/a/@href' -title_xpath = './/span[@class="title"]' -thumbnail_xpath = './/img[@class="js-clip_thumbnail_image"]/@src' -publishedDate_xpath = './/time/attribute::datetime' - -embedded_url = '<iframe data-src="//player.vimeo.com/video{videoid}" ' +\ +embedded_url = '<iframe data-src="//player.vimeo.com/video/{videoid}" ' +\ 'width="540" height="304" frameborder="0" ' +\ 'webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>' @@ -49,17 +40,18 @@ def request(query, params): # get response from search-request def response(resp): results = [] - - dom = html.fromstring(resp.text) - p = HTMLParser() + data_start_pos = resp.text.find('{"filtered"') + data_end_pos = resp.text.find(';\n', data_start_pos + 1) + data = loads(resp.text[data_start_pos:data_end_pos]) # parse results - for result in dom.xpath(results_xpath): - videoid = result.xpath(url_xpath)[0] + for result in data['filtered']['data']: + result = result[result['type']] + videoid = result['uri'].split('/')[-1] url = base_url + videoid - title = p.unescape(extract_text(result.xpath(title_xpath))) - thumbnail = extract_text(result.xpath(thumbnail_xpath)[0]) - publishedDate = parser.parse(extract_text(result.xpath(publishedDate_xpath)[0])) + title = result['name'] + thumbnail = result['pictures']['sizes'][-1]['link'] + publishedDate = parser.parse(result['created_time']) embedded = embedded_url.format(videoid=videoid) # append result diff --git a/searx/engines/wolframalpha_api.py b/searx/engines/wolframalpha_api.py index 4526c825f..e743c8f56 100644 --- a/searx/engines/wolframalpha_api.py +++ b/searx/engines/wolframalpha_api.py @@ -18,10 +18,10 @@ api_key = '' # defined in settings.yml # xpath variables failure_xpath = '/queryresult[attribute::success="false"]' -answer_xpath = '//pod[attribute::primary="true"]/subpod/plaintext' input_xpath = '//pod[starts-with(attribute::id, "Input")]/subpod/plaintext' pods_xpath = '//pod' subpods_xpath = './subpod' +pod_primary_xpath = './@primary' pod_id_xpath = './@id' pod_title_xpath = './@title' plaintext_xpath = './plaintext' @@ -75,13 +75,15 @@ def response(resp): try: infobox_title = search_results.xpath(input_xpath)[0].text except: - infobox_title = None + infobox_title = "" pods = search_results.xpath(pods_xpath) result_chunks = [] + result_content = "" for pod in pods: pod_id = pod.xpath(pod_id_xpath)[0] pod_title = pod.xpath(pod_title_xpath)[0] + pod_is_result = pod.xpath(pod_primary_xpath) subpods = pod.xpath(subpods_xpath) if not subpods: @@ -94,6 +96,10 @@ def response(resp): if content and pod_id not in image_pods: + if pod_is_result or not result_content: + if pod_id != "Input": + result_content = "%s: %s" % (pod_title, content) + # if no input pod was found, title is first plaintext pod if not infobox_title: infobox_title = content @@ -109,6 +115,8 @@ def response(resp): if not result_chunks: return [] + title = "Wolfram|Alpha (%s)" % infobox_title + # append infobox results.append({'infobox': infobox_title, 'attributes': result_chunks, @@ -116,7 +124,7 @@ def response(resp): # append link to site results.append({'url': resp.request.headers['Referer'].decode('utf8'), - 'title': 'Wolfram|Alpha', - 'content': infobox_title}) + 'title': title, + 'content': result_content}) return results diff --git a/searx/engines/wolframalpha_noapi.py b/searx/engines/wolframalpha_noapi.py index 3a8180f04..1534501b3 100644 --- a/searx/engines/wolframalpha_noapi.py +++ b/searx/engines/wolframalpha_noapi.py @@ -11,6 +11,7 @@ from json import loads from time import time from urllib import urlencode +from lxml.etree import XML from searx.poolrequests import get as http_get @@ -34,7 +35,7 @@ search_url = url + 'input/json.jsp'\ referer_url = url + 'input/?{query}' token = {'value': '', - 'last_updated': 0} + 'last_updated': None} # pods to display as image in infobox # this pods do return a plaintext, but they look better and are more useful as images @@ -80,10 +81,12 @@ def response(resp): # TODO handle resp_json['queryresult']['assumptions'] result_chunks = [] - infobox_title = None + infobox_title = "" + result_content = "" for pod in resp_json['queryresult']['pods']: pod_id = pod.get('id', '') pod_title = pod.get('title', '') + pod_is_result = pod.get('primary', None) if 'subpods' not in pod: continue @@ -97,6 +100,10 @@ def response(resp): if subpod['plaintext'] != '(requires interactivity)': result_chunks.append({'label': pod_title, 'value': subpod['plaintext']}) + if pod_is_result or not result_content: + if pod_id != "Input": + result_content = pod_title + ': ' + subpod['plaintext'] + elif 'img' in subpod: result_chunks.append({'label': pod_title, 'image': subpod['img']}) @@ -108,7 +115,7 @@ def response(resp): 'urls': [{'title': 'Wolfram|Alpha', 'url': resp.request.headers['Referer'].decode('utf8')}]}) results.append({'url': resp.request.headers['Referer'].decode('utf8'), - 'title': 'Wolfram|Alpha', - 'content': infobox_title}) + 'title': 'Wolfram|Alpha (' + infobox_title + ')', + 'content': result_content}) return results diff --git a/searx/engines/www500px.py b/searx/engines/www500px.py index f1bc6c583..546521ba3 100644 --- a/searx/engines/www500px.py +++ b/searx/engines/www500px.py @@ -12,12 +12,9 @@ @todo rewrite to api """ - +from json import loads from urllib import urlencode from urlparse import urljoin -from lxml import html -import re -from searx.engines.xpath import extract_text # engine dependent config categories = ['images'] @@ -25,13 +22,27 @@ paging = True # search-url base_url = 'https://500px.com' -search_url = base_url + '/search?search?page={pageno}&type=photos&{query}' +search_url = 'https://api.500px.com/v1/photos/search?type=photos'\ + '&{query}'\ + '&image_size%5B%5D=4'\ + '&image_size%5B%5D=20'\ + '&image_size%5B%5D=21'\ + '&image_size%5B%5D=1080'\ + '&image_size%5B%5D=1600'\ + '&image_size%5B%5D=2048'\ + '&include_states=true'\ + '&formats=jpeg%2Clytro'\ + '&include_tags=true'\ + '&exclude_nude=true'\ + '&page={pageno}'\ + '&rpp=50'\ + '&sdk_key=b68e60cff4c929bedea36ca978830c5caca790c3' # do search-request def request(query, params): params['url'] = search_url.format(pageno=params['pageno'], - query=urlencode({'q': query})) + query=urlencode({'term': query})) return params @@ -40,19 +51,16 @@ def request(query, params): def response(resp): results = [] - dom = html.fromstring(resp.text) - regex = re.compile(r'3\.jpg.*$') + response_json = loads(resp.text) # parse results - for result in dom.xpath('//div[@class="photo"]'): - link = result.xpath('.//a')[0] - url = urljoin(base_url, link.attrib.get('href')) - title = extract_text(result.xpath('.//div[@class="title"]')) - thumbnail_src = link.xpath('.//img')[0].attrib.get('src') - # To have a bigger thumbnail, uncomment the next line - # thumbnail_src = regex.sub('4.jpg', thumbnail_src) - content = extract_text(result.xpath('.//div[@class="info"]')) - img_src = regex.sub('2048.jpg', thumbnail_src) + for result in response_json['photos']: + url = urljoin(base_url, result['url']) + title = result['name'] + # last index is the biggest resolution + img_src = result['image_url'][-1] + thumbnail_src = result['image_url'][0] + content = result['description'] or '' # append result results.append({'url': url, diff --git a/searx/engines/xpath.py b/searx/engines/xpath.py index e701c02bf..e5c0c5bea 100644 --- a/searx/engines/xpath.py +++ b/searx/engines/xpath.py @@ -87,7 +87,7 @@ def request(query, params): fp = {'query': query} if paging and search_url.find('{pageno}') >= 0: - fp['pageno'] = (params['pageno'] + first_page_num - 1) * page_size + fp['pageno'] = (params['pageno'] - 1) * page_size + first_page_num params['url'] = search_url.format(**fp) params['query'] = query diff --git a/searx/engines/yacy.py b/searx/engines/yacy.py index c2f1bc7ef..92cf881c0 100644 --- a/searx/engines/yacy.py +++ b/searx/engines/yacy.py @@ -16,6 +16,8 @@ from json import loads from urllib import urlencode from dateutil import parser +from searx.utils import html_to_text + # engine dependent config categories = ['general', 'images'] # TODO , 'music', 'videos', 'files' paging = True @@ -88,7 +90,7 @@ def response(resp): # append result results.append({'url': result['link'], 'title': result['title'], - 'content': result['description'], + 'content': html_to_text(result['description']), 'publishedDate': publishedDate}) # TODO parse video, audio and file results diff --git a/searx/engines/yahoo.py b/searx/engines/yahoo.py index 8e24a283e..2bb34b83d 100644 --- a/searx/engines/yahoo.py +++ b/searx/engines/yahoo.py @@ -77,6 +77,9 @@ def _get_language(params): # do search-request def request(query, params): + if params['time_range'] and params['time_range'] not in time_range_dict: + return params + offset = (params['pageno'] - 1) * 10 + 1 language = _get_language(params) diff --git a/searx/engines/yandex.py b/searx/engines/yandex.py index be3ec36ce..b83a747f9 100644 --- a/searx/engines/yandex.py +++ b/searx/engines/yandex.py @@ -9,7 +9,6 @@ @parse url, title, content """ -from cgi import escape from urllib import urlencode from lxml import html from searx.search import logger @@ -30,10 +29,10 @@ language_map = {'ru': 'ru', base_url = 'https://yandex.{tld}/' search_url = 'search/?{query}&p={page}' -results_xpath = '//div[@class="serp-item serp-item_plain_yes clearfix i-bem"]' +results_xpath = '//li[@class="serp-item"]' url_xpath = './/h2/a/@href' title_xpath = './/h2/a//text()' -content_xpath = './/div[@class="serp-item__text"]//text()' +content_xpath = './/div[@class="text-container typo typo_text_m typo_line_m organic__text"]//text()' def request(query, params): @@ -52,8 +51,8 @@ def response(resp): for result in dom.xpath(results_xpath): try: res = {'url': result.xpath(url_xpath)[0], - 'title': escape(''.join(result.xpath(title_xpath))), - 'content': escape(''.join(result.xpath(content_xpath)))} + 'title': ''.join(result.xpath(title_xpath)), + 'content': ''.join(result.xpath(content_xpath))} except: logger.exception('yandex parse crash') continue diff --git a/searx/engines/youtube_noapi.py b/searx/engines/youtube_noapi.py index 401fca4c9..9b7ca64c8 100644 --- a/searx/engines/youtube_noapi.py +++ b/searx/engines/youtube_noapi.py @@ -17,10 +17,16 @@ from searx.utils import list_get categories = ['videos', 'music'] paging = True language_support = False +time_range_support = True # search-url base_url = 'https://www.youtube.com/results' search_url = base_url + '?search_query={query}&page={page}' +time_range_url = '&sp=EgII{time_range}%253D%253D' +time_range_dict = {'day': 'Ag', + 'week': 'Aw', + 'month': 'BA', + 'year': 'BQ'} embedded_url = '<iframe width="540" height="304" ' +\ 'data-src="//www.youtube-nocookie.com/embed/{videoid}" ' +\ @@ -47,6 +53,8 @@ def extract_text_from_dom(result, xpath): def request(query, params): params['url'] = search_url.format(query=quote_plus(query), page=params['pageno']) + if params['time_range'] in time_range_dict: + params['url'] += time_range_url.format(time_range=time_range_dict[params['time_range']]) return params diff --git a/searx/plugins/doai_rewrite.py b/searx/plugins/doai_rewrite.py index fc5998b14..a6e15ae5a 100644 --- a/searx/plugins/doai_rewrite.py +++ b/searx/plugins/doai_rewrite.py @@ -20,12 +20,12 @@ def extract_doi(url): return None -def on_result(request, ctx): - doi = extract_doi(ctx['result']['parsed_url']) +def on_result(request, search, result): + doi = extract_doi(result['parsed_url']) if doi and len(doi) < 50: for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'): if doi.endswith(suffix): doi = doi[:-len(suffix)] - ctx['result']['url'] = 'http://doai.io/' + doi - ctx['result']['parsed_url'] = urlparse(ctx['result']['url']) + result['url'] = 'http://doai.io/' + doi + result['parsed_url'] = urlparse(result['url']) return True diff --git a/searx/plugins/https_rewrite.py b/searx/plugins/https_rewrite.py index 8a9fcd4ad..8b4c9784e 100644 --- a/searx/plugins/https_rewrite.py +++ b/searx/plugins/https_rewrite.py @@ -220,8 +220,7 @@ def https_url_rewrite(result): return result -def on_result(request, ctx): - result = ctx['result'] +def on_result(request, search, result): if result['parsed_url'].scheme == 'http': https_url_rewrite(result) return True diff --git a/searx/plugins/self_info.py b/searx/plugins/self_info.py index 75cbae0de..a2aeda98e 100644 --- a/searx/plugins/self_info.py +++ b/searx/plugins/self_info.py @@ -28,17 +28,19 @@ p = re.compile('.*user[ -]agent.*', re.IGNORECASE) # attach callback to the post search hook # request: flask request object # ctx: the whole local context of the pre search hook -def post_search(request, ctx): - if ctx['search'].query == 'ip': +def post_search(request, search): + if search.search_query.pageno > 1: + return True + if search.search_query.query == 'ip': x_forwarded_for = request.headers.getlist("X-Forwarded-For") if x_forwarded_for: ip = x_forwarded_for[0] else: ip = request.remote_addr - ctx['search'].result_container.answers.clear() - ctx['search'].result_container.answers.add(ip) - elif p.match(ctx['search'].query): + search.result_container.answers.clear() + search.result_container.answers.add(ip) + elif p.match(search.search_query.query): ua = request.user_agent - ctx['search'].result_container.answers.clear() - ctx['search'].result_container.answers.add(ua) + search.result_container.answers.clear() + search.result_container.answers.add(ua) return True diff --git a/searx/plugins/tracker_url_remover.py b/searx/plugins/tracker_url_remover.py index b909e3fae..68a004e33 100644 --- a/searx/plugins/tracker_url_remover.py +++ b/searx/plugins/tracker_url_remover.py @@ -28,8 +28,8 @@ description = gettext('Remove trackers arguments from the returned URL') default_on = True -def on_result(request, ctx): - query = ctx['result']['parsed_url'].query +def on_result(request, search, result): + query = result['parsed_url'].query if query == "": return True @@ -37,8 +37,8 @@ def on_result(request, ctx): for reg in regexes: query = reg.sub('', query) - if query != ctx['result']['parsed_url'].query: - ctx['result']['parsed_url'] = ctx['result']['parsed_url']._replace(query=query) - ctx['result']['url'] = urlunparse(ctx['result']['parsed_url']) + if query != result['parsed_url'].query: + result['parsed_url'] = result['parsed_url']._replace(query=query) + result['url'] = urlunparse(result['parsed_url']) return True diff --git a/searx/preferences.py b/searx/preferences.py index e19ae7502..4436b8fe8 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -49,28 +49,32 @@ class StringSetting(Setting): class EnumStringSetting(Setting): """Setting of a value which can only come from the given choices""" + def _validate_selection(self, selection): + if selection not in self.choices: + raise ValidationException('Invalid value: "{0}"'.format(selection)) + def _post_init(self): if not hasattr(self, 'choices'): raise MissingArgumentException('Missing argument: choices') - - if self.value != '' and self.value not in self.choices: - raise ValidationException('Invalid default value: {0}'.format(self.value)) + self._validate_selection(self.value) def parse(self, data): - if data not in self.choices and data != self.value: - raise ValidationException('Invalid choice: {0}'.format(data)) + self._validate_selection(data) self.value = data class MultipleChoiceSetting(EnumStringSetting): """Setting of values which can only come from the given choices""" + def _validate_selections(self, selections): + for item in selections: + if item not in self.choices: + raise ValidationException('Invalid value: "{0}"'.format(selections)) + def _post_init(self): if not hasattr(self, 'choices'): raise MissingArgumentException('Missing argument: choices') - for item in self.value: - if item not in self.choices: - raise ValidationException('Invalid default value: {0}'.format(self.value)) + self._validate_selections(self.value) def parse(self, data): if data == '': @@ -78,9 +82,7 @@ class MultipleChoiceSetting(EnumStringSetting): return elements = data.split(',') - for item in elements: - if item not in self.choices: - raise ValidationException('Invalid choice: {0}'.format(item)) + self._validate_selections(elements) self.value = elements def parse_form(self, data): @@ -214,11 +216,12 @@ class Preferences(object): super(Preferences, self).__init__() self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories), - 'language': EnumStringSetting('all', choices=LANGUAGE_CODES), + 'language': EnumStringSetting(settings['search']['language'], + choices=LANGUAGE_CODES), 'locale': EnumStringSetting(settings['ui']['default_locale'], - choices=settings['locales'].keys()), + choices=settings['locales'].keys() + ['']), 'autocomplete': EnumStringSetting(settings['search']['autocomplete'], - choices=autocomplete.backends.keys()), + choices=autocomplete.backends.keys() + ['']), 'image_proxy': MapSetting(settings['server']['image_proxy'], map={'': settings['server']['image_proxy'], '0': False, @@ -227,7 +230,8 @@ class Preferences(object): 'safesearch': MapSetting(settings['search']['safe_search'], map={'0': 0, '1': 1, '2': 2}), - 'theme': EnumStringSetting(settings['ui']['default_theme'], choices=themes)} + 'theme': EnumStringSetting(settings['ui']['default_theme'], choices=themes), + 'results_on_new_tab': MapSetting(False, map={'0': False, '1': True})} self.engines = EnginesSetting('engines', choices=engines) self.plugins = PluginsSetting('plugins', choices=plugins) diff --git a/searx/query.py b/searx/query.py index 3d617ab05..b8afba6ed 100644 --- a/searx/query.py +++ b/searx/query.py @@ -25,8 +25,8 @@ import string import re -class Query(object): - """parse query""" +class RawTextQuery(object): + """parse raw text query (the value from the html input)""" def __init__(self, query, disabled_engines): self.query = query @@ -130,3 +130,19 @@ class Query(object): def getFullQuery(self): # get full querry including whitespaces return string.join(self.query_parts, '') + + +class SearchQuery(object): + """container for all the search parameters (query, language, etc...)""" + + def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range): + self.query = query + self.engines = engines + self.categories = categories + self.lang = lang + self.safesearch = safesearch + self.pageno = pageno + self.time_range = time_range + + def __str__(self): + return str(self.query) + ";" + str(self.engines) diff --git a/searx/results.py b/searx/results.py index 9a4ec0b28..73a96c081 100644 --- a/searx/results.py +++ b/searx/results.py @@ -28,7 +28,7 @@ def compare_urls(url_a, url_b): else: host_b = url_b.netloc - if host_a != host_b or url_a.query != url_b.query: + if host_a != host_b or url_a.query != url_b.query or url_a.fragment != url_b.fragment: return False # remove / from the end of the url if required @@ -128,6 +128,8 @@ class ResultContainer(object): self.suggestions = set() self.answers = set() self._number_of_results = [] + self._ordered = False + self.paging = False def extend(self, engine_name, results): for result in list(results): @@ -144,15 +146,19 @@ class ResultContainer(object): self._number_of_results.append(result['number_of_results']) results.remove(result) - with RLock(): - engines[engine_name].stats['search_count'] += 1 - engines[engine_name].stats['result_count'] += len(results) + if engine_name in engines: + with RLock(): + engines[engine_name].stats['search_count'] += 1 + engines[engine_name].stats['result_count'] += len(results) if not results: return self.results[engine_name].extend(results) + if not self.paging and engine_name in engines and engines[engine_name].paging: + self.paging = True + for i, result in enumerate(results): try: result['url'] = result['url'].decode('utf-8') @@ -219,7 +225,7 @@ class ResultContainer(object): with RLock(): self._merged_results.append(result) - def get_ordered_results(self): + def order_results(self): for result in self._merged_results: score = result_score(result) result['score'] = score @@ -269,8 +275,14 @@ class ResultContainer(object): # update categoryIndex categoryPositions[category] = {'index': len(gresults), 'count': 8} - # return gresults - return gresults + # update _merged_results + self._ordered = True + self._merged_results = gresults + + def get_ordered_results(self): + if not self._ordered: + self.order_results() + return self._merged_results def results_length(self): return len(self._merged_results) diff --git a/searx/search.py b/searx/search.py index 6de07d2b5..ee04b27f5 100644 --- a/searx/search.py +++ b/searx/search.py @@ -19,28 +19,70 @@ import gc import threading from thread import start_new_thread from time import time +from uuid import uuid4 import searx.poolrequests as requests_lib from searx.engines import ( categories, engines ) +from searx.answerers import ask from searx.utils import gen_useragent -from searx.query import Query +from searx.query import RawTextQuery, SearchQuery from searx.results import ResultContainer from searx import logger +from searx.plugins import plugins logger = logger.getChild('search') number_of_searches = 0 -def search_request_wrapper(fn, url, engine_name, **kwargs): - ret = None - engine = engines[engine_name] +def send_http_request(engine, request_params, timeout_limit): + response = None try: - ret = fn(url, **kwargs) + # create dictionary which contain all + # informations about the request + request_args = dict( + headers=request_params['headers'], + cookies=request_params['cookies'], + timeout=timeout_limit, + verify=request_params['verify'] + ) + # specific type of request (GET or POST) + if request_params['method'] == 'GET': + req = requests_lib.get + else: + req = requests_lib.post + request_args['data'] = request_params['data'] + + # for page_load_time stats + time_before_request = time() + + # send the request + response = req(request_params['url'], **request_args) + with threading.RLock(): + # no error : reset the suspend variables engine.continuous_errors = 0 engine.suspend_end_time = 0 + # update stats with current page-load-time + # only the HTTP request + engine.stats['page_load_time'] += time() - time_before_request + engine.stats['page_load_count'] += 1 + + # is there a timeout (no parsing in this case) + timeout_overhead = 0.2 # seconds + search_duration = time() - request_params['started'] + if search_duration > timeout_limit + timeout_overhead: + logger.exception('engine timeout on HTTP request:' + '{0} (search duration : {1} ms, time-out: {2} )' + .format(engine.name, search_duration, timeout_limit)) + with threading.RLock(): + engine.stats['errors'] += 1 + return False + + # everything is ok : return the response + return response + except: # increase errors stats with threading.RLock(): @@ -49,27 +91,73 @@ def search_request_wrapper(fn, url, engine_name, **kwargs): engine.suspend_end_time = time() + min(60, engine.continuous_errors) # print engine name and specific error message - logger.exception('engine crash: {0}'.format(engine_name)) - return ret + logger.exception('engine crash: {0}'.format(engine.name)) + return False + + +def search_one_request(engine_name, query, request_params, result_container, timeout_limit): + engine = engines[engine_name] + + # update request parameters dependent on + # search-engine (contained in engines folder) + engine.request(query, request_params) + + # TODO add support of offline engines + if request_params['url'] is None: + return False + + # ignoring empty urls + if not request_params['url']: + return False + + # send request + response = send_http_request(engine, request_params, timeout_limit) + + # parse response + success = None + if response: + # parse the response + response.search_params = request_params + try: + search_results = engine.response(response) + except: + logger.exception('engine crash: {0}'.format(engine.name)) + search_results = [] + + # add results + for result in search_results: + result['engine'] = engine.name + + result_container.extend(engine.name, search_results) + + success = True + else: + success = False + with threading.RLock(): + # update stats : total time + engine.stats['engine_time'] += time() - request_params['started'] + engine.stats['engine_time_count'] += 1 -def threaded_requests(requests): - timeout_limit = max(r[2]['timeout'] for r in requests) - search_start = time() - for fn, url, request_args, engine_name in requests: - request_args['timeout'] = timeout_limit + return success + + +def search_multiple_requests(requests, result_container, timeout_limit): + start_time = time() + search_id = uuid4().__str__() + + for engine_name, query, request_params in requests: th = threading.Thread( - target=search_request_wrapper, - args=(fn, url, engine_name), - kwargs=request_args, - name='search_request', + target=search_one_request, + args=(engine_name, query, request_params, result_container, timeout_limit), + name=search_id, ) th._engine_name = engine_name th.start() for th in threading.enumerate(): - if th.name == 'search_request': - remaining_time = max(0.0, timeout_limit - (time() - search_start)) + if th.name == search_id: + remaining_time = max(0.0, timeout_limit - (time() - start_time)) th.join(remaining_time) if th.isAlive(): logger.warning('engine timeout: {0}'.format(th._engine_name)) @@ -87,175 +175,142 @@ def default_request_params(): } -# create a callback wrapper for the search engine results -def make_callback(engine_name, callback, params, result_container): - - # creating a callback wrapper for the search engine results - def process_callback(response, **kwargs): - # check if redirect comparing to the True value, - # because resp can be a Mock object, and any attribut name returns something. - if response.is_redirect is True: - logger.debug('{0} redirect on: {1}'.format(engine_name, response)) - return - - response.search_params = params - - search_duration = time() - params['started'] - # update stats with current page-load-time - with threading.RLock(): - engines[engine_name].stats['page_load_time'] += search_duration - - timeout_overhead = 0.2 # seconds - timeout_limit = engines[engine_name].timeout + timeout_overhead - - if search_duration > timeout_limit: - with threading.RLock(): - engines[engine_name].stats['errors'] += 1 - return - - # callback - search_results = callback(response) - - # add results - for result in search_results: - result['engine'] = engine_name - - result_container.extend(engine_name, search_results) - - return process_callback - - -class Search(object): - - """Search information container""" - - def __init__(self, request): - # init vars - super(Search, self).__init__() - self.query = None - self.engines = [] - self.categories = [] - self.paging = False - self.pageno = 1 - self.lang = 'all' - self.time_range = None - self.is_advanced = None - - # set blocked engines - self.disabled_engines = request.preferences.engines.get_disabled() - - self.result_container = ResultContainer() - self.request_data = {} - - # set specific language if set - self.lang = request.preferences.get_value('language') - - # set request method - if request.method == 'POST': - self.request_data = request.form - else: - self.request_data = request.args - - # TODO better exceptions - if not self.request_data.get('q'): - raise Exception('noquery') - - # set pagenumber - pageno_param = self.request_data.get('pageno', '1') - if not pageno_param.isdigit() or int(pageno_param) < 1: - pageno_param = 1 - - self.pageno = int(pageno_param) - - # parse query, if tags are set, which change - # the serch engine or search-language - query_obj = Query(self.request_data['q'], self.disabled_engines) - query_obj.parse_query() - - # set query - self.query = query_obj.getSearchQuery() - - # get last selected language in query, if possible - # TODO support search with multible languages - if len(query_obj.languages): - self.lang = query_obj.languages[-1] - - self.time_range = self.request_data.get('time_range') - self.is_advanced = self.request_data.get('advanced_search') - - self.engines = query_obj.engines - - # if engines are calculated from query, - # set categories by using that informations - if self.engines and query_obj.specific: - self.categories = list(set(engine['category'] - for engine in self.engines)) - - # otherwise, using defined categories to - # calculate which engines should be used +def get_search_query_from_webapp(preferences, form): + query = None + query_engines = [] + query_categories = [] + query_pageno = 1 + query_lang = 'all' + query_time_range = None + + # set blocked engines + disabled_engines = preferences.engines.get_disabled() + + # set specific language if set + query_lang = preferences.get_value('language') + + # safesearch + query_safesearch = preferences.get_value('safesearch') + + # TODO better exceptions + if not form.get('q'): + raise Exception('noquery') + + # set pagenumber + pageno_param = form.get('pageno', '1') + if not pageno_param.isdigit() or int(pageno_param) < 1: + pageno_param = 1 + + query_pageno = int(pageno_param) + + # parse query, if tags are set, which change + # the serch engine or search-language + raw_text_query = RawTextQuery(form['q'], disabled_engines) + raw_text_query.parse_query() + + # set query + query = raw_text_query.getSearchQuery() + + # get last selected language in query, if possible + # TODO support search with multible languages + if len(raw_text_query.languages): + query_lang = raw_text_query.languages[-1] + + query_time_range = form.get('time_range') + + query_engines = raw_text_query.engines + + # if engines are calculated from query, + # set categories by using that informations + if query_engines and raw_text_query.specific: + query_categories = list(set(engine['category'] + for engine in query_engines)) + + # otherwise, using defined categories to + # calculate which engines should be used + else: + # set categories/engines + load_default_categories = True + for pd_name, pd in form.items(): + if pd_name == 'categories': + query_categories.extend(categ for categ in map(unicode.strip, pd.split(',')) if categ in categories) + elif pd_name == 'engines': + pd_engines = [{'category': engines[engine].categories[0], + 'name': engine} + for engine in map(unicode.strip, pd.split(',')) if engine in engines] + if pd_engines: + query_engines.extend(pd_engines) + load_default_categories = False + elif pd_name.startswith('category_'): + category = pd_name[9:] + + # if category is not found in list, skip + if category not in categories: + continue + + if pd != 'off': + # add category to list + query_categories.append(category) + elif category in query_categories: + # remove category from list if property is set to 'off' + query_categories.remove(category) + + if not load_default_categories: + if not query_categories: + query_categories = list(set(engine['category'] + for engine in query_engines)) else: - # set categories/engines - load_default_categories = True - for pd_name, pd in self.request_data.items(): - if pd_name == 'categories': - self.categories.extend(categ for categ in map(unicode.strip, pd.split(',')) if categ in categories) - elif pd_name == 'engines': - pd_engines = [{'category': engines[engine].categories[0], - 'name': engine} - for engine in map(unicode.strip, pd.split(',')) if engine in engines] - if pd_engines: - self.engines.extend(pd_engines) - load_default_categories = False - elif pd_name.startswith('category_'): - category = pd_name[9:] - - # if category is not found in list, skip - if category not in categories: - continue - - if pd != 'off': - # add category to list - self.categories.append(category) - elif category in self.categories: - # remove category from list if property is set to 'off' - self.categories.remove(category) - - if not load_default_categories: - if not self.categories: - self.categories = list(set(engine['category'] - for engine in self.engines)) - return - # if no category is specified for this search, # using user-defined default-configuration which # (is stored in cookie) - if not self.categories: - cookie_categories = request.preferences.get_value('categories') + if not query_categories: + cookie_categories = preferences.get_value('categories') for ccateg in cookie_categories: if ccateg in categories: - self.categories.append(ccateg) + query_categories.append(ccateg) # if still no category is specified, using general # as default-category - if not self.categories: - self.categories = ['general'] + if not query_categories: + query_categories = ['general'] # using all engines for that search, which are # declared under the specific categories - for categ in self.categories: - self.engines.extend({'category': categ, - 'name': engine.name} - for engine in categories[categ] - if (engine.name, categ) not in self.disabled_engines) + for categ in query_categories: + query_engines.extend({'category': categ, + 'name': engine.name} + for engine in categories[categ] + if (engine.name, categ) not in disabled_engines) - # remove suspended engines - self.engines = [e for e in self.engines - if engines[e['name']].suspend_end_time <= time()] + return SearchQuery(query, query_engines, query_categories, + query_lang, query_safesearch, query_pageno, query_time_range) + + +class Search(object): + + """Search information container""" + + def __init__(self, search_query): + # init vars + super(Search, self).__init__() + self.search_query = search_query + self.result_container = ResultContainer() # do search-request - def search(self, request): + def search(self): global number_of_searches + # start time + start_time = time() + + # answeres ? + answerers_results = ask(self.search_query) + + if answerers_results: + for results in answerers_results: + self.result_container.extend('answer', results) + return self.result_container + # init vars requests = [] @@ -266,88 +321,84 @@ class Search(object): # user_agent = request.headers.get('User-Agent', '') user_agent = gen_useragent() + search_query = self.search_query + + # max of all selected engine timeout + timeout_limit = 0 + # start search-reqest for all selected engines - for selected_engine in self.engines: + for selected_engine in search_query.engines: if selected_engine['name'] not in engines: continue engine = engines[selected_engine['name']] + # skip suspended engines + if engine.suspend_end_time >= time(): + logger.debug('Engine currently suspended: %s', selected_engine['name']) + continue + # if paging is not supported, skip - if self.pageno > 1 and not engine.paging: + if search_query.pageno > 1 and not engine.paging: continue # if search-language is set and engine does not # provide language-support, skip - if self.lang != 'all' and not engine.language_support: + if search_query.lang != 'all' and not engine.language_support: continue - if self.time_range and not engine.time_range_support: + # if time_range is not supported, skip + if search_query.time_range and not engine.time_range_support: continue # set default request parameters request_params = default_request_params() request_params['headers']['User-Agent'] = user_agent request_params['category'] = selected_engine['category'] - request_params['started'] = time() - request_params['pageno'] = self.pageno + request_params['started'] = start_time + request_params['pageno'] = search_query.pageno if hasattr(engine, 'language') and engine.language: request_params['language'] = engine.language else: - request_params['language'] = self.lang + request_params['language'] = search_query.lang # 0 = None, 1 = Moderate, 2 = Strict - request_params['safesearch'] = request.preferences.get_value('safesearch') - request_params['time_range'] = self.time_range - request_params['advanced_search'] = self.is_advanced - - # update request parameters dependent on - # search-engine (contained in engines folder) - engine.request(self.query.encode('utf-8'), request_params) - - if request_params['url'] is None: - # TODO add support of offline engines - pass - - # create a callback wrapper for the search engine results - callback = make_callback( - selected_engine['name'], - engine.response, - request_params, - self.result_container) - - # create dictionary which contain all - # informations about the request - request_args = dict( - headers=request_params['headers'], - hooks=dict(response=callback), - cookies=request_params['cookies'], - timeout=engine.timeout, - verify=request_params['verify'] - ) - - # specific type of request (GET or POST) - if request_params['method'] == 'GET': - req = requests_lib.get - else: - req = requests_lib.post - request_args['data'] = request_params['data'] - - # ignoring empty urls - if not request_params['url']: - continue + request_params['safesearch'] = search_query.safesearch + request_params['time_range'] = search_query.time_range # append request to list - requests.append((req, request_params['url'], - request_args, - selected_engine['name'])) + requests.append((selected_engine['name'], search_query.query.encode('utf-8'), request_params)) + + # update timeout_limit + timeout_limit = max(timeout_limit, engine.timeout) - if not requests: - return self - # send all search-request - threaded_requests(requests) - start_new_thread(gc.collect, tuple()) + if requests: + # send all search-request + search_multiple_requests(requests, self.result_container, timeout_limit - (time() - start_time)) + start_new_thread(gc.collect, tuple()) # return results, suggestions, answers and infoboxes - return self + return self.result_container + + +class SearchWithPlugins(Search): + + """Similar to the Search class but call the plugins.""" + + def __init__(self, search_query, request): + super(SearchWithPlugins, self).__init__(search_query) + self.request = request + + def search(self): + if plugins.call('pre_search', self.request, self): + super(SearchWithPlugins, self).search() + + plugins.call('post_search', self.request, self) + + results = self.result_container.get_ordered_results() + + for result in results: + plugins.call('on_result', self.request, self, result) + + return self.result_container diff --git a/searx/settings.yml b/searx/settings.yml index b875c5b12..527c80829 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -5,6 +5,7 @@ general: search: safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default + language : "all" server: port : 8888 @@ -18,6 +19,12 @@ ui: default_theme : oscar # ui theme default_locale : "" # Default interface locale - leave blank to detect from browser information or use codes from the 'locales' config section +# searx supports result proxification using an external service: https://github.com/asciimoo/morty +# uncomment below section if you have running morty proxy +#result_proxy: +# url : http://127.0.0.1:3000/ +# key : your_morty_proxy_key + outgoing: # communication with search engines request_timeout : 2.0 # seconds useragent_suffix : "" # suffix of searx_useragent, could contain informations like an email address to the administrator @@ -25,7 +32,7 @@ outgoing: # communication with search engines pool_maxsize : 10 # Number of simultaneous requests by host # uncomment below section if you want to use a proxy # see http://docs.python-requests.org/en/latest/user/advanced/#proxies -# SOCKS proxies are not supported : see https://github.com/kennethreitz/requests/pull/478 +# SOCKS proxies are also supported: see http://docs.python-requests.org/en/master/user/advanced/#socks # proxies : # http : http://127.0.0.1:8080 # https: http://127.0.0.1:8080 @@ -84,10 +91,6 @@ engines: disabled : True shortcut : bb - - name : btdigg - engine : btdigg - shortcut : bt - - name : crossref engine : json_engine paging : True @@ -118,6 +121,12 @@ engines: weight : 2 disabled : True + - name : digbt + engine : digbt + shortcut : dbt + timeout : 6.0 + disabled : True + - name : digg engine : digg shortcut : dg @@ -194,6 +203,7 @@ engines: - name : gigablast engine : gigablast shortcut : gb + timeout : 3.0 disabled: True - name : gitlab @@ -252,8 +262,8 @@ engines: engine : xpath search_url : https://play.google.com/store/search?q={query}&c=movies url_xpath : //a[@class="title"]/@href - title_xpath : //a[@class="title"] - content_xpath : //a[@class="subtitle"] + title_xpath : //a[@class="title"]/@title + content_xpath : //a[contains(@class, "subtitle")] categories : videos shortcut : gpm disabled : True @@ -284,20 +294,48 @@ engines: engine : xpath paging : True search_url : https://habrahabr.ru/search/page{pageno}/?q={query} - url_xpath : //div[@class="search_results"]//a[@class="post_title"]/@href - title_xpath : //div[@class="search_results"]//a[@class="post_title"] + url_xpath : //div[@class="search_results"]//a[contains(@class, "post__title_link")]/@href + title_xpath : //div[@class="search_results"]//a[contains(@class, "post__title_link")] content_xpath : //div[@class="search_results"]//div[contains(@class, "content")] categories : it timeout : 4.0 disabled : True shortcut : habr + - name : hoogle + engine : json_engine + paging : True + search_url : https://www.haskell.org/hoogle/?mode=json&hoogle={query}&start={pageno} + results_query : results + url_query : location + title_query : self + content_query : docs + page_size : 20 + categories : it + shortcut : ho + - name : ina engine : ina shortcut : in timeout : 6.0 disabled : True + - name: kickass + engine : kickass + shortcut : kc + timeout : 4.0 + disabled : True + + - name : lobste.rs + engine : xpath + search_url : https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance + results_xpath : //li[contains(@class, "story")] + url_xpath : .//span[@class="link"]/a/@href + title_xpath : .//span[@class="link"]/a + content_xpath : .//a[@class="domain"] + categories : it + shortcut : lo + - name : microsoft academic engine : json_engine paging : True @@ -336,6 +374,13 @@ engines: disabled : True shortcut : or + - name : pdbe + engine : pdbe + shortcut : pdb +# Hide obsolete PDB entries. +# Default is not to hide obsolete structures +# hide_obsolete : False + - name : photon engine : photon shortcut : ph @@ -343,7 +388,8 @@ engines: - name : piratebay engine : piratebay shortcut : tpb - disabled : True + url: https://pirateproxy.red/ + timeout : 3.0 - name : qwant engine : qwant @@ -373,7 +419,7 @@ engines: timeout : 10.0 disabled : True - - name : scanr_structures + - name : scanr structures shortcut: scs engine : scanr_structures disabled : True @@ -414,8 +460,8 @@ engines: - name : ixquick engine : startpage - base_url : 'https://www.ixquick.com/' - search_url : 'https://www.ixquick.com/do/search' + base_url : 'https://www.ixquick.eu/' + search_url : 'https://www.ixquick.eu/do/search' shortcut : iq timeout : 6.0 disabled : True @@ -431,11 +477,6 @@ engines: timeout : 6.0 disabled : True - - name : torrentz - engine : torrentz - timeout : 5.0 - shortcut : to - - name : twitter engine : twitter shortcut : tw @@ -451,9 +492,9 @@ engines: # - name : urbandictionary # engine : xpath # search_url : http://www.urbandictionary.com/define.php?term={query} -# url_xpath : //div[@class="word"]//a/@href -# title_xpath : //div[@class="word"]//a -# content_xpath : //div[@class="definition"] +# url_xpath : //*[@class="word"]/@href +# title_xpath : //*[@class="def-header"] +# content_xpath : //*[@class="meaning"] # shortcut : ud - name : yahoo @@ -496,6 +537,37 @@ engines: timeout: 6.0 categories : science + - name : seedpeer + engine : seedpeer + shortcut: speu + categories: files, music, videos + disabled: True + + - name : dictzone + engine : dictzone + shortcut : dc + + - name : mymemory translated + engine : translated + shortcut : tl + timeout : 5.0 + disabled : True + # You can use without an API key, but you are limited to 1000 words/day + # See : http://mymemory.translated.net/doc/usagelimits.php + # api_key : '' + + - name : voat + engine: xpath + shortcut: vo + categories: social media + search_url : https://voat.co/search?q={query} + url_xpath : //p[contains(@class, "title")]/a/@href + title_xpath : //p[contains(@class, "title")]/a + content_xpath : //span[@class="domain"] + timeout : 10.0 + disabled : True + + #The blekko technology and team have joined IBM Watson! -> https://blekko.com/ # - name : blekko images # engine : blekko_images diff --git a/searx/settings_robot.yml b/searx/settings_robot.yml index 7c7c4eec2..7d2701449 100644 --- a/searx/settings_robot.yml +++ b/searx/settings_robot.yml @@ -5,6 +5,7 @@ general: search: safe_search : 0 autocomplete : "" + language: "all" server: port : 11111 @@ -15,7 +16,7 @@ server: ui: themes_path : "" - default_theme : default + default_theme : legacy default_locale : "" outgoing: @@ -23,12 +24,12 @@ outgoing: useragent_suffix : "" engines: - - name : general_dummy + - name : general dummy engine : dummy categories : general shortcut : gd - - name : dummy_dummy + - name : dummy dummy engine : dummy categories : dummy shortcut : dd diff --git a/searx/static/plugins/js/infinite_scroll.js b/searx/static/plugins/js/infinite_scroll.js index 213f74b15..9cd582d7f 100644 --- a/searx/static/plugins/js/infinite_scroll.js +++ b/searx/static/plugins/js/infinite_scroll.js @@ -5,7 +5,7 @@ $(document).ready(function() { var formData = $('#pagination form:last').serialize(); if (formData) { $('#pagination').html('<div class="loading-spinner"></div>'); - $.post('/', formData, function (data) { + $.post('./', formData, function (data) { var body = $(data); $('#pagination').remove(); $('#main_results').append('<hr/>'); diff --git a/searx/static/themes/default/css/style-rtl.css b/searx/static/themes/legacy/css/style-rtl.css index 65ad6638e..65ad6638e 100644 --- a/searx/static/themes/default/css/style-rtl.css +++ b/searx/static/themes/legacy/css/style-rtl.css diff --git a/searx/static/themes/default/css/style.css b/searx/static/themes/legacy/css/style.css index 71422bc94..71422bc94 100644 --- a/searx/static/themes/default/css/style.css +++ b/searx/static/themes/legacy/css/style.css diff --git a/searx/static/themes/default/img/favicon.png b/searx/static/themes/legacy/img/favicon.png Binary files differindex 1a43d7fa6..1a43d7fa6 100644 --- a/searx/static/themes/default/img/favicon.png +++ b/searx/static/themes/legacy/img/favicon.png diff --git a/searx/static/themes/default/img/github_ribbon.png b/searx/static/themes/legacy/img/github_ribbon.png Binary files differindex 3799c2ea1..3799c2ea1 100644 --- a/searx/static/themes/default/img/github_ribbon.png +++ b/searx/static/themes/legacy/img/github_ribbon.png diff --git a/searx/static/themes/default/img/icons/icon_500px.ico b/searx/static/themes/legacy/img/icons/icon_500px.ico Binary files differindex b01aa20b5..b01aa20b5 100644 --- a/searx/static/themes/default/img/icons/icon_500px.ico +++ b/searx/static/themes/legacy/img/icons/icon_500px.ico diff --git a/searx/static/themes/default/img/icons/icon_bing.ico b/searx/static/themes/legacy/img/icons/icon_bing.ico Binary files differindex 5702749c1..5702749c1 100644 --- a/searx/static/themes/default/img/icons/icon_bing.ico +++ b/searx/static/themes/legacy/img/icons/icon_bing.ico diff --git a/searx/static/themes/default/img/icons/icon_dailymotion.ico b/searx/static/themes/legacy/img/icons/icon_dailymotion.ico Binary files differindex b161a57fb..b161a57fb 100644 --- a/searx/static/themes/default/img/icons/icon_dailymotion.ico +++ b/searx/static/themes/legacy/img/icons/icon_dailymotion.ico diff --git a/searx/static/themes/default/img/icons/icon_deezer.ico b/searx/static/themes/legacy/img/icons/icon_deezer.ico Binary files differindex d38c9b1f6..d38c9b1f6 100644 --- a/searx/static/themes/default/img/icons/icon_deezer.ico +++ b/searx/static/themes/legacy/img/icons/icon_deezer.ico diff --git a/searx/static/themes/default/img/icons/icon_deviantart.ico b/searx/static/themes/legacy/img/icons/icon_deviantart.ico Binary files differindex 26c353325..26c353325 100644 --- a/searx/static/themes/default/img/icons/icon_deviantart.ico +++ b/searx/static/themes/legacy/img/icons/icon_deviantart.ico diff --git a/searx/static/themes/default/img/icons/icon_digg.ico b/searx/static/themes/legacy/img/icons/icon_digg.ico Binary files differindex 162e57038..162e57038 100644 --- a/searx/static/themes/default/img/icons/icon_digg.ico +++ b/searx/static/themes/legacy/img/icons/icon_digg.ico diff --git a/searx/static/themes/default/img/icons/icon_duckduckgo.ico b/searx/static/themes/legacy/img/icons/icon_duckduckgo.ico Binary files differindex d093082cb..d093082cb 100644 --- a/searx/static/themes/default/img/icons/icon_duckduckgo.ico +++ b/searx/static/themes/legacy/img/icons/icon_duckduckgo.ico diff --git a/searx/static/themes/default/img/icons/icon_flickr.ico b/searx/static/themes/legacy/img/icons/icon_flickr.ico Binary files differindex e2304c587..e2304c587 100644 --- a/searx/static/themes/default/img/icons/icon_flickr.ico +++ b/searx/static/themes/legacy/img/icons/icon_flickr.ico diff --git a/searx/static/themes/default/img/icons/icon_github.ico b/searx/static/themes/legacy/img/icons/icon_github.ico Binary files differindex 133f0ca35..133f0ca35 100644 --- a/searx/static/themes/default/img/icons/icon_github.ico +++ b/searx/static/themes/legacy/img/icons/icon_github.ico diff --git a/searx/static/themes/default/img/icons/icon_google play apps.ico b/searx/static/themes/legacy/img/icons/icon_google play apps.ico Binary files differindex 74c84470b..74c84470b 100644 --- a/searx/static/themes/default/img/icons/icon_google play apps.ico +++ b/searx/static/themes/legacy/img/icons/icon_google play apps.ico diff --git a/searx/static/themes/default/img/icons/icon_google play movies.ico b/searx/static/themes/legacy/img/icons/icon_google play movies.ico Binary files differindex 74c84470b..74c84470b 100644 --- a/searx/static/themes/default/img/icons/icon_google play movies.ico +++ b/searx/static/themes/legacy/img/icons/icon_google play movies.ico diff --git a/searx/static/themes/default/img/icons/icon_google play music.ico b/searx/static/themes/legacy/img/icons/icon_google play music.ico Binary files differindex 74c84470b..74c84470b 100644 --- a/searx/static/themes/default/img/icons/icon_google play music.ico +++ b/searx/static/themes/legacy/img/icons/icon_google play music.ico diff --git a/searx/static/themes/default/img/icons/icon_google.ico b/searx/static/themes/legacy/img/icons/icon_google.ico Binary files differindex f594697d2..f594697d2 100644 --- a/searx/static/themes/default/img/icons/icon_google.ico +++ b/searx/static/themes/legacy/img/icons/icon_google.ico diff --git a/searx/static/themes/default/img/icons/icon_kickass.ico b/searx/static/themes/legacy/img/icons/icon_kickass.ico Binary files differindex 4aa2c77a5..4aa2c77a5 100644 --- a/searx/static/themes/default/img/icons/icon_kickass.ico +++ b/searx/static/themes/legacy/img/icons/icon_kickass.ico diff --git a/searx/static/themes/default/img/icons/icon_openstreetmap.ico b/searx/static/themes/legacy/img/icons/icon_openstreetmap.ico Binary files differindex b65863656..b65863656 100644 --- a/searx/static/themes/default/img/icons/icon_openstreetmap.ico +++ b/searx/static/themes/legacy/img/icons/icon_openstreetmap.ico diff --git a/searx/static/themes/default/img/icons/icon_searchcode code.ico b/searx/static/themes/legacy/img/icons/icon_searchcode code.ico Binary files differindex dc099ef70..dc099ef70 100644 --- a/searx/static/themes/default/img/icons/icon_searchcode code.ico +++ b/searx/static/themes/legacy/img/icons/icon_searchcode code.ico diff --git a/searx/static/themes/default/img/icons/icon_searchcode doc.ico b/searx/static/themes/legacy/img/icons/icon_searchcode doc.ico Binary files differindex dc099ef70..dc099ef70 100644 --- a/searx/static/themes/default/img/icons/icon_searchcode doc.ico +++ b/searx/static/themes/legacy/img/icons/icon_searchcode doc.ico diff --git a/searx/static/themes/default/img/icons/icon_searchcode.ico b/searx/static/themes/legacy/img/icons/icon_searchcode.ico Binary files differindex dc099ef70..dc099ef70 100644 --- a/searx/static/themes/default/img/icons/icon_searchcode.ico +++ b/searx/static/themes/legacy/img/icons/icon_searchcode.ico diff --git a/searx/static/themes/default/img/icons/icon_soundcloud.ico b/searx/static/themes/legacy/img/icons/icon_soundcloud.ico Binary files differindex 4130bea1b..4130bea1b 100644 --- a/searx/static/themes/default/img/icons/icon_soundcloud.ico +++ b/searx/static/themes/legacy/img/icons/icon_soundcloud.ico diff --git a/searx/static/themes/default/img/icons/icon_stackoverflow.ico b/searx/static/themes/legacy/img/icons/icon_stackoverflow.ico Binary files differindex b2242bc6c..b2242bc6c 100644 --- a/searx/static/themes/default/img/icons/icon_stackoverflow.ico +++ b/searx/static/themes/legacy/img/icons/icon_stackoverflow.ico diff --git a/searx/static/themes/default/img/icons/icon_startpage.ico b/searx/static/themes/legacy/img/icons/icon_startpage.ico Binary files differindex 44b94a986..44b94a986 100644 --- a/searx/static/themes/default/img/icons/icon_startpage.ico +++ b/searx/static/themes/legacy/img/icons/icon_startpage.ico diff --git a/searx/static/themes/default/img/icons/icon_subtitleseeker.ico b/searx/static/themes/legacy/img/icons/icon_subtitleseeker.ico Binary files differindex 9a0565558..9a0565558 100644 --- a/searx/static/themes/default/img/icons/icon_subtitleseeker.ico +++ b/searx/static/themes/legacy/img/icons/icon_subtitleseeker.ico diff --git a/searx/static/themes/default/img/icons/icon_twitter.ico b/searx/static/themes/legacy/img/icons/icon_twitter.ico Binary files differindex b4a71699a..b4a71699a 100644 --- a/searx/static/themes/default/img/icons/icon_twitter.ico +++ b/searx/static/themes/legacy/img/icons/icon_twitter.ico diff --git a/searx/static/themes/default/img/icons/icon_vimeo.ico b/searx/static/themes/legacy/img/icons/icon_vimeo.ico Binary files differindex 4fe4336da..4fe4336da 100644 --- a/searx/static/themes/default/img/icons/icon_vimeo.ico +++ b/searx/static/themes/legacy/img/icons/icon_vimeo.ico diff --git a/searx/static/themes/default/img/icons/icon_wikipedia.ico b/searx/static/themes/legacy/img/icons/icon_wikipedia.ico Binary files differindex e70021849..e70021849 100644 --- a/searx/static/themes/default/img/icons/icon_wikipedia.ico +++ b/searx/static/themes/legacy/img/icons/icon_wikipedia.ico diff --git a/searx/static/themes/default/img/icons/icon_yahoo.ico b/searx/static/themes/legacy/img/icons/icon_yahoo.ico Binary files differindex 9bd1d9f7c..9bd1d9f7c 100644 --- a/searx/static/themes/default/img/icons/icon_yahoo.ico +++ b/searx/static/themes/legacy/img/icons/icon_yahoo.ico diff --git a/searx/static/themes/default/img/icons/icon_youtube.ico b/searx/static/themes/legacy/img/icons/icon_youtube.ico Binary files differindex 977887dbb..977887dbb 100644 --- a/searx/static/themes/default/img/icons/icon_youtube.ico +++ b/searx/static/themes/legacy/img/icons/icon_youtube.ico diff --git a/searx/static/themes/default/img/preference-icon.png b/searx/static/themes/legacy/img/preference-icon.png Binary files differindex 8bdee641d..8bdee641d 100644 --- a/searx/static/themes/default/img/preference-icon.png +++ b/searx/static/themes/legacy/img/preference-icon.png diff --git a/searx/static/themes/default/img/search-icon.png b/searx/static/themes/legacy/img/search-icon.png Binary files differindex d70310b5d..d70310b5d 100644 --- a/searx/static/themes/default/img/search-icon.png +++ b/searx/static/themes/legacy/img/search-icon.png diff --git a/searx/static/themes/default/img/searx.png b/searx/static/themes/legacy/img/searx.png Binary files differindex a98f12a1d..a98f12a1d 100644 --- a/searx/static/themes/default/img/searx.png +++ b/searx/static/themes/legacy/img/searx.png diff --git a/searx/static/themes/default/img/searx_logo.svg b/searx/static/themes/legacy/img/searx_logo.svg index 67a2d4588..67a2d4588 100644 --- a/searx/static/themes/default/img/searx_logo.svg +++ b/searx/static/themes/legacy/img/searx_logo.svg diff --git a/searx/static/themes/default/js/searx.js b/searx/static/themes/legacy/js/searx.js index d6d5b74bb..d6d5b74bb 100644 --- a/searx/static/themes/default/js/searx.js +++ b/searx/static/themes/legacy/js/searx.js diff --git a/searx/static/themes/default/less/autocompleter.less b/searx/static/themes/legacy/less/autocompleter.less index db9601aeb..db9601aeb 100644 --- a/searx/static/themes/default/less/autocompleter.less +++ b/searx/static/themes/legacy/less/autocompleter.less diff --git a/searx/static/themes/default/less/code.less b/searx/static/themes/legacy/less/code.less index a688dd98d..a688dd98d 100644 --- a/searx/static/themes/default/less/code.less +++ b/searx/static/themes/legacy/less/code.less diff --git a/searx/static/themes/default/less/definitions.less b/searx/static/themes/legacy/less/definitions.less index 0ac0cc90c..0ac0cc90c 100644 --- a/searx/static/themes/default/less/definitions.less +++ b/searx/static/themes/legacy/less/definitions.less diff --git a/searx/static/themes/default/less/mixins.less b/searx/static/themes/legacy/less/mixins.less index dbccce6e3..dbccce6e3 100644 --- a/searx/static/themes/default/less/mixins.less +++ b/searx/static/themes/legacy/less/mixins.less diff --git a/searx/static/themes/default/less/search.less b/searx/static/themes/legacy/less/search.less index d285ca734..d285ca734 100644 --- a/searx/static/themes/default/less/search.less +++ b/searx/static/themes/legacy/less/search.less diff --git a/searx/static/themes/default/less/style-rtl.less b/searx/static/themes/legacy/less/style-rtl.less index eac53c1f8..eac53c1f8 100644 --- a/searx/static/themes/default/less/style-rtl.less +++ b/searx/static/themes/legacy/less/style-rtl.less diff --git a/searx/static/themes/default/less/style.less b/searx/static/themes/legacy/less/style.less index 4374f7d68..4374f7d68 100644 --- a/searx/static/themes/default/less/style.less +++ b/searx/static/themes/legacy/less/style.less diff --git a/searx/static/themes/oscar/css/logicodev.min.css b/searx/static/themes/oscar/css/logicodev.min.css index 195385bba..33d451b8f 100644 --- a/searx/static/themes/oscar/css/logicodev.min.css +++ b/searx/static/themes/oscar/css/logicodev.min.css @@ -1 +1 @@ -.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{background:#29314d;color:#01d7d4}.navbar>li>a{padding:0;margin:0}.navbar-nav>li>a{background:#29314d;padding:0 8px;margin:0;line-height:30px}.navbar,.navbar-default{background-color:#29314d;border:none;border-top:4px solid #01d7d4;padding-top:5px;color:#f6f9fa!important;font-weight:700;font-size:1.1em;text-transform:lowercase;margin-bottom:24px;height:30px;line-height:30px;z-index:10}.navbar .navbar-nav>li>a,.navbar-default .navbar-nav>li>a{color:#f6f9fa}.navbar .navbar-brand,.navbar-default .navbar-brand{font-weight:700;color:#01d7d4;line-height:30px;padding:0 30px;margin:0}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#01d7d4;background:#29314d}.navbar-toggle{margin-top:0}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:6px;margin-bottom:4px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link,.external-link a{color:#2ecc71}.external-link a,.external-link a a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;height:170px;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#advanced-search-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;padding-bottom:.4rem;padding-top:.4rem;padding-left:1rem;padding-right:5rem;margin-right:.5rem;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700}
\ No newline at end of file +.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{background:#29314d;color:#01d7d4}.navbar>li>a{padding:0;margin:0}.navbar-nav>li>a{background:#29314d;padding:0 8px;margin:0;line-height:30px}.navbar,.navbar-default,.menu{background-color:#29314d;border:none;border-top:4px solid #01d7d4;padding-top:5px;color:#f6f9fa!important;font-weight:700;font-size:1.1em;text-transform:lowercase;margin-bottom:24px;height:30px;line-height:30px;z-index:10}.navbar .navbar-nav>li>a,.navbar-default .navbar-nav>li>a,.menu .navbar-nav>li>a{color:#f6f9fa}.navbar .navbar-brand,.navbar-default .navbar-brand,.menu .navbar-brand{font-weight:700;color:#01d7d4;line-height:30px;padding:0 30px;margin:0}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#01d7d4;background:#29314d}.navbar-toggle{margin-top:0}.menu{margin:0;padding:0;position:absolute;top:4px;border:0;z-index:1000000000;height:40px;line-height:40px}.menu ul{padding:0;margin:0}.menu ul li{padding:0 .6em;margin:0;float:left;list-style:none}.menu ul li a{color:#f6f9fa}.menu ul li.active a{color:#01d7d4}.menu-right{right:2em}.menu-left{left:2em}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:6px;margin-bottom:4px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link,.external-link a{color:#2ecc71}.external-link a,.external-link a a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#advanced-search-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;padding-bottom:.4rem;padding-top:.4rem;padding-left:1rem;padding-right:5rem;margin-right:.5rem;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700}
\ No newline at end of file diff --git a/searx/static/themes/oscar/css/pointhi.min.css b/searx/static/themes/oscar/css/pointhi.min.css index 389add2b9..921d60a32 100644 --- a/searx/static/themes/oscar/css/pointhi.min.css +++ b/searx/static/themes/oscar/css/pointhi.min.css @@ -1 +1 @@ -html{position:relative;min-height:100%}body{margin-bottom:80px}.footer{position:absolute;bottom:0;width:100%;height:60px}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#0C0;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-bottom:5px;margin-top:20px}.result_header .favicon{margin-bottom:-3px}.result_header a{vertical-align:bottom}.result_header a .highlight{font-weight:700}.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:700}.result-default{clear:both}.result-images{float:left!important}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-torrents{clear:both}.result-map{clear:both}.result-code{clear:both}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:50px}.label-default{color:#AAA;background:#FFF}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:1.5rem;margin-top:1.5rem;display:flex;flex-wrap:wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-top:.8rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#DDD 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#000;font-weight:700;background-color:#EEE}#advanced-search-container{display:none;text-align:center;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-left:1.2rem;padding-right:1.2rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#DDD 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#000;font-weight:700;background-color:#EEE}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:green;font-weight:700}.highlight .kd{color:green;font-weight:700}.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#BA2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}
\ No newline at end of file +html{position:relative;min-height:100%}body{margin-bottom:80px}.footer{position:absolute;bottom:0;width:100%;height:60px}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#0C0;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-bottom:5px;margin-top:20px}.result_header .favicon{margin-bottom:-3px}.result_header a{vertical-align:bottom}.result_header a .highlight{font-weight:700}.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:700}.result-default{clear:both}.result-images{float:left!important}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-torrents{clear:both}.result-map{clear:both}.result-code{clear:both}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:50px}.label-default{color:#AAA;background:#FFF}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:1.5rem;margin-top:1.5rem;display:flex;flex-wrap:wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-top:.8rem;text-align:center}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#DDD 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#000;font-weight:700;background-color:#EEE}#advanced-search-container{display:none;text-align:center;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.3rem;font-weight:400;background-color:#fff;border:#DDD 1px solid;border-right:none;color:#333;padding-bottom:.8rem;padding-left:1.2rem;padding-right:1.2rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#DDD 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#000;font-weight:700;background-color:#EEE}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:green;font-weight:700}.highlight .kd{color:green;font-weight:700}.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#BA2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.menu{margin:0;padding:0;position:absolute;top:4px;border:0;z-index:1000000000;height:40px;line-height:40px}.menu ul{padding:0;margin:0}.menu ul li{padding:0 .6em;margin:0;float:left;list-style:none}.menu-right{right:2em}.menu-left{left:2em}
\ No newline at end of file diff --git a/searx/static/themes/oscar/less/logicodev/navbar.less b/searx/static/themes/oscar/less/logicodev/navbar.less index 2426210ca..411fd63c6 100644 --- a/searx/static/themes/oscar/less/logicodev/navbar.less +++ b/searx/static/themes/oscar/less/logicodev/navbar.less @@ -15,7 +15,7 @@ line-height: 30px; } -.navbar, .navbar-default{ +.navbar, .navbar-default, .menu { background-color: @black; border: none; border-top: 4px solid @light-green; @@ -52,3 +52,38 @@ .navbar-toggle { margin-top: 0; } + +.menu { + margin: 0; + padding: 0; + position: absolute; + top: 4px; + border: 0; + z-index: 1000000000; + height: 40px; + line-height: 40px; + ul { + padding: 0; + margin: 0; + li { + padding: 0 0.6em; + margin: 0; + float: left; + list-style: none; + a { + color: @dim-gray; + } + } + li.active a { + color: @light-green; + } + } +} + +.menu-right { + right: 2em; +} + +.menu-left { + left: 2em; +} diff --git a/searx/static/themes/oscar/less/logicodev/results.less b/searx/static/themes/oscar/less/logicodev/results.less index 37a5a76d5..9e57da788 100644 --- a/searx/static/themes/oscar/less/logicodev/results.less +++ b/searx/static/themes/oscar/less/logicodev/results.less @@ -6,7 +6,7 @@ .favicon { margin-bottom:-3px; } - + a { color: @black; text-decoration: none; @@ -18,7 +18,7 @@ &:visited{ color: @violet; } - + .highlight { background-color: @dim-gray; // Chrome hack: bold is different size than normal @@ -64,10 +64,9 @@ float: left !important; width: 24%; margin: .5%; - a{ + a { display: block; width: 100%; - height: 170px; background-size: cover; } } @@ -148,3 +147,21 @@ color: @gray; background: transparent; } + +.result .text-muted small { + word-wrap: break-word; +} + +.modal-wrapper { + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); +} + +.modal-wrapper { + background-clip: padding-box; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + outline: 0 none; + position: relative; +} diff --git a/searx/static/themes/oscar/less/pointhi/navbar.less b/searx/static/themes/oscar/less/pointhi/navbar.less new file mode 100644 index 000000000..f0ce53e71 --- /dev/null +++ b/searx/static/themes/oscar/less/pointhi/navbar.less @@ -0,0 +1,28 @@ +.menu { + margin: 0; + padding: 0; + position: absolute; + top: 4px; + border: 0; + z-index: 1000000000; + height: 40px; + line-height: 40px; + ul { + padding: 0; + margin: 0; + li { + padding: 0 0.6em; + margin: 0; + float: left; + list-style: none; + } + } +} + +.menu-right { + right: 2em; +} + +.menu-left { + left: 2em; +} diff --git a/searx/static/themes/oscar/less/pointhi/oscar.less b/searx/static/themes/oscar/less/pointhi/oscar.less index ef69acee3..4e2fee129 100644 --- a/searx/static/themes/oscar/less/pointhi/oscar.less +++ b/searx/static/themes/oscar/less/pointhi/oscar.less @@ -15,3 +15,5 @@ @import "cursor.less"; @import "code.less"; + +@import "navbar.less"; diff --git a/searx/static/themes/oscar/less/pointhi/results.less b/searx/static/themes/oscar/less/pointhi/results.less index b3d87001c..beea353d0 100644 --- a/searx/static/themes/oscar/less/pointhi/results.less +++ b/searx/static/themes/oscar/less/pointhi/results.less @@ -6,10 +6,10 @@ .favicon { margin-bottom:-3px; } - + a { vertical-align: bottom; - + .highlight { font-weight:bold; } @@ -81,3 +81,21 @@ color: #AAA; background: #FFF; } + +.result .text-muted small { + word-wrap: break-word; +} + +.modal-wrapper { + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); +} + +.modal-wrapper { + background-clip: padding-box; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + outline: 0 none; + position: relative; +} diff --git a/searx/templates/courgette/404.html b/searx/templates/courgette/404.html new file mode 100644 index 000000000..77f1287ab --- /dev/null +++ b/searx/templates/courgette/404.html @@ -0,0 +1,9 @@ +{% extends "courgette/base.html" %} +{% block content %} +<div class="center"> + <h1>{{ _('Page not found') }}</h1> + {% autoescape false %} + <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p> + {% endautoescape %} +</div> +{% endblock %} diff --git a/searx/templates/courgette/about.html b/searx/templates/courgette/about.html index 2945e1f7b..faa7b6138 100644 --- a/searx/templates/courgette/about.html +++ b/searx/templates/courgette/about.html @@ -6,20 +6,20 @@ <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users. </p> - <h2>Why use Searx?</h2> + <h2>Why use searx?</h2> <ul> - <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> - <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> - <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> + <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> + <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> + <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> </ul> <p>If you do care about privacy, want to be a conscious user, or otherwise believe - in digital freedom, make Searx your default search engine or run it on your own server</p> + in digital freedom, make searx your default search engine or run it on your own server</p> <h2>Technical details - How does it work?</h2> <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, -inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br /> -It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, Searx uses the search bar to perform GET requests.<br /> +inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br /> +It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, searx uses the search bar to perform GET requests.<br /> Searx can be added to your browser's search bar; moreover, it can be set as the default search engine. </p> diff --git a/searx/templates/courgette/base.html b/searx/templates/courgette/base.html index 276fae870..8e272585c 100644 --- a/searx/templates/courgette/base.html +++ b/searx/templates/courgette/base.html @@ -2,7 +2,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}> <head> <meta charset="UTF-8" /> - <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" /> + <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" /> <meta name="keywords" content="searx, search, search engine, metasearch, meta search" /> <meta name="generator" content="searx/{{ searx_version }}"> <meta name="referrer" content="no-referrer"> @@ -22,7 +22,7 @@ {% endblock %} {% block meta %}{% endblock %} {% block head %} - <link title="searx" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/> + <link title="{{ instance_name }}" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/> {% endblock %} <script type="text/javascript"> searx = {}; diff --git a/searx/templates/courgette/opensearch_response_rss.xml b/searx/templates/courgette/opensearch_response_rss.xml index 5673eb2e1..ddb60fa5e 100644 --- a/searx/templates/courgette/opensearch_response_rss.xml +++ b/searx/templates/courgette/opensearch_response_rss.xml @@ -3,14 +3,14 @@ xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> - <title>Searx search: {{ q }}</title> - <link>{{ base_url }}?q={{ q }}</link> - <description>Search results for "{{ q }}" - searx</description> + <title>Searx search: {{ q|e }}</title> + <link>{{ base_url }}?q={{ q|e }}</link> + <description>Search results for "{{ q|e }}" - searx</description> <opensearch:totalResults>{{ number_of_results }}</opensearch:totalResults> <opensearch:startIndex>1</opensearch:startIndex> <opensearch:itemsPerPage>{{ number_of_results }}</opensearch:itemsPerPage> <atom:link rel="search" type="application/opensearchdescription+xml" href="{{ base_url }}opensearch.xml"/> - <opensearch:Query role="request" searchTerms="{{ q }}" startPage="1" /> + <opensearch:Query role="request" searchTerms="{{ q|e }}" startPage="1" /> {% for r in results %} <item> <title>{{ r.title }}</title> diff --git a/searx/templates/courgette/result_templates/code.html b/searx/templates/courgette/result_templates/code.html index 726f305cb..953617e84 100644 --- a/searx/templates/courgette/result_templates/code.html +++ b/searx/templates/courgette/result_templates/code.html @@ -1,8 +1,8 @@ <div class="result {{ result.class }}">
- <h3 class="result_title">{% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
+ <h3 class="result_title">{% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}
<p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
- {% if result.repository %}<p class="content"><a href="{{ result.repository|safe }}" rel="noreferrer">{{ result.repository }}</a></p>{% endif %}
+ {% if result.repository %}<p class="content"><a href="{{ result.repository|safe }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
<div dir="ltr">
{{ result.codelines|code_highlighter(result.code_language)|safe }}
</div>
diff --git a/searx/templates/courgette/result_templates/default.html b/searx/templates/courgette/result_templates/default.html index 585ecf3f5..5f2ead63f 100644 --- a/searx/templates/courgette/result_templates/default.html +++ b/searx/templates/courgette/result_templates/default.html @@ -5,7 +5,7 @@ {% endif %} <div> - <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> + <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> {% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %} <p class="content">{% if result.content %}{{ result.content|safe }}<br />{% endif %}</p> <p class="url">{{ result.pretty_url }}‎</p> diff --git a/searx/templates/courgette/result_templates/images.html b/searx/templates/courgette/result_templates/images.html index 87fc7744c..49acb3b61 100644 --- a/searx/templates/courgette/result_templates/images.html +++ b/searx/templates/courgette/result_templates/images.html @@ -1,6 +1,6 @@ <div class="image_result"> <p> - <a href="{{ result.img_src }}" rel="noreferrer"><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a> - <span class="url"><a href="{{ result.url }}" rel="noreferrer" class="small_font">{{ _('original context') }}</a></span> + <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a> + <span class="url"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="small_font">{{ _('original context') }}</a></span> </p> </div> diff --git a/searx/templates/courgette/result_templates/map.html b/searx/templates/courgette/result_templates/map.html index 585ecf3f5..5f2ead63f 100644 --- a/searx/templates/courgette/result_templates/map.html +++ b/searx/templates/courgette/result_templates/map.html @@ -5,7 +5,7 @@ {% endif %} <div> - <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> + <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> {% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %} <p class="content">{% if result.content %}{{ result.content|safe }}<br />{% endif %}</p> <p class="url">{{ result.pretty_url }}‎</p> diff --git a/searx/templates/courgette/result_templates/torrent.html b/searx/templates/courgette/result_templates/torrent.html index 33b574244..2fd8395ad 100644 --- a/searx/templates/courgette/result_templates/torrent.html +++ b/searx/templates/courgette/result_templates/torrent.html @@ -2,12 +2,12 @@ {% if "icon_"~result.engine~".ico" in favicons %} <img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" /> {% endif %} - <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> + <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> {% if result.content %}<span class="content">{{ result.content|safe }}</span><br />{% endif %} <span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span><br /> <span> {% if result.magnetlink %}<a href="{{ result.magnetlink }}" class="magnetlink">{{ _('magnet link') }}</a>{% endif %} - {% if result.torrentfile %}<a href="{{ result.torrentfile }}" class="torrentfile" rel="noreferrer">{{ _('torrent file') }}</a>{% endif %} + {% if result.torrentfile %}<a href="{{ result.torrentfile }}" class="torrentfile" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('torrent file') }}</a>{% endif %} </span> <p class="url">{{ result.pretty_url }}‎</p> </div> diff --git a/searx/templates/courgette/result_templates/videos.html b/searx/templates/courgette/result_templates/videos.html index ceed8b28f..b3e19e024 100644 --- a/searx/templates/courgette/result_templates/videos.html +++ b/searx/templates/courgette/result_templates/videos.html @@ -3,8 +3,8 @@ <img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" /> {% endif %} - <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> + <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> {% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span><br />{% endif %} - <a href="{{ result.url }}" rel="noreferrer"><img width="400" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a> + <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img width="400" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a> <p class="url">{{ result.pretty_url }}‎</p> </div> diff --git a/searx/templates/courgette/results.html b/searx/templates/courgette/results.html index 3ffbd5882..c72b7c3f7 100644 --- a/searx/templates/courgette/results.html +++ b/searx/templates/courgette/results.html @@ -1,6 +1,6 @@ {% extends "courgette/base.html" %} -{% block title %}{{ q }} - {% endblock %} -{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&format=rss&{% for category in selected_categories %}category_{{ category }}=1&{% endfor %}pageno={{ pageno }}">{% endblock %} +{% block title %}{{ q|e }} - {% endblock %} +{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&format=rss&{% for category in selected_categories %}category_{{ category }}=1&{% endfor %}pageno={{ pageno }}">{% endblock %} {% block content %} <div class="right"><a href="{{ url_for('preferences') }}" id="preferences"><span>{{ _('preferences') }}</span></a></div> <div class="small search center"> @@ -17,7 +17,7 @@ {% for output_type in ('csv', 'json', 'rss') %} <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"> <div class="left"> - <input type="hidden" name="q" value="{{ q }}" /> + <input type="hidden" name="q" value="{{ q|e }}" /> <input type="hidden" name="format" value="{{ output_type }}" /> {% for category in selected_categories %} <input type="hidden" name="category_{{ category }}" value="1"/> @@ -62,7 +62,7 @@ {% if pageno > 1 %} <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"> <div class="left"> - <input type="hidden" name="q" value="{{ q }}" /> + <input type="hidden" name="q" value="{{ q|e }}" /> {% for category in selected_categories %} <input type="hidden" name="category_{{ category }}" value="1"/> {% endfor %} @@ -76,7 +76,7 @@ {% for category in selected_categories %} <input type="hidden" name="category_{{ category }}" value="1"/> {% endfor %} - <input type="hidden" name="q" value="{{ q }}" /> + <input type="hidden" name="q" value="{{ q|e }}" /> <input type="hidden" name="pageno" value="{{ pageno+1 }}" /> <input type="submit" value="{{ _('next page') }} >>" /> </div> diff --git a/searx/templates/default/result_templates/images.html b/searx/templates/default/result_templates/images.html deleted file mode 100644 index d85f841ae..000000000 --- a/searx/templates/default/result_templates/images.html +++ /dev/null @@ -1,6 +0,0 @@ -<div class="image_result"> - <p> - <a href="{{ result.img_src }}" rel="noreferrer"><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a> - <span class="url"><a href="{{ result.url }}" rel="noreferrer" class="small_font">{{ _('original context') }}</a></span> - </p> -</div> diff --git a/searx/templates/legacy/404.html b/searx/templates/legacy/404.html new file mode 100644 index 000000000..05c14e155 --- /dev/null +++ b/searx/templates/legacy/404.html @@ -0,0 +1,9 @@ +{% extends "legacy/base.html" %} +{% block content %} +<div class="center"> + <h1>{{ _('Page not found') }}</h1> + {% autoescape false %} + <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p> + {% endautoescape %} +</div> +{% endblock %} diff --git a/searx/templates/default/about.html b/searx/templates/legacy/about.html index 1b5fc34c0..580321e47 100644 --- a/searx/templates/default/about.html +++ b/searx/templates/legacy/about.html @@ -1,25 +1,25 @@ -{% extends 'default/base.html' %} +{% extends 'legacy/base.html' %} {% block content %} -{% include 'default/github_ribbon.html' %} +{% include 'legacy/github_ribbon.html' %} <div class="row"{% if rtl %} dir="ltr"{% endif %}> <h1>About <a href="{{ url_for('index') }}">searx</a></h1> <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users. </p> - <h2>Why use Searx?</h2> + <h2>Why use searx?</h2> <ul> - <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> - <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> - <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> + <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> + <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> + <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> </ul> <p>If you do care about privacy, want to be a conscious user, or otherwise believe - in digital freedom, make Searx your default search engine or run it on your own server</p> + in digital freedom, make searx your default search engine or run it on your own server</p> <h2>Technical details - How does it work?</h2> <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, -inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br /> -It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if Searx used from the search bar it performs GET requests.<br /> +inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br /> +It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if searx used from the search bar it performs GET requests.<br /> Searx can be added to your browser's search bar; moreover, it can be set as the default search engine. </p> diff --git a/searx/templates/default/base.html b/searx/templates/legacy/base.html index 143bdb8d2..da19741cb 100644 --- a/searx/templates/default/base.html +++ b/searx/templates/legacy/base.html @@ -2,7 +2,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}> <head> <meta charset="UTF-8" /> - <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" /> + <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" /> <meta name="keywords" content="searx, search, search engine, metasearch, meta search" /> <meta name="generator" content="searx/{{ searx_version }}"> <meta name="referrer" content="no-referrer"> @@ -17,7 +17,7 @@ {% endblock %} {% block meta %}{% endblock %} {% block head %} - <link title="searx" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/> + <link title="{{ instance_name }}" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/> {% endblock %} </head> <body> diff --git a/searx/templates/default/categories.html b/searx/templates/legacy/categories.html index 1c466781b..1c466781b 100644 --- a/searx/templates/default/categories.html +++ b/searx/templates/legacy/categories.html diff --git a/searx/templates/default/github_ribbon.html b/searx/templates/legacy/github_ribbon.html index bdd9cf180..bdd9cf180 100644 --- a/searx/templates/default/github_ribbon.html +++ b/searx/templates/legacy/github_ribbon.html diff --git a/searx/templates/default/index.html b/searx/templates/legacy/index.html index fc15a44b6..de956d5b3 100644 --- a/searx/templates/default/index.html +++ b/searx/templates/legacy/index.html @@ -1,8 +1,8 @@ -{% extends "default/base.html" %} +{% extends "legacy/base.html" %} {% block content %} <div class="center"> <div class="title"><h1>searx</h1></div> - {% include 'default/search.html' %} + {% include 'legacy/search.html' %} <p class="top_margin"> {% if rtl %} <a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a> @@ -13,6 +13,6 @@ {% endif %} </p> </div> -{% include 'default/github_ribbon.html' %} +{% include 'legacy/github_ribbon.html' %} {% endblock %} diff --git a/searx/templates/default/infobox.html b/searx/templates/legacy/infobox.html index ce26ac578..4dd25fabd 100644 --- a/searx/templates/default/infobox.html +++ b/searx/templates/legacy/infobox.html @@ -24,7 +24,7 @@ <div class="urls"> <ul> {% for url in infobox.urls %} - <li class="url"><bdi><a href="{{ url.url }}" rel="noreferrer">{{ url.title }}</a></bdi></li> + <li class="url"><bdi><a href="{{ url.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ url.title }}</a></bdi></li> {% endfor %} </ul> </div> diff --git a/searx/templates/default/opensearch.xml b/searx/templates/legacy/opensearch.xml index 15d3eb792..15d3eb792 100644 --- a/searx/templates/default/opensearch.xml +++ b/searx/templates/legacy/opensearch.xml diff --git a/searx/templates/default/opensearch_response_rss.xml b/searx/templates/legacy/opensearch_response_rss.xml index 5673eb2e1..ddb60fa5e 100644 --- a/searx/templates/default/opensearch_response_rss.xml +++ b/searx/templates/legacy/opensearch_response_rss.xml @@ -3,14 +3,14 @@ xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> - <title>Searx search: {{ q }}</title> - <link>{{ base_url }}?q={{ q }}</link> - <description>Search results for "{{ q }}" - searx</description> + <title>Searx search: {{ q|e }}</title> + <link>{{ base_url }}?q={{ q|e }}</link> + <description>Search results for "{{ q|e }}" - searx</description> <opensearch:totalResults>{{ number_of_results }}</opensearch:totalResults> <opensearch:startIndex>1</opensearch:startIndex> <opensearch:itemsPerPage>{{ number_of_results }}</opensearch:itemsPerPage> <atom:link rel="search" type="application/opensearchdescription+xml" href="{{ base_url }}opensearch.xml"/> - <opensearch:Query role="request" searchTerms="{{ q }}" startPage="1" /> + <opensearch:Query role="request" searchTerms="{{ q|e }}" startPage="1" /> {% for r in results %} <item> <title>{{ r.title }}</title> diff --git a/searx/templates/default/preferences.html b/searx/templates/legacy/preferences.html index a47dba458..30d632c93 100644 --- a/searx/templates/default/preferences.html +++ b/searx/templates/legacy/preferences.html @@ -1,4 +1,4 @@ -{% extends "default/base.html" %} +{% extends "legacy/base.html" %} {% block head %} {% endblock %} {% block content %} <div class="row"> @@ -8,7 +8,7 @@ <fieldset> <legend>{{ _('Default categories') }}</legend> {% set display_tooltip = false %} - {% include 'default/categories.html' %} + {% include 'legacy/categories.html' %} </fieldset> <fieldset> <legend>{{ _('Search language') }}</legend> @@ -81,6 +81,15 @@ </p> </fieldset> <fieldset> + <legend>{{ _('Results on new tabs') }}</legend> + <p> + <select name='results_on_new_tab'> + <option value="1" {% if results_on_new_tab %}selected="selected"{% endif %}>{{ _('On') }}</option> + <option value="0" {% if not results_on_new_tab %}selected="selected"{% endif %}>{{ _('Off')}}</option> + </select> + </p> + </fieldset> + <fieldset> <legend>{{ _('Currently used search engines') }}</legend> <table> diff --git a/searx/templates/default/result_templates/code.html b/searx/templates/legacy/result_templates/code.html index ad1d97e9e..9e3ed20af 100644 --- a/searx/templates/default/result_templates/code.html +++ b/searx/templates/legacy/result_templates/code.html @@ -1,9 +1,9 @@ <div class="result {{ result.class }}">
- <h3 class="result_title"> {% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3>
- <p class="url">{{ result.pretty_url }}‎ <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ _('cached') }}</a></p>
+ <h3 class="result_title"> {% if result['favicon'] %}<img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" alt="{{result['favicon']}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
+ <p class="url">{{ result.pretty_url }}‎ <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('cached') }}</a></p>
{% if result.publishedDate %}<p class="published_date">{{ result.publishedDate }}</p>{% endif %}
<p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
- {% if result.repository %}<p class="result-content"><a href="{{ result.repository|safe }}" rel="noreferrer">{{ result.repository }}</a></p>{% endif %}
+ {% if result.repository %}<p class="result-content"><a href="{{ result.repository|safe }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
<div dir="ltr">
{{ result.codelines|code_highlighter(result.code_language)|safe }}
diff --git a/searx/templates/default/result_templates/default.html b/searx/templates/legacy/result_templates/default.html index 89091e280..da091174d 100644 --- a/searx/templates/default/result_templates/default.html +++ b/searx/templates/legacy/result_templates/default.html @@ -1,6 +1,6 @@ <div class="result {{ result.class }}"> - <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> - <p class="url">{{ result.pretty_url }}‎ <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ _('cached') }}</a> + <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> + <p class="url">{{ result.pretty_url }}‎ <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('cached') }}</a> {% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}</p> <p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p> </div> diff --git a/searx/templates/legacy/result_templates/images.html b/searx/templates/legacy/result_templates/images.html new file mode 100644 index 000000000..00f62abcc --- /dev/null +++ b/searx/templates/legacy/result_templates/images.html @@ -0,0 +1,6 @@ +<div class="image_result"> + <p> + <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a> + <span class="url"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="small_font">{{ _('original context') }}</a></span> + </p> +</div> diff --git a/searx/templates/default/result_templates/map.html b/searx/templates/legacy/result_templates/map.html index d413742e7..0200e0f6b 100644 --- a/searx/templates/default/result_templates/map.html +++ b/searx/templates/legacy/result_templates/map.html @@ -5,8 +5,8 @@ {% endif %} <div> - <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> - <p class="url">{{ result.pretty_url }}‎ <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ _('cached') }}</a> + <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> + <p class="url">{{ result.pretty_url }}‎ <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('cached') }}</a> {% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span>{% endif %}</p> <p class="content">{% if result.img_src %}<img src="{{ image_proxify(result.img_src) }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p> </div> diff --git a/searx/templates/default/result_templates/torrent.html b/searx/templates/legacy/result_templates/torrent.html index 4b2522ad0..67e058ae5 100644 --- a/searx/templates/default/result_templates/torrent.html +++ b/searx/templates/legacy/result_templates/torrent.html @@ -2,12 +2,12 @@ {% if "icon_"~result.engine~".ico" in favicons %} <img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" /> {% endif %} - <h3 class="result_title"><a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> + <h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> <p class="url">{{ result.pretty_url }}‎</p> {% if result.content %}<p class="content">{{ result.content|safe }}</p>{% endif %} <p> {% if result.magnetlink %}<a href="{{ result.magnetlink }}" class="magnetlink">{{ _('magnet link') }}</a>{% endif %} - {% if result.torrentfile %}<a href="{{ result.torrentfile }}" rel="noreferrer" class="torrentfile">{{ _('torrent file') }}</a>{% endif %} - + {% if result.torrentfile %}<a href="{{ result.torrentfile }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="torrentfile">{{ _('torrent file') }}</a>{% endif %} - <span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span> </p> </div> diff --git a/searx/templates/default/result_templates/videos.html b/searx/templates/legacy/result_templates/videos.html index 5a377b70f..727f44c71 100644 --- a/searx/templates/default/result_templates/videos.html +++ b/searx/templates/legacy/result_templates/videos.html @@ -1,6 +1,6 @@ <div class="result"> - <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h3> + <h3 class="result_title">{% if "icon_"~result.engine~".ico" in favicons %}<img width="14" height="14" class="favicon" src="{{ url_for('static', filename='img/icons/icon_'+result.engine+'.ico') }}" alt="{{result.engine}}" />{% endif %}<a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3> {% if result.publishedDate %}<span class="published_date">{{ result.publishedDate }}</span><br />{% endif %} - <a href="{{ result.url }}" rel="noreferrer"><img class="thumbnail" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a> + <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img class="thumbnail" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a> <p class="url">{{ result.url }}‎</p> </div> diff --git a/searx/templates/default/results.html b/searx/templates/legacy/results.html index 927b7b8a8..f0d78398d 100644 --- a/searx/templates/default/results.html +++ b/searx/templates/legacy/results.html @@ -1,10 +1,10 @@ -{% extends "default/base.html" %} -{% block title %}{{ q }} - {% endblock %} -{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&format=rss&{% for category in selected_categories %}category_{{ category }}=1&{% endfor %}pageno={{ pageno }}">{% endblock %} +{% extends "legacy/base.html" %} +{% block title %}{{ q|e }} - {% endblock %} +{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&format=rss&{% for category in selected_categories %}category_{{ category }}=1&{% endfor %}pageno={{ pageno }}">{% endblock %} {% block content %} <div class="preferences_container right"><a href="{{ url_for('preferences') }}" id="preferences"><span>preferences</span></a></div> <div class="small search center"> - {% include 'default/search.html' %} + {% include 'legacy/search.html' %} </div> <div id="results"> <div id="sidebar"> @@ -18,7 +18,7 @@ {% for output_type in ('csv', 'json', 'rss') %} <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"> <div class="left"> - <input type="hidden" name="q" value="{{ q }}" /> + <input type="hidden" name="q" value="{{ q|e }}" /> <input type="hidden" name="format" value="{{ output_type }}" /> {% for category in selected_categories %} <input type="hidden" name="category_{{ category }}" value="1"/> @@ -55,16 +55,16 @@ {% if infoboxes %} <div id="infoboxes"> {% for infobox in infoboxes %} - {% include 'default/infobox.html' %} + {% include 'legacy/infobox.html' %} {% endfor %} </div> {% endif %} {% for result in results %} {% if result['template'] %} - {% include get_result_template('default', result['template']) %} + {% include get_result_template('legacy', result['template']) %} {% else %} - {% include 'default/result_templates/default.html' %} + {% include 'legacy/result_templates/default.html' %} {% endif %} {% endfor %} @@ -73,7 +73,7 @@ {% if pageno > 1 %} <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"> <div class="{% if rtl %}right{% else %}left{% endif %}"> - <input type="hidden" name="q" value="{{ q }}" /> + <input type="hidden" name="q" value="{{ q|e }}" /> {% for category in selected_categories %} <input type="hidden" name="category_{{ category }}" value="1"/> {% endfor %} @@ -87,7 +87,7 @@ {% for category in selected_categories %} <input type="hidden" name="category_{{ category }}" value="1"/> {% endfor %} - <input type="hidden" name="q" value="{{ q }}" /> + <input type="hidden" name="q" value="{{ q|e }}" /> <input type="hidden" name="pageno" value="{{ pageno+1 }}" /> <input type="submit" value="{{ _('next page') }} >>" /> </div> diff --git a/searx/templates/default/search.html b/searx/templates/legacy/search.html index 5a049a492..4d37f9ba1 100644 --- a/searx/templates/default/search.html +++ b/searx/templates/legacy/search.html @@ -4,5 +4,5 @@ <input type="submit" value="search" id="search_submit" /> </div> {% set display_tooltip = true %} - {% include 'default/categories.html' %} + {% include 'legacy/categories.html' %} </form> diff --git a/searx/templates/default/stats.html b/searx/templates/legacy/stats.html index 70fe98ac7..372447e23 100644 --- a/searx/templates/default/stats.html +++ b/searx/templates/legacy/stats.html @@ -1,4 +1,4 @@ -{% extends "default/base.html" %} +{% extends "legacy/base.html" %} {% block head %} {% endblock %} {% block content %} <h2>{{ _('Engine stats') }}</h2> diff --git a/searx/templates/oscar/404.html b/searx/templates/oscar/404.html new file mode 100644 index 000000000..11d789564 --- /dev/null +++ b/searx/templates/oscar/404.html @@ -0,0 +1,9 @@ +{% extends "oscar/base.html" %} +{% block content %} +<div class="text-center"> + <h1>{{ _('Page not found') }}</h1> + {% autoescape false %} + <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p> + {% endautoescape %} +</div> +{% endblock %} diff --git a/searx/templates/oscar/about.html b/searx/templates/oscar/about.html index 39ef3663e..673738172 100644 --- a/searx/templates/oscar/about.html +++ b/searx/templates/oscar/about.html @@ -1,5 +1,4 @@ {% extends "oscar/base.html" %} -{% block site_alert_warning_nojs %} {% endblock %} {% block title %}{{ _('about') }} - {% endblock %} {% block content %} <div{% if rtl %} dir="ltr"{% endif %}> @@ -7,20 +6,20 @@ <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users. </p> - <h2>Why use Searx?</h2> + <h2>Why use searx?</h2> <ul> - <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> - <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> - <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> + <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> + <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> + <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> </ul> <p>If you do care about privacy, want to be a conscious user, or otherwise believe - in digital freedom, make Searx your default search engine or run it on your own server</p> + in digital freedom, make searx your default search engine or run it on your own server</p> <h2>Technical details - How does it work?</h2> <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, -inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br /> -It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, Searx uses the search bar to perform GET requests.<br /> +inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br /> +It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, searx uses the search bar to perform GET requests.<br /> Searx can be added to your browser's search bar; moreover, it can be set as the default search engine. </p> diff --git a/searx/templates/oscar/base.html b/searx/templates/oscar/base.html index a1f1c1a90..220f5f8b1 100644 --- a/searx/templates/oscar/base.html +++ b/searx/templates/oscar/base.html @@ -1,8 +1,9 @@ +{% from 'oscar/macros.html' import icon %} <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}> <head> <meta charset="UTF-8" /> - <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" /> + <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" /> <meta name="keywords" content="searx, search, search engine, metasearch, meta search" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="generator" content="searx/{{ searx_version }}"> @@ -54,18 +55,25 @@ <body> {% include 'oscar/navbar.html' %} <div class="container"> + {% if errors %} + <div class="alert alert-danger fade in" role="alert"> + <button class="close" data-dismiss="alert" type="button"> + <span aria-hidden="true">×</span> + <span class="sr-only">{{ _('Close') }}</span> + </button> + <strong class="lead">{{ icon('info-sign') }} {{ _('Error!') }}</strong> + <ul> + {% for message in errors %} + <li>{{ message }}</li> + {% endfor %} + </ul> + </div> + {% endif %} {% block site_alert_error %} {% endblock %} {% block site_alert_warning %} {% endblock %} - {% block site_alert_warning_nojs %} - <noscript> - <div class="visible-xs-block"> - {% include 'oscar/messages/js_disabled.html' %} - </div> - </noscript> - {% endblock %} {% block site_alert_info %} {% endblock %} {% block site_alert_success %} diff --git a/searx/templates/oscar/categories.html b/searx/templates/oscar/categories.html index 241d262ea..1ace10f16 100644 --- a/searx/templates/oscar/categories.html +++ b/searx/templates/oscar/categories.html @@ -3,7 +3,6 @@ {% for category in categories | reverse %} <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} /> <label for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label> - </label> {% endfor %} {% else %} {% for category in categories %} diff --git a/searx/templates/oscar/infobox.html b/searx/templates/oscar/infobox.html index 70d12f2fb..c98fb0e63 100644 --- a/searx/templates/oscar/infobox.html +++ b/searx/templates/oscar/infobox.html @@ -1,3 +1,4 @@ +{% from 'oscar/macros.html' import result_link with context %} <div class="panel panel-default infobox"> <div class="panel-heading"> <h4 class="panel-title infobox_part"><bdi>{{ infobox.infobox }}</bdi></h4> @@ -25,7 +26,7 @@ <div class="infobox_part"> <bdi> {% for url in infobox.urls %} - <p class="btn btn-default btn-xs"><a href="{{ url.url }}" rel="noreferrer">{{ url.title }}</a></p> + <p class="btn btn-default btn-xs">{{ result_link(url.url, url.title) }}</a></p> {% endfor %} </bdi> </div> diff --git a/searx/templates/oscar/macros.html b/searx/templates/oscar/macros.html index bf51d5940..221300fe4 100644 --- a/searx/templates/oscar/macros.html +++ b/searx/templates/oscar/macros.html @@ -9,16 +9,20 @@ <img width="32" height="32" class="favicon" src="static/themes/oscar/img/icons/{{ favicon }}.png" alt="{{ favicon }}" />
{%- endmacro %}
+{%- macro result_link(url, title, classes='') -%}
+<a href="{{ url }}" {% if classes %}class="{{ classes }} "{% endif %}{% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ title }}</a>
+{%- endmacro -%}
+
<!-- Draw result header -->
-{% macro result_header(result, favicons) -%}
- <h4 class="result_header">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}<a href="{{ result.url }}" rel="noreferrer">{{ result.title|safe }}</a></h4>
+{% macro result_header(result, favicons) -%}
+<h4 class="result_header">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result_link(result.url, result.title|safe) }}</h4>
{%- endmacro %}
<!-- Draw result sub header -->
{% macro result_sub_header(result) -%}
{% if result.publishedDate %}<time class="text-muted" datetime="{{ result.pubdate }}" >{{ result.publishedDate }}</time>{% endif %}
- {% if result.magnetlink %}<small> • <a href="{{ result.magnetlink }}" class="magnetlink">{{ icon('magnet') }} {{ _('magnet link') }}</a></small>{% endif %}
- {% if result.torrentfile %}<small> • <a href="{{ result.torrentfile }}" class="torrentfile" rel="noreferrer">{{ icon('download-alt') }} {{ _('torrent file') }}</a></small>{% endif %}
+ {% if result.magnetlink %}<small> • {{ result_link(result.magnetlink, icon('magnet') + _('magnet link'), "magnetlink") }}</small>{% endif %}
+ {% if result.torrentfile %}<small> • {{ result_link(result.torrentfile, icon('download-alt') + _('torrent file'), "torrentfile") }}</small>{% endif %}
{%- endmacro %}
<!-- Draw result footer -->
@@ -28,7 +32,10 @@ {% for engine in result.engines %}
<span class="label label-default">{{ engine }}</span>
{% endfor %}
- <small><a class="text-info" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ icon('link') }} {{ _('cached') }}</a></small>
+ <small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
+ {% if proxify %}
+ <small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
+ {% endif %}
</div>
<div class="text-muted"><small>{{ result.pretty_url }}</small></div>
{%- endmacro %}
@@ -39,7 +46,10 @@ {% for engine in result.engines %}
<span class="label label-default">{{ engine }}</span>
{% endfor %}
- <small><a class="text-info" href="https://web.archive.org/web/{{ result.url }}" rel="noreferrer">{{ icon('link') }} {{ _('cached') }}</a></small>
+ <small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
+ {% if proxify %}
+ <small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
+ {% endif %}
<div class="text-muted"><small>{{ result.pretty_url }}</small></div>
{%- endmacro %}
diff --git a/searx/templates/oscar/messages/js_disabled.html b/searx/templates/oscar/messages/js_disabled.html deleted file mode 100644 index 8baaf1e4c..000000000 --- a/searx/templates/oscar/messages/js_disabled.html +++ /dev/null @@ -1,4 +0,0 @@ -<div class="alert alert-warning" role="alert"> - <strong class="lead">{{ _('Warning!') }}</strong> - {{ _('Please enable JavaScript to use full functionality of this site.') }} -</div> diff --git a/searx/templates/oscar/navbar.html b/searx/templates/oscar/navbar.html index c59bcda3d..d12de7dab 100644 --- a/searx/templates/oscar/navbar.html +++ b/searx/templates/oscar/navbar.html @@ -1,40 +1,14 @@ <!-- Static navbar --> <div class="navbar navbar-default" role="navigation"> <div class="container-fluid"> - {% if rtl %} - <div class="navbar-collapse collapse navbar-left"> - <ul class="nav navbar-nav navbar-left"> <!-- results.html --> - <li{% if template_name == 'preferences.html' %} class="active"{% endif %}><a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a></li> - <li{% if template_name == 'about.html' %} class="active"{% endif %}><a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a></li> - <li{% if template_name == 'index.html' %} class="active"{% endif %}><a href="{{ url_for('index') }}" class="hmarg">{{ _('home') }}</a></li> - </ul> - </div> - <div class="navbar-header navbar-right"> - <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> - <span class="sr-only">{{ _('Toggle navigation') }}</span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - <a class="navbar-brand" href="{{ url_for('index') }}">{{ instance_name }}</a> - </div> - {% else %} - <div class="navbar-header"> - <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> - <span class="sr-only">{{ _('Toggle navigation') }}</span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> + <div class="navbar-header{% if rtl %} navbar-right{% endif %}"> <a class="navbar-brand" href="{{ url_for('index') }}">{{ instance_name }}</a> </div> - <div class="navbar-collapse collapse"> - <ul class="nav navbar-nav navbar-right"> <!-- results.html --> - <li{% if template_name == 'index.html' %} class="active"{% endif %}><a href="{{ url_for('index') }}" class="hmarg">{{ _('home') }}</a></li> - <li{% if template_name == 'about.html' %} class="active"{% endif %}><a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a></li> - <li{% if template_name == 'preferences.html' %} class="active"{% endif %}><a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a></li> - </ul> - </div><!--/.nav-collapse --> - {% endif %} </div><!--/.container-fluid --> </div> +<div class="menu menu-{% if rtl %}left{% else %}right{% endif %}"> + <ul> <!-- results.html --> + <li{% if template_name == 'about.html' %} class="active"{% endif %}><a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a></li> + <li{% if template_name == 'preferences.html' %} class="active"{% endif %}><a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a></li> + </ul> +</div><!--/.nav-collapse --> diff --git a/searx/templates/oscar/opensearch_response_rss.xml b/searx/templates/oscar/opensearch_response_rss.xml index 5673eb2e1..ddb60fa5e 100644 --- a/searx/templates/oscar/opensearch_response_rss.xml +++ b/searx/templates/oscar/opensearch_response_rss.xml @@ -3,14 +3,14 @@ xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> - <title>Searx search: {{ q }}</title> - <link>{{ base_url }}?q={{ q }}</link> - <description>Search results for "{{ q }}" - searx</description> + <title>Searx search: {{ q|e }}</title> + <link>{{ base_url }}?q={{ q|e }}</link> + <description>Search results for "{{ q|e }}" - searx</description> <opensearch:totalResults>{{ number_of_results }}</opensearch:totalResults> <opensearch:startIndex>1</opensearch:startIndex> <opensearch:itemsPerPage>{{ number_of_results }}</opensearch:itemsPerPage> <atom:link rel="search" type="application/opensearchdescription+xml" href="{{ base_url }}opensearch.xml"/> - <opensearch:Query role="request" searchTerms="{{ q }}" startPage="1" /> + <opensearch:Query role="request" searchTerms="{{ q|e }}" startPage="1" /> {% for r in results %} <item> <title>{{ r.title }}</title> diff --git a/searx/templates/oscar/preferences.html b/searx/templates/oscar/preferences.html index 0e3848b7c..6ad795095 100644 --- a/searx/templates/oscar/preferences.html +++ b/searx/templates/oscar/preferences.html @@ -1,11 +1,6 @@ {% from 'oscar/macros.html' import preferences_item_header, preferences_item_header_rtl, preferences_item_footer, preferences_item_footer_rtl, checkbox_toggle %} {% extends "oscar/base.html" %} {% block title %}{{ _('preferences') }} - {% endblock %} -{% block site_alert_warning_nojs %} -<noscript> - {% include 'oscar/messages/js_disabled.html' %} -</noscript> -{% endblock %} {% block content %} <div> @@ -17,6 +12,7 @@ <li class="active"><a href="#tab_general" role="tab" data-toggle="tab">{{ _('General') }}</a></li> <li><a href="#tab_engine" role="tab" data-toggle="tab">{{ _('Engines') }}</a></li> <li><a href="#tab_plugins" role="tab" data-toggle="tab">{{ _('Plugins') }}</a></li> + {% if answerers %}<li><a href="#tab_answerers" role="tab" data-toggle="tab">{{ _('Answerers') }}</a></li>{% endif %} <li><a href="#tab_cookies" role="tab" data-toggle="tab">{{ _('Cookies') }}</a></li> </ul> @@ -117,6 +113,15 @@ <option value="pointhi" {% if cookies['oscar-style'] == 'pointhi' %}selected="selected"{% endif %}>Pointhi</option> </select> {{ preferences_item_footer(_('Choose style for this theme'), _('Style'), rtl) }} + + {% set label = _('Results on new tabs') %} + {% set info = _('Open result links on new browser tabs') %} + {{ preferences_item_header(info, label, rtl) }} + <select class="form-control" name='results_on_new_tab'> + <option value="1" {% if results_on_new_tab %}selected="selected"{% endif %}>{{ _('On') }}</option> + <option value="0" {% if not results_on_new_tab %}selected="selected"{% endif %}>{{ _('Off')}}</option> + </select> + {{ preferences_item_footer(info, label, rtl) }} </div> </fieldset> </div> @@ -149,6 +154,7 @@ <th>{{ _("Engine name") }}</th> <th>{{ _("Shortcut") }}</th> <th>{{ _("SafeSearch") }}</th> + <th>{{ _("Time range") }}</th> <th>{{ _("Avg. time") }}</th> <th>{{ _("Max time") }}</th> {% else %} @@ -170,6 +176,7 @@ <th>{{ search_engine.name }}</th> <td>{{ shortcuts[search_engine.name] }}</td> <td><input type="checkbox" {{ "checked" if search_engine.safesearch==True else ""}} readonly="readonly" disabled="disabled"></td> + <td><input type="checkbox" {{ "checked" if search_engine.time_range_support==True else ""}} readonly="readonly" disabled="disabled"></td> <td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td> <td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td> {% else %} @@ -218,6 +225,34 @@ </fieldset> </div> + {% if answerers %} + <div class="tab-pane active_if_nojs" id="tab_answerers"> + <noscript> + <h3>{{ _('Answerers') }}</h3> + </noscript> + <p class="text-muted" style="margin:20px 0;"> + {{ _('This is the list of searx\'s instant answering modules.') }} + </p> + <table class="table table-striped"> + <tr> + <th class="text-muted">{{ _('Name') }}</th> + <th class="text-muted">{{ _('Keywords') }}</th> + <th class="text-muted">{{ _('Description') }}</th> + <th class="text-muted">{{ _('Examples') }}</th> + </tr> + + {% for answerer in answerers %} + <tr> + <td class="text-muted">{{ answerer.info.name }}</td> + <td class="text-muted">{{ answerer.keywords|join(', ') }}</td> + <td class="text-muted">{{ answerer.info.description }}</td> + <td class="text-muted">{{ answerer.info.examples|join(', ') }}</td> + </tr> + {% endfor %} + </table> + </div> + {% endif %} + <div class="tab-pane active_if_nojs" id="tab_cookies"> <noscript> <h3>{{ _('Cookies') }}</h3> diff --git a/searx/templates/oscar/result_templates/code.html b/searx/templates/oscar/result_templates/code.html index 582a2149c..ba74d0333 100644 --- a/searx/templates/oscar/result_templates/code.html +++ b/searx/templates/oscar/result_templates/code.html @@ -5,7 +5,7 @@ {% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
-{% if result.repository %}<p class="result-content">{{ icon('file') }} <a href="{{ result.repository|safe }}" rel="noreferrer">{{ result.repository }}</a></p>{% endif %}
+{% if result.repository %}<p class="result-content">{{ icon('file') }} <a href="{{ result.repository }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
<div dir="ltr">
{{ result.codelines|code_highlighter(result.code_language)|safe }}
diff --git a/searx/templates/oscar/result_templates/default.html b/searx/templates/oscar/result_templates/default.html index f283693c3..3ed0f3122 100644 --- a/searx/templates/oscar/result_templates/default.html +++ b/searx/templates/oscar/result_templates/default.html @@ -1,4 +1,4 @@ -{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
+{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon with context %}
{{ result_header(result, favicons) }}
{{ result_sub_header(result) }}
diff --git a/searx/templates/oscar/result_templates/images.html b/searx/templates/oscar/result_templates/images.html index 1bfff0a1a..b23f34915 100644 --- a/searx/templates/oscar/result_templates/images.html +++ b/searx/templates/oscar/result_templates/images.html @@ -1,27 +1,38 @@ {% from 'oscar/macros.html' import draw_favicon %}
-<a href="{{ result.img_src }}" rel="noreferrer" data-toggle="modal" data-target="#modal-{{ index }}">
+<a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} data-toggle="modal" data-target="#modal-{{ index }}-{{pageno}}">
<img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" class="img-thumbnail">
</a>
-<div class="modal fade" id="modal-{{ index }}" tabindex="-1" role="dialog" aria-hidden="true">
+<div class="modal fade" id="modal-{{ index }}-{{ pageno }}" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
- <div class="modal-content">
+ <div class="modal-wrapper">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<h4 class="modal-title">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result.title|striptags }}</h4>
</div>
<div class="modal-body">
<img class="img-responsive center-block" src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}">
- {% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
+ {% if result.author %}<span class="photo-author">{{ result.author }}</span><br />{% endif %}
+ {% if result.content %}
+ <p class="result-content">
+ {{ result.content }}
+ </p>
+ {% endif %}
</div>
<div class="modal-footer">
<div class="clearfix"></div>
<span class="label label-default pull-right">{{ result.engine }}</span>
<p class="text-muted pull-left">{{ result.pretty_url }}</p>
<div class="clearfix"></div>
- <a href="{{ result.img_src }}" rel="noreferrer" class="btn btn-default">{{ _('Get image') }}</a>
- <a href="{{ result.url }}" rel="noreferrer" class="btn btn-default">{{ _('View source') }}</a>
+ <div class="row">
+ <div class="col-md-6">
+ <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('Get image') }}</a>
+ </div>
+ <div class="col-md-6">
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('View source') }}</a>
+ </div>
+ </div>
</div>
</div>
</div>
diff --git a/searx/templates/oscar/result_templates/videos.html b/searx/templates/oscar/result_templates/videos.html index af4841453..36fb26240 100644 --- a/searx/templates/oscar/result_templates/videos.html +++ b/searx/templates/oscar/result_templates/videos.html @@ -15,7 +15,7 @@ <div class="container-fluid">
<div class="row">
- <a href="{{ result.url }}" rel="noreferrer"><img class="thumbnail col-xs-6 col-sm-4 col-md-4 result-content" src="{{ image_proxify(result.thumbnail) }}" alt="{{ result.title|striptags }} {{ result.engine }}" /></a>
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img class="thumbnail col-xs-6 col-sm-4 col-md-4 result-content" src="{{ image_proxify(result.thumbnail) }}" alt="{{ result.title|striptags }} {{ result.engine }}" /></a>
{% if result.content %}<p class="col-xs-12 col-sm-8 col-md-8 result-content">{{ result.content|safe }}</p>{% endif %}
</div>
</div>
diff --git a/searx/templates/oscar/results.html b/searx/templates/oscar/results.html index e71be325a..0ae83e74b 100644 --- a/searx/templates/oscar/results.html +++ b/searx/templates/oscar/results.html @@ -1,6 +1,6 @@ {% extends "oscar/base.html" %}
-{% block title %}{{ q }} - {% endblock %}
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&format=rss&{% for category in selected_categories %}category_{{ category }}=1&{% endfor %}pageno={{ pageno }}&time_range={{ time_range }}">{% endblock %}
+{% block title %}{{ q|e }} - {% endblock %}
+{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&format=rss&{% for category in selected_categories %}category_{{ category }}=1&{% endfor %}pageno={{ pageno }}&time_range={{ time_range }}">{% endblock %}
{% block content %}
<div class="row">
<div class="col-sm-8" id="main_results">
@@ -37,9 +37,9 @@ <div id="pagination">
<div class="pull-left">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="pageno" value="{{ pageno+1 }}" />
<input type="hidden" name="time_range" value="{{ time_range }}" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>
@@ -59,7 +59,7 @@ <div id="pagination">
<div class="pull-left">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
<input type="hidden" name="pageno" value="{{ pageno-1 }}" />
<input type="hidden" name="time_range" value="{{ time_range }}" />
@@ -69,7 +69,7 @@ <div class="pull-right">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
- <input type="hidden" name="q" value="{{ q }}" />
+ <input type="hidden" name="q" value="{{ q|e }}" />
<input type="hidden" name="pageno" value="{{ pageno+1 }}" />
<input type="hidden" name="time_range" value="{{ time_range }}" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>
@@ -130,7 +130,7 @@ <div class="clearfix"></div>
{% for output_type in ('csv', 'json', 'rss') %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="form-inline pull-{% if rtl %}right{% else %}left{% endif %} result_download">
- <input type="hidden" name="q" value="{{ q }}">
+ <input type="hidden" name="q" value="{{ q|e }}">
<input type="hidden" name="format" value="{{ output_type }}">
{% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1">{% endfor %}
<input type="hidden" name="pageno" value="{{ pageno }}">
diff --git a/searx/templates/oscar/time-range.html b/searx/templates/oscar/time-range.html index 4a13c4fdb..6ce1b91cb 100644 --- a/searx/templates/oscar/time-range.html +++ b/searx/templates/oscar/time-range.html @@ -11,4 +11,7 @@ <option id="time-range-month" value="month" {{ "selected" if time_range=="month" else ""}}> {{ _('Last month') }} </option> + <option id="time-range-year" value="year" {{ "selected" if time_range=="year" else ""}}> + {{ _('Last year') }} + </option> </select> diff --git a/searx/templates/pix-art/404.html b/searx/templates/pix-art/404.html new file mode 100644 index 000000000..592e8610f --- /dev/null +++ b/searx/templates/pix-art/404.html @@ -0,0 +1,9 @@ +{% extends "pix-art/base.html" %} +{% block content %} +<div class="center"> + <h1>{{ _('Page not found') }}</h1> + {% autoescape false %} + <p>{{ _('Go to %(search_page)s.', search_page='<a href="{}">{}</a>'.decode('utf-8').format(url_for('index'), _('search page'))) }}</p> + {% endautoescape %} +</div> +{% endblock %} diff --git a/searx/templates/pix-art/about.html b/searx/templates/pix-art/about.html index cb4b351f8..041b036f2 100644 --- a/searx/templates/pix-art/about.html +++ b/searx/templates/pix-art/about.html @@ -5,20 +5,20 @@ <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users. </p> - <h2>Why use Searx?</h2> + <h2>Why use searx?</h2> <ul> - <li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> - <li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> - <li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> + <li>searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li> + <li>searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li> + <li>searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li> </ul> <p>If you do care about privacy, want to be a conscious user, or otherwise believe - in digital freedom, make Searx your default search engine or run it on your own server</p> + in digital freedom, make searx your default search engine or run it on your own server</p> <h2>Technical details - How does it work?</h2> <p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, -inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br /> -It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if Searx used from the search bar it performs GET requests.<br /> +inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>.<br /> +It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if searx used from the search bar it performs GET requests.<br /> Searx can be added to your browser's search bar; moreover, it can be set as the default search engine. </p> diff --git a/searx/templates/pix-art/base.html b/searx/templates/pix-art/base.html index 578180c84..6af8823cc 100644 --- a/searx/templates/pix-art/base.html +++ b/searx/templates/pix-art/base.html @@ -2,7 +2,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}> <head> <meta charset="UTF-8" /> - <meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" /> + <meta name="description" content="searx - a privacy-respecting, hackable metasearch engine" /> <meta name="keywords" content="searx, search, search engine, metasearch, meta search" /> <meta name="generator" content="searx/{{ searx_version }}"> <meta name="referrer" content="no-referrer"> diff --git a/searx/templates/pix-art/index.html b/searx/templates/pix-art/index.html index d398cc829..a0c61f975 100644 --- a/searx/templates/pix-art/index.html +++ b/searx/templates/pix-art/index.html @@ -1,7 +1,7 @@ {% extends "pix-art/base.html" %} {% block content %} <div class="center"> - <div class="title"><h1><img src="{{ url_for('static', filename='img/searx-pixel.png') }}" alt="Searx Logo"/></h1></div> + <div class="title"><h1><img src="{{ url_for('static', filename='img/searx-pixel.png') }}" alt="searx Logo"/></h1></div> {% include 'pix-art/search.html' %} <p class="top_margin"> <a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a> diff --git a/searx/templates/pix-art/preferences.html b/searx/templates/pix-art/preferences.html index a4a6cd268..ea5557b07 100644 --- a/searx/templates/pix-art/preferences.html +++ b/searx/templates/pix-art/preferences.html @@ -1,4 +1,4 @@ -{% extends "default/base.html" %} +{% extends "legacy/base.html" %} {% block head %} {% endblock %} {% block content %} <div class="row"> diff --git a/searx/templates/pix-art/results.html b/searx/templates/pix-art/results.html index 9385b608a..8999e0513 100644 --- a/searx/templates/pix-art/results.html +++ b/searx/templates/pix-art/results.html @@ -5,10 +5,10 @@ {% endfor %} {% else %} {% extends "pix-art/base.html" %} -{% block title %}{{ q }} - {% endblock %} +{% block title %}{{ q|e }} - {% endblock %} {% block meta %}{% endblock %} {% block content %} -<div id="logo"><a href="./"><img src="{{ url_for('static', filename='img/searx-pixel-small.png') }}" alt="Searx Logo"/></a></div> +<div id="logo"><a href="./"><img src="{{ url_for('static', filename='img/searx-pixel-small.png') }}" alt="searx Logo"/></a></div> <div class="preferences_container right"><a href="{{ url_for('preferences') }}" id="preferences"><span>preferences</span></a></div> <div class="small search center"> {% include 'pix-art/search.html' %} @@ -25,8 +25,8 @@ </span> <div id="pagination"> <br /> - <input type="button" onclick="load_more('{{ q }}', {{ pageno+1 }})" id="load_more" value="{{ _('Load more...') }}" /> + <input type="button" onclick="load_more('{{ q|e }}', {{ pageno+1 }})" id="load_more" value="{{ _('Load more...') }}" /> </div> </div> {% endblock %} -{% endif %}
\ No newline at end of file +{% endif %} diff --git a/searx/templates/pix-art/stats.html b/searx/templates/pix-art/stats.html index 70fe98ac7..372447e23 100644 --- a/searx/templates/pix-art/stats.html +++ b/searx/templates/pix-art/stats.html @@ -1,4 +1,4 @@ -{% extends "default/base.html" %} +{% extends "legacy/base.html" %} {% block head %} {% endblock %} {% block content %} <h2>{{ _('Engine stats') }}</h2> diff --git a/searx/translations/bg/LC_MESSAGES/messages.mo b/searx/translations/bg/LC_MESSAGES/messages.mo Binary files differindex 887d052bd..926beb989 100644 --- a/searx/translations/bg/LC_MESSAGES/messages.mo +++ b/searx/translations/bg/LC_MESSAGES/messages.mo diff --git a/searx/translations/bg/LC_MESSAGES/messages.po b/searx/translations/bg/LC_MESSAGES/messages.po index b5f443001..82fa87c99 100644 --- a/searx/translations/bg/LC_MESSAGES/messages.po +++ b/searx/translations/bg/LC_MESSAGES/messages.po @@ -3,94 +3,124 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: -# poke amom <van_ds_ff@mail.bg>, 2015 +# ubone <van_ds_ff@mail.bg>, 2015 +# ubone <van_ds_ff@mail.bg>, 2016 msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Bulgarian (http://www.transifex.com/asciimoo/searx/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "файлове" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" -msgstr "общ" +msgstr "общо" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "музика" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "социална мрежа" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "изображения" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "видео" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" -msgstr "ай-ти" +msgstr "IT" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "новини" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "карта" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" -msgstr "" +msgstr "наука" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "преди {minutes} минута(минути)" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "преди {hours} час(ове), {minutes} минута(минути)" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Страницата зарежда (сек)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Брой резултати" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Грешки" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Поправи HTTP връзки на HTTPS, ако е възможно" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Търси при избор на категория" @@ -105,7 +135,7 @@ msgstr "Търси веднага при избрана категория. Из msgid "" "Displays your IP if the query is \"ip\" and your user agent if the query " "contains \"user agent\"." -msgstr "" +msgstr "Показва IP-то ви и др. инфо, ако търсенето е \"ip\" или \"user agent\"." #: searx/plugins/tracker_url_remover.py:26 msgid "Tracker URL remover" @@ -115,6 +145,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -201,8 +257,8 @@ msgstr "Метод" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Безопасно търсене" @@ -260,31 +316,30 @@ msgid "Red" msgstr "Червено" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Използвани търсачки в момента " #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Име на търсачка" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Категория" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -292,17 +347,16 @@ msgstr "Позволи" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Забрани" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -310,43 +364,43 @@ msgid "" msgstr "Тези настройки се съхраняват във вашите бисквитки. Това ни позволява да не съхраняваме тази информация за вас." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " "track you." -msgstr "Тези бисквитки служат за ваше удобство. Ние не ги използваме, за да Ви следим." +msgstr "Тези бисквитки служат за ваше удобство. Ние не ги използваме, за да ви следим." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "запази" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Върни първоначалните" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "назад" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Търси URL" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Свали резултатите" @@ -357,19 +411,19 @@ msgstr "Отговори" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Предложения" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "предишна страница" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "следваща страница" @@ -405,13 +459,13 @@ msgstr "Лийчър" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "магнитна връзка" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "торент файл" @@ -419,18 +473,37 @@ msgstr "торент файл" msgid "Click on the magnifier to perform search" msgstr "Кликнете лупичката, за да изпълните търсене" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "кеширана" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "" @@ -448,17 +521,17 @@ msgid "General" msgstr "Общи" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Търсачки" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Добавки" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Бисквитки" @@ -493,36 +566,46 @@ msgstr "Филтрирай съдържание" msgid "Change searx layout" msgstr "Промени оформлението на searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Пряк път" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "Средно време" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "Макс. време" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "Това е списък на бисквитки с техните стойности, които searx съхранява на вашия компютър." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Име на бисквитката" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Стойност" @@ -530,7 +613,7 @@ msgstr "Стойност" msgid "Search results" msgstr "Резултати от търсенето" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Връзки" @@ -539,18 +622,26 @@ msgstr "Връзки" msgid "Start search" msgstr "Започни търсене" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Покажи филтрите за търсене" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Скрий филтрите за търсене" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "статистики" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/de/LC_MESSAGES/messages.mo b/searx/translations/de/LC_MESSAGES/messages.mo Binary files differindex 7d3451265..41b91a9a9 100644 --- a/searx/translations/de/LC_MESSAGES/messages.mo +++ b/searx/translations/de/LC_MESSAGES/messages.mo diff --git a/searx/translations/de/LC_MESSAGES/messages.po b/searx/translations/de/LC_MESSAGES/messages.po index 2ba9cc51e..0b12358a5 100644 --- a/searx/translations/de/LC_MESSAGES/messages.po +++ b/searx/translations/de/LC_MESSAGES/messages.po @@ -15,89 +15,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:07+0000\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 18:40+0000\n" "Last-Translator: Thomas Pointhuber\n" "Language-Team: German (http://www.transifex.com/asciimoo/searx/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "Dateien" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "Allgemein" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "Musik" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "Soziale Medien" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "Bilder" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "Videos" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "IT" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "Neuigkeiten" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "Karte" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "Wissenschaft" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "vor {minutes} Minute(n)" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "vor {hours} Stunde(n), {minutes} Minute(n)" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Ladezeit (sek)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Trefferanzahl" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Punkte" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Punkte pro Treffer" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Fehler" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "DOAI umschreiben" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "Vermeidet Bezahlschranken durch die Weiterleitung zu der Open-Access Version falls möglich" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Wandelt wenn möglich HTTP Links in HTTPS Links um" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "Undendliches Scrollen" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "Lädt automatisch die nächste Seite wenn das Ende der aktuellen Seite erreicht wurde" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "Öffne Links in einem neuen Browser Tab" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "Links werden normalerweise im gleichen Fenster geöffnet. Dieses Plugin überschreibt dieses Verhalten und öffnet Links in einem neuen Browser Tab bzw Fenster.\n(es wird JavaScript benötigt)" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Starte Suche wenn Kategorie angeklickt wird" @@ -122,6 +151,32 @@ msgstr "Tracker-URL entferner" msgid "Remove trackers arguments from the returned URL" msgstr "Entferne Tracker Argumente von den URLs" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "Vim angelehnte Tastenkombinationen" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "Navigiere in der Ergebnisseite mit Vim ähnlichen Tastataurkombinationen (es wird JavaScript benötigt).\nDrücke \"h\" auf der Start bzw. Ergebnisseite um eine Hifefenster anzuzeigen" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "Seite nicht gefunden" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "Gehe zu %(search_page)s." + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "Suchseite" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -208,8 +263,8 @@ msgstr "Methode" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Sichere Suche (SafeSearch)" @@ -267,31 +322,30 @@ msgid "Red" msgstr "Rot" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Aktuell benutzte Suchmaschinen" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Suchmaschinenname" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Kategorie" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -299,17 +353,16 @@ msgstr "Erlauben" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Blockieren" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -317,8 +370,8 @@ msgid "" msgstr "Diese Informationen werden in Cookies auf Ihrem Rechner gespeichert, damit wir keine Ihrer persönlichen Daten speichern müssen." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -326,34 +379,34 @@ msgid "" msgstr "Diese Cookies dienen einzig Ihrem Komfort. Wir verwenden sie nicht, um Sie zu überwachen." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "Speichern" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Zurücksetzen" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "Zurück" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Such-URL" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Ergebnisse herunterladen" @@ -364,19 +417,19 @@ msgstr "Antworten" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Vorschläge" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "vorherige Seite" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "nächste Seite" @@ -412,13 +465,13 @@ msgstr "Leecher" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "Magnet Link" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "Torrent" @@ -426,18 +479,37 @@ msgstr "Torrent" msgid "Click on the magnifier to perform search" msgstr "klicke auf die Lupe, um die Suche zu starten" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "Ergebniss in neuem Tab" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "Ein" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "Aus" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "Im Cache" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "Experteneinstellungen" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Powered by" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "eine privatsphären-respektierende, hackbare Metasuchmaschine" @@ -455,17 +527,17 @@ msgid "General" msgstr "Allgemein" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Suchmaschinen" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Erweiterungen" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Cookies" @@ -500,36 +572,46 @@ msgstr "Inhalte filtern" msgid "Change searx layout" msgstr "ändere das Aussehen von searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "wähle das Aussehen des Design" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "Aussehen" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Abkürzung" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "mittlere Zeit" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "max. Zeit" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "Diese Liste zeigt alle Daten welche searx auf deinem Computer speichert." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "Mit dieser Liste können Sie die Transparenz von searx bewerten" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Cookie Name" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Wert" @@ -537,7 +619,7 @@ msgstr "Wert" msgid "Search results" msgstr "Suchergebnisse" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Links" @@ -546,18 +628,26 @@ msgstr "Links" msgid "Start search" msgstr "Suche starten" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Suchfilter anzeigen" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Suchfilter verstecken" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "Statistiken" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "Jederzeit" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "Letzter Tag" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "Letzte Woche" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "Letztes Monat" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.mo b/searx/translations/el_GR/LC_MESSAGES/messages.mo Binary files differindex 385bcbc84..2da4ee02e 100644 --- a/searx/translations/el_GR/LC_MESSAGES/messages.mo +++ b/searx/translations/el_GR/LC_MESSAGES/messages.mo diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.po b/searx/translations/el_GR/LC_MESSAGES/messages.po index 73b49e27f..5d62b3ce5 100644 --- a/searx/translations/el_GR/LC_MESSAGES/messages.po +++ b/searx/translations/el_GR/LC_MESSAGES/messages.po @@ -8,89 +8,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Greek (Greece) (http://www.transifex.com/asciimoo/searx/language/el_GR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: el_GR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "αρχεία" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "γενικά" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "μουσική" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "κοινωνικά δίκτυα" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "εικόνες" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "νέα" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "χάρτης" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Αριθμός αποτελεσμάτων" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Λάθη" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "" @@ -115,6 +144,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -201,8 +256,8 @@ msgstr "Μέθοδος" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "" @@ -260,31 +315,30 @@ msgid "Red" msgstr "Κόκκινο" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Κατηγορία" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -292,17 +346,16 @@ msgstr "" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -310,8 +363,8 @@ msgid "" msgstr "" #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -319,34 +372,34 @@ msgid "" msgstr "" #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "αποθήκευση" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "πίσω" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "" @@ -357,19 +410,19 @@ msgstr "Απαντήσεις" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Προτάσεις" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "προηγούμενη σελίδα" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "επόμενη σελίδα" @@ -405,13 +458,13 @@ msgstr "" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "" @@ -419,18 +472,37 @@ msgstr "" msgid "Click on the magnifier to perform search" msgstr "" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "" @@ -448,17 +520,17 @@ msgid "General" msgstr "" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "" @@ -493,36 +565,46 @@ msgstr "" msgid "Change searx layout" msgstr "" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "" @@ -530,7 +612,7 @@ msgstr "" msgid "Search results" msgstr "Αποτελέσματα αναζήτησης" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Σύνδεσμοι" @@ -539,18 +621,26 @@ msgstr "Σύνδεσμοι" msgid "Start search" msgstr "Έναρξη αναζήτησης" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Προβολή φίλτρων αναζήτησης" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Απόκρυψη φίλτρων αναζήτησης" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "στατιστικά" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/en/LC_MESSAGES/messages.mo b/searx/translations/en/LC_MESSAGES/messages.mo Binary files differindex e852afc30..48bf06224 100644 --- a/searx/translations/en/LC_MESSAGES/messages.mo +++ b/searx/translations/en/LC_MESSAGES/messages.mo diff --git a/searx/translations/eo/LC_MESSAGES/messages.mo b/searx/translations/eo/LC_MESSAGES/messages.mo Binary files differindex d9d1d5fc8..fcddb7d41 100644 --- a/searx/translations/eo/LC_MESSAGES/messages.mo +++ b/searx/translations/eo/LC_MESSAGES/messages.mo diff --git a/searx/translations/eo/LC_MESSAGES/messages.po b/searx/translations/eo/LC_MESSAGES/messages.po index 51323c264..861b0d379 100644 --- a/searx/translations/eo/LC_MESSAGES/messages.po +++ b/searx/translations/eo/LC_MESSAGES/messages.po @@ -3,94 +3,123 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: -# juanda097 <juanda097@openmailbox.org>, 2015 +# juanda097 <juanda097@openmailbox.org>, 2015-2016 msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Esperanto (http://www.transifex.com/asciimoo/searx/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "dosieroj" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "ĝenerala" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "muziko" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "sociaj retservoj" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "bildoj" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "videoj" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "novaĵoj" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "mapo" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" -msgstr "" +msgstr "scienco" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Nombro de rezultoj" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Poentaroj" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Poentaroj por unu rezulto" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Eraroj" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Reverki HTTP ligiloj HTTP se eble" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "" @@ -115,6 +144,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -196,15 +251,15 @@ msgstr "" #: searx/templates/oscar/preferences.html:85 #: searx/templates/pix-art/preferences.html:30 msgid "Method" -msgstr "" +msgstr "Metodo" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" -msgstr "" +msgstr " SekuraSerĉo" #: searx/templates/courgette/preferences.html:66 #: searx/templates/default/preferences.html:67 @@ -260,31 +315,30 @@ msgid "Red" msgstr "Ruĝa" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" -msgstr "" +msgstr " Aktuale uzitajn serĉilojn" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" -msgstr "" +msgstr " Motoro nomo" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Kategorio" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -292,17 +346,16 @@ msgstr "Permesi" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Bloko" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -310,8 +363,8 @@ msgid "" msgstr "" #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -319,34 +372,34 @@ msgid "" msgstr "" #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Deŝuto rezultoj" @@ -357,21 +410,21 @@ msgstr "Respondoj" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" -msgstr "" +msgstr " antaŭa paĝo" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" -msgstr "" +msgstr " sekvanta paĝo" #: searx/templates/courgette/search.html:3 #: searx/templates/default/search.html:3 searx/templates/oscar/search.html:4 @@ -405,13 +458,13 @@ msgstr "" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "" @@ -419,18 +472,37 @@ msgstr "" msgid "Click on the magnifier to perform search" msgstr "" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "" @@ -445,20 +517,20 @@ msgstr "" #: searx/templates/oscar/preferences.html:17 #: searx/templates/oscar/preferences.html:25 msgid "General" -msgstr "" +msgstr "Ĝenerala" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" -msgstr "" +msgstr "Motoroj" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "" @@ -493,36 +565,46 @@ msgstr "" msgid "Change searx layout" msgstr "" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "" @@ -530,26 +612,34 @@ msgstr "" msgid "Search results" msgstr "Serĉrezultoj" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "" #: searx/templates/oscar/search.html:6 #: searx/templates/oscar/search_full.html:11 msgid "Start search" +msgstr "Komenco serĉo" + +#: searx/templates/oscar/stats.html:2 +msgid "stats" +msgstr "statistiko" + +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" msgstr "" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" msgstr "" -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" msgstr "" -#: searx/templates/oscar/stats.html:2 -msgid "stats" -msgstr "statistiko" +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 diff --git a/searx/translations/es/LC_MESSAGES/messages.mo b/searx/translations/es/LC_MESSAGES/messages.mo Binary files differindex 1afc7256d..49c156f2e 100644 --- a/searx/translations/es/LC_MESSAGES/messages.mo +++ b/searx/translations/es/LC_MESSAGES/messages.mo diff --git a/searx/translations/es/LC_MESSAGES/messages.po b/searx/translations/es/LC_MESSAGES/messages.po index de6c0a438..332ffc60b 100644 --- a/searx/translations/es/LC_MESSAGES/messages.po +++ b/searx/translations/es/LC_MESSAGES/messages.po @@ -7,94 +7,125 @@ # Alejandro León Aznar, 2014 # Alejandro León Aznar, 2014-2015 # juanda097 <juanda097@openmailbox.org>, 2016 +# marc, 2016 # Oscar Carrero <ocf@openmailbox.org>, 2015 +# wefwefew ewfewfewf <nnnedmz0d@moakt.ws>, 2016 msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-02-24 23:02+0000\n" -"Last-Translator: juanda097 <juanda097@openmailbox.org>\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Spanish (http://www.transifex.com/asciimoo/searx/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "Archivos" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "General" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "Música" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "Medios sociales" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "Imágenes" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "Vídeos" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" -msgstr "TIC" +msgstr "Informática" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" -msgstr "noticias" +msgstr "Noticias" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" -msgstr "mapa" +msgstr "Mapa" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" -msgstr "ciencia" +msgstr "Ciencia" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "hace {minutes} minuto(s)" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "hace {hours} hora(s) y {minutes} minuto(s)" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Tiempo de carga (segundos)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Número de resultados" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Puntuaciones" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Puntuaciones por resultado" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Errores" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Cambiar los enlaces HTTP a HTTPS si es posible" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "Abrir los enlaces del resultado en una nueva pestaña del navegador" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "Los resultados se abren en la misma ventana por defecto. Este plugin sobrescribe el comportamiento por defecto para abrir enlaces en nuevas pestañas / ventanas. (es necesario JavaScript)" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Buscar en la categoría seleccionada" @@ -119,6 +150,32 @@ msgstr "Eliminador de URL rastreadora" msgid "Remove trackers arguments from the returned URL" msgstr "Eliminar los argumentos de los rastreadores en la URL devuelta" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "Teclas de acceso rápido como-Vim" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "Navegar por los resultados de búsqueda con las teclas de acceso rápido como-Vim (es necesario JavaScript). Pulse la tecla \"h\" en la página principal o en el resultado para obtener ayuda." + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -205,8 +262,8 @@ msgstr "Método" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Búsqueda segura" @@ -264,31 +321,30 @@ msgid "Red" msgstr "Rojo" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Motores de búsqueda actualmente en uso" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Nombre del motor de búsqueda" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Categoría" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -296,17 +352,16 @@ msgstr "Permitir" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Bloquear" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -314,8 +369,8 @@ msgid "" msgstr "Esta configuración se guarda en sus cookies, lo que nos permite no almacenar dicha información sobre usted." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -323,34 +378,34 @@ msgid "" msgstr "Estas cookies son para su propia comodidad, no las utilizamos para rastrearle." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "Guardar" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Restablecer configuración por defecto" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "Atrás" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "URL de la búsqueda" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Descargar resultados" @@ -361,19 +416,19 @@ msgstr "Respuestas" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Sugerencias" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "Página anterior" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "Página siguiente" @@ -409,13 +464,13 @@ msgstr "Descargador" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "magnet link (enlace sin archivo)" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "archivo torrent" @@ -423,18 +478,37 @@ msgstr "archivo torrent" msgid "Click on the magnifier to perform search" msgstr "Haz clic en la lupa para realizar la búsqueda" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "en caché" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Creado por" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "un metabuscador hackable que respeta la privacidad" @@ -452,17 +526,17 @@ msgid "General" msgstr "General" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Motores" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Plugins" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Cookies" @@ -497,36 +571,46 @@ msgstr "Filtro de contenido" msgid "Change searx layout" msgstr "Cambiar aspecto de searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "Elige un estilo para este tema" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "Estilo" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Atajo" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "Tiempo promedio" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "Tiempo máximo" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "Esta es la lista de cookies y sus valores que searx está almacenando en tu ordenador." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "Con esa lista puedes valorar la transparencia de searx." -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Nombre de la cookie" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Valor" @@ -534,7 +618,7 @@ msgstr "Valor" msgid "Search results" msgstr "Buscar" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Enlaces" @@ -543,18 +627,26 @@ msgstr "Enlaces" msgid "Start search" msgstr "Comenzar búsqueda" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Mostrar filtros de búsqueda" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Ocultar filtros de búsqueda" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "estadísitcas" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/fr/LC_MESSAGES/messages.mo b/searx/translations/fr/LC_MESSAGES/messages.mo Binary files differindex d33c51b63..c21b8415b 100644 --- a/searx/translations/fr/LC_MESSAGES/messages.mo +++ b/searx/translations/fr/LC_MESSAGES/messages.mo diff --git a/searx/translations/fr/LC_MESSAGES/messages.po b/searx/translations/fr/LC_MESSAGES/messages.po index 77ccaa28e..3a2843757 100644 --- a/searx/translations/fr/LC_MESSAGES/messages.po +++ b/searx/translations/fr/LC_MESSAGES/messages.po @@ -13,89 +13,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:31+0000\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 17:58+0000\n" "Last-Translator: Cqoicebordel <david.barouh@wanadoo.fr>\n" "Language-Team: French (http://www.transifex.com/asciimoo/searx/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "fichiers" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "général" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "musique" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "réseaux sociaux" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "images" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "vidéos" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "informatique" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "actus" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "carte" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "science" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "il y a {minutes} minute(s)" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "il y a {hours} heure(s), {minutes} minute(s)" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Chargement de la page (sec)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Nombre de résultats" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Score" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Score par résultat" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Erreurs" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "Utiliser DOAI" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "Contourne les verrous payants de certaines publications scientifiques en redirigeant vers la version ouverte de ces papiers si elle est disponible." + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Réécrire les liens HTTP en HTTPS si possible" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "Défilement infini" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "Charge automatiquement la page suivante quand vous arriver en bas de la page" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "Ouvrir les liens de résultats dans un nouvel onglet" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "Les résultats sont ouvert dans la même fenêtre par défaut. Cette extension change le comportement par défaut pour ouvrir les liens dans des nouveaux onglets ou fenêtres (Javascript est nécessaire)" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Lancer la recherche lors du choix d'une catégorie" @@ -120,6 +149,32 @@ msgstr "Nettoyeur d'URL de suivis" msgid "Remove trackers arguments from the returned URL" msgstr "Retire les arguments utilisés pour vous pister des URL retournées" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "Raccourcis comme Vim" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "Parcourez les résultats de recherche avec des raccourcis clavier similaires à Vim (Javascript est nécessaire. Appuyez sur \"h\" dans la fenêtre principale de résultats pour afficher de l'aide." + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "Page non trouvée" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "Aller à %(search_page)s." + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "la page d'accueil" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -206,8 +261,8 @@ msgstr "Méthode" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Recherche sécurisée" @@ -265,31 +320,30 @@ msgid "Red" msgstr "Rouge" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Moteurs de recherche actuellement utilisés" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Nom du moteur" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Catégorie" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -297,17 +351,16 @@ msgstr "Autoriser" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Bloquer" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -315,8 +368,8 @@ msgid "" msgstr "Ces paramètres sont stockés dans vos cookies ; ceci nous permet de ne pas collecter vos données." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -324,34 +377,34 @@ msgid "" msgstr "Ces cookies existent pour votre confort d'utilisation, nous ne les utilisons pas pour vous espionner." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "enregistrer" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Remettre les valeurs par défaut" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "retour" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "URL de recherche" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Télécharger les résultats" @@ -362,19 +415,19 @@ msgstr "Réponses" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Suggestions" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "page précédente" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "page suivante" @@ -410,13 +463,13 @@ msgstr "Téléchargeurs" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "lien magnet" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "fichier torrent" @@ -424,18 +477,37 @@ msgstr "fichier torrent" msgid "Click on the magnifier to perform search" msgstr "Cliquez sur la loupe pour effectuer une recherche" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "Résultats dans de nouveaux onglets" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "On" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "Off" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "en cache" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "Paramètres avancés" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Powered by" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "un meta-moteur de recherche hackable et respectueux de la vie privée" @@ -453,17 +525,17 @@ msgid "General" msgstr "Général" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Moteurs" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Plugins" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Cookies" @@ -498,36 +570,46 @@ msgstr "Filtrer le contenu" msgid "Change searx layout" msgstr "Modifier l'affichage de searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "Choisir un style pour ce thème" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "Style" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Raccourcis" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "Temps moy." -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "Temps max" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "C'est une liste de cookies et de leurs valeurs que searx enregistre sur votre ordinateur." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "Avec cette liste, vous pouvez juger de la transparence de searx." -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Nom du cookie" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Valeur" @@ -535,7 +617,7 @@ msgstr "Valeur" msgid "Search results" msgstr "Résultats de recherche" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Liens" @@ -544,18 +626,26 @@ msgstr "Liens" msgid "Start search" msgstr "Lancer une recherche" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Afficher les filtres de recherche" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Cacher les filtres de recherche" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "statistiques" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "N'importe quand" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "Dernières 24h" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "Semaine précédente" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "Mois précédent" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 @@ -586,7 +676,7 @@ msgstr "Information !" #: searx/templates/oscar/messages/no_cookies.html:4 msgid "currently, there are no cookies defined." -msgstr "il n'y a pas de cookies définit pour le moment." +msgstr "il n'y a pas de cookies définis pour le moment." #: searx/templates/oscar/messages/no_data_available.html:4 msgid "There is currently no data available. " diff --git a/searx/translations/he/LC_MESSAGES/messages.mo b/searx/translations/he/LC_MESSAGES/messages.mo Binary files differindex 4458e0f3c..743ed6bb5 100644 --- a/searx/translations/he/LC_MESSAGES/messages.mo +++ b/searx/translations/he/LC_MESSAGES/messages.mo diff --git a/searx/translations/he/LC_MESSAGES/messages.po b/searx/translations/he/LC_MESSAGES/messages.po index 753d25dfa..19830743c 100644 --- a/searx/translations/he/LC_MESSAGES/messages.po +++ b/searx/translations/he/LC_MESSAGES/messages.po @@ -12,112 +12,167 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-03-01 15:21+0000\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-05 18:36+0000\n" "Last-Translator: GenghisKhan <genghiskhan@gmx.ca>\n" "Language-Team: Hebrew (http://www.transifex.com/asciimoo/searx/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "קבצים" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "כללי" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "מוזיקה" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "מדיה חברתית" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "תמונות" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "סרטונים" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "IT" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "חדשות" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" -msgstr "מפה" +msgstr "מפות" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "מדע" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "לפני {minutes} דקות" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "לפני {hours} שעות, {minutes} דקות" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "עומס עמוד (שניות)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "מספר תוצאות" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "דירוג" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "דירוג לכל תוצאה" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "שגיאות" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "שכתוב DOAI" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" -msgstr "שכתב קישורי HTTP לקישורי HTTPS כאשר אפשר" +msgstr "שכתוב קישורי HTTP לקישורי HTTPS כאשר ניתן" + +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "גלילה אינסופית" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "טען אוטומטית עמוד הלאה כאשר גוללים לתחתית של עמוד נוכחי" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "פתח קישורי תוצאה בכרטיסיות דפדפן חדשות" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "תוצאות נפתחות בתוך אותו חלון באופן שגרתי. תוסף זה משכתב את ההתנהגות השגרתית כדי לפתוח קישורים בתוך כרטיסיות/חלונות חדשים. (JavaScript נדרש)" #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" -msgstr "חפש בעת בחירת קטגוריה" +msgstr "חיפוש בעת בחירת קטגוריה" #: searx/plugins/search_on_category_select.py:19 msgid "" "Perform search immediately if a category selected. Disable to select " "multiple categories. (JavaScript required)" -msgstr "בצע חיפוש כאשר קטגוריה נבחרת. נטרל כדי לבחור קטגוריות מרובות. (מצריך JavaScript)" +msgstr "ביצוע חיפוש כאשר קטגוריה נבחרת. יש לנטרל את תוסף זה כדי לבחור קטגוריות מרובות. (מצריך JavaScript)" #: searx/plugins/self_info.py:20 msgid "" "Displays your IP if the query is \"ip\" and your user agent if the query " "contains \"user agent\"." -msgstr "מציגה כתובת IP המשוייכת לך אם השאילתא היא \"ip\" וגם סוכן משתמש אם שאילתא מכילה \"user agent\"." +msgstr "הצגת כתובת IP המשוייכת לך אם השאילתא היא \"ip\" וגם סוכן משתמש אם השאילתא מכילה \"user agent\"." #: searx/plugins/tracker_url_remover.py:26 msgid "Tracker URL remover" -msgstr "מסיר URL גשש" +msgstr "הסרת Tracker URL" #: searx/plugins/tracker_url_remover.py:27 msgid "Remove trackers arguments from the returned URL" -msgstr "הסר ארגומנטים מאתרים מתוך URL מוחזר" +msgstr "הסרת ארגומנטים מאתרים מתוך URL מוחזר" + +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "מקשים חמים Vim-like" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "ניווט בתוצאות בעזרת מקשים חמים Vim-like (JavaScript נדרש). לחיצה על קליד \"h\" במסך ראשי או תוצאות תציג דו שיח עזרה." + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "עמוד לא נמצא" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "עבור אל %(search_page)s." + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 @@ -205,8 +260,8 @@ msgstr "שיטה" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "חיפוש בטוח" @@ -233,7 +288,7 @@ msgstr "בלי" #: searx/templates/oscar/preferences.html:104 #: searx/templates/pix-art/preferences.html:39 msgid "Themes" -msgstr "מוטיבים" +msgstr "עיצובים" #: searx/templates/courgette/preferences.html:83 msgid "Color" @@ -264,31 +319,30 @@ msgid "Red" msgstr "אדום" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "מנועי חיפוש בשימוש עתה" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "שם מנוע" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "קטגוריה" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -296,17 +350,16 @@ msgstr "התר" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "חסום" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -314,8 +367,8 @@ msgid "" msgstr "הגדרות אלו מאוחסנות בתוך העוגיות שלך, אלו מאפשרות לנו לא לאחסן את מידע זה אודותייך." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -323,34 +376,34 @@ msgid "" msgstr "עוגיות אלו משרתות את נוחותך הבלעדית, אנחנו לא משתמשים בהן כדי לעקוב אחריך." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "שמור" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "אפס ברירות מחדל" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "חזור" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "קישור חיפוש" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "הורד תוצאות" @@ -361,19 +414,19 @@ msgstr "תשובות" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "הצעות" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "עמוד קודם" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "עמוד הבא" @@ -409,13 +462,13 @@ msgstr "יונקים" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "קישור magnet" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "קובץ torrent" @@ -423,18 +476,37 @@ msgstr "קובץ torrent" msgid "Click on the magnifier to perform search" msgstr "לחצו על הזכוכית מגדלת כדי לבצע חיפוש" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "תוצאות בכרטיסיות חדשות" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "מוטמן" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "הגדרות מתקדמות" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "מופעל באמצעות" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "מנוע מטא-חיפוש גמיש, ומכבד פרטיות" @@ -444,7 +516,7 @@ msgstr "בית" #: searx/templates/oscar/navbar.html:14 searx/templates/oscar/navbar.html:24 msgid "Toggle navigation" -msgstr "Toggle ניווט" +msgstr "החלף ניווט" #: searx/templates/oscar/preferences.html:17 #: searx/templates/oscar/preferences.html:25 @@ -452,17 +524,17 @@ msgid "General" msgstr "כללי" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "מנועים" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "תוספים" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "עוגיות" @@ -480,53 +552,63 @@ msgstr "מציאת דברים בזמן הקלדה" #: searx/templates/oscar/preferences.html:77 msgid "Proxying image results through searx" -msgstr "שלוף תוצאות תמונה דרך searx" +msgstr "שליפת (מבעד Proxy) תוצאות תמונה דרך searx" #: searx/templates/oscar/preferences.html:86 msgid "" "Change how forms are submited, <a " "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" " rel=\"external\">learn more about request methods</a>" -msgstr "שינוי האופן בו טפסים נשלחים, <a href=\"http://he.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">למדו עוד אודות שיטות בקשה (request methods)</a>" +msgstr "שינוי האופן בו טפסים נשלחים, <a href=\"https://he.wikipedia.org/wiki/Hypertext_Transfer_Protocol#.D7.A9.D7.99.D7.98.D7.95.D7.AA_.D7.91.D7.A7.D7.A9.D7.94\" rel=\"external\">למדו עוד אודות שיטות בקשה (request methods)</a>" #: searx/templates/oscar/preferences.html:95 msgid "Filter content" -msgstr "סנן תוכן" +msgstr "סינון תוכן" #: searx/templates/oscar/preferences.html:105 msgid "Change searx layout" msgstr "שינוי ממשק searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "בחר סגנון עבור עיצוב זה" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "סגנון" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "קיצור דרך" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "זמן ממוצע" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "זמן מירבי" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "זוהי רשימה של עוגיות וערכיהן אשר searx מאחסנת על המחשב שלך." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "בעזרת רשימה זו, באפשרותך לגשת אל searx transparency." -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "שם עוגייה" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "ערך" @@ -534,7 +616,7 @@ msgstr "ערך" msgid "Search results" msgstr "תוצאות חיפוש" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "קישורים" @@ -543,18 +625,26 @@ msgstr "קישורים" msgid "Start search" msgstr "התחל חיפוש" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "הצג מסנני חיפוש" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "הסתר מסנני חיפוש" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "סטטיסטיקות" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "כל עת" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "יום אחרון" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "שבוע אחרון" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "חודש אחרון" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/hu/LC_MESSAGES/messages.mo b/searx/translations/hu/LC_MESSAGES/messages.mo Binary files differindex b418c486a..bf67caea6 100644 --- a/searx/translations/hu/LC_MESSAGES/messages.mo +++ b/searx/translations/hu/LC_MESSAGES/messages.mo diff --git a/searx/translations/hu/LC_MESSAGES/messages.po b/searx/translations/hu/LC_MESSAGES/messages.po index ba2978e42..906b69bb9 100644 --- a/searx/translations/hu/LC_MESSAGES/messages.po +++ b/searx/translations/hu/LC_MESSAGES/messages.po @@ -5,96 +5,126 @@ # Translators: # Adam Tauber <asciimoo@gmail.com>, 2014-2016 # FIRST AUTHOR <EMAIL@ADDRESS>, 2014 +# Noémi Ványi <sitbackandwait@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-02-06 08:36+0000\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:42+0000\n" "Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Hungarian (http://www.transifex.com/asciimoo/searx/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "fájlok" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "általános" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "zene" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "közösségi média" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "képek" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "videók" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "it" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "hírek" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "térkép" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "tudomány" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes} perce" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours} óra, {minutes} perce" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Válaszidők (sec)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Találatok száma" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Pontszámok" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Pontszámok találatonként" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Hibák" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "Szabad publikációs oldalak" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "Publikácós linkeknél szabad forrás használat, amennyiben lehetséges" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "HTTP linkek lecserélése HTTPS-re" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "Végtelenített találatok" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "További találatok automatikus betöltése" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "Találatok megnyitása új lapon" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "A találatok az aktuális oldalon nyílnak meg alapértelmezetten. Ez a plugin megváltoztatja ezt a működést és új lapra nyitja meg a találatokat. (ez a funkció JavaScript-et igényel)" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" -msgstr "Azonnal keresés kategória választással" +msgstr "Azonnali keresés kategória választással" #: searx/plugins/search_on_category_select.py:19 msgid "" @@ -116,6 +146,32 @@ msgstr "Tracker URL eltávolítás" msgid "Remove trackers arguments from the returned URL" msgstr "Felhasználó követéshez használt találati URL paraméterek eltávolítása" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "Vim típusú billentyűzetes navigáció" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "Navigálj néhány gombnyomással a találatok között. Aktiválás után a \"h\" betű lenyomásával jeleníthető meg részletes segítség a használatról. (Ez a funkció JavaScript-et igényel)" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "Az oldal nem található" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "Vissza a %(search_page)s." + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "kereső oldalra" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -202,8 +258,8 @@ msgstr "Method" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Felnőtt tartalom szűrés" @@ -250,7 +306,7 @@ msgstr "Zöld" #: searx/templates/courgette/preferences.html:89 msgid "Cyan" -msgstr "Türkisz" +msgstr "Türkiz" #: searx/templates/courgette/preferences.html:90 msgid "Orange" @@ -261,31 +317,30 @@ msgid "Red" msgstr "Piros" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Jelenleg használt keresők" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Kereső neve" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Kategória" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -293,17 +348,16 @@ msgstr "Engedélyezés" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Tiltás" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -311,8 +365,8 @@ msgid "" msgstr "Ezek a beállítások csak a böngésző cookie-jaiban tárolódnak." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -320,34 +374,34 @@ msgid "" msgstr "Ezek a cookie-k csak kényelmi funkciókat látnak el, nem használjuk a felhasználók követésére." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "mentés" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Alapbeállítások visszaállítása" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "vissza" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Keresési URL" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Találatok letöltése" @@ -358,19 +412,19 @@ msgstr "Válaszok" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Javaslatok" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "előző oldal" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "következő oldal" @@ -406,13 +460,13 @@ msgstr "Leecher" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "magnet link" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "torrent fájl" @@ -420,18 +474,37 @@ msgstr "torrent fájl" msgid "Click on the magnifier to perform search" msgstr "A nagyítóra kattintva indítható a keresés" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "Eredmények új tabon" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "On" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "Off" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "tárolt" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "Keresés beállításai" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Az oldalt kiszolgálja: " -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "egy privátszféra tisztelő, könnyen módosítható metakereső" @@ -449,17 +522,17 @@ msgid "General" msgstr "Általános" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" -msgstr "Kereső motorok" +msgstr "Keresőmotorok" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Pluginek" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Sütik" @@ -494,36 +567,46 @@ msgstr "Tartalom szűrés" msgid "Change searx layout" msgstr "Megjelenés" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "Válassz megjelenést ehhez a témához" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "Megjelenés" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Rövidítés" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "Átlag idő" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "Maximális idő" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "Searx által használt sütik listája." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "Ez a lista a kereső transzparenciáját hivatott megmutatni." -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Süti név" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Érték" @@ -531,7 +614,7 @@ msgstr "Érték" msgid "Search results" msgstr "Keresési eredmények" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Linkek" @@ -540,18 +623,26 @@ msgstr "Linkek" msgid "Start search" msgstr "Keresés indítása" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Keresési szűrők megjelenítése" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Keresési szűrők elrejtése" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "statisztikák" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "Bármikor" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "Legutóbbi nap" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "Legutóbbi hét" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "Legutóbbi hónap" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/it/LC_MESSAGES/messages.mo b/searx/translations/it/LC_MESSAGES/messages.mo Binary files differindex 756f41fb2..9b303e287 100644 --- a/searx/translations/it/LC_MESSAGES/messages.mo +++ b/searx/translations/it/LC_MESSAGES/messages.mo diff --git a/searx/translations/it/LC_MESSAGES/messages.po b/searx/translations/it/LC_MESSAGES/messages.po index 672d1e054..7ad36c87a 100644 --- a/searx/translations/it/LC_MESSAGES/messages.po +++ b/searx/translations/it/LC_MESSAGES/messages.po @@ -10,89 +10,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Italian (http://www.transifex.com/asciimoo/searx/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "documenti" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "generale" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "musica" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "social media" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "immagini" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "video" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "it" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "notizie" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "mappe" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "di {minutes} minuti fa" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "di {ore} h e {minutes} minuti fa" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr " Caricamento della pagina (secondi)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Risultati ottenuti" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Punteggio" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Punteggio per risultato" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Errori" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "" @@ -117,6 +146,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -203,8 +258,8 @@ msgstr "Metodo" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Ricerca rassicurato" @@ -262,31 +317,30 @@ msgid "Red" msgstr "Rosso" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Motori di ricerca attualmente in uso" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Nome del motore" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Categoria" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -294,17 +348,16 @@ msgstr "Autorizza" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Blocca" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -312,8 +365,8 @@ msgid "" msgstr "Queste impostazioni sono salvate nei tuoi cookie, consentendoci di non conservare dati su di te." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -321,34 +374,34 @@ msgid "" msgstr "I cookie sono funzionali ad un servizio migliore. Non usiamo i cookie per sorvegliarti." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "salva" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Azzerare default" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "indietro" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "URL della ricerca" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Scarica i risultati" @@ -359,19 +412,19 @@ msgstr "Riposte" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Suggerimenti" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "pagina precedente" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "pagina successiva" @@ -407,13 +460,13 @@ msgstr "" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "" @@ -421,18 +474,37 @@ msgstr "" msgid "Click on the magnifier to perform search" msgstr "" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "" @@ -450,17 +522,17 @@ msgid "General" msgstr "" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "" @@ -495,36 +567,46 @@ msgstr "" msgid "Change searx layout" msgstr "" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "" @@ -532,7 +614,7 @@ msgstr "" msgid "Search results" msgstr "" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "" @@ -541,16 +623,24 @@ msgstr "" msgid "Start search" msgstr "" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" +#: searx/templates/oscar/stats.html:2 +msgid "stats" msgstr "" -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" msgstr "" -#: searx/templates/oscar/stats.html:2 -msgid "stats" +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" msgstr "" #: searx/templates/oscar/messages/first_time.html:4 diff --git a/searx/translations/ja/LC_MESSAGES/messages.mo b/searx/translations/ja/LC_MESSAGES/messages.mo Binary files differindex e8bb56ed5..3be04b797 100644 --- a/searx/translations/ja/LC_MESSAGES/messages.mo +++ b/searx/translations/ja/LC_MESSAGES/messages.mo diff --git a/searx/translations/ja/LC_MESSAGES/messages.po b/searx/translations/ja/LC_MESSAGES/messages.po index 00158358f..9d0dc7e1c 100644 --- a/searx/translations/ja/LC_MESSAGES/messages.po +++ b/searx/translations/ja/LC_MESSAGES/messages.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: +# Akio Nishimura <akionux@gmail.com>, 2016 # Thomas Pointhuber, 2014-2015 # FIRST AUTHOR <EMAIL@ADDRESS>, 2014,2016 # Lucas Phillips <mail@lep.pw>, 2015 @@ -13,89 +14,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-02-14 00:11+0000\n" -"Last-Translator: Akio Nishimura <akionux@gmail.com>\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Japanese (http://www.transifex.com/asciimoo/searx/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "ファイル" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "一般" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "音楽" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "ソーシャルメディア" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "画像" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "動画" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "情報技術" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "お知らせ" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "地図" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "学問" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes}分前" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours}時間と{minutes}分前" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "ページ読み込み時間 (秒)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "通知の数" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "スコア" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "検索結果当たりスコア" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "エラー" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "可能ならばHTTPリンクをHTTPSリンクに書き換える" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "検索結果のリンクを新しいタブで開く" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "デフォルトでは結果は同じウィンドウで開きます。このプラグインはデフォルトの動作を書き換えて新しいタブ/ウィンドウで開くようにします。(JavaScriptが必要です)" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "カテゴリ選択したら検索を実行" @@ -120,6 +150,32 @@ msgstr "トラッカーURLリムーバー" msgid "Remove trackers arguments from the returned URL" msgstr "返されたURLからトラッカー引数を消去します。" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "Vim風のホットキー" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "検索結果をVim風のホットキーで操作します(JavaScriptが必要)。メインページまたは検索結果ページで\"h\"キーを押してヘルプを表示します。" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -206,8 +262,8 @@ msgstr "方法" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "安全な検索" @@ -265,31 +321,30 @@ msgid "Red" msgstr "赤" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "現在使用中の検索エンジン" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "検索エンジン名" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "カテゴリー" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -297,17 +352,16 @@ msgstr "許可する" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "禁止する" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -315,8 +369,8 @@ msgid "" msgstr "これらの設定はあなたのクッキーに保存されますが、これはサーバーがあなたの情報の保存するわけではありません。" #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -324,34 +378,34 @@ msgid "" msgstr "クッキーはあなたが便利に使えるようにするために使うのであって、サーバーはあなたを追跡するためにクッキーを使うことはありません。" #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "保存" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "デフォルト設定に戻す" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "戻る" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "URLを検索する" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "ダウンロードするファイル形式" @@ -362,19 +416,19 @@ msgstr "回答" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "提案" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "前のページ" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "次のページ" @@ -410,13 +464,13 @@ msgstr "リーチャー" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "マグネットリンク" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "トレントファイル" @@ -424,18 +478,37 @@ msgstr "トレントファイル" msgid "Click on the magnifier to perform search" msgstr "検索を実行するには虫めがねをクリックしてください" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "キャッシュ" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "提供:" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "プライバシー保護を重視した、ハッカブルなメタサーチエンジン" @@ -453,17 +526,17 @@ msgid "General" msgstr "一般設定" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "検索エンジン" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "プラグイン" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "クッキー" @@ -498,36 +571,46 @@ msgstr "コンテンツをフィルタリングする" msgid "Change searx layout" msgstr "searxのレイアウトの変更" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "このテーマのスタイルを選択" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "スタイル" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "ショートカット" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "平均時間" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "最大時間" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "これはクッキーのリストで、これらの値はあなたのコンピュータに保存されています。" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "このリストによって、あなたはsearxの透明性を評価できます。" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "クッキー名" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "値" @@ -535,7 +618,7 @@ msgstr "値" msgid "Search results" msgstr "検索結果" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "リンク" @@ -544,18 +627,26 @@ msgstr "リンク" msgid "Start search" msgstr "検索を開始" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "サーチフィルタを表示" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "サーチフィルタを隠す" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "統計" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/nl/LC_MESSAGES/messages.mo b/searx/translations/nl/LC_MESSAGES/messages.mo Binary files differindex bd55e44fd..744d55e02 100644 --- a/searx/translations/nl/LC_MESSAGES/messages.mo +++ b/searx/translations/nl/LC_MESSAGES/messages.mo diff --git a/searx/translations/nl/LC_MESSAGES/messages.po b/searx/translations/nl/LC_MESSAGES/messages.po index b04ede24b..945bc2c51 100644 --- a/searx/translations/nl/LC_MESSAGES/messages.po +++ b/searx/translations/nl/LC_MESSAGES/messages.po @@ -9,89 +9,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-31 11:35+0000\n" -"Last-Translator: Nathan Follens\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Dutch (http://www.transifex.com/asciimoo/searx/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "bestanden" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "algemeen" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "muziek" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "social media" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "afbeeldingen" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "video's" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "it" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "nieuws" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "kaart" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "wetenschap" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes} min geleden" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours} uur, {minutes} min geleden" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Pagina laadt (sec)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Aantal zoekresultaten" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Scores" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Scores per zoekresultaat" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Fouten" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Herschrijf HTTP-koppelingen naar HTTPS, indien mogelijk" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "Open koppelingen in nieuwe tabbladen" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "Resultaten worden standaard in hetzelfde venster geopend. Deze plug-in overschrijft het standaardgedrag zodat koppelingen in nieuwe tabbladen/vensters geopend worden. (JavaScript vereist)" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Zoeken bij selecteren van categorie" @@ -116,6 +145,32 @@ msgstr "Tracker-URL verwijderaar" msgid "Remove trackers arguments from the returned URL" msgstr "Verwijdert trackerargumenten van de gekregen URL" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "Sneltoetsen als in Vim" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "Blader door zoekresultaten met sneltoetsen zoals die in Vim (JavaScript vereist). Druk op \"h\" op de hoofdpagina of de pagina met resultaten voor hulp." + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -202,8 +257,8 @@ msgstr "Methode" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "SafeSearch" @@ -261,31 +316,30 @@ msgid "Red" msgstr "Rood" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Momenteel gebruikte zoekmachines" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Naam zoekmachine" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Categorie" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -293,17 +347,16 @@ msgstr "Toestaan" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Blokkeren" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -311,8 +364,8 @@ msgid "" msgstr "Deze instellingen worden bewaard in je cookies. Hierdoor hoeven wij niets over jou te bewaren." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -320,34 +373,34 @@ msgid "" msgstr "Deze cookies zijn alleen voor je eigen gemak, we gebruiken deze cookies niet om je te volgen." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "bewaren" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Standaardinstellingen herstellen" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "terug" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Zoek URL" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Downloaden zoekresultaten" @@ -358,19 +411,19 @@ msgstr "Antwoorden" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Suggesties" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "vorige pagina" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "volgende pagina" @@ -406,13 +459,13 @@ msgstr "Ophaler" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "magneetlink" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "torrentbestand" @@ -420,18 +473,37 @@ msgstr "torrentbestand" msgid "Click on the magnifier to perform search" msgstr "Klik op het vergrootglas om te zoeken" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "gecached" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Powered by" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "een privacy eerbiedigende, aanpasbare metazoekmachine" @@ -449,17 +521,17 @@ msgid "General" msgstr "Algemeen" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Zoekmachines" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Plugins" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Cookies" @@ -494,36 +566,46 @@ msgstr "Filteren content" msgid "Change searx layout" msgstr "Wijzig searx layout" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "Kies een stijl voor dit thema" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "Stijl" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Snelkoppeling" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "Gem. duur" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "Max. duur" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "Dit is de lijst van cookies en hun waarden die searx op je computer opslaat." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "Met deze lijst kan je de openheid van searx beoordelen." -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Cookienaam" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Waarde" @@ -531,7 +613,7 @@ msgstr "Waarde" msgid "Search results" msgstr "Zoekresultaten" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Links" @@ -540,18 +622,26 @@ msgstr "Links" msgid "Start search" msgstr "Start zoeken" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Toon zoekfilters" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Verberg zoekfilters" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "stats" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/pt/LC_MESSAGES/messages.mo b/searx/translations/pt/LC_MESSAGES/messages.mo Binary files differindex acf83eb6f..73a2c489e 100644 --- a/searx/translations/pt/LC_MESSAGES/messages.mo +++ b/searx/translations/pt/LC_MESSAGES/messages.mo diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.mo b/searx/translations/pt_BR/LC_MESSAGES/messages.mo Binary files differindex 325b8f267..17b267bc0 100644 --- a/searx/translations/pt_BR/LC_MESSAGES/messages.mo +++ b/searx/translations/pt_BR/LC_MESSAGES/messages.mo diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.po b/searx/translations/pt_BR/LC_MESSAGES/messages.po index 8580ff528..96d1a7360 100644 --- a/searx/translations/pt_BR/LC_MESSAGES/messages.po +++ b/searx/translations/pt_BR/LC_MESSAGES/messages.po @@ -8,89 +8,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/asciimoo/searx/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "Arquivos" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "geral" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "áudio" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "rede social" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "imagens" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "vídeos" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "códigos" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "notícias" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "mapas" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutos} minuto(s) atrás" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{horas} hora(s), {minutos} minuto(s) atrás" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Carregamento da página (sec)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Número de resultados" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Pontuações" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Pontuações por resultado" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Erros" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Redirecionar conexões HTTP para HTTPS, se possível" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Pesquisar na categoria selecionada" @@ -115,6 +144,32 @@ msgstr "Remover Tracker da url" msgid "Remove trackers arguments from the returned URL" msgstr "Remover argumentos de url retornáveis" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -201,8 +256,8 @@ msgstr "Método" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Busca Segura" @@ -260,31 +315,30 @@ msgid "Red" msgstr "Vermelho" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Serviço de busca usado atualmente" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Nome do serviço" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Categoria" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -292,17 +346,16 @@ msgstr "Ativo" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Bloqueado" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -310,8 +363,8 @@ msgid "" msgstr "Essas configurações são armazenadas em seus cookies, nos não armazenamos nenhum dado a seu respeito." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -319,34 +372,34 @@ msgid "" msgstr "Estes cookies servem ao seu único propósito, nós não usamos esses cookies para rastreá-lo." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "salvar" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Redefinir configurações" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "voltar" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Buscar URL" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Resultados para download" @@ -357,19 +410,19 @@ msgstr "Perguntas" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Sugestões" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "Página anterior" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "Próxima página" @@ -405,13 +458,13 @@ msgstr "Leecher" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "Link magnético" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "Arquivo torrent" @@ -419,18 +472,37 @@ msgstr "Arquivo torrent" msgid "Click on the magnifier to perform search" msgstr "Clique na lupa para executar a busca" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "em cache" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Distribuído por" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "um mecanismo de metabusca que respeita a sua privacidade" @@ -448,17 +520,17 @@ msgid "General" msgstr "Geral" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Buscadores" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Complementos" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Cookies" @@ -493,36 +565,46 @@ msgstr "Filtrar conteúdo" msgid "Change searx layout" msgstr "Alterar interface do searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "Atalhos" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "Avg.tempo" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "Tempo máximo" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "Esta é a lista de cookies que searx está armazenando em seu computador." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "Com essa lista, você pode avaliar a transparência do searx." -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "Nome do cookie" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "Valor" @@ -530,7 +612,7 @@ msgstr "Valor" msgid "Search results" msgstr "Procurar resultados" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Links" @@ -539,18 +621,26 @@ msgstr "Links" msgid "Start search" msgstr "Iniciar busca" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Mostrar filtros de busca" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Ocultar filtros de busca" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "estatísticas" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/ro/LC_MESSAGES/messages.mo b/searx/translations/ro/LC_MESSAGES/messages.mo Binary files differindex 25cbf25a8..41e282b4c 100644 --- a/searx/translations/ro/LC_MESSAGES/messages.mo +++ b/searx/translations/ro/LC_MESSAGES/messages.mo diff --git a/searx/translations/ro/LC_MESSAGES/messages.po b/searx/translations/ro/LC_MESSAGES/messages.po index 9abe0fb9f..950f59f96 100644 --- a/searx/translations/ro/LC_MESSAGES/messages.po +++ b/searx/translations/ro/LC_MESSAGES/messages.po @@ -8,89 +8,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Romanian (http://www.transifex.com/asciimoo/searx/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "fișiere" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "general" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "muzică" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "rețele sociale" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "imagini" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "videouri" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "el(ea)" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "știri" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "hartă" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes} minut(e) în urmă" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours} oră(e), {minutes} minut(e) în urmă" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Încărcarea paginilor (sec)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Numărul de rezultate" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Scoruri" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Scoruri per rezultat" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Erori" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Rescrie legăturile HTTP cu HTTPS dacă e posibil" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "Căutare în categoria selectată" @@ -115,6 +144,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -201,8 +256,8 @@ msgstr "Metodă" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "CăutareSigură" @@ -260,31 +315,30 @@ msgid "Red" msgstr "Roșu" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Motoarele de căutare folosite curent" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Numele motorului" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Categorie" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -292,17 +346,16 @@ msgstr "Permite" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Blochează" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -310,8 +363,8 @@ msgid "" msgstr "Aceste setări sunt stocate în cookie-urile d-voastră, aceasta ne permite să nu stocăm aceste date despre d-voastră." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -319,34 +372,34 @@ msgid "" msgstr "Aceste cookie-uri servesc doar pentru confortul d-voastră, noi nu stocăm aceste cookie-uri pentru a vă urmări." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "salvează" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Resetează valorile implicite" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "înapoi" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "URL de căutare" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Descarcă rezultate" @@ -357,19 +410,19 @@ msgstr "Răspunsuri" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Sugestii" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "pagina anterioară" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "pagina următoare" @@ -405,13 +458,13 @@ msgstr "Leecher" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "legătură magnet" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "fișier torrent" @@ -419,18 +472,37 @@ msgstr "fișier torrent" msgid "Click on the magnifier to perform search" msgstr "Apăsați pe lupă pentru a executa căutarea" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "stocat temporar" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Motorizat de" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "un meta-motor de căutare care respectă confidențialitatea" @@ -448,17 +520,17 @@ msgid "General" msgstr "General" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Motoare" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Module" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "" @@ -493,36 +565,46 @@ msgstr "Filtrează conținutul" msgid "Change searx layout" msgstr "Schimbă aspectul lui searx" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "" @@ -530,7 +612,7 @@ msgstr "" msgid "Search results" msgstr "Rezultatele căutării" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Legături" @@ -539,18 +621,26 @@ msgstr "Legături" msgid "Start search" msgstr "Pornește căutarea" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Arată filtrele căutării" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Ascunde filtrele căutării" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "statistici" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/ru/LC_MESSAGES/messages.mo b/searx/translations/ru/LC_MESSAGES/messages.mo Binary files differindex b3777d074..6e49e0855 100644 --- a/searx/translations/ru/LC_MESSAGES/messages.mo +++ b/searx/translations/ru/LC_MESSAGES/messages.mo diff --git a/searx/translations/ru/LC_MESSAGES/messages.po b/searx/translations/ru/LC_MESSAGES/messages.po index 2319625d5..4ef57cf33 100644 --- a/searx/translations/ru/LC_MESSAGES/messages.po +++ b/searx/translations/ru/LC_MESSAGES/messages.po @@ -5,108 +5,138 @@ # Translators: # dimqua <dimqua@riseup.net>, 2015 # dimqua <dimqua@riseup.net>, 2015 +# Дмитрий Михирев <bizdelnick@gmail.com>, 2016 msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Russian (http://www.transifex.com/asciimoo/searx/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "файлы" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "общие" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "музыка" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "соцсети" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "картинки" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "видео" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "IT" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "новости" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "карты" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" -msgstr "" +msgstr "наука" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes} минут назад" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours} час, {minutes} минут назад" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Время загрузки (сек)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Число результатов" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "Попаданий" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "Попаданий за результат" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Ошибок" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" +msgstr "По возможности заменять в ссылках HTTP на HTTPS" + +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" msgstr "" #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" -msgstr "" +msgstr "Искать при выборе категории" #: searx/plugins/search_on_category_select.py:19 msgid "" "Perform search immediately if a category selected. Disable to select " "multiple categories. (JavaScript required)" -msgstr "" +msgstr "Выполнять поиск сразу при выборе категории. Отключить выбор нескольких категорий. (Требуется JavaScript)" #: searx/plugins/self_info.py:20 msgid "" "Displays your IP if the query is \"ip\" and your user agent if the query " "contains \"user agent\"." -msgstr "" +msgstr "Показывает IP-адрес при запросе \"ip\" и user-agent при запросе \"user agent\"." #: searx/plugins/tracker_url_remover.py:26 msgid "Tracker URL remover" @@ -116,6 +146,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -145,7 +201,7 @@ msgstr "Опции" #: searx/templates/oscar/preferences.html:36 #: searx/templates/oscar/preferences.html:38 msgid "Default categories" -msgstr "Категории по-умолчанию" +msgstr "Категории по умолчанию" #: searx/templates/courgette/preferences.html:13 #: searx/templates/default/preferences.html:14 @@ -172,7 +228,7 @@ msgstr "Язык интерфейса" #: searx/templates/default/preferences.html:35 #: searx/templates/oscar/preferences.html:65 msgid "Autocomplete" -msgstr "Авто-подсказки" +msgstr "Автодополнение" #: searx/templates/courgette/preferences.html:45 #: searx/templates/default/preferences.html:46 @@ -202,8 +258,8 @@ msgstr "Метод" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Безопасный поиск" @@ -238,7 +294,7 @@ msgstr "Цвет" #: searx/templates/courgette/preferences.html:86 msgid "Blue (default)" -msgstr "Синий (по-умолчанию)" +msgstr "Синий (по умолчанию)" #: searx/templates/courgette/preferences.html:87 msgid "Violet" @@ -261,31 +317,30 @@ msgid "Red" msgstr "Красный" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Используемые поисковые движки" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Имя движка" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Категория" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -293,61 +348,60 @@ msgstr "Разрешить" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Блокировать" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " "data about you." -msgstr "Настройки хранятся в ваших cookies-файлах, что позволяет нам не хранить эти сведения о Вас." +msgstr "Настройки хранятся в ваших cookies-файлах, что позволяет нам не хранить эти сведения о вас." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " "track you." -msgstr "Данные cookies применяются для вашего удобства, мы не используем их, чтобы отслеживать Вас." +msgstr "Данные cookies применяются для вашего удобства, мы не используем их чтобы отслеживать вас." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "сохранить" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" -msgstr "" +msgstr "Восстановить настройки по умолчанию" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "назад" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Ссылка на поиск" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Загрузить результаты" @@ -358,19 +412,19 @@ msgstr "Ответы" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Предложения" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "предыдущая стр." #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "следующая стр. " @@ -406,13 +460,13 @@ msgstr "Личер" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "магнет-ссылка" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "торрент-файл" @@ -420,18 +474,37 @@ msgstr "торрент-файл" msgid "Click on the magnifier to perform search" msgstr "Нажмите на лупу, чтобы выполнить поиск" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "в архиве" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Используется" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "свободный движок метапоиска, уважающий вашу приватность" @@ -449,19 +522,19 @@ msgid "General" msgstr "Общие" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Движки" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" -msgstr "" +msgstr "Плагины" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" -msgstr "" +msgstr "Cookies" #: searx/templates/oscar/preferences.html:45 msgid "What language do you prefer for search?" @@ -494,44 +567,54 @@ msgstr "Использовать ли фильтр контента" msgid "Change searx layout" msgstr "Изменить тему сайта" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 -msgid "Shortcut" +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" msgstr "" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 -msgid "Avg. time" +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" msgstr "" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 +msgid "Shortcut" +msgstr "Ускоритель" + +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 +msgid "Avg. time" +msgstr "Среднее время" + +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" -msgstr "" +msgstr "Максимальное время" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." -msgstr "" +msgstr "Это список cookies и их значений, которые searx хранит на вашем компьютере." -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" -msgstr "" +msgstr "Имя cookie" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" -msgstr "" +msgstr "Значение" #: searx/templates/oscar/results.html:7 msgid "Search results" msgstr "Результаты поиска" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Ссылки" @@ -540,18 +623,26 @@ msgstr "Ссылки" msgid "Start search" msgstr "Начать поиск" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Показать фильтры поиска" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Скрыть фильтры поиска" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "статистика" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 @@ -578,11 +669,11 @@ msgstr "Пожалуйста включите JavaScript, чтобы испол #: searx/templates/oscar/messages/no_cookies.html:3 msgid "Information!" -msgstr "" +msgstr "Информация!" #: searx/templates/oscar/messages/no_cookies.html:4 msgid "currently, there are no cookies defined." -msgstr "" +msgstr "в данный момент cookies не установлены." #: searx/templates/oscar/messages/no_data_available.html:4 msgid "There is currently no data available. " @@ -596,7 +687,7 @@ msgstr "Сожалеем!" msgid "" "we didn't find any results. Please use another query or search in more " "categories." -msgstr "результатов не найдено. Попробуйте другой запрос или выберете больше категорий." +msgstr "результатов не найдено. Попробуйте другой запрос или выберите больше категорий." #: searx/templates/oscar/messages/save_settings_successfull.html:7 msgid "Well done!" @@ -656,19 +747,19 @@ msgstr "Байт" #: searx/templates/oscar/result_templates/torrent.html:10 msgid "kiB" -msgstr "Кбайт" +msgstr "КиБ" #: searx/templates/oscar/result_templates/torrent.html:11 msgid "MiB" -msgstr "Мбайт" +msgstr "МиБ" #: searx/templates/oscar/result_templates/torrent.html:12 msgid "GiB" -msgstr "Гбайт" +msgstr "ГиБ" #: searx/templates/oscar/result_templates/torrent.html:13 msgid "TiB" -msgstr "Тбайт" +msgstr "ТиБ" #: searx/templates/oscar/result_templates/torrent.html:15 msgid "Number of Files" @@ -684,4 +775,4 @@ msgstr "скрыть видео" #: searx/templates/pix-art/results.html:28 msgid "Load more..." -msgstr "" +msgstr "Загрузить ещё…" diff --git a/searx/translations/tr/LC_MESSAGES/messages.mo b/searx/translations/tr/LC_MESSAGES/messages.mo Binary files differindex 7b785fa9a..012e4c125 100644 --- a/searx/translations/tr/LC_MESSAGES/messages.mo +++ b/searx/translations/tr/LC_MESSAGES/messages.mo diff --git a/searx/translations/tr/LC_MESSAGES/messages.po b/searx/translations/tr/LC_MESSAGES/messages.po index eb9fe8fa4..cabb3f624 100644 --- a/searx/translations/tr/LC_MESSAGES/messages.po +++ b/searx/translations/tr/LC_MESSAGES/messages.po @@ -3,95 +3,124 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: -# Caner Başaran <basaran.caner@gmail.com>, 2014-2015 +# Caner Başaran <basaran.caner@gmail.com>, 2014-2016 # FIRST AUTHOR <EMAIL@ADDRESS>, 2014 msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 15:06+0000\n" -"Last-Translator: Thomas Pointhuber\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-04 16:41+0000\n" +"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" "Language-Team: Turkish (http://www.transifex.com/asciimoo/searx/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "dosyalar" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" msgstr "genel" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "müzik" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "sosyal medya" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "görseller" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "videolar" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "bilişim" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "haberler" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "harita" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" -msgstr "" +msgstr "bilim" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes} dakika() önce" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours} saat(), {minutes} dakika() önce" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "Yüklenen sayfa (sn)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "Sonuç sayısı" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "Hatalar" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "Mümkünse HTTP bağlantıları HTTPS olarak düzelt" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "Bağlantıları yeni sekmede aç" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "" @@ -116,6 +145,32 @@ msgstr "" msgid "Remove trackers arguments from the returned URL" msgstr "" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -202,8 +257,8 @@ msgstr "Sorgu gönderim yöntemi" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "Güvenli Arama" @@ -261,31 +316,30 @@ msgid "Red" msgstr "Kırmızı" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "Şu anda kullanılan arama motorları" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "Motor adı" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "Türü" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -293,17 +347,16 @@ msgstr "İzin ver" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "Engelle" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " @@ -311,8 +364,8 @@ msgid "" msgstr "Ayarlar çerezlerinizde saklanır. Verdiğiniz izinler, sizin hakkınızda veri saklamak için değildir." #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " @@ -320,34 +373,34 @@ msgid "" msgstr "Bu çerezler size kolaylık sağlar. Sizi takip etmek için kullanılmaz." #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "kaydet" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "Varsayılanları sıfırla" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "geri" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "Arama Bağlantısı" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "Arama sonuçlarını indir" @@ -358,19 +411,19 @@ msgstr "" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "Öneriler" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "önceki sayfa" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "sonraki sayfa" @@ -406,13 +459,13 @@ msgstr "Sömürenler" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "mıknatıs bağlantı" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "torrent dosyası" @@ -420,18 +473,37 @@ msgstr "torrent dosyası" msgid "Click on the magnifier to perform search" msgstr "Arama yapmak için büyütece tıklayın" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "önbellek" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Gücümün kaynağı" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "kişisel gizliliğe saygılı ve merak edenlerin kurcalayabildiği bir meta arama motoru" @@ -449,17 +521,17 @@ msgid "General" msgstr "Genel" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "Motorlar" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "Eklentiler" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "" @@ -494,36 +566,46 @@ msgstr "İçeriyi süz" msgid "Change searx layout" msgstr "searx yerleşim düzenini değiştir" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." msgstr "" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." msgstr "" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "" @@ -531,7 +613,7 @@ msgstr "" msgid "Search results" msgstr "Arama sonuçları" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "Bağlantılar" @@ -540,18 +622,26 @@ msgstr "Bağlantılar" msgid "Start search" msgstr "Aramayı başlat" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "Arama süzgeçlerini göster" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "Arama süzgeçlerini gizle" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "istatistikler" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/translations/zh_CN/LC_MESSAGES/messages.mo b/searx/translations/zh_CN/LC_MESSAGES/messages.mo Binary files differindex 0cd5edd96..3d80c8151 100644 --- a/searx/translations/zh_CN/LC_MESSAGES/messages.mo +++ b/searx/translations/zh_CN/LC_MESSAGES/messages.mo diff --git a/searx/translations/zh_CN/LC_MESSAGES/messages.po b/searx/translations/zh_CN/LC_MESSAGES/messages.po index c7903563c..beda94e7e 100644 --- a/searx/translations/zh_CN/LC_MESSAGES/messages.po +++ b/searx/translations/zh_CN/LC_MESSAGES/messages.po @@ -9,89 +9,118 @@ msgid "" msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-01-21 16:05+0100\n" -"PO-Revision-Date: 2016-01-21 16:25+0000\n" +"POT-Creation-Date: 2016-09-04 18:36+0200\n" +"PO-Revision-Date: 2016-09-05 09:42+0000\n" "Last-Translator: wenke\n" "Language-Team: Chinese (China) (http://www.transifex.com/asciimoo/searx/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.2.0\n" +"Generated-By: Babel 2.3.4\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: searx/webapp.py:114 +#: searx/webapp.py:115 msgid "files" msgstr "文件" -#: searx/webapp.py:115 +#: searx/webapp.py:116 msgid "general" -msgstr "一般" +msgstr "全部" -#: searx/webapp.py:116 +#: searx/webapp.py:117 msgid "music" msgstr "音乐" -#: searx/webapp.py:117 +#: searx/webapp.py:118 msgid "social media" msgstr "社交媒体" -#: searx/webapp.py:118 +#: searx/webapp.py:119 msgid "images" msgstr "图片" -#: searx/webapp.py:119 +#: searx/webapp.py:120 msgid "videos" msgstr "视频" -#: searx/webapp.py:120 +#: searx/webapp.py:121 msgid "it" msgstr "it" -#: searx/webapp.py:121 +#: searx/webapp.py:122 msgid "news" msgstr "新闻" -#: searx/webapp.py:122 +#: searx/webapp.py:123 msgid "map" msgstr "地图" -#: searx/webapp.py:123 +#: searx/webapp.py:124 msgid "science" msgstr "学术" -#: searx/webapp.py:415 +#: searx/webapp.py:423 msgid "{minutes} minute(s) ago" msgstr "{minutes}分钟之前" -#: searx/webapp.py:417 +#: searx/webapp.py:425 msgid "{hours} hour(s), {minutes} minute(s) ago" msgstr "{hours}小时{minutes}分钟之前" -#: searx/engines/__init__.py:185 +#: searx/engines/__init__.py:179 msgid "Page loads (sec)" msgstr "页面加载 (秒)" -#: searx/engines/__init__.py:189 +#: searx/engines/__init__.py:183 searx/templates/oscar/results.html:88 msgid "Number of results" msgstr "结果数" -#: searx/engines/__init__.py:193 +#: searx/engines/__init__.py:187 msgid "Scores" msgstr "得分" -#: searx/engines/__init__.py:197 +#: searx/engines/__init__.py:191 msgid "Scores per result" msgstr "每个结果等分" -#: searx/engines/__init__.py:201 +#: searx/engines/__init__.py:195 msgid "Errors" msgstr "错误" +#: searx/plugins/doai_rewrite.py:7 +msgid "DOAI rewrite" +msgstr "DOAI改写" + +#: searx/plugins/doai_rewrite.py:8 +msgid "" +"Avoid paywalls by redirecting to open-access versions of publications when " +"available" +msgstr "" + #: searx/plugins/https_rewrite.py:29 msgid "Rewrite HTTP links to HTTPS if possible" msgstr "如果可能的话重定向HTTP链接到HTTPS" +#: searx/plugins/infinite_scroll.py:3 +msgid "Infinite scroll" +msgstr "无限滚动" + +#: searx/plugins/infinite_scroll.py:4 +msgid "Automatically load next page when scrolling to bottom of current page" +msgstr "滚动到当前页面底部时自动加载下一页" + +#: searx/plugins/open_results_on_new_tab.py:18 +#: searx/templates/oscar/preferences.html:122 +msgid "Open result links on new browser tabs" +msgstr "在新标签页打开搜索链接" + +#: searx/plugins/open_results_on_new_tab.py:19 +msgid "" +"Results are opened in the same window by default. This plugin overwrites the" +" default behaviour to open links on new tabs/windows. (JavaScript required)" +msgstr "搜索结果默认在原窗口打开。这个插件使其在新标签页/窗口打开。(需要启用JavaScript )" + #: searx/plugins/search_on_category_select.py:18 msgid "Search on category select" msgstr "搜索类别选择" @@ -100,13 +129,13 @@ msgstr "搜索类别选择" msgid "" "Perform search immediately if a category selected. Disable to select " "multiple categories. (JavaScript required)" -msgstr "如果选中一个类别立即搜索。禁用选择多个类别功能。(JavaScript 启用)" +msgstr "选中一个类别立即搜索。禁用可以选择多个类别搜索。(JavaScript 启用)" #: searx/plugins/self_info.py:20 msgid "" "Displays your IP if the query is \"ip\" and your user agent if the query " "contains \"user agent\"." -msgstr "搜索“ip”显示你的ip和搜索内容包括“user agent”显示你的user agent。" +msgstr "搜索“ip”显示你的ip以及搜索内容含有“user agent”显示你的user agent。" #: searx/plugins/tracker_url_remover.py:26 msgid "Tracker URL remover" @@ -116,6 +145,32 @@ msgstr "移除跟踪链接" msgid "Remove trackers arguments from the returned URL" msgstr "从返回的链接中移除跟踪参数" +#: searx/plugins/vim_hotkeys.py:3 +msgid "Vim-like hotkeys" +msgstr "类vim快捷键" + +#: searx/plugins/vim_hotkeys.py:4 +msgid "" +"Navigate search results with Vim-like hotkeys (JavaScript required). Press " +"\"h\" key on main or result page to get help." +msgstr "使用类vim快捷键浏览搜索结果(JavaScript启用)。按“h”键获取帮助。" + +#: searx/templates/courgette/404.html:4 searx/templates/default/404.html:4 +#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4 +msgid "Page not found" +msgstr "未找到网页" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +#, python-format +msgid "Go to %(search_page)s." +msgstr "返回%(search_page)s。" + +#: searx/templates/courgette/404.html:6 searx/templates/default/404.html:6 +#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 +msgid "search page" +msgstr "搜索页面" + #: searx/templates/courgette/index.html:9 #: searx/templates/courgette/index.html:13 #: searx/templates/courgette/results.html:5 @@ -202,8 +257,8 @@ msgstr "方法" #: searx/templates/courgette/preferences.html:63 #: searx/templates/default/preferences.html:64 #: searx/templates/oscar/preferences.html:94 -#: searx/templates/oscar/preferences.html:144 -#: searx/templates/oscar/preferences.html:150 +#: searx/templates/oscar/preferences.html:160 +#: searx/templates/oscar/preferences.html:166 msgid "SafeSearch" msgstr "安全搜索" @@ -261,31 +316,30 @@ msgid "Red" msgstr "红色" #: searx/templates/courgette/preferences.html:96 -#: searx/templates/default/preferences.html:84 +#: searx/templates/default/preferences.html:93 #: searx/templates/pix-art/preferences.html:49 msgid "Currently used search engines" msgstr "目前使用的搜索引擎" #: searx/templates/courgette/preferences.html:100 -#: searx/templates/default/preferences.html:88 -#: searx/templates/oscar/preferences.html:142 -#: searx/templates/oscar/preferences.html:152 +#: searx/templates/default/preferences.html:97 +#: searx/templates/oscar/preferences.html:158 +#: searx/templates/oscar/preferences.html:168 #: searx/templates/pix-art/preferences.html:53 msgid "Engine name" msgstr "搜索引擎名称" #: searx/templates/courgette/preferences.html:101 -#: searx/templates/default/preferences.html:89 +#: searx/templates/default/preferences.html:98 msgid "Category" msgstr "类别" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:113 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:101 -#: searx/templates/oscar/macros.html:71 -#: searx/templates/oscar/preferences.html:141 -#: searx/templates/oscar/preferences.html:153 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:110 +#: searx/templates/oscar/preferences.html:157 +#: searx/templates/oscar/preferences.html:169 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:64 msgid "Allow" @@ -293,61 +347,60 @@ msgstr "允许" #: searx/templates/courgette/preferences.html:102 #: searx/templates/courgette/preferences.html:114 -#: searx/templates/default/preferences.html:90 -#: searx/templates/default/preferences.html:102 -#: searx/templates/oscar/macros.html:70 +#: searx/templates/default/preferences.html:99 +#: searx/templates/default/preferences.html:111 #: searx/templates/pix-art/preferences.html:54 #: searx/templates/pix-art/preferences.html:65 msgid "Block" msgstr "阻止" #: searx/templates/courgette/preferences.html:122 -#: searx/templates/default/preferences.html:110 -#: searx/templates/oscar/preferences.html:235 +#: searx/templates/default/preferences.html:119 +#: searx/templates/oscar/preferences.html:257 #: searx/templates/pix-art/preferences.html:73 msgid "" "These settings are stored in your cookies, this allows us not to store this " "data about you." -msgstr "这些设置保存你的cookie,这代表我们不能储存你的数据。" +msgstr "这些设置保存在你的cookie,我们不能保存你的数据。" #: searx/templates/courgette/preferences.html:124 -#: searx/templates/default/preferences.html:112 -#: searx/templates/oscar/preferences.html:237 +#: searx/templates/default/preferences.html:121 +#: searx/templates/oscar/preferences.html:259 #: searx/templates/pix-art/preferences.html:75 msgid "" "These cookies serve your sole convenience, we don't use these cookies to " "track you." -msgstr "这些cookie是为了让你更加方便,我们不会使用这些cookie跟踪你。" +msgstr "这些cookie是为了让你更加方便,我们不会使用这些cookie追踪你。" #: searx/templates/courgette/preferences.html:127 -#: searx/templates/default/preferences.html:115 -#: searx/templates/oscar/preferences.html:240 +#: searx/templates/default/preferences.html:124 +#: searx/templates/oscar/preferences.html:262 #: searx/templates/pix-art/preferences.html:78 msgid "save" msgstr "保存" #: searx/templates/courgette/preferences.html:128 -#: searx/templates/default/preferences.html:116 -#: searx/templates/oscar/preferences.html:242 +#: searx/templates/default/preferences.html:125 +#: searx/templates/oscar/preferences.html:264 msgid "Reset defaults" msgstr "恢复默认" #: searx/templates/courgette/preferences.html:129 -#: searx/templates/default/preferences.html:117 -#: searx/templates/oscar/preferences.html:241 +#: searx/templates/default/preferences.html:126 +#: searx/templates/oscar/preferences.html:263 #: searx/templates/pix-art/preferences.html:79 msgid "back" msgstr "返回" #: searx/templates/courgette/results.html:12 #: searx/templates/default/results.html:13 -#: searx/templates/oscar/results.html:110 +#: searx/templates/oscar/results.html:124 msgid "Search URL" msgstr "搜索链接" #: searx/templates/courgette/results.html:16 #: searx/templates/default/results.html:17 -#: searx/templates/oscar/results.html:115 +#: searx/templates/oscar/results.html:129 msgid "Download results" msgstr "下载结果" @@ -358,19 +411,19 @@ msgstr "回答" #: searx/templates/courgette/results.html:42 #: searx/templates/default/results.html:43 -#: searx/templates/oscar/results.html:90 +#: searx/templates/oscar/results.html:104 msgid "Suggestions" msgstr "搜索建议" #: searx/templates/courgette/results.html:70 #: searx/templates/default/results.html:81 -#: searx/templates/oscar/results.html:51 searx/templates/oscar/results.html:63 +#: searx/templates/oscar/results.html:53 searx/templates/oscar/results.html:66 msgid "previous page" msgstr "上一页" #: searx/templates/courgette/results.html:81 #: searx/templates/default/results.html:92 -#: searx/templates/oscar/results.html:44 searx/templates/oscar/results.html:71 +#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 msgid "next page" msgstr "下一页" @@ -406,13 +459,13 @@ msgstr "Leecher" #: searx/templates/courgette/result_templates/torrent.html:9 #: searx/templates/default/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:21 +#: searx/templates/oscar/macros.html:24 msgid "magnet link" msgstr "磁力链接" #: searx/templates/courgette/result_templates/torrent.html:10 #: searx/templates/default/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:22 +#: searx/templates/oscar/macros.html:25 msgid "torrent file" msgstr "种子文件" @@ -420,18 +473,37 @@ msgstr "种子文件" msgid "Click on the magnifier to perform search" msgstr "点击放大镜执行搜索" +#: searx/templates/default/preferences.html:84 +#: searx/templates/oscar/preferences.html:121 +msgid "Results on new tabs" +msgstr "在新标签页打开搜索结果" + +#: searx/templates/default/preferences.html:87 +#: searx/templates/oscar/preferences.html:125 +msgid "On" +msgstr "开" + +#: searx/templates/default/preferences.html:88 +#: searx/templates/oscar/preferences.html:126 +msgid "Off" +msgstr "关" + #: searx/templates/default/result_templates/code.html:3 #: searx/templates/default/result_templates/default.html:3 #: searx/templates/default/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:20 +#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:46 msgid "cached" msgstr "缓存" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/advanced.html:4 +msgid "Advanced settings" +msgstr "高级设置" + +#: searx/templates/oscar/base.html:82 msgid "Powered by" msgstr "Powered by" -#: searx/templates/oscar/base.html:78 +#: searx/templates/oscar/base.html:82 msgid "a privacy-respecting, hackable metasearch engine" msgstr "一个尊重隐私,可再开发的元搜索引擎" @@ -449,17 +521,17 @@ msgid "General" msgstr "常规" #: searx/templates/oscar/preferences.html:18 -#: searx/templates/oscar/preferences.html:126 +#: searx/templates/oscar/preferences.html:142 msgid "Engines" msgstr "搜索引擎" #: searx/templates/oscar/preferences.html:19 -#: searx/templates/oscar/preferences.html:187 +#: searx/templates/oscar/preferences.html:207 msgid "Plugins" msgstr "插件" #: searx/templates/oscar/preferences.html:20 -#: searx/templates/oscar/preferences.html:210 +#: searx/templates/oscar/preferences.html:232 msgid "Cookies" msgstr "Cookie" @@ -484,7 +556,7 @@ msgid "" "Change how forms are submited, <a " "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" " rel=\"external\">learn more about request methods</a>" -msgstr "更改请求方法,<a href=\"http://zh.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">了解更多请求方法相关</a>" +msgstr "更改请求方法,<a href=\"http://zh.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">深入了解请求方法</a>" #: searx/templates/oscar/preferences.html:95 msgid "Filter content" @@ -494,36 +566,46 @@ msgstr "过滤内容" msgid "Change searx layout" msgstr "改变searx布局" -#: searx/templates/oscar/preferences.html:143 -#: searx/templates/oscar/preferences.html:151 +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Choose style for this theme" +msgstr "选择这个主题的样式" + +#: searx/templates/oscar/preferences.html:114 +#: searx/templates/oscar/preferences.html:119 +msgid "Style" +msgstr "样式" + +#: searx/templates/oscar/preferences.html:159 +#: searx/templates/oscar/preferences.html:167 msgid "Shortcut" msgstr "快捷键" -#: searx/templates/oscar/preferences.html:145 -#: searx/templates/oscar/preferences.html:149 +#: searx/templates/oscar/preferences.html:161 +#: searx/templates/oscar/preferences.html:165 msgid "Avg. time" msgstr "平均时间" -#: searx/templates/oscar/preferences.html:146 -#: searx/templates/oscar/preferences.html:148 +#: searx/templates/oscar/preferences.html:162 +#: searx/templates/oscar/preferences.html:164 msgid "Max time" msgstr "最大时间" -#: searx/templates/oscar/preferences.html:213 +#: searx/templates/oscar/preferences.html:235 msgid "" "This is the list of cookies and their values searx is storing on your " "computer." -msgstr "这是searx保存在你的电脑上的cookie列表。" +msgstr "这里展示了searx保存在你的电脑上的cookie。" -#: searx/templates/oscar/preferences.html:214 +#: searx/templates/oscar/preferences.html:236 msgid "With that list, you can assess searx transparency." -msgstr "有了这个列表,你可以评价searx透明度。" +msgstr "有了这个列表,你可以评估searx透明度。" -#: searx/templates/oscar/preferences.html:219 +#: searx/templates/oscar/preferences.html:241 msgid "Cookie name" msgstr "cookie名称" -#: searx/templates/oscar/preferences.html:220 +#: searx/templates/oscar/preferences.html:242 msgid "Value" msgstr "值" @@ -531,7 +613,7 @@ msgstr "值" msgid "Search results" msgstr "搜索结果" -#: searx/templates/oscar/results.html:105 +#: searx/templates/oscar/results.html:119 msgid "Links" msgstr "链接" @@ -540,18 +622,26 @@ msgstr "链接" msgid "Start search" msgstr "开始搜索" -#: searx/templates/oscar/search_full.html:15 -msgid "Show search filters" -msgstr "显示搜索过滤器" - -#: searx/templates/oscar/search_full.html:15 -msgid "Hide search filters" -msgstr "隐藏搜索过滤器" - #: searx/templates/oscar/stats.html:2 msgid "stats" msgstr "统计" +#: searx/templates/oscar/time-range.html:3 +msgid "Anytime" +msgstr "时间不限" + +#: searx/templates/oscar/time-range.html:6 +msgid "Last day" +msgstr "过去一天内" + +#: searx/templates/oscar/time-range.html:9 +msgid "Last week" +msgstr "过去一周内" + +#: searx/templates/oscar/time-range.html:12 +msgid "Last month" +msgstr "过去一个月内" + #: searx/templates/oscar/messages/first_time.html:4 #: searx/templates/oscar/messages/no_results.html:5 #: searx/templates/oscar/messages/save_settings_successfull.html:5 diff --git a/searx/utils.py b/searx/utils.py index aa8ce92a1..faa634853 100644 --- a/searx/utils.py +++ b/searx/utils.py @@ -6,9 +6,13 @@ import re from babel.dates import format_date from codecs import getincrementalencoder from HTMLParser import HTMLParser +from imp import load_source +from os.path import splitext, join from random import choice +import sys from searx.version import VERSION_STRING +from searx.languages import language_codes from searx import settings from searx import logger @@ -237,3 +241,60 @@ def list_get(a_list, index, default=None): return a_list[index] else: return default + + +def get_torrent_size(filesize, filesize_multiplier): + try: + filesize = float(filesize) + + if filesize_multiplier == 'TB': + filesize = int(filesize * 1024 * 1024 * 1024 * 1024) + elif filesize_multiplier == 'GB': + filesize = int(filesize * 1024 * 1024 * 1024) + elif filesize_multiplier == 'MB': + filesize = int(filesize * 1024 * 1024) + elif filesize_multiplier == 'KB': + filesize = int(filesize * 1024) + elif filesize_multiplier == 'TiB': + filesize = int(filesize * 1000 * 1000 * 1000 * 1000) + elif filesize_multiplier == 'GiB': + filesize = int(filesize * 1000 * 1000 * 1000) + elif filesize_multiplier == 'MiB': + filesize = int(filesize * 1000 * 1000) + elif filesize_multiplier == 'KiB': + filesize = int(filesize * 1000) + except: + filesize = None + + return filesize + + +def convert_str_to_int(number_str): + if number_str.isdigit(): + return int(number_str) + else: + return 0 + + +def is_valid_lang(lang): + is_abbr = (len(lang) == 2) + if is_abbr: + for l in language_codes: + if l[0][:2] == lang.lower(): + return (True, l[0][:2], l[1].lower()) + return False + else: + for l in language_codes: + if l[1].lower() == lang.lower(): + return (True, l[0][:2], l[1].lower()) + return False + + +def load_module(filename, module_dir): + modname = splitext(filename)[0] + if modname in sys.modules: + del sys.modules[modname] + filepath = join(module_dir, filename) + module = load_source(modname, filepath) + module.name = modname + return module diff --git a/searx/version.py b/searx/version.py index 7f254df90..e32307b65 100644 --- a/searx/version.py +++ b/searx/version.py @@ -18,7 +18,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >. # version of searx VERSION_MAJOR = 0 -VERSION_MINOR = 9 +VERSION_MINOR = 10 VERSION_BUILD = 0 VERSION_STRING = "{0}.{1}.{2}".format(VERSION_MAJOR, diff --git a/searx/webapp.py b/searx/webapp.py index 460681b35..096e1f269 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -22,10 +22,11 @@ if __name__ == '__main__': from os.path import realpath, dirname path.append(realpath(dirname(realpath(__file__)) + '/../')) -import json import cStringIO -import os import hashlib +import hmac +import json +import os import requests from searx import logger @@ -39,7 +40,7 @@ except: logger.critical("cannot import dependency: pygments") from sys import exit exit(1) - +from cgi import escape from datetime import datetime, timedelta from urllib import urlencode from urlparse import urlparse, urljoin @@ -50,7 +51,7 @@ from flask import ( ) from flask_babel import Babel, gettext, format_date, format_decimal from flask.json import jsonify -from searx import settings, searx_dir +from searx import settings, searx_dir, searx_debug from searx.engines import ( categories, engines, get_engines_stats, engine_shortcuts ) @@ -61,11 +62,12 @@ from searx.utils import ( ) from searx.version import VERSION_STRING from searx.languages import language_codes -from searx.search import Search -from searx.query import Query +from searx.search import SearchWithPlugins, get_search_query_from_webapp +from searx.query import RawTextQuery from searx.autocomplete import searx_bang, backends as autocomplete_backends from searx.plugins import plugins from searx.preferences import Preferences, ValidationException +from searx.answerers import answerers # check if the pyopenssl, ndg-httpsclient, pyasn1 packages are installed. # They are needed for SSL connection without trouble, see #298 @@ -77,6 +79,9 @@ except ImportError: logger.critical("The pyopenssl, ndg-httpsclient, pyasn1 packages have to be installed.\n" "Some HTTPS connections will fail") +# serve pages with HTTP/1.1 +from werkzeug.serving import WSGIRequestHandler +WSGIRequestHandler.protocol_version = "HTTP/1.1" static_path, templates_path, themes =\ get_themes(settings['ui']['themes_path'] @@ -242,6 +247,24 @@ def url_for_theme(endpoint, override_theme=None, **values): return url_for(endpoint, **values) +def proxify(url): + if url.startswith('//'): + url = 'https:' + url + + if not settings.get('result_proxy'): + return url + + url_params = dict(mortyurl=url.encode('utf-8')) + + if settings['result_proxy'].get('key'): + url_params['mortyhash'] = hmac.new(settings['result_proxy']['key'], + url.encode('utf-8'), + hashlib.sha256).hexdigest() + + return '{0}?{1}'.format(settings['result_proxy']['url'], + urlencode(url_params)) + + def image_proxify(url): if url.startswith('//'): @@ -250,8 +273,10 @@ def image_proxify(url): if not request.preferences.get_value('image_proxy'): return url - hash_string = url + settings['server']['secret_key'] - h = hashlib.sha256(hash_string.encode('utf-8')).hexdigest() + if settings.get('result_proxy'): + return proxify(url) + + h = hmac.new(settings['server']['secret_key'], url.encode('utf-8'), hashlib.sha256).hexdigest() return '{0}?{1}'.format(url_for('image_proxy'), urlencode(dict(url=url.encode('utf-8'), h=h))) @@ -310,6 +335,8 @@ def render(template_name, override_theme=None, **kwargs): kwargs['image_proxify'] = image_proxify + kwargs['proxify'] = proxify if settings.get('result_proxy') else None + kwargs['get_result_template'] = get_result_template kwargs['theme'] = get_current_theme_name(override=override_theme) @@ -318,8 +345,12 @@ def render(template_name, override_theme=None, **kwargs): kwargs['cookies'] = request.cookies + kwargs['errors'] = request.errors + kwargs['instance_name'] = settings['general']['instance_name'] + kwargs['results_on_new_tab'] = request.preferences.get_value('results_on_new_tab') + kwargs['scripts'] = set() for plugin in request.user_plugins: for script in plugin.js_dependencies: @@ -336,16 +367,23 @@ def render(template_name, override_theme=None, **kwargs): @app.before_request def pre_request(): - # merge GET, POST vars + request.errors = [] + preferences = Preferences(themes, categories.keys(), engines, plugins) - preferences.parse_cookies(request.cookies) request.preferences = preferences + try: + preferences.parse_cookies(request.cookies) + except: + request.errors.append(gettext('Invalid settings, please edit your preferences')) + # merge GET, POST vars + # request.form request.form = dict(request.form.items()) for k, v in request.args.items(): if k not in request.form: request.form[k] = v + # request.user_plugins request.user_plugins = [] allowed_plugins = preferences.plugins.get_enabled() disabled_plugins = preferences.plugins.get_disabled() @@ -363,37 +401,42 @@ def index(): Supported outputs: html, json, csv, rss. """ - if not request.args and not request.form: + if request.form.get('q') is None: return render( 'index.html', ) + # search + search_query = None + result_container = None try: - search = Search(request) + search_query = get_search_query_from_webapp(request.preferences, request.form) + # search = Search(search_query) # without plugins + search = SearchWithPlugins(search_query, request) + result_container = search.search() except: + request.errors.append(gettext('search error')) + logger.exception('search error') return render( 'index.html', ) - if plugins.call('pre_search', request, locals()): - search.search(request) - - plugins.call('post_search', request, locals()) + results = result_container.get_ordered_results() - results = search.result_container.get_ordered_results() + # UI + advanced_search = request.form.get('advanced_search', None) + output_format = request.form.get('format', 'html') + if output_format not in ['html', 'csv', 'json', 'rss']: + output_format = 'html' + # output for result in results: - - plugins.call('on_result', request, locals()) - if not search.paging and engines[result['engine']].paging: - search.paging = True - - if search.request_data.get('format', 'html') == 'html': - if 'content' in result: - result['content'] = highlight_content(result['content'], - search.query.encode('utf-8')) # noqa - result['title'] = highlight_content(result['title'], - search.query.encode('utf-8')) + if output_format == 'html': + if 'content' in result and result['content']: + result['content'] = highlight_content(escape(result['content'][:1024]), + search_query.query.encode('utf-8')) + result['title'] = highlight_content(escape(result['title'] or u''), + search_query.query.encode('utf-8')) else: if result.get('content'): result['content'] = html_to_text(result['content']).strip() @@ -420,16 +463,19 @@ def index(): else: result['publishedDate'] = format_date(result['publishedDate']) - number_of_results = search.result_container.results_number() - if number_of_results < search.result_container.results_length(): + number_of_results = result_container.results_number() + if number_of_results < result_container.results_length(): number_of_results = 0 - if search.request_data.get('format') == 'json': - return Response(json.dumps({'query': search.query, + if output_format == 'json': + return Response(json.dumps({'query': search_query.query, 'number_of_results': number_of_results, - 'results': results}), + 'results': results, + 'answers': list(result_container.answers), + 'infoboxes': result_container.infoboxes, + 'suggestions': list(result_container.suggestions)}), mimetype='application/json') - elif search.request_data.get('format') == 'csv': + elif output_format == 'csv': csv = UnicodeWriter(cStringIO.StringIO()) keys = ('title', 'url', 'content', 'host', 'engine', 'score') csv.writerow(keys) @@ -438,14 +484,14 @@ def index(): csv.writerow([row.get(key, '') for key in keys]) csv.stream.seek(0) response = Response(csv.stream.read(), mimetype='application/csv') - cont_disp = 'attachment;Filename=searx_-_{0}.csv'.format(search.query.encode('utf-8')) + cont_disp = 'attachment;Filename=searx_-_{0}.csv'.format(search_query.query.encode('utf-8')) response.headers.add('Content-Disposition', cont_disp) return response - elif search.request_data.get('format') == 'rss': + elif output_format == 'rss': response_rss = render( 'opensearch_response_rss.xml', results=results, - q=search.request_data['q'], + q=request.form['q'], number_of_results=number_of_results, base_url=get_base_url() ) @@ -454,17 +500,17 @@ def index(): return render( 'results.html', results=results, - q=search.request_data['q'], - selected_categories=search.categories, - paging=search.paging, + q=request.form['q'], + selected_categories=search_query.categories, + pageno=search_query.pageno, + time_range=search_query.time_range, number_of_results=format_decimal(number_of_results), - pageno=search.pageno, - advanced_search=search.is_advanced, - time_range=search.time_range, + advanced_search=advanced_search, + suggestions=result_container.suggestions, + answers=result_container.answers, + infoboxes=result_container.infoboxes, + paging=result_container.paging, base_url=get_base_url(), - suggestions=search.result_container.suggestions, - answers=search.result_container.answers, - infoboxes=search.result_container.infoboxes, theme=get_current_theme_name(), favicons=global_favicons[themes.index(get_current_theme_name())] ) @@ -481,30 +527,23 @@ def about(): @app.route('/autocompleter', methods=['GET', 'POST']) def autocompleter(): """Return autocompleter results""" - request_data = {} - - # select request method - if request.method == 'POST': - request_data = request.form - else: - request_data = request.args # set blocked engines disabled_engines = request.preferences.engines.get_disabled() # parse query - query = Query(request_data.get('q', '').encode('utf-8'), disabled_engines) - query.parse_query() + raw_text_query = RawTextQuery(request.form.get('q', '').encode('utf-8'), disabled_engines) + raw_text_query.parse_query() # check if search query is set - if not query.getSearchQuery(): + if not raw_text_query.getSearchQuery(): return '', 400 # run autocompleter completer = autocomplete_backends.get(request.preferences.get_value('autocomplete')) # parse searx specific autocompleter results like !bang - raw_results = searx_bang(query) + raw_results = searx_bang(raw_text_query) # normal autocompletion results only appear if max 3 inner results returned if len(raw_results) <= 3 and completer: @@ -515,19 +554,19 @@ def autocompleter(): else: language = language.split('_')[0] # run autocompletion - raw_results.extend(completer(query.getSearchQuery(), language)) + raw_results.extend(completer(raw_text_query.getSearchQuery(), language)) # parse results (write :language and !engine back to result string) results = [] for result in raw_results: - query.changeSearchQuery(result) + raw_text_query.changeSearchQuery(result) # add parsed result - results.append(query.getFullQuery()) + results.append(raw_text_query.getFullQuery()) # return autocompleter results - if request_data.get('format') == 'x-suggestions': - return Response(json.dumps([query.query, results]), + if request.form.get('format') == 'x-suggestions': + return Response(json.dumps([raw_text_query.query, results]), mimetype='application/json') return Response(json.dumps(results), @@ -544,7 +583,7 @@ def preferences(): try: request.preferences.parse_form(request.form) except ValidationException: - # TODO use flash feature of flask + request.errors.append(gettext('Invalid settings, please edit your preferences')) return resp return request.preferences.save(resp) @@ -565,6 +604,8 @@ def preferences(): if e.timeout > settings['outgoing']['request_timeout']: stats[e.name]['warn_timeout'] = True + # get first element [0], the engine time, + # and then the second element [1] : the time (the first one is the label) for engine_stat in get_engines_stats()[0][1]: stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'), 3) if engine_stat.get('avg') > settings['outgoing']['request_timeout']: @@ -579,6 +620,7 @@ def preferences(): language_codes=language_codes, engines_by_category=categories, stats=stats, + answerers=[{'info': a.self_info(), 'keywords': a.keywords} for a in answerers], disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, @@ -595,7 +637,7 @@ def image_proxy(): if not url: return '', 400 - h = hashlib.sha256(url + settings['server']['secret_key'].encode('utf-8')).hexdigest() + h = hmac.new(settings['server']['secret_key'], url, hashlib.sha256).hexdigest() if h != request.args.get('h'): return '', 400 @@ -653,6 +695,7 @@ Allow: / Allow: /about Disallow: /stats Disallow: /preferences +Disallow: /*?*q=* """, mimetype='text/plain') @@ -712,15 +755,22 @@ def config(): 'default_locale': settings['ui']['default_locale'], 'autocomplete': settings['search']['autocomplete'], 'safe_search': settings['search']['safe_search'], - 'default_theme': settings['ui']['default_theme']}) + 'default_theme': settings['ui']['default_theme'], + 'version': VERSION_STRING}) + + +@app.errorhandler(404) +def page_not_found(e): + return render('404.html'), 404 def run(): app.run( - debug=settings['general']['debug'], - use_debugger=settings['general']['debug'], + debug=searx_debug, + use_debugger=searx_debug, port=settings['server']['port'], - host=settings['server']['bind_address'] + host=settings['server']['bind_address'], + threaded=True ) diff --git a/tests/robot/test_basic.robot b/tests/robot/test_basic.robot index 4a20d0ba2..a466a095c 100644 --- a/tests/robot/test_basic.robot +++ b/tests/robot/test_basic.robot @@ -4,14 +4,27 @@ Test Setup Open Browser http://localhost:11111/ Test Teardown Close All Browsers +*** Keywords *** +Submit Preferences + Set Selenium Speed 2 seconds + Submit Form id=search_form + Location Should Be http://localhost:11111/ + Set Selenium Speed 0 seconds + + *** Test Cases *** Front page Page Should Contain about Page Should Contain preferences +404 page + Go To http://localhost:11111/no-such-page + Page Should Contain Page not found + Page Should Contain Go to search page + About page Click Element link=about - Page Should Contain Why use Searx? + Page Should Contain Why use searx? Page Should Contain Element link=search engines Preferences page @@ -19,8 +32,8 @@ Preferences page Page Should Contain Preferences Page Should Contain Default categories Page Should Contain Currently used search engines - Page Should Contain dummy_dummy - Page Should Contain general_dummy + Page Should Contain dummy dummy + Page Should Contain general dummy Switch category Go To http://localhost:11111/preferences @@ -28,8 +41,7 @@ Switch category Page Should Contain Checkbox category_dummy Click Element xpath=//*[.="general"] Click Element xpath=//*[.="dummy"] - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Checkbox Should Not Be Selected category_general Checkbox Should Be Selected category_dummy @@ -38,8 +50,7 @@ Change language Page Should Contain preferences Go To http://localhost:11111/preferences Select From List locale hu - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Page Should Contain rólunk Page Should Contain beállítások @@ -48,13 +59,11 @@ Change method Page Should Contain preferences Go To http://localhost:11111/preferences Select From List method GET - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be method GET Select From List method POST - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be method POST @@ -62,10 +71,9 @@ Change theme Page Should Contain about Page Should Contain preferences Go To http://localhost:11111/preferences - List Selection Should Be theme default + List Selection Should Be theme legacy Select From List theme oscar - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be theme oscar @@ -75,8 +83,7 @@ Change safesearch Go To http://localhost:11111/preferences List Selection Should Be safesearch None Select From List safesearch Strict - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be safesearch Strict @@ -86,8 +93,7 @@ Change image proxy Go To http://localhost:11111/preferences List Selection Should Be image_proxy Disabled Select From List image_proxy Enabled - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be image_proxy Enabled @@ -97,8 +103,7 @@ Change search language Go To http://localhost:11111/preferences List Selection Should Be language Automatic Select From List language Turkish (Turkey) - tr_TR - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be language Turkish (Turkey) - tr_TR @@ -108,8 +113,7 @@ Change autocomplete Go To http://localhost:11111/preferences List Selection Should Be autocomplete - Select From List autocomplete google - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be autocomplete google @@ -121,8 +125,7 @@ Change allowed/disabled engines Element Should Contain xpath=//label[@class="deny"][@for='engine_dummy_dummy_dummy'] Block Element Should Contain xpath=//label[@class="deny"][@for='engine_general_general_dummy'] Block Click Element xpath=//label[@class="deny"][@for='engine_general_general_dummy'] - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Page Should Contain about Page Should Contain preferences Go To http://localhost:11111/preferences @@ -134,18 +137,16 @@ Block a plugin Page Should Contain about Page Should Contain preferences Go To http://localhost:11111/preferences - List Selection Should Be theme default + List Selection Should Be theme legacy Select From List theme oscar - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences List Selection Should Be theme oscar Page Should Contain Plugins Click Link Plugins Checkbox Should Not Be Selected id=plugin_HTTPS_rewrite Click Element xpath=//label[@for='plugin_HTTPS_rewrite'] - Submit Form id=search_form - Location Should Be http://localhost:11111/ + Submit Preferences Go To http://localhost:11111/preferences Page Should Contain Plugins Click Link Plugins diff --git a/tests/unit/engines/seedpeer_fixture.html b/tests/unit/engines/seedpeer_fixture.html new file mode 100644 index 000000000..28207bfad --- /dev/null +++ b/tests/unit/engines/seedpeer_fixture.html @@ -0,0 +1,110 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head> + </head> + <body> + <div id="header"> + <div id="whoIsYou"> + <a href="/lang.php"><small>SeedPeer in your own language?</small></a> <a href="http://www.seedpeer.eu"><img src="/images/flags/uk.gif" width="16px" alt="Torrents EN" /></a> <a href="http://spanish.seedpeer.eu"><img src="/images/flags/es.gif" width="16px" alt="Torrents ES" /></a> <a href="http://german.seedpeer.eu"><img src="/images/flags/de.gif" width="16px" alt="Torrents DE" /></a> <a href="http://french.seedpeer.eu"><img src="/images/flags/fr.gif" width="16px" alt="Torrents FR" /></a> <a href="http://portuguese.seedpeer.eu"><img src="/images/flags/pt.gif" width="16px" alt="Torrents Portuguese" /></a> <a href="http://swedish.seedpeer.eu"><img src="/images/flags/se.gif" width="16px" alt="Torrents Sweden" /></a> + </div> + + <script type="text/javascript"> + whoIsYou(); + </script> + <div id="search"> + <form action="/search.php" method="get"> + <input id="topsearchbar" name="search" value="narcos season 2" /> + <input type="submit" class="searchbutton" value="Torrents" /> + <input style="color:#000" type="submit" class="searchbutton" name="usenet" value="Usenet Binaries" /> + </form> + <div id="suggestion"></div> + </div> + <div id="logo"><a href="/"><img src="/images/logo2.gif" alt="Seedpeer homepage" width="415" height="143" /></a></div> + <div id="subtext"><a href="/">Home</a> > <a href="/search.html">Torrent search</a> > Narcos season 2 | page 1</div> + </div> + <div id="nav"> + <ul> + <!-- + <li><font style="color:red;font-size:9px;font-weight:bold;">NEW</font><a title="Download TOP Games for FREE" rel="nofollow" href="http://www.bigrebelads.com/affiliate/index?ref=9301" target="_blank">FREE Games</a></li> + + --> + <li style="border-left:none" id="categories"><a title="Browse Torrent Categories" href="/browse.html">Categories</a> + <ul> + <li><a title="Browse Anime Torrents" href="/browse.html#6">Anime</a></li> + <li><a title="Browse Game Torrents" href="/browse.html#4">Games</a></li> + <li><a title="Browse Movie Torrents" href="/browse.html#1">Movies</a></li> + <li><a title="Browse Music Torrents" href="/browse.html#3">Music</a></li> + <li><a title="Browse Software Torrents" href="/browse.html#5">Software</a></li> + <li><a title="Browse TV Torrents" href="/browse.html#2">TV Shows</a></li> + <li><a title="Browse Other Torrents" href="/browse.html#7">Others</a></li> + </ul> + </li> + <li><a title="Upload A Torrents" href="/upload.html">Upload torrent</a></li> + <li id="verified"><a title="Verified Torrents" href="/verified.html">Verified</a></li> + <li id="searchoptions"><a title="Search Torrents" href="/search.html">Torrent search</a></li> + <li id="newsgroups"><a style="color:#212b3e" title="News Groups" href="/usenet.html">Usenet Binaries</a></li> + <li id="about" style="border-right:none"><a rel="nofollow" href="/faq.html">About Us</a> + <ul> + <li><a title="SeedPeer Statistics" href="/stats.html">Statistics</a></li> + <li><a title="Contact Us" href="/contact.html">Contact</a></li> + <li><a title="Frequently Asked Questions" href="/faq.html">FAQ</a></li> + <li><a title="SeedPeer API" href="http://api.seedpeer.eu">Our API</a></li> + <li><a title="SeedPeer Blog" href="/blog">Blog</a></li> + </ul> + </li> + <!--<li><a href="/toolbar.php">Our Toolbar</a></li>--> + </ul> + <div class="clear"></div> + </div> + <div id="body"><div id="pageTop"></div> + <div id="headerbox"><h1>Verified <font class="colored">Narcos season 2</font> torrents</h1></div><table width="100%"><tr><th> + <span style="float:right"> + <a href="/search/narcos-season-2/8/1.html"><img style="vertical-align:middle" src="/images/comments.gif" alt="comments" /></a> | + <a href="/search/narcos-season-2/7/1.html"><img style="vertical-align:middle" src="/images/ver.gif" alt="verified" /></a> + </span> + <a href="/search/narcos-season-2/1/1.html">Torrent name</a></th><th class="right"><a href="/search/narcos-season-2/2/1.html">Age</a></th><th class="right"><a href="/search/narcos-season-2/3/1.html">Size</a></th><th class="right"><a href="/search/narcos-season-2/4/1.html">Seeds</a></th><th class="right"><a href="/search/narcos-season-2/5/1.html">Peers</a></th><th class="center"><a href="/search/narcos-season-2/6/1.html">Health</a></th><td class="tableAd" rowspan="6"><iframe src="http://creative.wwwpromoter.com/13689?d=300x250" width="300" height="250" style="border: none;" frameborder="0" scrolling="no"></iframe></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_1" href="" data-tad="431726" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> Full Version</a></td><td class="right">20 hours</td><td class="right">681.3 MB</td><td class="right"><font color="green">28</font> </td><td class="right"><font color="navy">654</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class="tdark"><td><a class="pblink" id="pblink_table_item_2" href="" data-tad="431727" data-url="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> Trusted Source</a></td><td class="right">12 hours</td><td class="right">787.1 MB</td><td class="right"><font color="green">64</font> </td><td class="right"><font color="navy">220</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_3" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Full Narcos season 2 Download</strong></a> <small><a class="pblink" id="pblink_table_item_4" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Usenet</a></small></td><td class="right">24 hours</td><td class="right">775.5 MB</td><td class="right"><font color="green">60</font> </td><td class="right"><font color="navy">236</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class="tdark"><td><a class="pblink" id="pblink_table_item_5" href="" data-tad="431730" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> 2014 - DIRECT STREAMING</a> <small><a class="pblink" id="pblink_table_item_6" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Movies</a></small></td><td class="right">17 hours</td><td class="right">654.1 MB</td><td class="right"><font color="green">2</font> </td><td class="right"><font color="navy">391</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_7" href="" data-tad="431731" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> 2014</a> <small><a class="pblink" id="pblink_table_item_8" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Movies</a></small></td><td class="right">20 hours</td><td class="right">754.5 MB</td><td class="right"><font color="green">21</font> </td><td class="right"><font color="navy">919</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr></table><br /><br /><center><iframe src='http://creative.wwwpromoter.com/13689?d=728x90' width='728' height='90' style='border: none;' frameborder='0' scrolling='no'></iframe><center><span style="float:right;margin:1em .2em 0 0"><a title="Download at the speed of your connection" href="/usenet.php?search=narcos+season+2"><img src="/images/dlf.gif" alt="Search Binaries" /></a></span><div style="margin-bottom:1em;margin-right:290px" id="headerbox"><h1><a href="/searchfeed/narcos+season+2.xml" target="_blank" title="SeedPeer RSS Torrent Search Feed fornarcos season 2"><img src="/images/feedIcon.png" border="0" /></a> 2 <font class="colored">Narcos season 2</font> Torrents were found</h1></div><table width="100%"><tr><th> + <span style="float:right"> + <a href="/search/narcos-season-2/8/1.html"><img style="vertical-align:middle" src="/images/comments.gif" alt="comments" /></a> | + <a href="/search/narcos-season-2/7/1.html"><img style="vertical-align:middle" src="/images/ver.gif" alt="verified" /></a> + </span> + <a href="/search/narcos-season-2/1/1.html">Torrent name</a></th><th class="right"><a href="/search/narcos-season-2/2/1.html">Age</a></th><th class="right"><a href="/search/narcos-season-2/3/1.html">Size</a></th><th class="right"><a href="/search/narcos-season-2/4/1.html">Seeds</a></th><th class="right"><a href="/search/narcos-season-2/5/1.html">Peers</a></th><th class="center"><a href="/search/narcos-season-2/6/1.html">Health</a></th></tr><tr class=""><td><small class="comments"><a href="http://www.facebook.com/sharer.php?t=Download%20<strong class='colored'>Narcos</strong> <strong class='colored'>Season</strong> <strong class='colored'>2</strong> Complete 7<strong class='colored'>2</strong>0p WebRip EN-SUB x<strong class='colored'>2</strong>64-[MULVAcoded] S0<strong class='colored'>2</strong>%20 torrent&u=http://seedpeer.seedpeer.eu/details/11686840/Narcos-Season-2-Complete-720p-WebRip-EN-SUB-x264-[MULVAcoded]-S02.html"><img src="/images/facebook.png" alt="Add to Facebook" width="14" height="14" /></a></small><a href="/details/11686840/Narcos-Season-2-Complete-720p-WebRip-EN-SUB-x264-[MULVAcoded]-S02.html"><strong class='colored'>Narcos</strong> <strong class='colored'>Season</strong> <strong class='colored'>2</strong> Complete 7<strong class='colored'>2</strong>0p WebRip EN-SUB x<strong class='colored'>2</strong>64-[MULVAcoded] S0<strong class='colored'>2</strong> <small><a href="/browse.html#11686840"></a></small></a></td><td class="right">19 hours</td><td class="right">4.39 GB</td><td class="right"><font color="green">715</font> </td><td class="right"><font color="navy">183</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" width="40" height="11" /></td></tr><tr class="tdark"><td><small class="comments"><a href="http://www.facebook.com/sharer.php?t=Download%20<strong class='colored'>Narcos</strong> - <strong class='colored'>Season</strong> <strong class='colored'>2</strong> - 7<strong class='colored'>2</strong>0p WEBRiP - x<strong class='colored'>2</strong>65 HEVC - ShAaNiG%20 torrent&u=http://seedpeer.seedpeer.eu/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html"><img src="/images/facebook.png" alt="Add to Facebook" width="14" height="14" /></a></small><a href="/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html"><strong class='colored'>Narcos</strong> - <strong class='colored'>Season</strong> <strong class='colored'>2</strong> - 7<strong class='colored'>2</strong>0p WEBRiP - x<strong class='colored'>2</strong>65 HEVC - ShAaNiG <small><a href="/browse.html#11685972"></a></small></a></td><td class="right">1 day</td><td class="right">2.48 GB</td><td class="right"><font color="green">861</font> </td><td class="right"><font color="navy">332</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" width="40" height="11" /></td></tr></table><div id="headerbox"><h1>Related searches for: <font class="colored">Narcos season 2</font></h1></div><div id="search_suggestions"><br />Other suggested searches: </div><br /><a href="http://torrentz2.eu/search?f=narcos-season-2">Search for "narcos-season-2" on Torrentz2.eu</a><br /><a href="http://torrent-finder.info/show.php?q=narcos-season-2">Search for "narcos-season-2" on Torrent-Finder</a><br /><center><iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe> <iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe> <iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe></center><div id="footer"> + <table width="100%"> + <tr> + <td width="30%"> + <h2>Torrents Download</h2> + <a href="/">Torrent search</a><br /> + <a href="/browse.html">Browse categories</a><br /> + <a href="/verified.html">Verified Torrents</a><br /> + <a href="/order-date.html">Today's torrents</a><br /> + <a href="/yesterday.html">Yesterday's torrents</a><br /> + <a href="/stats.html">Statistics</a><br /> + <br /> + <a href="/faq.html#copyright"><strong>Copyright & Removal</strong></a> + </td> + <td width="30%"><h2>Cool Stuff</h2> + <a href="/promotional.php">Promotional</a><br /> + <a href="/contact.html">Advertising Information</a><br /> + <strong><a href="/plugins.php" title="Add a search plugin to Firefox or Internet Explorer">Search Plugin <span style="color:red">*</span></a></strong><br /> + <a href="http://www.utorrent.com">µTorrent Client</a><br /> + <a href="/blog">Seedpeer Blog</a><br /> + </td> + <td width="30%"><h2>Links</h2> + <a href="http://www.sumotorrent.com" target="_blank"><strong>SumoTorrent</strong></a><br /> + <a href="http://www.torrent-finder.info" target="_blank"><strong>Torrent Finder</strong></a><br /> + <a href="http://www.torrentpond.com" target="_blank"><strong>TorrentPond</strong></a><br /> + <a href="https://www.limetorrents.cc" target="_blank">LimeTorrents.cc</a><br /> + <a href="http://www.torrents.to/" target="_blank">Torrents.to</a><br /> + <a href="http://www.torrentfunk.com" target="_blank">TorrentFunk</a><br /> + <a href="https://monova.org" target="_blank">Monova</a><br /> + <a href="http://www.torrentroom.com" target="_blank">TorrentRoom</a><br /> + <a href="http://www.katcr.co/" target="_blank">Kickass Torrents Community</a><br /> + </td> + <td width="10%"><div id="bottomlogo"></div></td> + </tr> + </table> + <br /> + <br /> + </div> + </div> + </body> + </html>
\ No newline at end of file diff --git a/tests/unit/engines/test_bing.py b/tests/unit/engines/test_bing.py index bce221440..886584229 100644 --- a/tests/unit/engines/test_bing.py +++ b/tests/unit/engines/test_bing.py @@ -14,14 +14,12 @@ class TestBingEngine(SearxTestCase): params = bing.request(query, dicto) self.assertTrue('url' in params) self.assertTrue(query in params['url']) + self.assertTrue('language%3AFR' in params['url']) self.assertTrue('bing.com' in params['url']) - self.assertTrue('SRCHHPGUSR' in params['cookies']) - self.assertTrue('fr' in params['cookies']['SRCHHPGUSR']) dicto['language'] = 'all' params = bing.request(query, dicto) - self.assertTrue('SRCHHPGUSR' in params['cookies']) - self.assertTrue('en' in params['cookies']['SRCHHPGUSR']) + self.assertTrue('language' not in params['url']) def test_response(self): self.assertRaises(AttributeError, bing.response, None) diff --git a/tests/unit/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py index 9d8ec18af..cc256f51e 100644 --- a/tests/unit/engines/test_bing_images.py +++ b/tests/unit/engines/test_bing_images.py @@ -13,6 +13,7 @@ class TestBingImagesEngine(SearxTestCase): dicto['pageno'] = 1 dicto['language'] = 'fr_FR' dicto['safesearch'] = 1 + dicto['time_range'] = '' params = bing_images.request(query, dicto) self.assertTrue('url' in params) self.assertTrue(query in params['url']) diff --git a/tests/unit/engines/test_bing_news.py b/tests/unit/engines/test_bing_news.py index a64d59b7b..b6793f7be 100644 --- a/tests/unit/engines/test_bing_news.py +++ b/tests/unit/engines/test_bing_news.py @@ -12,6 +12,7 @@ class TestBingNewsEngine(SearxTestCase): dicto = defaultdict(dict) dicto['pageno'] = 1 dicto['language'] = 'fr_FR' + dicto['time_range'] = '' params = bing_news.request(query, dicto) self.assertIn('url', params) self.assertIn(query, params['url']) @@ -22,6 +23,13 @@ class TestBingNewsEngine(SearxTestCase): params = bing_news.request(query, dicto) self.assertIn('en', params['url']) + def test_no_url_in_request_year_time_range(self): + dicto = defaultdict(dict) + query = 'test_query' + dicto['time_range'] = 'year' + params = bing_news.request(query, dicto) + self.assertEqual({}, params['url']) + def test_response(self): self.assertRaises(AttributeError, bing_news.response, None) self.assertRaises(AttributeError, bing_news.response, []) diff --git a/tests/unit/engines/test_deezer.py b/tests/unit/engines/test_deezer.py index cfef852af..5b9f55c33 100644 --- a/tests/unit/engines/test_deezer.py +++ b/tests/unit/engines/test_deezer.py @@ -42,7 +42,7 @@ class TestDeezerEngine(SearxTestCase): self.assertEqual(len(results), 1) self.assertEqual(results[0]['title'], 'Title of track') self.assertEqual(results[0]['url'], 'https://www.deezer.com/track/1094042') - self.assertEqual(results[0]['content'], 'Artist Name • Album Title • Title of track') + self.assertEqual(results[0]['content'], 'Artist Name - Album Title - Title of track') self.assertTrue('100' in results[0]['embedded']) json = r""" diff --git a/tests/unit/engines/test_deviantart.py b/tests/unit/engines/test_deviantart.py index 75c59f760..bd2cf182f 100644 --- a/tests/unit/engines/test_deviantart.py +++ b/tests/unit/engines/test_deviantart.py @@ -7,8 +7,8 @@ from searx.testing import SearxTestCase class TestDeviantartEngine(SearxTestCase): def test_request(self): - query = 'test_query' dicto = defaultdict(dict) + query = 'test_query' dicto['pageno'] = 0 dicto['time_range'] = '' params = deviantart.request(query, dicto) @@ -16,6 +16,13 @@ class TestDeviantartEngine(SearxTestCase): self.assertTrue(query in params['url']) self.assertTrue('deviantart.com' in params['url']) + def test_no_url_in_request_year_time_range(self): + dicto = defaultdict(dict) + query = 'test_query' + dicto['time_range'] = 'year' + params = deviantart.request(query, dicto) + self.assertEqual({}, params['url']) + def test_response(self): self.assertRaises(AttributeError, deviantart.response, None) self.assertRaises(AttributeError, deviantart.response, []) diff --git a/tests/unit/engines/test_digbt.py b/tests/unit/engines/test_digbt.py new file mode 100644 index 000000000..31a1b03a4 --- /dev/null +++ b/tests/unit/engines/test_digbt.py @@ -0,0 +1,61 @@ +from collections import defaultdict +import mock +from searx.engines import digbt +from searx.testing import SearxTestCase + + +class TestDigBTEngine(SearxTestCase): + + def test_request(self): + query = 'test_query' + dicto = defaultdict(dict) + dicto['pageno'] = 0 + params = digbt.request(query, dicto) + self.assertIn('url', params) + self.assertIn(query, params['url']) + self.assertIn('digbt.org', params['url']) + + def test_response(self): + self.assertRaises(AttributeError, digbt.response, None) + self.assertRaises(AttributeError, digbt.response, []) + self.assertRaises(AttributeError, digbt.response, '') + self.assertRaises(AttributeError, digbt.response, '[]') + + response = mock.Mock(content='<html></html>') + self.assertEqual(digbt.response(response), []) + + html = """ + <table class="table"> + <tr><td class="x-item"> + <div> + <a title="The Big Bang Theory" class="title" href="/The-Big-Bang-Theory-d2.html"> + The Big <span class="highlight">Bang</span> Theory + </a> + <span class="ctime"><span style="color:red;">4 hours ago</span></span> + </div> + <div class="files"> + <ul> + <li>The Big Bang Theory 2.9 GB</li> + <li>....</li> + </ul> + </div> + <div class="tail"> + Files: 1 Size: 2.9 GB Downloads: 1 Updated: <span style="color:red;">4 hours ago</span> + + <a class="title" href="magnet:?xt=urn:btih:a&dn=The+Big+Bang+Theory"> + <span class="glyphicon glyphicon-magnet"></span> magnet-link + </a> + + </div> + </td></tr> + </table> + """ + response = mock.Mock(content=html) + results = digbt.response(response) + self.assertEqual(type(results), list) + self.assertEqual(len(results), 1) + self.assertEqual(results[0]['title'], 'The Big Bang Theory') + self.assertEqual(results[0]['url'], 'https://digbt.org/The-Big-Bang-Theory-d2.html') + self.assertEqual(results[0]['content'], 'The Big Bang Theory 2.9 GB ....') + self.assertEqual(results[0]['filesize'], 3113851289) + self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:a&dn=The+Big+Bang+Theory') diff --git a/tests/unit/engines/test_duckduckgo.py b/tests/unit/engines/test_duckduckgo.py index cb866d396..734f2c39e 100644 --- a/tests/unit/engines/test_duckduckgo.py +++ b/tests/unit/engines/test_duckduckgo.py @@ -19,6 +19,13 @@ class TestDuckduckgoEngine(SearxTestCase): self.assertIn('duckduckgo.com', params['url']) self.assertIn('ch-de', params['url']) + def test_no_url_in_request_year_time_range(self): + dicto = defaultdict(dict) + query = 'test_query' + dicto['time_range'] = 'year' + params = duckduckgo.request(query, dicto) + self.assertEqual({}, params['url']) + def test_response(self): self.assertRaises(AttributeError, duckduckgo.response, None) self.assertRaises(AttributeError, duckduckgo.response, []) diff --git a/tests/unit/engines/test_flickr.py b/tests/unit/engines/test_flickr.py index 2d7472a92..be97647ce 100644 --- a/tests/unit/engines/test_flickr.py +++ b/tests/unit/engines/test_flickr.py @@ -52,7 +52,7 @@ class TestFlickrEngine(SearxTestCase): self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054') self.assertTrue('o.jpg' in results[0]['img_src']) self.assertTrue('n.jpg' in results[0]['thumbnail_src']) - self.assertTrue('Owner' in results[0]['content']) + self.assertTrue('Owner' in results[0]['author']) self.assertTrue('Description' in results[0]['content']) json = r""" @@ -76,7 +76,7 @@ class TestFlickrEngine(SearxTestCase): self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054') self.assertTrue('z.jpg' in results[0]['img_src']) self.assertTrue('z.jpg' in results[0]['thumbnail_src']) - self.assertTrue('Owner' in results[0]['content']) + self.assertTrue('Owner' in results[0]['author']) self.assertTrue('Description' in results[0]['content']) json = r""" @@ -100,7 +100,7 @@ class TestFlickrEngine(SearxTestCase): self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054') self.assertTrue('o.jpg' in results[0]['img_src']) self.assertTrue('o.jpg' in results[0]['thumbnail_src']) - self.assertTrue('Owner' in results[0]['content']) + self.assertTrue('Owner' in results[0]['author']) self.assertTrue('Description' in results[0]['content']) json = r""" diff --git a/tests/unit/engines/test_flickr_noapi.py b/tests/unit/engines/test_flickr_noapi.py index 42f38f90b..5f8b069e3 100644 --- a/tests/unit/engines/test_flickr_noapi.py +++ b/tests/unit/engines/test_flickr_noapi.py @@ -15,6 +15,7 @@ class TestFlickrNoapiEngine(SearxTestCase): query = 'test_query' dicto = defaultdict(dict) dicto['pageno'] = 1 + dicto['time_range'] = '' params = flickr_noapi.request(query, dicto) self.assertIn('url', params) self.assertIn(query, params['url']) @@ -144,7 +145,7 @@ class TestFlickrNoapiEngine(SearxTestCase): self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434') self.assertIn('k.jpg', results[0]['img_src']) self.assertIn('n.jpg', results[0]['thumbnail_src']) - self.assertIn('Owner', results[0]['content']) + self.assertIn('Owner', results[0]['author']) # no n size, only the z size json = """ @@ -187,7 +188,7 @@ class TestFlickrNoapiEngine(SearxTestCase): self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434') self.assertIn('z.jpg', results[0]['img_src']) self.assertIn('z.jpg', results[0]['thumbnail_src']) - self.assertIn('Owner', results[0]['content']) + self.assertIn('Owner', results[0]['author']) # no z or n size json = """ @@ -230,7 +231,7 @@ class TestFlickrNoapiEngine(SearxTestCase): self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434') self.assertIn('o.jpg', results[0]['img_src']) self.assertIn('o.jpg', results[0]['thumbnail_src']) - self.assertIn('Owner', results[0]['content']) + self.assertIn('Owner', results[0]['author']) # no image test json = """ diff --git a/tests/unit/engines/test_google_news.py b/tests/unit/engines/test_google_news.py index 31d674121..6454dde47 100644 --- a/tests/unit/engines/test_google_news.py +++ b/tests/unit/engines/test_google_news.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from collections import defaultdict import mock from searx.engines import google_news @@ -11,16 +13,16 @@ class TestGoogleNewsEngine(SearxTestCase): dicto = defaultdict(dict) dicto['pageno'] = 1 dicto['language'] = 'fr_FR' + dicto['time_range'] = 'w' params = google_news.request(query, dicto) self.assertIn('url', params) self.assertIn(query, params['url']) - self.assertIn('googleapis.com', params['url']) self.assertIn('fr', params['url']) dicto['language'] = 'all' params = google_news.request(query, dicto) self.assertIn('url', params) - self.assertIn('en', params['url']) + self.assertNotIn('fr', params['url']) def test_response(self): self.assertRaises(AttributeError, google_news.response, None) @@ -34,103 +36,15 @@ class TestGoogleNewsEngine(SearxTestCase): response = mock.Mock(text='{"data": []}') self.assertEqual(google_news.response(response), []) - json = """ - { - "responseData": { - "results": [ - { - "GsearchResultClass": "GnewsSearch", - "clusterUrl": "http://news.google.com/news/story?ncl=d2d3t1LMDpNIj2MPPhdTT0ycN4sWM&hl=fr&ned=fr", - "content": "This is the content", - "unescapedUrl": "http://this.is.the.url", - "url": "http://this.is.the.url", - "title": "This is the title", - "titleNoFormatting": "This is the title", - "location": "", - "publisher": "Jeux Actu", - "publishedDate": "Fri, 30 Jan 2015 11:00:25 -0800", - "signedRedirectUrl": "http://news.google.com/", - "language": "fr", - "image": { - "url": "http://i.jeuxactus.com/datas/jeux/d/y/dying-light/vu/dying-light-54cc080b568fb.jpg", - "tbUrl": "http://t1.gstatic.com/images?q=tbn:ANd9GcSF4yYrs9Ycw23DGiOSAZ-5SEPXYwG3LNs", - "originalContextUrl": "http://www.jeuxactu.com/test-dying-light-sur-ps4-97208.htm", - "publisher": "Jeux Actu", - "tbWidth": 80, - "tbHeight": 30 - }, - "relatedStories": [ - { - "unescapedUrl": "http://www.jeuxvideo.com/test/415823/dying-light.htm", - "url": "http%3A%2F%2Fwww.jeuxvideo.com%2Ftest%2F415823%2Fdying-light.htm", - "title": "<b>Test</b> du jeu Dying Light - jeuxvideo.com", - "titleNoFormatting": "Test du jeu Dying Light - jeuxvideo.com", - "location": "", - "publisher": "JeuxVideo.com", - "publishedDate": "Fri, 30 Jan 2015 08:52:30 -0800", - "signedRedirectUrl": "http://news.google.com/news/url?sa=T&", - "language": "fr" - } - ] - } - ] - }, - "responseDetails": null, - "responseStatus": 200 - } - """ - response = mock.Mock(text=json) + html = u""" +<div class="g"> +<div class="ts _V6c _Zmc _XO _knc _d7c"><a class="top _vQb _mnc" href="http://this.is.the.url" onmousedown="return rwt(this,'','','','5','AFQjCNGixEtJGC3qTB9pYFLXlRj8XXwdiA','','0ahUKEwiG7O_M5-rQAhWDtRoKHd0RD5QQvIgBCCwwBA','','',event)"><img class="th _lub" id="news-thumbnail-image-52779299683347" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAGQAZAMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAFBgADBAIBB//EADsQAAIBAwIEAwUGBAUFAAAAAAECAwAEEQUhBhIxURNBYRQiMnGBFSORobHBB1Ji4UKS0fDxFiQzNYL/xAAYAQEBAQEBAAAAAAAAAAAAAAACAwEEAP/EACERAAMBAAICAgMBAAAAAAAAAAABAhEhMQMSE2EEQVEi/9oADAMBAAIRAxEAPwDSkKr8JFWIzwnMTlSepFdiBgMiuxEdid6B7QbrEr8qE4L4wGNCIT7u/WifE0eIosHBz0oWnugCjQ4BfEipJHbpK/JG0gDP/KO9XT6Lw7BGDHrofIBIJQ4NXalAs8IDJnFLepS21pmOOFXl679FoY66ZTcNwWxtGzaaqwOf8JFcXupSSr4cupSOp6gnGaDQahJESQwU/wBIxXbX0l0jl+VgduYjJrfj/ofc9MluueV1z3xV2jlX1AlDkY61TY3MAk5LuJSnm4G4+nnTFb2ltEweFRvuCO1ebw8uTYNnQ9iDTtDKJYY8DflFJgXLp8xT5FbJHBGx/lFFM9a4MrQFjnFSilvPGiYaItv1zUrTnwHljgLViqwUDyNFEskKlmIDCs08JMWHfl32INZ8hnIscWII4oWPmdqCg9KLccsUtLZM596g6HmVT6Um9WlvGeXk/gWruCObGFz3pb0/R59Y1D2WDYk5lmfpGP3PpW7iK4aIxY3CqWA7t5UxcG3SQWxsZI2VI0MxM6hedj1Oeo9Kc5M6PPagQ3DdjpcpWeHx2U7s+9LuvPCsr+yoETIwAOgpq1DV59RmuJIpbS2hhOG5zvmlLVXE4OCpcnBKdDRW7ptZgMEuCCPrTJwteGYS2z78vvpnt5j/AH3pWIxRbhZ+XV4h5Orj8s/tTtcE5fI6xKWmjVepYfrX0trQrbxLICDyDavm0EvgXEU2M8jhsfI033fHiyxxSfZkwj+EtjP6VzpPR0E8ICQR0qUuT8Y2DSExxtj69alVwOINy3Esye7zKfnXdpZzzMjSfAO1KGm8UX99qNvbm1SNZZApYnoPOimr6rf2crBLmQoTsFIwo8htUHDRk+N0Zv4nQi2itMHALUAiP3SH0oxJrUtyqJcKk4GDiZeb9a0LqkOADY2nz8FaSeLCkxgsWUVrecWQRXwDQW8DzMpGckdNvPr0orxZfpa2if8AYywPIfDkY4YDYHbHbcVgucf9YWd3CqR+MxUgDC5C7bDy2FecRzXQsxJd3lmJN8wCPCvgkZBBOc1Vr2kccaA7PkuBOm6qzD3+XZh1/UflWG+isoGAgMjPzb8x2Jz2r37Sm8AouynqKFyOQxkk8unqa9KYKawolI529CRRLhr/ANxb46AOT/lNBgSTTPwTL7PqMlwpHOkXKuR3IzTvonPY2WqCa6hiPR3VT9TTfx3pzaRb2IskUJICpBPUgUvDXphjLR5HQ8oq6bii9uOUXExmC/CJBzY/GoTWFXOiKV1BZpvEjJYyEkgbb1Kdvt19j9zk9fuk/wBKlL5foz0Zk0vTWa0N/hyVYqiKcZ26/jSvdX81pqET+0PJCX8Nw3l6H5b19H0pccPWpxu2WO/9R3pQ4s0yzi1K4gcFGuW8WN+b3STny8t6xr9lU+MRe2AQVPukZGKq9qTxzCGJcLzbHIqm2uILSCO2uiyvF7pdh1HUNjtQO0uootbLSmQ25kIfwyOYrnyztmvT/oL4C91M3NHIh96GRZB9D+/T61xxNf6XqbBrC2LSbkhVyfypk1Cew1SP7F0exNjbW8LXeovKwMx5VJCs3/0vToT6EUhcHTqOIEfConIyLy+QNX9MWElYOmkYHDKVx5EYrFIrSNk7imriCFrm7kt+TM8R5ie696y6Do41G5naUlLa2TnkxjJ7L9TR3BOdeCzgbg82fntRvR1mtbpGYe5IvUdiP7isrWDSTuIwFIyewA+tbraC7js4J7WVpYz92VUZMTdeUr28wenX1rXyg+rTC7TkHrXonPeiGk6TFeWeNQuWsLot7kkihoXHrj3l+e4oZJbSxzTxY5mgcrJyHmAx57eXrXOVc1Pawt8dq8rPv5VKww+jWUgbhGymTO8QIPod6y8cadHfaQsgws8GWUjrjO4/erXxa8M2cETZCW6bEdNq513UlsbSO6mh9oRXXmh5+UPkk4Jx54NdUrQ08Qj2cQ1ezMDkpexA7k/EBQ+C3ubOVXliICts3l1rXqEr3+qPeWASK7n55vZ7bHhxDGeQf1coJP4dc13Y8SMiPDeRBiRjp19DUaiofBs3NLkKahcwcNaLJaQMtzquspz3jhuYRRE5EYPc9W/4oDDYGyvLO4upLdB4YzFFJmRQq5HMvcj9qtvI7SPXpGguxqFvFysZSvKHON167gdM1a/EUb6fLYz2FvI01yJZrphmVlyCVHYfLue9dTWyRisotfVpLm8D272suB0mURtjtkV3p2qwWF5P7VbmETAK6ZyrD0odrtq+nTiy1PT47Oc4mWWPBflYbA4OMenWsdnd3FusqxOkyMpVkYdR9a5nLXBer2tQyxRWcjznT5CpfDBMbtjoPl6VlN+sCLNbwMZjIysoAGPQj8OtBre5dJeaPKN5ods0aGoW2o2rQ3i/eHYSpsw+dTc4dng/L9J9WjSsK3Og3V/JeQWvhL4cUcr5Zj5j0JGw9aG6Jpst3NDFLcmzNzA8ts2ATIyZ265Xz/vtWbVbOzgQCW4eJ4oT4I8MkSHyUYHmepJAHY0PWGSbT11CFFSGKQwM6EhmYjOTv2OM7darCyeDl/J8r8nk1sIwXDSRK7jDHrnY586lNuh6Pouu6Xb3ZvE06ZV8KaFCFUuvVgD0zsa8oNE9CmpA/YtoRkhrdPptWPidZ5dGuIraETSye6V64jQB3IH82QD8gcb1gvuIDJp9vaW8JVkRYyZN8kDyArBbXx1XXLO2vb2SKI8yyGBSFRSu+MZJzhc/6V1QsYLeo1R3Oh3dnby6RYvDcWcQE1wUVRM3KASQCd/n39aUkhN7rltFJ1muI0OP6mA/ejeqX1jYaxLpOmzmfT4IQgmOMu5PMzbAdwPpS+l37Pq8NzGvM0Myui9yrAgfpXrfIZ6CkmjXWpa9qcPD9s3hQvIyoGGBGrcvmfP96OcI8YaTpelw2mp6MJkR2cThVkEj9dww28umdsVm0HSotb1O6tbK5v8ATp1R2dmcOo94Aqccp8/yoHxBbrpt39lLMswtCweRVwGdt2/ABR9KbWAX2aNX1231DiCXVru3M5kkLmGR/cIxhV+QAH4UHvbqC5lMsFvFa7Y5Yc4P4k0X1vS7XS9E0znwb+6BmkXkX3E8t8ZzuOpxsawXEa6Td3MKrHLJ4JhdiPgYgc2PUbrn51Nz/WPfoxpOcY8QEjbB3q2KUswzjbzWt+t3Ftcw2Hh28cKwRLCzqP8AydMtjA32rnUtG9jiS4srhJ7OT4JUYZ+TDqDQpCVFpmW/g9llYArvGxHwmrNX0v2HQdKkjcxx3HOZk5jhnGMk9+woRFKUO/Uedbprye8tGiZs28Eikcx+FmBG3ocfkKKWcG1zyPv8PLi2Xh3wpbOSQxTuodFHvA4PbuTUpG07XtW0qA29lMYoy3MVx5kD07AVKxzyZphmvZnWViR/KMeQrvQ4lutQm8bJ8G0lmUZ/xKuRn61KldDACoHYzu7MSx6sepo9pFtE/vMMloyT9cj8sV7UoPsS6G7+HX3Wm6jdLvM0ioWPYLn9SaQFka91NHuTzme4Bkz58zb/AK17Uq1dImg5rcrXPGcUU2GSIxqq+QGA36ml+bMkaXEjM0kw8R89yd6lSpiCfCcEV7fXdpcxq8TWUjjujAggr2NXcJ3k08F9pcpDWslpJNyEfA6gEFe29SpQZqAgbmAY9TvXAY5YZOCRUqV79ifRthucRhXgglxsGkTmIHbNSpUrAn//2Q==" alt="A(z) south témájának képe a következőből: CBC.ca" data-deferred="1" onload="google.aft&&google.aft(this)"></a><div class="_cnc"><h3 class="r _U6c"><a class="l _HId" href="http://this.is.the.url" onmousedown="return rwt(this,'','','','5','AFQjCNGixEtJGC3qTB9pYFLXlRj8XXwdiA','','0ahUKEwiG7O_M5-rQAhWDtRoKHd0RD5QQqQIILSgAMAQ','','',event)">Meet Thuli Madonsela — <em>South</em> Africa's conscience</a></h3><div class="slp"><span class="_tQb _IId">CBC.ca</span><span class="_v5">-</span><span class="f nsa _uQb">9 órával ezelőtt</span></div><div class="st"><em>South</em> African Public Protector</div></div><div class="_Xmc card-section"><a class="_sQb" href="http://www.news24.com/Columnists/Mpumelelo_Mkhabela/who-really-governs-south-africa-20161209" onmousedown="return rwt(this,'','','','5','AFQjCNHhc2MnYSZ5T4COqInzvgoju5k5bA','','0ahUKEwiG7O_M5-rQAhWDtRoKHd0RD5QQuogBCC4oATAE','','',event)">Who really governs <em>South</em> Africa?</a><br><span class="_Wmc _GId">Vélemény</span><span class="_v5">-</span><span class="_tQb _IId">News24</span><span class="_v5">-</span><span class="f nsa _uQb">2016. dec. 8.</span></div><div class="_Vmc"></div></div> +</div> + """ # noqa + response = mock.Mock(text=html) results = google_news.response(response) self.assertEqual(type(results), list) self.assertEqual(len(results), 1) - self.assertEqual(results[0]['title'], 'This is the title') + self.assertEqual(results[0]['title'], u'Meet Thuli Madonsela \u2014 South Africa\'s conscience') self.assertEqual(results[0]['url'], 'http://this.is.the.url') - self.assertEqual(results[0]['content'], 'This is the content') - - json = """ - { - "responseData": { - "results": [ - { - "GsearchResultClass": "GnewsSearch", - "clusterUrl": "http://news.google.com/news/story?ncl=d2d3t1LMDpNIj2MPPhdTT0ycN4sWM&hl=fr&ned=fr", - "content": "This is the content", - "unescapedUrl": "http://this.is.the.url", - "title": "This is the title", - "titleNoFormatting": "This is the title", - "location": "", - "publisher": "Jeux Actu", - "publishedDate": "Fri, 30 Jan 2015 11:00:25 -0800", - "signedRedirectUrl": "http://news.google.com/news/", - "language": "fr", - "image": { - "url": "http://i.jeuxactus.com/datas/jeux/d/y/dying-light/vu/dying-light-54cc080b568fb.jpg", - "tbUrl": "http://t1.gstatic.com/images?q=tbn:b_6f-OSAZ-5SEPXYwG3LNs", - "originalContextUrl": "http://www.jeuxactu.com/test-dying-light-sur-ps4-97208.htm", - "publisher": "Jeux Actu", - "tbWidth": 80, - "tbHeight": 30 - } - } - ] - }, - "responseDetails": null, - "responseStatus": 200 - } - """ - response = mock.Mock(text=json) - results = google_news.response(response) - self.assertEqual(type(results), list) - self.assertEqual(len(results), 0) - - json = """ - { - "responseData": {}, - "responseDetails": null, - "responseStatus": 200 - } - """ - response = mock.Mock(text=json) - results = google_news.response(response) - self.assertEqual(type(results), list) - self.assertEqual(len(results), 0) + self.assertEqual(results[0]['content'], 'South African Public Protector') diff --git a/tests/unit/engines/test_kickass.py b/tests/unit/engines/test_kickass.py index 4cfcaa63c..3a75c6697 100644 --- a/tests/unit/engines/test_kickass.py +++ b/tests/unit/engines/test_kickass.py @@ -14,7 +14,7 @@ class TestKickassEngine(SearxTestCase): params = kickass.request(query, dicto) self.assertIn('url', params) self.assertIn(query, params['url']) - self.assertIn('kickass.to', params['url']) + self.assertIn('kickass.cd', params['url']) self.assertFalse(params['verify']) def test_response(self): @@ -84,7 +84,7 @@ class TestKickassEngine(SearxTestCase): </span> </div> </td> - <td class="nobr center">449 <span>bytes</span></td> + <td class="nobr center">449 bytes</td> <td class="center">4</td> <td class="center">2 years</td> <td class="green center">10</td> @@ -97,8 +97,8 @@ class TestKickassEngine(SearxTestCase): self.assertEqual(type(results), list) self.assertEqual(len(results), 1) self.assertEqual(results[0]['title'], 'This should be the title') - self.assertEqual(results[0]['url'], 'https://kickass.to/url.html') - self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted') + self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html') + self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted') self.assertEqual(results[0]['seed'], 10) self.assertEqual(results[0]['leech'], 1) self.assertEqual(results[0]['filesize'], 449) @@ -191,7 +191,7 @@ class TestKickassEngine(SearxTestCase): </span> </div> </td> - <td class="nobr center">1 <span>KB</span></td> + <td class="nobr center">1 KiB</td> <td class="center">4</td> <td class="center">2 years</td> <td class="green center">10</td> @@ -235,7 +235,7 @@ class TestKickassEngine(SearxTestCase): </span> </div> </td> - <td class="nobr center">1 <span>MB</span></td> + <td class="nobr center">1 MiB</td> <td class="center">4</td> <td class="center">2 years</td> <td class="green center">9</td> @@ -279,7 +279,7 @@ class TestKickassEngine(SearxTestCase): </span> </div> </td> - <td class="nobr center">1 <span>GB</span></td> + <td class="nobr center">1 GiB</td> <td class="center">4</td> <td class="center">2 years</td> <td class="green center">8</td> @@ -323,7 +323,7 @@ class TestKickassEngine(SearxTestCase): </span> </div> </td> - <td class="nobr center">1 <span>TB</span></td> + <td class="nobr center">1 TiB</td> <td class="center">4</td> <td class="center">2 years</td> <td class="green center">7</td> @@ -367,7 +367,7 @@ class TestKickassEngine(SearxTestCase): </span> </div> </td> - <td class="nobr center">z <span>bytes</span></td> + <td class="nobr center">z bytes</td> <td class="center">r</td> <td class="center">2 years</td> <td class="green center">a</td> @@ -380,17 +380,17 @@ class TestKickassEngine(SearxTestCase): self.assertEqual(type(results), list) self.assertEqual(len(results), 5) self.assertEqual(results[0]['title'], 'This should be the title') - self.assertEqual(results[0]['url'], 'https://kickass.to/url.html') - self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted') + self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html') + self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted') self.assertEqual(results[0]['seed'], 10) self.assertEqual(results[0]['leech'], 1) self.assertEqual(results[0]['files'], 4) self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test') self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test') - self.assertEqual(results[0]['filesize'], 1024) - self.assertEqual(results[1]['filesize'], 1048576) - self.assertEqual(results[2]['filesize'], 1073741824) - self.assertEqual(results[3]['filesize'], 1099511627776) + self.assertEqual(results[0]['filesize'], 1000) + self.assertEqual(results[1]['filesize'], 1000000) + self.assertEqual(results[2]['filesize'], 1000000000) + self.assertEqual(results[3]['filesize'], 1000000000000) self.assertEqual(results[4]['seed'], 0) self.assertEqual(results[4]['leech'], 0) self.assertEqual(results[4]['files'], None) diff --git a/tests/unit/engines/test_pdbe.py b/tests/unit/engines/test_pdbe.py new file mode 100644 index 000000000..7aa8e2655 --- /dev/null +++ b/tests/unit/engines/test_pdbe.py @@ -0,0 +1,109 @@ +import mock +from collections import defaultdict +from searx.engines import pdbe +from searx.testing import SearxTestCase + + +class TestPdbeEngine(SearxTestCase): + def test_request(self): + query = 'test_query' + dicto = defaultdict(dict) + params = pdbe.request(query, dicto) + self.assertTrue('url' in params) + self.assertTrue('ebi.ac.uk' in params['url']) + self.assertTrue('data' in params) + self.assertTrue('q' in params['data']) + self.assertTrue(query in params['data']['q']) + self.assertTrue('wt' in params['data']) + self.assertTrue('json' in params['data']['wt']) + self.assertTrue('method' in params) + self.assertTrue(params['method'] == 'POST') + + def test_response(self): + self.assertRaises(AttributeError, pdbe.response, None) + self.assertRaises(AttributeError, pdbe.response, []) + self.assertRaises(AttributeError, pdbe.response, '') + self.assertRaises(AttributeError, pdbe.response, '[]') + + json = """ +{ + "response": { + "docs": [ + { + "citation_title": "X-ray crystal structure of ferric Aplysia limacina myoglobin in different liganded states.", + "citation_year": 1993, + "entry_author_list": [ + "Conti E, Moser C, Rizzi M, Mattevi A, Lionetti C, Coda A, Ascenzi P, Brunori M, Bolognesi M" + ], + "journal": "J. Mol. Biol.", + "journal_page": "498-508", + "journal_volume": "233", + "pdb_id": "2fal", + "status": "REL", + "title": "X-RAY CRYSTAL STRUCTURE OF FERRIC APLYSIA LIMACINA MYOGLOBIN IN DIFFERENT LIGANDED STATES" + } + ], + "numFound": 1, + "start": 0 + }, + "responseHeader": { + "QTime": 0, + "params": { + "q": "2fal", + "wt": "json" + }, + "status": 0 + } +} +""" + + response = mock.Mock(text=json) + results = pdbe.response(response) + self.assertEqual(type(results), list) + self.assertEqual(len(results), 1) + self.assertEqual(results[0]['title'], + 'X-RAY CRYSTAL STRUCTURE OF FERRIC APLYSIA LIMACINA MYOGLOBIN IN DIFFERENT LIGANDED STATES') + self.assertEqual(results[0]['url'], pdbe.pdbe_entry_url.format(pdb_id='2fal')) + self.assertEqual(results[0]['img_src'], pdbe.pdbe_preview_url.format(pdb_id='2fal')) + self.assertTrue('Conti E' in results[0]['content']) + self.assertTrue('X-ray crystal structure of ferric Aplysia limacina myoglobin in different liganded states.' in + results[0]['content']) + self.assertTrue('1993' in results[0]['content']) + + # Testing proper handling of PDB entries marked as obsolete + json = """ +{ + "response": { + "docs": [ + { + "citation_title": "Obsolete entry test", + "citation_year": 2016, + "entry_author_list": ["Doe J"], + "journal": "J. Obs.", + "journal_page": "1-2", + "journal_volume": "1", + "pdb_id": "xxxx", + "status": "OBS", + "title": "OBSOLETE ENTRY TEST", + "superseded_by": "yyyy" + } + ], + "numFound": 1, + "start": 0 + }, + "responseHeader": { + "QTime": 0, + "params": { + "q": "xxxx", + "wt": "json" + }, + "status": 0 + } +} +""" + response = mock.Mock(text=json) + results = pdbe.response(response) + self.assertEqual(type(results), list) + self.assertEqual(len(results), 1) + self.assertEqual(results[0]['title'], 'OBSOLETE ENTRY TEST (OBSOLETE)') + self.assertTrue(results[0]['content'].startswith('<em>This entry has been superseded by')) diff --git a/tests/unit/engines/test_searchcode_doc.py b/tests/unit/engines/test_searchcode_doc.py index 7228613ed..d02bb7a44 100644 --- a/tests/unit/engines/test_searchcode_doc.py +++ b/tests/unit/engines/test_searchcode_doc.py @@ -56,9 +56,6 @@ class TestSearchcodeDocEngine(SearxTestCase): self.assertEqual(len(results), 1) self.assertEqual(results[0]['title'], '[Type] Namespace test') self.assertEqual(results[0]['url'], 'http://url') - self.assertIn('Synopsis', results[0]['content']) - self.assertIn('Type', results[0]['content']) - self.assertIn('test', results[0]['content']) self.assertIn('Description', results[0]['content']) json = r""" diff --git a/tests/unit/engines/test_seedpeer.py b/tests/unit/engines/test_seedpeer.py new file mode 100644 index 000000000..37b2de8e4 --- /dev/null +++ b/tests/unit/engines/test_seedpeer.py @@ -0,0 +1,51 @@ +import mock +from collections import defaultdict +from searx.engines import seedpeer +from searx.testing import SearxTestCase +from datetime import datetime + + +class TestSeedPeerEngine(SearxTestCase): + + html = '' + with open('./tests/unit/engines/seedpeer_fixture.html') as fixture: + html += fixture.read() + + def test_request(self): + query = 'test_query' + dicto = defaultdict(dict) + dicto['pageno'] = 1 + params = seedpeer.request(query, dicto) + self.assertIn('url', params) + self.assertIn(query, params['url']) + self.assertIn('seedpeer.eu', params['url']) + + def test_response_raises_attr_error_on_empty_response(self): + self.assertRaises(AttributeError, seedpeer.response, None) + self.assertRaises(AttributeError, seedpeer.response, []) + self.assertRaises(AttributeError, seedpeer.response, '') + self.assertRaises(AttributeError, seedpeer.response, '[]') + + def test_response_returns_empty_list(self): + response = mock.Mock(text='<html></html>') + self.assertEqual(seedpeer.response(response), []) + + def test_response_returns_all_results(self): + response = mock.Mock(text=self.html) + results = seedpeer.response(response) + self.assertTrue(isinstance(results, list)) + self.assertEqual(len(results), 2) + + def test_response_returns_correct_results(self): + response = mock.Mock(text=self.html) + results = seedpeer.response(response) + self.assertEqual( + results[0]['title'], 'Narcos - Season 2 - 720p WEBRiP - x265 HEVC - ShAaNiG ' + ) + self.assertEqual( + results[0]['url'], + 'http://www.seedpeer.eu/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html' + ) + self.assertEqual(results[0]['content'], '2.48 GB, 1 day') + self.assertEqual(results[0]['seed'], '861') + self.assertEqual(results[0]['leech'], '332') diff --git a/tests/unit/engines/test_spotify.py b/tests/unit/engines/test_spotify.py index fd274abbd..e37c344d2 100644 --- a/tests/unit/engines/test_spotify.py +++ b/tests/unit/engines/test_spotify.py @@ -90,7 +90,7 @@ class TestSpotifyEngine(SearxTestCase): self.assertEqual(len(results), 1) self.assertEqual(results[0]['title'], 'Title of track') self.assertEqual(results[0]['url'], 'https://open.spotify.com/track/2GzvFiedqW8hgqUpWcASZa') - self.assertEqual(results[0]['content'], 'Artist Name • Album Title • Title of track') + self.assertEqual(results[0]['content'], 'Artist Name - Album Title - Title of track') self.assertIn('1000', results[0]['embedded']) json = """ diff --git a/tests/unit/engines/test_vimeo.py b/tests/unit/engines/test_vimeo.py index 50b1cb563..c86b50a14 100644 --- a/tests/unit/engines/test_vimeo.py +++ b/tests/unit/engines/test_vimeo.py @@ -22,80 +22,15 @@ class TestVimeoEngine(SearxTestCase): self.assertRaises(AttributeError, vimeo.response, '') self.assertRaises(AttributeError, vimeo.response, '[]') - response = mock.Mock(text='<html></html>') - self.assertEqual(vimeo.response(response), []) + json = u""" +{"filtered":{"total":274641,"page":1,"per_page":18,"paging":{"next":"?sizes=590x332&page=2","previous":null,"first":"?sizes=590x332&page=1","last":"?sizes=590x332&page=15258"},"data":[{"is_staffpick":false,"is_featured":true,"type":"clip","clip":{"uri":"\\/videos\\/106557563","name":"Hot Rod Revue: The South","link":"https:\\/\\/vimeo.com\\/106557563","duration":4069,"created_time":"2014-09-19T03:38:04+00:00","privacy":{"view":"ptv"},"pictures":{"sizes":[{"width":"590","height":"332","link":"https:\\/\\/i.vimeocdn.com\\/video\\/489717884_590x332.jpg?r=pad","link_with_play_button":"https:\\/\\/i.vimeocdn.com\\/filter\\/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F489717884_590x332.jpg&src1=http%3A%2F%2Ff.vimeocdn.com%2Fp%2Fimages%2Fcrawler_play.png"}]},"stats":{"plays":null},"metadata":{"connections":{"comments":{"total":0},"likes":{"total":5}},"interactions":[]},"user":{"name":"Cal Thorley","link":"https:\\/\\/vimeo.com\\/calthorley","pictures":{"sizes":[{"width":30,"height":30,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_30x30?r=pad"},{"width":75,"height":75,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_75x75?r=pad"},{"width":100,"height":100,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_100x100?r=pad"},{"width":300,"height":300,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_300x300?r=pad"}]}}}}]}}; - html = """ - <div id="browse_content" class="results_grid" data-search-id="696d5f8366914ec4ffec33cf7652de384976d4f4"> - <ul class="js-browse_list clearfix browse browse_videos browse_videos_thumbnails kane" - data-stream="c2VhcmNoOjo6ZGVzYzp7InF1ZXJ5IjoidGVzdCJ9"> - <li data-position="7" data-result-id="clip_79600943"> - <div class="clip_thumbnail"> - <a href="/videoid" class="js-result_url"> - <div class="thumbnail_wrapper"> - <img src="http://image.url.webp" class="js-clip_thumbnail_image"> - <div class="overlay overlay_clip_meta"> - <div class="meta_data_footer"> - <span class="clip_upload_date"> - <time datetime="2013-11-17T08:49:09-05:00" - title="dimanche 17 novembre 2013 08:49">Il y a 1 an</time> - </span> - <span class="clip_likes"> - <img src="https://f.vimeocdn.com/images_v6/svg/heart-icon.svg">2 215 - </span> - <span class="clip_comments"> - <img src="https://f.vimeocdn.com/images_v6/svg/comment-icon.svg">75 - </span> - <span class="overlay meta_data_footer clip_duration">01:12</span> - </div> - </div> - </div> - <span class="title">This is the title</span> - </a> - </div> - <div class="clip_thumbnail_attribution"> - <a href="/fedorshmidt"> - <img src="https://i.vimeocdn.com/portrait/6628061_100x100.jpg" class="avatar"> - <span class="display_name">Fedor Shmidt</span> - </a> - <span class="plays">2,1M lectures</span> - </div> - </li> - </ul> - </div> - """ - response = mock.Mock(text=html) +""" # noqa + response = mock.Mock(text=json) results = vimeo.response(response) self.assertEqual(type(results), list) self.assertEqual(len(results), 1) - self.assertEqual(results[0]['title'], 'This is the title') - self.assertEqual(results[0]['url'], 'https://vimeo.com/videoid') + self.assertEqual(results[0]['title'], u'Hot Rod Revue: The South') + self.assertEqual(results[0]['url'], 'https://vimeo.com/106557563') self.assertEqual(results[0]['content'], '') - self.assertEqual(results[0]['thumbnail'], 'http://image.url.webp') - self.assertIn('/videoid', results[0]['embedded']) - - html = """ - <ol class="js-browse_list clearfix browse browse_videos browse_videos_thumbnails kane" - data-stream="c2VhcmNoOjo6ZGVzYzp7InF1ZXJ5IjoidGVzdCJ9"> - <li id="clip_100785455" data-start-page="/search/page:1/sort:relevant/" data-position="1"> - <a href="/videoid" title="Futurama 3d (test shot)"> - <img src="http://image.url.webp" - srcset="http://i.vimeocdn.com/video/482375085_590x332.webp 2x" alt="" - class="thumbnail thumbnail_lg_wide"> - <div class="data"> - <p class="title"> - This is the title - </p> - <p class="meta"> - <time datetime="2014-07-15T04:16:27-04:00" - title="mardi 15 juillet 2014 04:16">Il y a 6 mois</time> - </p> - </div> - </a> - </li> - </ol> - """ - response = mock.Mock(text=html) - results = vimeo.response(response) - self.assertEqual(type(results), list) - self.assertEqual(len(results), 0) + self.assertEqual(results[0]['thumbnail'], 'https://i.vimeocdn.com/video/489717884_590x332.jpg?r=pad') diff --git a/tests/unit/engines/test_wolframalpha_api.py b/tests/unit/engines/test_wolframalpha_api.py index 76404e192..64a64ceb3 100644 --- a/tests/unit/engines/test_wolframalpha_api.py +++ b/tests/unit/engines/test_wolframalpha_api.py @@ -103,7 +103,8 @@ class TestWolframAlphaAPIEngine(SearxTestCase): self.assertEqual(referer_url, results[0]['urls'][0]['url']) self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title']) self.assertEqual(referer_url, results[1]['url']) - self.assertEqual('Wolfram|Alpha', results[1]['title']) + self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title']) + self.assertIn('result_plaintext', results[1]['content']) # test calc xml = """<?xml version='1.0' encoding='UTF-8'?> @@ -161,4 +162,5 @@ class TestWolframAlphaAPIEngine(SearxTestCase): self.assertEqual(referer_url, results[0]['urls'][0]['url']) self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title']) self.assertEqual(referer_url, results[1]['url']) - self.assertEqual('Wolfram|Alpha', results[1]['title']) + self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title']) + self.assertIn('integral_plaintext', results[1]['content']) diff --git a/tests/unit/engines/test_wolframalpha_noapi.py b/tests/unit/engines/test_wolframalpha_noapi.py index a8f73470e..982edd9f2 100644 --- a/tests/unit/engines/test_wolframalpha_noapi.py +++ b/tests/unit/engines/test_wolframalpha_noapi.py @@ -140,7 +140,8 @@ class TestWolframAlphaNoAPIEngine(SearxTestCase): self.assertEqual(referer_url, results[0]['urls'][0]['url']) self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title']) self.assertEqual(referer_url, results[1]['url']) - self.assertEqual('Wolfram|Alpha', results[1]['title']) + self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title']) + self.assertIn('result_plaintext', results[1]['content']) # test calc json = r""" @@ -219,4 +220,5 @@ class TestWolframAlphaNoAPIEngine(SearxTestCase): self.assertEqual(referer_url, results[0]['urls'][0]['url']) self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title']) self.assertEqual(referer_url, results[1]['url']) - self.assertEqual('Wolfram|Alpha', results[1]['title']) + self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title']) + self.assertIn('integral_plaintext', results[1]['content']) diff --git a/tests/unit/engines/test_www500px.py b/tests/unit/engines/test_www500px.py index 8df15b945..e50601da0 100644 --- a/tests/unit/engines/test_www500px.py +++ b/tests/unit/engines/test_www500px.py @@ -22,62 +22,13 @@ class TestWww500pxImagesEngine(SearxTestCase): self.assertRaises(AttributeError, www500px.response, '') self.assertRaises(AttributeError, www500px.response, '[]') - response = mock.Mock(text='<html></html>') - self.assertEqual(www500px.response(response), []) - - html = """ - <div class="photo"> - <a href="/this.should.be.the.url" data-ga-category="Photo Thumbnail" data-ga-action="Title"> - <img src="https://image.url/3.jpg?v=0" /> - </a> - <div class="details"> - <div class="inside"> - <div class="title"> - <a href="/photo/64312705/branch-out-by-oliver-turpin?feature="> - This is the title - </a> - </div> - <div class="info"> - <a href="/ChronicleUK" data-ga-action="Image" data-ga-category="Photo Thumbnail"> - This is the content - </a> - </div> - <div class="rating">44.8</div> - </div> - </div> - </div> - """ - response = mock.Mock(text=html) + json = """ +{"current_page":1,"total_pages":1000,"total_items":862178,"photos":[{"id":64531569,"user_id":111147,"name":"Grand Canyon Afternoon","description":"Looking west on a very windy winter afternoon.","camera":"Canon EOS 5D Mark II","lens":"EF24-105mm f/4L IS USM","focal_length":"28","iso":"200","shutter_speed":"1/1250","aperture":"6.3","times_viewed":4809,"rating":48.5,"status":1,"created_at":"2014-03-22T03:44:46-04:00","category":8,"location":null,"latitude":36.0323916666667,"longitude":-111.85273,"taken_at":"2014-02-27T14:10:43-05:00","hi_res_uploaded":2,"for_sale":true,"width":5476,"height":3651,"votes_count":108,"favorites_count":35,"comments_count":5,"nsfw":false,"sales_count":0,"for_sale_date":null,"highest_rating":91.9,"highest_rating_date":"2014-03-22T22:34:54-04:00","license_type":0,"converted":31,"collections_count":10,"crop_version":0,"privacy":false,"profile":true,"image_url":["https://drscdn.500px.org/photo/64531569/w%3D70_h%3D70/449d50817f28d85395e23bbb415b3cdb?v=0","https://drscdn.500px.org/photo/64531569/q%3D50_w%3D140_h%3D140/3e3e123734a596644ede78105268bdb2?v=0","https://drscdn.500px.org/photo/64531569/q%3D80_h%3D300/2ce2f61714aebdca710967dfdc3efb04","https://drscdn.500px.org/photo/64531569/q%3D80_h%3D450/c8ec030441f2c68b9bd40a114903348a","https://drscdn.500px.org/photo/64531569/q%3D80_h%3D600/ab6562d0581b359679ecc8ef2e939396","https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1000/bd7dbc54a505e041a8c9a70dfa434272","https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1500/eb4d7f8f6a32d3e5c168c2cb55d29c12","https://drscdn.500px.org/photo/64531569/q%3D80_m%3D2000/d519f91b8a568e7357a8a7fa1aabbe74","https://drscdn.500px.org/photo/64531569/m%3D2048/4c52fb18cc2b2b6f91a0d04609786507","https://drscdn.500px.org/photo/64531569/m%3D900/fb620ae39569ab4a421e9170a94b1a0f","https://drscdn.500px.org/photo/64531569/m%3D900_s%3D1_k%3D1_a%3D1/02b95ce64db090c1f94f890960974612?v=0"],"images":[{"size":1,"url":"https://drscdn.500px.org/photo/64531569/w%3D70_h%3D70/449d50817f28d85395e23bbb415b3cdb?v=0","https_url":"https://drscdn.500px.org/photo/64531569/w%3D70_h%3D70/449d50817f28d85395e23bbb415b3cdb?v=0","format":"jpeg"},{"size":2,"url":"https://drscdn.500px.org/photo/64531569/q%3D50_w%3D140_h%3D140/3e3e123734a596644ede78105268bdb2?v=0","https_url":"https://drscdn.500px.org/photo/64531569/q%3D50_w%3D140_h%3D140/3e3e123734a596644ede78105268bdb2?v=0","format":"jpeg"},{"size":4,"url":"https://drscdn.500px.org/photo/64531569/m%3D900/fb620ae39569ab4a421e9170a94b1a0f","https_url":"https://drscdn.500px.org/photo/64531569/m%3D900/fb620ae39569ab4a421e9170a94b1a0f","format":"jpeg"},{"size":14,"url":"https://drscdn.500px.org/photo/64531569/m%3D900_s%3D1_k%3D1_a%3D1/02b95ce64db090c1f94f890960974612?v=0","https_url":"https://drscdn.500px.org/photo/64531569/m%3D900_s%3D1_k%3D1_a%3D1/02b95ce64db090c1f94f890960974612?v=0","format":"jpeg"},{"size":31,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D450/c8ec030441f2c68b9bd40a114903348a","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D450/c8ec030441f2c68b9bd40a114903348a","format":"jpeg"},{"size":32,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D300/2ce2f61714aebdca710967dfdc3efb04","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D300/2ce2f61714aebdca710967dfdc3efb04","format":"jpeg"},{"size":33,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D600/ab6562d0581b359679ecc8ef2e939396","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_h%3D600/ab6562d0581b359679ecc8ef2e939396","format":"jpeg"},{"size":34,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1000/bd7dbc54a505e041a8c9a70dfa434272","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1000/bd7dbc54a505e041a8c9a70dfa434272","format":"jpeg"},{"size":35,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1500/eb4d7f8f6a32d3e5c168c2cb55d29c12","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D1500/eb4d7f8f6a32d3e5c168c2cb55d29c12","format":"jpeg"},{"size":36,"url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D2000/d519f91b8a568e7357a8a7fa1aabbe74","https_url":"https://drscdn.500px.org/photo/64531569/q%3D80_m%3D2000/d519f91b8a568e7357a8a7fa1aabbe74","format":"jpeg"},{"size":2048,"url":"https://drscdn.500px.org/photo/64531569/m%3D2048/4c52fb18cc2b2b6f91a0d04609786507","https_url":"https://drscdn.500px.org/photo/64531569/m%3D2048/4c52fb18cc2b2b6f91a0d04609786507","format":"jpeg"}],"url":"/photo/64531569/grand-canyon-afternoon-by-todd-hakala","positive_votes_count":108,"converted_bits":31,"tags":["landscape","river","arizona","canyon","grand","colorado","south","southwest","az","west","rim","CanonGetaway"],"watermark":false,"image_format":"jpeg","licensing_requested":false,"licensing_suggested":false,"is_free_photo":false,"user":{"id":111147,"username":"ToddHakala","firstname":"Todd","lastname":"Hakala","city":"Albuquerque","country":"US","usertype":0,"fullname":"Todd Hakala","userpic_url":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/1.jpg?2","userpic_https_url":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/1.jpg?2","cover_url":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/cover_2048.jpg?8","upgrade_status":1,"store_on":true,"affection":5217,"avatars":{"default":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/1.jpg?2"},"large":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/2.jpg?2"},"small":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/3.jpg?2"},"tiny":{"https":"https://pacdn.500px.org/111147/ea167926a64ce9b32e44cbec61e3af4f75b762cb/4.jpg?2"}},"followers_count":171}}]} + """ # noqa + response = mock.Mock(text=json) results = www500px.response(response) self.assertEqual(type(results), list) self.assertEqual(len(results), 1) - self.assertEqual(results[0]['title'], 'This is the title') - self.assertEqual(results[0]['url'], 'https://500px.com/this.should.be.the.url') - self.assertEqual(results[0]['content'], 'This is the content') - self.assertEqual(results[0]['thumbnail_src'], 'https://image.url/3.jpg?v=0') - self.assertEqual(results[0]['img_src'], 'https://image.url/2048.jpg') - - html = """ - <a href="/this.should.be.the.url" data-ga-category="Photo Thumbnail" data-ga-action="Title"> - <img src="https://image.url/3.jpg?v=0" /> - </a> - <div class="details"> - <div class="inside"> - <div class="title"> - <a href="/photo/64312705/branch-out-by-oliver-turpin?feature="> - This is the title - </a> - </div> - <div class="info"> - <a href="/ChronicleUK" data-ga-action="Image" data-ga-category="Photo Thumbnail"> - Oliver Turpin - </a> - </div> - <div class="rating">44.8</div> - </div> - </div> - """ - response = mock.Mock(text=html) - results = www500px.response(response) - self.assertEqual(type(results), list) - self.assertEqual(len(results), 0) + self.assertEqual(results[0]['title'], u'Grand Canyon Afternoon') + self.assertEqual(results[0]['url'], 'https://500px.com/photo/64531569/grand-canyon-afternoon-by-todd-hakala') + self.assertEqual(results[0]['content'], u'Looking west on a very windy winter afternoon.') diff --git a/tests/unit/engines/test_yahoo.py b/tests/unit/engines/test_yahoo.py index 1226f92ab..303295e2f 100644 --- a/tests/unit/engines/test_yahoo.py +++ b/tests/unit/engines/test_yahoo.py @@ -46,6 +46,13 @@ class TestYahooEngine(SearxTestCase): self.assertIn('en', params['cookies']['sB']) self.assertIn('en', params['url']) + def test_no_url_in_request_year_time_range(self): + dicto = defaultdict(dict) + query = 'test_query' + dicto['time_range'] = 'year' + params = yahoo.request(query, dicto) + self.assertEqual({}, params['url']) + def test_response(self): self.assertRaises(AttributeError, yahoo.response, None) self.assertRaises(AttributeError, yahoo.response, []) diff --git a/tests/unit/engines/test_youtube_noapi.py b/tests/unit/engines/test_youtube_noapi.py index 9fa8fd20e..41dcbb749 100644 --- a/tests/unit/engines/test_youtube_noapi.py +++ b/tests/unit/engines/test_youtube_noapi.py @@ -11,11 +11,31 @@ class TestYoutubeNoAPIEngine(SearxTestCase): query = 'test_query' dicto = defaultdict(dict) dicto['pageno'] = 0 + dicto['time_range'] = '' params = youtube_noapi.request(query, dicto) self.assertIn('url', params) self.assertIn(query, params['url']) self.assertIn('youtube.com', params['url']) + def test_time_range_search(self): + dicto = defaultdict(dict) + query = 'test_query' + dicto['time_range'] = 'year' + params = youtube_noapi.request(query, dicto) + self.assertIn('&sp=EgIIBQ%253D%253D', params['url']) + + dicto['time_range'] = 'month' + params = youtube_noapi.request(query, dicto) + self.assertIn('&sp=EgIIBA%253D%253D', params['url']) + + dicto['time_range'] = 'week' + params = youtube_noapi.request(query, dicto) + self.assertIn('&sp=EgIIAw%253D%253D', params['url']) + + dicto['time_range'] = 'day' + params = youtube_noapi.request(query, dicto) + self.assertIn('&sp=EgIIAg%253D%253D', params['url']) + def test_response(self): self.assertRaises(AttributeError, youtube_noapi.response, None) self.assertRaises(AttributeError, youtube_noapi.response, []) diff --git a/tests/unit/test_answerers.py b/tests/unit/test_answerers.py new file mode 100644 index 000000000..bd8789a7e --- /dev/null +++ b/tests/unit/test_answerers.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from mock import Mock + +from searx.answerers import answerers +from searx.testing import SearxTestCase + + +class AnswererTest(SearxTestCase): + + def test_unicode_input(self): + query = Mock() + unicode_payload = u'árvíztűrő tükörfúrógép' + for answerer in answerers: + query.query = u'{} {}'.format(answerer.keywords[0], unicode_payload) + self.assertTrue(isinstance(answerer.answer(query), list)) diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py index 98d39ec14..c9e65dfcb 100644 --- a/tests/unit/test_plugins.py +++ b/tests/unit/test_plugins.py @@ -6,9 +6,8 @@ from mock import Mock def get_search_mock(query, **kwargs): - return {'search': Mock(query=query, - result_container=Mock(answers=set()), - **kwargs)} + return Mock(search_query=Mock(query=query, **kwargs), + result_container=Mock(answers=set())) class PluginStoreTest(SearxTestCase): @@ -52,23 +51,39 @@ class SelfIPTest(SearxTestCase): request = Mock(user_plugins=store.plugins, remote_addr='127.0.0.1') request.headers.getlist.return_value = [] - ctx = get_search_mock(query='ip') - store.call('post_search', request, ctx) - self.assertTrue('127.0.0.1' in ctx['search'].result_container.answers) + search = get_search_mock(query='ip', pageno=1) + store.call('post_search', request, search) + self.assertTrue('127.0.0.1' in search.result_container.answers) + + search = get_search_mock(query='ip', pageno=2) + store.call('post_search', request, search) + self.assertFalse('127.0.0.1' in search.result_container.answers) # User agent test request = Mock(user_plugins=store.plugins, user_agent='Mock') request.headers.getlist.return_value = [] - ctx = get_search_mock(query='user-agent') - store.call('post_search', request, ctx) - self.assertTrue('Mock' in ctx['search'].result_container.answers) + search = get_search_mock(query='user-agent', pageno=1) + store.call('post_search', request, search) + self.assertTrue('Mock' in search.result_container.answers) + + search = get_search_mock(query='user-agent', pageno=2) + store.call('post_search', request, search) + self.assertFalse('Mock' in search.result_container.answers) + + search = get_search_mock(query='user-agent', pageno=1) + store.call('post_search', request, search) + self.assertTrue('Mock' in search.result_container.answers) + + search = get_search_mock(query='user-agent', pageno=2) + store.call('post_search', request, search) + self.assertFalse('Mock' in search.result_container.answers) - ctx = get_search_mock(query='user-agent') - store.call('post_search', request, ctx) - self.assertTrue('Mock' in ctx['search'].result_container.answers) + search = get_search_mock(query='What is my User-Agent?', pageno=1) + store.call('post_search', request, search) + self.assertTrue('Mock' in search.result_container.answers) - ctx = get_search_mock(query='What is my User-Agent?') - store.call('post_search', request, ctx) - self.assertTrue('Mock' in ctx['search'].result_container.answers) + search = get_search_mock(query='What is my User-Agent?', pageno=2) + store.call('post_search', request, search) + self.assertFalse('Mock' in search.result_container.answers) diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py index 1762d66b6..1ef1f56c3 100644 --- a/tests/unit/test_webapp.py +++ b/tests/unit/test_webapp.py @@ -5,6 +5,7 @@ from mock import Mock from urlparse import ParseResult from searx import webapp from searx.testing import SearxTestCase +from searx.search import Search class ViewsTestCase(SearxTestCase): @@ -41,10 +42,10 @@ class ViewsTestCase(SearxTestCase): results_number=lambda: 3, results_length=lambda: len(self.test_results)) - webapp.Search.search = search_mock + Search.search = search_mock def get_current_theme_name_mock(override=None): - return 'default' + return 'legacy' webapp.get_current_theme_name = get_current_theme_name_mock @@ -58,7 +59,7 @@ class ViewsTestCase(SearxTestCase): def test_index_html(self): result = self.app.post('/', data={'q': 'test'}) self.assertIn( - '<h3 class="result_title"><img width="14" height="14" class="favicon" src="/static/themes/default/img/icons/icon_youtube.ico" alt="youtube" /><a href="http://second.test.xyz" rel="noreferrer">Second <span class="highlight">Test</span></a></h3>', # noqa + '<h3 class="result_title"><img width="14" height="14" class="favicon" src="/static/themes/legacy/img/icons/icon_youtube.ico" alt="youtube" /><a href="http://second.test.xyz" rel="noreferrer">Second <span class="highlight">Test</span></a></h3>', # noqa result.data ) self.assertIn( |