From 8dfc02a066034c139a16bfe9c620a0dbf8fa14b5 Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Mon, 21 Aug 2017 16:44:25 +0200 Subject: [PATCH 01/39] [doc] add opencollective badges - closes #1005 --- README.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.rst b/README.rst index a0bb12f19..b7ef323d3 100644 --- a/README.rst +++ b/README.rst @@ -10,6 +10,8 @@ instances `__. See the `documentation `__ and the `wiki `__ for more information. |Flattr searx| +|OpenCollective searx backers| +|OpenCollective searx sponsors| Installation ~~~~~~~~~~~~ @@ -43,3 +45,11 @@ More about searx .. |Flattr searx| image:: http://api.flattr.com/button/flattr-badge-large.png :target: https://flattr.com/submit/auto?user_id=asciimoo&url=https://github.com/asciimoo/searx&title=searx&language=&tags=github&category=software + + +.. |OpenCollective searx backers| image:: https://opencollective.com/searx/backers/badge.svg + :target: https://opencollective.com/searx#backer + + +.. |OpenCollective searx sponsors| image:: https://opencollective.com/searx/sponsors/badge.svg + :target: https://opencollective.com/searx#sponsor From 700baf2178d5970cef7cd1efaf24522a458a6b55 Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Mon, 21 Aug 2017 17:28:43 +0200 Subject: [PATCH 02/39] [doc] remove flattr from readme --- README.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.rst b/README.rst index b7ef323d3..86334c3c3 100644 --- a/README.rst +++ b/README.rst @@ -9,7 +9,6 @@ instances `__. See the `documentation `__ and the `wiki `__ for more information. -|Flattr searx| |OpenCollective searx backers| |OpenCollective searx sponsors| @@ -43,9 +42,6 @@ More about searx - `twitter `__ - IRC: #searx @ freenode -.. |Flattr searx| image:: http://api.flattr.com/button/flattr-badge-large.png - :target: https://flattr.com/submit/auto?user_id=asciimoo&url=https://github.com/asciimoo/searx&title=searx&language=&tags=github&category=software - .. |OpenCollective searx backers| image:: https://opencollective.com/searx/backers/badge.svg :target: https://opencollective.com/searx#backer From d14e2781b28e77207ab841dd52db0835ee55fcf2 Mon Sep 17 00:00:00 2001 From: misnyo Date: Fri, 25 Aug 2017 00:52:35 +0200 Subject: [PATCH 03/39] [fix]torrentz search engine fixed for new version --- searx/engines/torrentz.py | 38 +++++++++++++++++------------ searx/settings.yml | 6 +++++ tests/unit/engines/test_torrentz.py | 32 +++++++++++------------- 3 files changed, 42 insertions(+), 34 deletions(-) diff --git a/searx/engines/torrentz.py b/searx/engines/torrentz.py index dda56fc22..fd4164a66 100644 --- a/searx/engines/torrentz.py +++ b/searx/engines/torrentz.py @@ -1,7 +1,7 @@ """ - Torrentz.eu (BitTorrent meta-search engine) + Torrentz2.eu (BitTorrent meta-search engine) - @website https://torrentz.eu/ + @website https://torrentz2.eu/ @provide-api no @using-api no @@ -14,24 +14,24 @@ import re from lxml import html from datetime import datetime -from searx.engines.nyaa import int_or_zero, get_filesize_mul from searx.engines.xpath import extract_text from searx.url_utils import urlencode +from searx.utils import get_torrent_size # engine dependent config categories = ['files', 'videos', 'music'] paging = True # search-url -# https://torrentz.eu/search?f=EXAMPLE&p=6 -base_url = 'https://torrentz.eu/' +# https://torrentz2.eu/search?f=EXAMPLE&p=6 +base_url = 'https://torrentz2.eu/' search_url = base_url + 'search?{query}' # do search-request def request(query, params): page = params['pageno'] - 1 - query = urlencode({'q': query, 'p': page}) + query = urlencode({'f': query, 'p': page}) params['url'] = search_url.format(query=query) return params @@ -54,22 +54,29 @@ def response(resp): # extract url and remove a slash in the beginning link = links[0].attrib.get('href').lstrip('/') - seed = result.xpath('./dd/span[@class="u"]/text()')[0].replace(',', '') - leech = result.xpath('./dd/span[@class="d"]/text()')[0].replace(',', '') + seed = 0 + leech = 0 + try: + seed = int(result.xpath('./dd/span[4]/text()')[0].replace(',', '')) + leech = int(result.xpath('./dd/span[5]/text()')[0].replace(',', '')) + except: + pass params = { 'url': base_url + link, 'title': title, - 'seed': int_or_zero(seed), - 'leech': int_or_zero(leech), + 'seed': seed, + 'leech': leech, 'template': 'torrent.html' } # let's try to calculate the torrent size try: - size_str = result.xpath('./dd/span[@class="s"]/text()')[0] - size, suffix = size_str.split() - params['filesize'] = int(size) * get_filesize_mul(suffix) + filesize_info = result.xpath('./dd/span[3]/text()')[0] + filesize, filesize_multiplier = filesize_info.split() + filesize = get_torrent_size(filesize, filesize_multiplier) + + params['filesize'] = filesize except: pass @@ -80,9 +87,8 @@ def response(resp): # extract and convert creation date try: - date_str = result.xpath('./dd/span[@class="a"]/span')[0].attrib.get('title') - # Fri, 25 Mar 2016 16:29:01 - date = datetime.strptime(date_str, '%a, %d %b %Y %H:%M:%S') + date_ts = result.xpath('./dd/span[2]')[0].attrib.get('title') + date = datetime.fromtimestamp(float(date_ts)) params['publishedDate'] = date except: pass diff --git a/searx/settings.yml b/searx/settings.yml index 4da96b5bf..bb06c4a0c 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -552,6 +552,12 @@ engines: timeout : 6.0 disabled : True + - name : torrentz + engine : torrentz + shortcut : tor + url: https://torrentz2.eu/ + timeout : 3.0 + - name : twitter engine : twitter shortcut : tw diff --git a/tests/unit/engines/test_torrentz.py b/tests/unit/engines/test_torrentz.py index 2f836f73e..06c6fa30c 100644 --- a/tests/unit/engines/test_torrentz.py +++ b/tests/unit/engines/test_torrentz.py @@ -14,7 +14,7 @@ class TestTorrentzEngine(SearxTestCase): params = torrentz.request(query, dic) self.assertTrue('url' in params) self.assertTrue(query in params['url']) - self.assertTrue('torrentz.eu' in params['url']) + self.assertTrue('torrentz2.eu' in params['url']) def test_response(self): resp = mock.Mock(text='') @@ -30,13 +30,11 @@ class TestTorrentzEngine(SearxTestCase): books ebooks
- 1 - - 4 months - - 30 MB - 14 - 1 + 1 + 5 hours + 30 MB + 14 + 1
@@ -48,13 +46,11 @@ class TestTorrentzEngine(SearxTestCase): books ebooks
- 1 - - 4 months - - 30MB - 5,555 - 1,234,567 + 1 + 5 hours + 30MB + 5,555 + 1,234,567
@@ -68,10 +64,10 @@ class TestTorrentzEngine(SearxTestCase): # testing against the first result r = results[0] - self.assertEqual(r['url'], 'https://torrentz.eu/4362e08b1d80e1820fb2550b752f9f3126fe76d6') + self.assertEqual(r['url'], 'https://torrentz2.eu/4362e08b1d80e1820fb2550b752f9f3126fe76d6') self.assertEqual(r['title'], 'Completely valid info books ebooks') # 22 Nov 2015 03:01:42 - self.assertEqual(r['publishedDate'], datetime(2015, 11, 22, 3, 1, 42)) + self.assertEqual(r['publishedDate'], datetime(2017, 8, 24, 19, 32, 4)) self.assertEqual(r['seed'], 14) self.assertEqual(r['leech'], 1) self.assertEqual(r['filesize'], 30 * 1024 * 1024) @@ -79,7 +75,7 @@ class TestTorrentzEngine(SearxTestCase): # testing against the second result r = results[1] - self.assertEqual(r['url'], 'https://torrentz.eu/poaskdpokaspod') + self.assertEqual(r['url'], 'https://torrentz2.eu/poaskdpokaspod') self.assertEqual(r['title'], 'Invalid hash and date and filesize books ebooks') self.assertEqual(r['seed'], 5555) self.assertEqual(r['leech'], 1234567) From 2098e1b7ff39fb24bbc2ad7f1800992f1748eba0 Mon Sep 17 00:00:00 2001 From: misnyo Date: Fri, 25 Aug 2017 01:11:02 +0200 Subject: [PATCH 04/39] [fix]torrentz unit_tests timezone fix --- tests/unit/engines/test_torrentz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/engines/test_torrentz.py b/tests/unit/engines/test_torrentz.py index 06c6fa30c..271758da0 100644 --- a/tests/unit/engines/test_torrentz.py +++ b/tests/unit/engines/test_torrentz.py @@ -67,7 +67,7 @@ class TestTorrentzEngine(SearxTestCase): self.assertEqual(r['url'], 'https://torrentz2.eu/4362e08b1d80e1820fb2550b752f9f3126fe76d6') self.assertEqual(r['title'], 'Completely valid info books ebooks') # 22 Nov 2015 03:01:42 - self.assertEqual(r['publishedDate'], datetime(2017, 8, 24, 19, 32, 4)) + self.assertEqual(r['publishedDate'], datetime(2017, 8, 24, 17, 32, 4)) self.assertEqual(r['seed'], 14) self.assertEqual(r['leech'], 1) self.assertEqual(r['filesize'], 30 * 1024 * 1024) From bf3f9a91fa3a07864f316ddd3a463ad45bd3d25d Mon Sep 17 00:00:00 2001 From: misnyo Date: Tue, 29 Aug 2017 17:54:41 +0200 Subject: [PATCH 05/39] [fix]torrentz unit_tests timezone fix --- tests/unit/engines/test_torrentz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/engines/test_torrentz.py b/tests/unit/engines/test_torrentz.py index 271758da0..f483bf68c 100644 --- a/tests/unit/engines/test_torrentz.py +++ b/tests/unit/engines/test_torrentz.py @@ -67,7 +67,7 @@ class TestTorrentzEngine(SearxTestCase): self.assertEqual(r['url'], 'https://torrentz2.eu/4362e08b1d80e1820fb2550b752f9f3126fe76d6') self.assertEqual(r['title'], 'Completely valid info books ebooks') # 22 Nov 2015 03:01:42 - self.assertEqual(r['publishedDate'], datetime(2017, 8, 24, 17, 32, 4)) + self.assertEqual(r['publishedDate'], datetime.fromtimestamp(1503595924)) self.assertEqual(r['seed'], 14) self.assertEqual(r['leech'], 1) self.assertEqual(r['filesize'], 30 * 1024 * 1024) From f139f9cfdbc8d77eb61724eca253dc1e6ad72ce7 Mon Sep 17 00:00:00 2001 From: misnyo Date: Wed, 30 Aug 2017 16:47:56 +0200 Subject: [PATCH 06/39] [mod]blekko images removed --- searx/engines/blekko_images.py | 70 ----------------------- searx/settings.yml | 6 -- tests/unit/engines/test_blekko_images.py | 71 ------------------------ 3 files changed, 147 deletions(-) delete mode 100644 searx/engines/blekko_images.py delete mode 100644 tests/unit/engines/test_blekko_images.py diff --git a/searx/engines/blekko_images.py b/searx/engines/blekko_images.py deleted file mode 100644 index f71645634..000000000 --- a/searx/engines/blekko_images.py +++ /dev/null @@ -1,70 +0,0 @@ -""" - Blekko (Images) - - @website https://blekko.com - @provide-api yes (inofficial) - - @using-api yes - @results JSON - @stable yes - @parse url, title, img_src -""" - -from json import loads -from searx.url_utils import urlencode - -# engine dependent config -categories = ['images'] -paging = True -safesearch = True - -# search-url -base_url = 'https://blekko.com' -search_url = '/api/images?{query}&c={c}' - -# safesearch definitions -safesearch_types = {2: '1', - 1: '', - 0: '0'} - - -# do search-request -def request(query, params): - c = (params['pageno'] - 1) * 48 - - params['url'] = base_url +\ - search_url.format(query=urlencode({'q': query}), - c=c) - - if params['pageno'] != 1: - params['url'] += '&page={pageno}'.format(pageno=(params['pageno'] - 1)) - - # let Blekko know we wan't have profiling - params['cookies']['tag_lesslogging'] = '1' - - # parse safesearch argument - params['cookies']['safesearch'] = safesearch_types.get(params['safesearch'], '') - - return params - - -# get response from search-request -def response(resp): - results = [] - - search_results = loads(resp.text) - - # return empty array if there are no results - if not search_results: - return [] - - for result in search_results: - # append result - results.append({'url': result['page_url'], - 'title': result['title'], - 'content': '', - 'img_src': result['url'], - 'template': 'images.html'}) - - # return results - return results diff --git a/searx/settings.yml b/searx/settings.yml index 4da96b5bf..7822c6483 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -647,12 +647,6 @@ engines: shortcut : 1337x disabled : True -#The blekko technology and team have joined IBM Watson! -> https://blekko.com/ -# - name : blekko images -# engine : blekko_images -# locale : en-US -# shortcut : bli - # - name : yacy # engine : yacy # shortcut : ya diff --git a/tests/unit/engines/test_blekko_images.py b/tests/unit/engines/test_blekko_images.py deleted file mode 100644 index beb0853e3..000000000 --- a/tests/unit/engines/test_blekko_images.py +++ /dev/null @@ -1,71 +0,0 @@ -from collections import defaultdict -import mock -from searx.engines import blekko_images -from searx.testing import SearxTestCase - - -class TestBlekkoImagesEngine(SearxTestCase): - - def test_request(self): - query = 'test_query' - dicto = defaultdict(dict) - dicto['pageno'] = 0 - dicto['safesearch'] = 1 - params = blekko_images.request(query, dicto) - self.assertIn('url', params) - self.assertIn(query, params['url']) - self.assertIn('blekko.com', params['url']) - self.assertIn('page', params['url']) - - dicto['pageno'] = 1 - params = blekko_images.request(query, dicto) - self.assertNotIn('page', params['url']) - - def test_response(self): - self.assertRaises(AttributeError, blekko_images.response, None) - self.assertRaises(AttributeError, blekko_images.response, []) - self.assertRaises(AttributeError, blekko_images.response, '') - self.assertRaises(AttributeError, blekko_images.response, '[]') - - response = mock.Mock(text='[]') - self.assertEqual(blekko_images.response(response), []) - - json = """ - [ - { - "c": 1, - "page_url": "http://result_url.html", - "title": "Photo title", - "tn_url": "http://ts1.mm.bing.net/th?id=HN.608050619474382748&pid=15.1", - "url": "http://result_image.jpg" - }, - { - "c": 2, - "page_url": "http://companyorange.simpsite.nl/OSM", - "title": "OSM", - "tn_url": "http://ts2.mm.bing.net/th?id=HN.608048068264919461&pid=15.1", - "url": "http://simpsite.nl/userdata2/58985/Home/OSM.bmp" - }, - { - "c": 3, - "page_url": "http://invincible.webklik.nl/page/osm", - "title": "OSM", - "tn_url": "http://ts1.mm.bing.net/th?id=HN.608024514657649476&pid=15.1", - "url": "http://www.webklik.nl/user_files/2009_09/65324/osm.gif" - }, - { - "c": 4, - "page_url": "http://www.offshorenorway.no/event/companyDetail/id/12492", - "title": "Go to OSM Offshore AS homepage", - "tn_url": "http://ts2.mm.bing.net/th?id=HN.608054265899847285&pid=15.1", - "url": "http://www.offshorenorway.no/firmalogo/OSM-logo.png" - } - ] - """ - response = mock.Mock(text=json) - results = blekko_images.response(response) - self.assertEqual(type(results), list) - self.assertEqual(len(results), 4) - self.assertEqual(results[0]['title'], 'Photo title') - self.assertEqual(results[0]['url'], 'http://result_url.html') - self.assertEqual(results[0]['img_src'], 'http://result_image.jpg') From a49cc18f9c9b09c59daebe503f89d02d7357705f Mon Sep 17 00:00:00 2001 From: misnyo Date: Wed, 30 Aug 2017 18:20:43 +0200 Subject: [PATCH 07/39] [fix] digg now requires cookie for search --- searx/engines/digg.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/searx/engines/digg.py b/searx/engines/digg.py index 606747a4d..84f1ea599 100644 --- a/searx/engines/digg.py +++ b/searx/engines/digg.py @@ -10,6 +10,8 @@ @parse url, title, content, publishedDate, thumbnail """ +import random +import string from dateutil import parser from json import loads from lxml import html @@ -36,6 +38,10 @@ def request(query, params): offset = (params['pageno'] - 1) * 10 params['url'] = search_url.format(position=offset, query=quote_plus(query)) + params['cookies']['frontend.auid'] = ''.join(random.choice( + string.ascii_uppercase + + string.ascii_lowercase + + string.digits + "+_") for _ in range(22)) return params From 0607b167f85acc6c0ab4c641f14b53cb4190e445 Mon Sep 17 00:00:00 2001 From: misnyo Date: Wed, 30 Aug 2017 18:53:00 +0200 Subject: [PATCH 08/39] [fix] faroo json api and image layout fixed --- searx/engines/faroo.py | 49 ++++++++++---------------------- searx/settings.yml | 9 +++--- tests/unit/engines/test_faroo.py | 7 ++--- 3 files changed, 21 insertions(+), 44 deletions(-) diff --git a/searx/engines/faroo.py b/searx/engines/faroo.py index e24d1b7dc..5936c1902 100644 --- a/searx/engines/faroo.py +++ b/searx/engines/faroo.py @@ -4,7 +4,7 @@ @website http://www.faroo.com @provide-api yes (http://www.faroo.com/hp/api/api.html), require API-key - @using-api yes + @using-api no @results JSON @stable yes @parse url, title, content, publishedDate, img_src @@ -20,18 +20,16 @@ categories = ['general', 'news'] paging = True language_support = True number_of_results = 10 -api_key = None # search-url url = 'http://www.faroo.com/' -search_url = url + 'api?{query}'\ +search_url = url + 'instant.json?{query}'\ '&start={offset}'\ '&length={number_of_results}'\ '&l={language}'\ '&src={categorie}'\ '&i=false'\ - '&f=json'\ - '&key={api_key}' # noqa + '&c=false' search_category = {'general': 'web', 'news': 'news'} @@ -57,21 +55,15 @@ def request(query, params): number_of_results=number_of_results, query=urlencode({'q': query}), language=language, - categorie=categorie, - api_key=api_key) + categorie=categorie) - # using searx User-Agent - params['headers']['User-Agent'] = searx_useragent() + params['headers']['Referer'] = url return params # get response from search-request def response(resp): - # HTTP-Code 401: api-key is not valide - if resp.status_code == 401: - raise Exception("API key is not valide") - # HTTP-Code 429: rate limit exceeded if resp.status_code == 429: raise Exception("rate limit has been exceeded!") @@ -86,31 +78,20 @@ def response(resp): # parse results for result in search_res['results']: + publishedDate = None + result_json = {'url': result['url'], + 'title': result['title'], + 'content': result['kwic']} if result['news']: - # timestamp (milliseconds since 1970) - publishedDate = datetime.datetime.fromtimestamp(result['date'] / 1000.0) # noqa - - # append news result - results.append({'url': result['url'], - 'title': result['title'], - 'publishedDate': publishedDate, - 'content': result['kwic']}) - - else: - # append general result - # TODO, publishedDate correct? - results.append({'url': result['url'], - 'title': result['title'], - 'content': result['kwic']}) + result_json['publishedDate'] = \ + datetime.datetime.fromtimestamp(result['date'] / 1000.0) # append image result if image url is set - # TODO, show results with an image like in faroo if result['iurl']: - results.append({'template': 'images.html', - 'url': result['url'], - 'title': result['title'], - 'content': result['kwic'], - 'img_src': result['iurl']}) + result_json['template'] ='videos.html' + result_json['thumbnail'] = result['iurl'] + + results.append(result_json) # return results return results diff --git a/searx/settings.yml b/searx/settings.yml index bb06c4a0c..a98fb2663 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -189,11 +189,10 @@ engines: shortcut : et disabled : True -# api-key required: http://www.faroo.com/hp/api/api.html#key -# - name : faroo -# engine : faroo -# shortcut : fa -# api_key : 'apikey' # required! + - name : faroo + engine : faroo + shortcut : fa + disabled : True - name : 500px engine : www500px diff --git a/tests/unit/engines/test_faroo.py b/tests/unit/engines/test_faroo.py index acebdda86..ebcde39a7 100644 --- a/tests/unit/engines/test_faroo.py +++ b/tests/unit/engines/test_faroo.py @@ -40,9 +40,6 @@ class TestFarooEngine(SearxTestCase): response = mock.Mock(text='{"data": []}') self.assertEqual(faroo.response(response), []) - response = mock.Mock(text='{"data": []}', status_code=401) - self.assertRaises(Exception, faroo.response, response) - response = mock.Mock(text='{"data": []}', status_code=429) self.assertRaises(Exception, faroo.response, response) @@ -98,14 +95,14 @@ class TestFarooEngine(SearxTestCase): response = mock.Mock(text=json) results = faroo.response(response) self.assertEqual(type(results), list) - self.assertEqual(len(results), 4) + self.assertEqual(len(results), 3) self.assertEqual(results[0]['title'], 'This is the title') self.assertEqual(results[0]['url'], 'http://this.is.the.url/') self.assertEqual(results[0]['content'], 'This is the content') self.assertEqual(results[1]['title'], 'This is the title2') self.assertEqual(results[1]['url'], 'http://this.is.the.url2/') self.assertEqual(results[1]['content'], 'This is the content2') - self.assertEqual(results[3]['img_src'], 'http://upload.wikimedia.org/optimized.jpg') + self.assertEqual(results[2]['thumbnail'], 'http://upload.wikimedia.org/optimized.jpg') json = """ {} From 20d2d4dab1edab77634184d7932b380a549ca3a3 Mon Sep 17 00:00:00 2001 From: misnyo Date: Wed, 30 Aug 2017 19:48:57 +0200 Subject: [PATCH 09/39] [fix] pep8 fix for faroo engine --- searx/engines/faroo.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/searx/engines/faroo.py b/searx/engines/faroo.py index 5936c1902..7ce3a6ce8 100644 --- a/searx/engines/faroo.py +++ b/searx/engines/faroo.py @@ -24,12 +24,12 @@ number_of_results = 10 # search-url url = 'http://www.faroo.com/' search_url = url + 'instant.json?{query}'\ - '&start={offset}'\ - '&length={number_of_results}'\ - '&l={language}'\ - '&src={categorie}'\ - '&i=false'\ - '&c=false' + '&start={offset}'\ + '&length={number_of_results}'\ + '&l={language}'\ + '&src={categorie}'\ + '&i=false'\ + '&c=false' search_category = {'general': 'web', 'news': 'news'} @@ -79,16 +79,15 @@ def response(resp): # parse results for result in search_res['results']: publishedDate = None - result_json = {'url': result['url'], - 'title': result['title'], - 'content': result['kwic']} + result_json = {'url': result['url'], 'title': result['title'], + 'content': result['kwic']} if result['news']: result_json['publishedDate'] = \ - datetime.datetime.fromtimestamp(result['date'] / 1000.0) + datetime.datetime.fromtimestamp(result['date'] / 1000.0) # append image result if image url is set if result['iurl']: - result_json['template'] ='videos.html' + result_json['template'] = 'videos.html' result_json['thumbnail'] = result['iurl'] results.append(result_json) From 6e92fb383ae8b39579fe7ddb5bc6b2ea6a4c93b4 Mon Sep 17 00:00:00 2001 From: misnyo Date: Wed, 30 Aug 2017 21:14:12 +0200 Subject: [PATCH 10/39] [fix] digg cookie characters created in module import --- searx/engines/digg.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/searx/engines/digg.py b/searx/engines/digg.py index 84f1ea599..4369ccb84 100644 --- a/searx/engines/digg.py +++ b/searx/engines/digg.py @@ -32,6 +32,9 @@ title_xpath = './/h2//a//text()' content_xpath = './/p//text()' pubdate_xpath = './/time' +digg_cookie_chars = string.ascii_uppercase + string.ascii_lowercase +\ + string.digits + "+_" + # do search-request def request(query, params): @@ -39,9 +42,7 @@ def request(query, params): params['url'] = search_url.format(position=offset, query=quote_plus(query)) params['cookies']['frontend.auid'] = ''.join(random.choice( - string.ascii_uppercase + - string.ascii_lowercase + - string.digits + "+_") for _ in range(22)) + digg_cookie_chars) for _ in range(22)) return params From 971179587675e1b47301019130a7874196e3f65f Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 15:36:49 +0200 Subject: [PATCH 11/39] [fix] geektimes.ru xpath fix --- searx/settings.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/searx/settings.yml b/searx/settings.yml index 8f57e2e84..26d4f8bee 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -321,9 +321,9 @@ engines: engine : xpath paging : True search_url : https://geektimes.ru/search/page{pageno}/?q={query} - url_xpath : //div[@class="search_results"]//a[@class="post__title_link"]/@href - title_xpath : //div[@class="search_results"]//a[@class="post__title_link"] - content_xpath : //div[@class="search_results"]//div[contains(@class, "content")] + url_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"]/@href + title_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"] + content_xpath : //article[contains(@class, "post")]//div[contains(@class, "post__text")] categories : it timeout : 4.0 disabled : True From 2d66df0548bebabfb998098ef43c1b2010887952 Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 15:51:16 +0200 Subject: [PATCH 12/39] [mod]generalfile engine removed --- searx/engines/generalfile.py | 62 ------------------------------------ 1 file changed, 62 deletions(-) delete mode 100644 searx/engines/generalfile.py diff --git a/searx/engines/generalfile.py b/searx/engines/generalfile.py deleted file mode 100644 index 3bb27444f..000000000 --- a/searx/engines/generalfile.py +++ /dev/null @@ -1,62 +0,0 @@ -""" - General Files (Files) - - @website http://www.general-files.org - @provide-api no (nothing found) - - @using-api no (because nothing found) - @results HTML (using search portal) - @stable no (HTML can change) - @parse url, title, content - - @todo detect torrents? -""" - -from lxml import html - -# engine dependent config -categories = ['files'] -paging = True - -# search-url -base_url = 'http://www.general-file.com' -search_url = base_url + '/files-{letter}/{query}/{pageno}' - -# specific xpath variables -result_xpath = '//table[@class="block-file"]' -title_xpath = './/h2/a//text()' -url_xpath = './/h2/a/@href' -content_xpath = './/p//text()' - - -# do search-request -def request(query, params): - - params['url'] = search_url.format(query=query, - letter=query[0], - pageno=params['pageno']) - - return params - - -# get response from search-request -def response(resp): - results = [] - - dom = html.fromstring(resp.text) - - # parse results - for result in dom.xpath(result_xpath): - url = result.xpath(url_xpath)[0] - - # skip fast download links - if not url.startswith('/'): - continue - - # append result - results.append({'url': base_url + url, - 'title': ''.join(result.xpath(title_xpath)), - 'content': ''.join(result.xpath(content_xpath))}) - - # return results - return results From 8849606e5f75e6769399aadf06106aee44d0278f Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 16:11:04 +0200 Subject: [PATCH 13/39] [fix] gigablast api fix --- searx/engines/gigablast.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/searx/engines/gigablast.py b/searx/engines/gigablast.py index 37933c69b..6681de996 100644 --- a/searx/engines/gigablast.py +++ b/searx/engines/gigablast.py @@ -10,6 +10,7 @@ @parse url, title, content """ +import random from json import loads from time import time from lxml.html import fromstring @@ -32,7 +33,8 @@ search_string = 'search?{query}'\ '&qh=0'\ '&qlang={lang}'\ '&ff={safesearch}'\ - '&rxikd={rxikd}' # random number - 9 digits + '&rxieu={rxieu}'\ + '&rand={rxikd}' # current unix timestamp # specific xpath variables results_xpath = '//response//result' @@ -59,10 +61,12 @@ def request(query, params): else: safesearch = 0 + # rxieu is some kind of hash from the search query, but accepts random atm search_path = search_string.format(query=urlencode({'q': query}), offset=offset, number_of_results=number_of_results, - rxikd=str(time())[:9], + rxikd=int(time() * 1000), + rxieu=random.randint(1000000000,9999999999), lang=language, safesearch=safesearch) From 3182ba7069b2aa2fba1a1b7879bd5f234a4d2868 Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 17:48:07 +0200 Subject: [PATCH 14/39] [fix] google news dom xpath fix --- searx/engines/google_news.py | 4 +- tests/unit/engines/test_google_news.py | 62 +++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/searx/engines/google_news.py b/searx/engines/google_news.py index 7344b5289..8881d0dad 100644 --- a/searx/engines/google_news.py +++ b/searx/engines/google_news.py @@ -67,8 +67,8 @@ def response(resp): for result in dom.xpath('//div[@class="g"]|//div[@class="g _cy"]'): try: r = { - 'url': result.xpath('.//div[@class="_cnc"]//a/@href')[0], - 'title': ''.join(result.xpath('.//div[@class="_cnc"]//h3//text()')), + 'url': result.xpath('.//a[@class="l _PMs"]')[0].attrib.get("href"), + 'title': ''.join(result.xpath('.//a[@class="l _PMs"]//text()')), 'content': ''.join(result.xpath('.//div[@class="st"]//text()')), } except: diff --git a/tests/unit/engines/test_google_news.py b/tests/unit/engines/test_google_news.py index 6454dde47..20a75af48 100644 --- a/tests/unit/engines/test_google_news.py +++ b/tests/unit/engines/test_google_news.py @@ -37,14 +37,64 @@ class TestGoogleNewsEngine(SearxTestCase): self.assertEqual(google_news.response(response), []) html = u""" -
-
A(z) south témájának képe a következőből: CBC.ca

Meet Thuli Madonsela — South Africa's conscience

CBC.ca-9 órával ezelőtt
South African Public Protector
Who really governs South Africa?
Vélemény-News24-2016. dec. 8.
+

Search Results

+
+
+
+ +
+
+
+

+ Example title +

+
+ + Mac & i + + - + + Mar 21, 2016 +
+
Example description
+
+
+
+
+
+ + Story image for searx from Golem.de + +
+

+ Example title 2 +

+
+ + Golem.de + + - + + Oct 4, 2016 +
+
Example description 2
+
+
+
+
+
+ + """ # 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'], u'Meet Thuli Madonsela \u2014 South Africa\'s conscience') - self.assertEqual(results[0]['url'], 'http://this.is.the.url') - self.assertEqual(results[0]['content'], 'South African Public Protector') + self.assertEqual(len(results), 2) + self.assertEqual(results[0]['title'], u'Example title') + self.assertEqual(results[0]['url'], 'https://example.com/') + self.assertEqual(results[0]['content'], 'Example description') + self.assertEqual(results[1]['title'], u'Example title 2') + self.assertEqual(results[1]['url'], 'https://example2.com/') + self.assertEqual(results[1]['content'], 'Example description 2') + self.assertEqual(results[1]['img_src'], 'https://example2.com/image.jpg') From bf1ca2ccd37dab4d43386e1c9863043c9dd817f5 Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 18:26:46 +0200 Subject: [PATCH 15/39] [fix] habrahabr.ru xpath fix --- searx/settings.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/searx/settings.yml b/searx/settings.yml index 26d4f8bee..77d1301b7 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -333,9 +333,9 @@ engines: engine : xpath paging : True search_url : https://habrahabr.ru/search/page{pageno}/?q={query} - 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")] + url_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"]/@href + title_xpath : //article[contains(@class, "post")]//a[@class="post__title_link"] + content_xpath : //article[contains(@class, "post")]//div[contains(@class, "post__text")] categories : it timeout : 4.0 disabled : True From 1e2b60f3805a1cdc87cff0c5753bd355ad00cc98 Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 21:31:40 +0200 Subject: [PATCH 16/39] [mod] tokyotoshokan dependecy to other engine removed --- searx/engines/tokyotoshokan.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/searx/engines/tokyotoshokan.py b/searx/engines/tokyotoshokan.py index 9a6b5e57d..dfd2e7790 100644 --- a/searx/engines/tokyotoshokan.py +++ b/searx/engines/tokyotoshokan.py @@ -14,8 +14,8 @@ import re from lxml import html from searx.engines.xpath import extract_text from datetime import datetime -from searx.engines.nyaa import int_or_zero, get_filesize_mul from searx.url_utils import urlencode +from searx.utils import get_torrent_size # engine dependent config categories = ['files', 'videos', 'music'] @@ -26,6 +26,17 @@ base_url = 'https://www.tokyotosho.info/' search_url = base_url + 'search.php?{query}' +# convert a variable to integer or return 0 if it's not a number +def int_or_zero(num): + if isinstance(num, list): + if len(num) < 1: + return 0 + num = num[0] + if num.isdigit(): + return int(num) + return 0 + + # do search-request def request(query, params): query = urlencode({'page': params['pageno'], 'terms': query}) @@ -76,8 +87,7 @@ def response(resp): try: # ('1.228', 'GB') groups = size_re.match(item).groups() - multiplier = get_filesize_mul(groups[1]) - params['filesize'] = int(multiplier * float(groups[0])) + params['filesize'] = get_torrent_size(groups[0], groups[1]) except: pass elif item.startswith('Date:'): From 01330f71cd60cab6c1ce9a19c28c2729f2d02344 Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 21:32:30 +0200 Subject: [PATCH 17/39] [fix] nyaa.si fixed --- searx/engines/nyaa.py | 97 ++++++++++++------------- tests/unit/engines/test_nyaa.py | 124 +++++++++++++++++++++++--------- 2 files changed, 137 insertions(+), 84 deletions(-) diff --git a/searx/engines/nyaa.py b/searx/engines/nyaa.py index 272c712c4..0d5bfc917 100644 --- a/searx/engines/nyaa.py +++ b/searx/engines/nyaa.py @@ -1,7 +1,7 @@ """ - Nyaa.se (Anime Bittorrent tracker) + Nyaa.si (Anime Bittorrent tracker) - @website http://www.nyaa.se/ + @website http://www.nyaa.si/ @provide-api no @using-api no @results HTML @@ -12,50 +12,25 @@ from lxml import html from searx.engines.xpath import extract_text from searx.url_utils import urlencode +from searx.utils import get_torrent_size # engine dependent config categories = ['files', 'images', 'videos', 'music'] paging = True # search-url -base_url = 'http://www.nyaa.se/' +base_url = 'http://www.nyaa.si/' search_url = base_url + '?page=search&{query}&offset={offset}' # xpath queries -xpath_results = '//table[@class="tlist"]//tr[contains(@class, "tlistrow")]' -xpath_category = './/td[@class="tlisticon"]/a' -xpath_title = './/td[@class="tlistname"]/a' -xpath_torrent_file = './/td[@class="tlistdownload"]/a' -xpath_filesize = './/td[@class="tlistsize"]/text()' -xpath_seeds = './/td[@class="tlistsn"]/text()' -xpath_leeches = './/td[@class="tlistln"]/text()' -xpath_downloads = './/td[@class="tlistdn"]/text()' - - -# convert a variable to integer or return 0 if it's not a number -def int_or_zero(num): - if isinstance(num, list): - if len(num) < 1: - return 0 - num = num[0] - if num.isdigit(): - return int(num) - return 0 - - -# get multiplier to convert torrent size to bytes -def get_filesize_mul(suffix): - return { - 'KB': 1024, - 'MB': 1024 ** 2, - 'GB': 1024 ** 3, - 'TB': 1024 ** 4, - - 'KIB': 1024, - 'MIB': 1024 ** 2, - 'GIB': 1024 ** 3, - 'TIB': 1024 ** 4 - }[str(suffix).upper()] +xpath_results = '//table[contains(@class, "torrent-list")]//tr[not(th)]' +xpath_category = './/td[1]/a[1]' +xpath_title = './/td[2]/a[last()]' +xpath_torrent_links = './/td[3]/a' +xpath_filesize = './/td[4]/text()' +xpath_seeds = './/td[6]/text()' +xpath_leeches = './/td[7]/text()' +xpath_downloads = './/td[8]/text()' # do search-request @@ -72,6 +47,14 @@ def response(resp): dom = html.fromstring(resp.text) for result in dom.xpath(xpath_results): + # defaults + filesize = 0 + seed = 0 + leech = 0 + downloads = 0 + magnet_link = "" + torrent_link = "" + # category in which our torrent belongs category = result.xpath(xpath_category)[0].attrib.get('title') @@ -80,26 +63,37 @@ def response(resp): title = extract_text(page_a) # link to the page - href = page_a.attrib.get('href') + href = base_url + page_a.attrib.get('href') - # link to the torrent file - torrent_link = result.xpath(xpath_torrent_file)[0].attrib.get('href') + for link in result.xpath(xpath_torrent_links): + url = link.attrib.get('href') + if 'magnet' in url: + # link to the magnet + magnet_link = url + else: + # link to the torrent file + torrent_link = url - # torrent size + # get seeders and leechers try: - file_size, suffix = result.xpath(xpath_filesize)[0].split(' ') - file_size = int(float(file_size) * get_filesize_mul(suffix)) + seed = int(result.xpath(xpath_seeds)[0]) + leech = int(result.xpath(xpath_leeches)[0]) except: - file_size = None + pass - # seed count - seed = int_or_zero(result.xpath(xpath_seeds)) - - # leech count - leech = int_or_zero(result.xpath(xpath_leeches)) + # let's try to calculate the torrent size + try: + filesize_info = result.xpath(xpath_filesize)[0] + filesize, filesize_multiplier = filesize_info.split() + filesize = get_torrent_size(filesize, filesize_multiplier) + except: + pass # torrent downloads count - downloads = int_or_zero(result.xpath(xpath_downloads)) + try: + downloads = result.xpath(xpath_downloads)[0] + except: + pass # content string contains all information not included into template content = 'Category: "{category}". Downloaded {downloads} times.' @@ -110,8 +104,9 @@ def response(resp): 'content': content, 'seed': seed, 'leech': leech, - 'filesize': file_size, + 'filesize': filesize, 'torrentfile': torrent_link, + 'magnetlink': magnet_link, 'template': 'torrent.html'}) return results diff --git a/tests/unit/engines/test_nyaa.py b/tests/unit/engines/test_nyaa.py index db412e1cc..6dcafc6b7 100644 --- a/tests/unit/engines/test_nyaa.py +++ b/tests/unit/engines/test_nyaa.py @@ -13,38 +13,92 @@ class TestNyaaEngine(SearxTestCase): params = nyaa.request(query, dic) self.assertTrue('url' in params) self.assertTrue(query in params['url']) - self.assertTrue('nyaa.se' in params['url']) + self.assertTrue('nyaa.si' in params['url']) def test_response(self): resp = mock.Mock(text='') self.assertEqual(nyaa.response(resp), []) html = """ - - - - - - - - - - - - - +
- - English-translated Anime - - - - Sample torrent title - - - - DL - - 10 MiB136660
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
Category
+
+
Name
+
+ + + +
Link
+
+ +
Size
+
+ +
Date
+
+ + + + + + + + +
+ + Anime - English-translated + + + Sample title 1 + + + + 723.7 MiB2017-08-21 11:241312
+ + Anime - English-translated + + + Sample title 2 + + + 8.2 GiB2017-04-08 01:40101206
""" @@ -52,15 +106,19 @@ class TestNyaaEngine(SearxTestCase): results = nyaa.response(resp) self.assertEqual(type(results), list) - self.assertEqual(len(results), 1) + self.assertEqual(len(results), 2) r = results[0] - self.assertTrue(r['url'].find('www.nyaa.se/?page3') >= 0) - self.assertTrue(r['torrentfile'].find('www.nyaa.se/?page_dl') >= 0) - self.assertTrue(r['content'].find('English-translated Anime') >= 0) - self.assertTrue(r['content'].find('Downloaded 666 times.') >= 0) + self.assertTrue(r['url'].find('1') >= 0) + self.assertTrue(r['torrentfile'].find('1.torrent') >= 0) + self.assertTrue(r['content'].find('Anime - English-translated') >= 0) + self.assertTrue(r['content'].find('Downloaded 12 times.') >= 0) - self.assertEqual(r['title'], 'Sample torrent title') + self.assertEqual(r['title'], 'Sample title 1') self.assertEqual(r['seed'], 1) self.assertEqual(r['leech'], 3) - self.assertEqual(r['filesize'], 10 * 1024 * 1024) + self.assertEqual(r['filesize'], 723700000) + + r = results[1] + self.assertTrue(r['url'].find('2') >= 0) + self.assertTrue(r['magnetlink'].find('magnet:') >= 0) From b91772eff155f79fdf01be5695f3f15ea24ad17e Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 21:49:19 +0200 Subject: [PATCH 18/39] [fix] gigablast pep8 fix --- searx/engines/gigablast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/engines/gigablast.py b/searx/engines/gigablast.py index 6681de996..2bdc97fd1 100644 --- a/searx/engines/gigablast.py +++ b/searx/engines/gigablast.py @@ -66,7 +66,7 @@ def request(query, params): offset=offset, number_of_results=number_of_results, rxikd=int(time() * 1000), - rxieu=random.randint(1000000000,9999999999), + rxieu=random.randint(1000000000, 9999999999), lang=language, safesearch=safesearch) From 9b6307a36518179e7b89d6b1966a1384c52bab5f Mon Sep 17 00:00:00 2001 From: misnyo Date: Thu, 31 Aug 2017 17:18:04 +0200 Subject: [PATCH 19/39] [fix] gitlab search fixed for proper api usage --- searx/settings.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/searx/settings.yml b/searx/settings.yml index 8f57e2e84..3d94ac8fa 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -242,15 +242,16 @@ engines: disabled: True - name : gitlab - engine : xpath + engine : json_engine paging : True - search_url : https://gitlab.com/search?page={pageno}&search={query} - url_xpath : //li[@class="project-row"]//a[@class="project"]/@href - title_xpath : //li[@class="project-row"]//span[contains(@class, "project-full-name")] - content_xpath : //li[@class="project-row"]//div[@class="description"]/p + search_url : https://gitlab.com/api/v4/projects?search={query}&page={pageno} + url_query : web_url + title_query : name_with_namespace + content_query : description + page_size : 20 categories : it shortcut : gl - timeout : 5.0 + timeout : 10.0 disabled : True - name : github From 33fd938016def4496876d89d0ccaa53f47705005 Mon Sep 17 00:00:00 2001 From: misnyo Date: Mon, 4 Sep 2017 20:05:04 +0200 Subject: [PATCH 20/39] [mod] int_or_zero refactored to searx_utils --- searx/engines/nyaa.py | 30 +++++++++++++----------------- searx/engines/tokyotoshokan.py | 13 +------------ searx/utils.py | 9 +++++++++ 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/searx/engines/nyaa.py b/searx/engines/nyaa.py index 0d5bfc917..6a8e598c4 100644 --- a/searx/engines/nyaa.py +++ b/searx/engines/nyaa.py @@ -12,7 +12,7 @@ from lxml import html from searx.engines.xpath import extract_text from searx.url_utils import urlencode -from searx.utils import get_torrent_size +from searx.utils import get_torrent_size, int_or_zero # engine dependent config categories = ['files', 'images', 'videos', 'music'] @@ -49,14 +49,14 @@ def response(resp): for result in dom.xpath(xpath_results): # defaults filesize = 0 - seed = 0 - leech = 0 - downloads = 0 magnet_link = "" torrent_link = "" # category in which our torrent belongs - category = result.xpath(xpath_category)[0].attrib.get('title') + try: + category = result.xpath(xpath_category)[0].attrib.get('title') + except: + pass # torrent title page_a = result.xpath(xpath_title)[0] @@ -74,12 +74,14 @@ def response(resp): # link to the torrent file torrent_link = url - # get seeders and leechers - try: - seed = int(result.xpath(xpath_seeds)[0]) - leech = int(result.xpath(xpath_leeches)[0]) - except: - pass + # seed count + seed = int_or_zero(result.xpath(xpath_seeds)) + + # leech count + leech = int_or_zero(result.xpath(xpath_leeches)) + + # torrent downloads count + downloads = int_or_zero(result.xpath(xpath_downloads)) # let's try to calculate the torrent size try: @@ -89,12 +91,6 @@ def response(resp): except: pass - # torrent downloads count - try: - downloads = result.xpath(xpath_downloads)[0] - except: - pass - # content string contains all information not included into template content = 'Category: "{category}". Downloaded {downloads} times.' content = content.format(category=category, downloads=downloads) diff --git a/searx/engines/tokyotoshokan.py b/searx/engines/tokyotoshokan.py index dfd2e7790..773212043 100644 --- a/searx/engines/tokyotoshokan.py +++ b/searx/engines/tokyotoshokan.py @@ -15,7 +15,7 @@ from lxml import html from searx.engines.xpath import extract_text from datetime import datetime from searx.url_utils import urlencode -from searx.utils import get_torrent_size +from searx.utils import get_torrent_size, int_or_zero # engine dependent config categories = ['files', 'videos', 'music'] @@ -26,17 +26,6 @@ base_url = 'https://www.tokyotosho.info/' search_url = base_url + 'search.php?{query}' -# convert a variable to integer or return 0 if it's not a number -def int_or_zero(num): - if isinstance(num, list): - if len(num) < 1: - return 0 - num = num[0] - if num.isdigit(): - return int(num) - return 0 - - # do search-request def request(query, params): query = urlencode({'page': params['pageno'], 'terms': query}) diff --git a/searx/utils.py b/searx/utils.py index 3df571160..35b20ad83 100644 --- a/searx/utils.py +++ b/searx/utils.py @@ -290,6 +290,15 @@ def convert_str_to_int(number_str): return 0 +# convert a variable to integer or return 0 if it's not a number +def int_or_zero(num): + if isinstance(num, list): + if len(num) < 1: + return 0 + num = num[0] + return convert_str_to_int(num) + + def is_valid_lang(lang): is_abbr = (len(lang) == 2) if is_abbr: From 043143c89892c7d4fd4f35766a7d7e4190774d51 Mon Sep 17 00:00:00 2001 From: misnyo Date: Mon, 4 Sep 2017 20:36:27 +0200 Subject: [PATCH 21/39] [fix] voat.co search xpath and url fixed --- searx/settings.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/searx/settings.yml b/searx/settings.yml index f262f4973..07b7d09cc 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -641,10 +641,10 @@ engines: 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"] + search_url : https://searchvoat.co/?t={query} + url_xpath : //div[@class="entry"]/p/a[@class="title"]/@href + title_xpath : //div[@class="entry"]/p/a[@class="title"] + content_xpath : //div[@class="entry"]/p/span[@class="domain"] timeout : 10.0 disabled : True From ae99f9070c7d96385aaea6d5f3d56cab8d2b3f46 Mon Sep 17 00:00:00 2001 From: misnyo Date: Fri, 8 Sep 2017 20:33:14 +0200 Subject: [PATCH 22/39] [fix] static path fixed in templates and webapp, line endings fixed --- .../courgette/result_templates/code.html | 22 +-- .../legacy/result_templates/code.html | 22 +-- searx/templates/oscar/macros.html | 175 +++++++++--------- searx/templates/simple/macros.html | 3 +- searx/webapp.py | 3 +- 5 files changed, 112 insertions(+), 113 deletions(-) diff --git a/searx/templates/courgette/result_templates/code.html b/searx/templates/courgette/result_templates/code.html index 953617e84..d6dbd5ed7 100644 --- a/searx/templates/courgette/result_templates/code.html +++ b/searx/templates/courgette/result_templates/code.html @@ -1,11 +1,11 @@ -
-

{% if result['favicon'] %}{{result['favicon']}}{% endif %}{{ result.title|safe }}

- {% if result.publishedDate %}{{ result.publishedDate }}{% endif %} -

{% if result.img_src %}{% endif %}{% if result.content %}{{ result.content|safe }}
{% endif %}

- {% if result.repository %}

{{ result.repository }}

{% endif %} -
- {{ result.codelines|code_highlighter(result.code_language)|safe }} -
- -

{{ result.pretty_url }}‎

-
+
+

{{ result.title|safe }}

+ {% if result.publishedDate %}{{ result.publishedDate }}{% endif %} +

{% if result.img_src %}{% endif %}{% if result.content %}{{ result.content|safe }}
{% endif %}

+ {% if result.repository %}

{{ result.repository }}

{% endif %} +
+ {{ result.codelines|code_highlighter(result.code_language)|safe }} +
+ +

{{ result.pretty_url }}‎

+
diff --git a/searx/templates/legacy/result_templates/code.html b/searx/templates/legacy/result_templates/code.html index 9e3ed20af..fee6c8221 100644 --- a/searx/templates/legacy/result_templates/code.html +++ b/searx/templates/legacy/result_templates/code.html @@ -1,11 +1,11 @@ -
-

{% if result['favicon'] %}{{result['favicon']}}{% endif %}{{ result.title|safe }}

-

{{ result.pretty_url }}‎ {{ _('cached') }}

- {% if result.publishedDate %}

{{ result.publishedDate }}

{% endif %} -

{% if result.img_src %}{% endif %}{% if result.content %}{{ result.content|safe }}
{% endif %}

- {% if result.repository %}

{{ result.repository }}

{% endif %} - -
- {{ result.codelines|code_highlighter(result.code_language)|safe }} -
-
+
+

{{ result.title|safe }}

+

{{ result.pretty_url }}‎ {{ _('cached') }}

+ {% if result.publishedDate %}

{{ result.publishedDate }}

{% endif %} +

{% if result.img_src %}{% endif %}{% if result.content %}{{ result.content|safe }}
{% endif %}

+ {% if result.repository %}

{{ result.repository }}

{% endif %} + +
+ {{ result.codelines|code_highlighter(result.code_language)|safe }} +
+
diff --git a/searx/templates/oscar/macros.html b/searx/templates/oscar/macros.html index e71091e70..c35a19158 100644 --- a/searx/templates/oscar/macros.html +++ b/searx/templates/oscar/macros.html @@ -1,88 +1,87 @@ - -{% macro icon(action) -%} - -{%- endmacro %} - - - -{% macro draw_favicon(favicon) -%} - {{ favicon }} -{%- endmacro %} - -{%- macro result_link(url, title, classes='') -%} -{{ title }} -{%- endmacro -%} - - -{% macro result_header(result, favicons) -%} -

{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result_link(result.url, result.title|safe) }}

-{%- endmacro %} - - -{% macro result_sub_header(result) -%} - {% if result.publishedDate %}{% endif %} - {% if result.magnetlink %} • {{ result_link(result.magnetlink, icon('magnet') + _('magnet link'), "magnetlink") }}{% endif %} - {% if result.torrentfile %} • {{ result_link(result.torrentfile, icon('download-alt') + _('torrent file'), "torrentfile") }}{% endif %} -{%- endmacro %} - - -{% macro result_footer(result) -%} -
-
- {% for engine in result.engines %} - {{ engine }} - {% endfor %} - {{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }} - {% if proxify %} - {{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }} - {% endif %} -
- -{%- endmacro %} - - -{% macro result_footer_rtl(result) -%} -
- {% for engine in result.engines %} - {{ engine }} - {% endfor %} - {{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }} - {% if proxify %} - {{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }} - {% endif %} - -{%- endmacro %} - -{% macro preferences_item_header(info, label, rtl) -%} - {% if rtl %} -
- - {{ info }} -
- {% else %} -
- -
- {% endif %} -{%- endmacro %} - -{% macro preferences_item_footer(info, label, rtl) -%} - {% if rtl %} -
-
- {% else %} -
- {{ info }} -
- {% endif %} -{%- endmacro %} - -{% macro checkbox_toggle(id, blocked) -%} -
- - -
-{%- endmacro %} + +{% macro icon(action) -%} + +{%- endmacro %} + + +{% macro draw_favicon(favicon) -%} + {{ favicon }} +{%- endmacro %} + +{%- macro result_link(url, title, classes='') -%} +{{ title }} +{%- endmacro -%} + + +{% macro result_header(result, favicons) -%} +

{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result_link(result.url, result.title|safe) }}

+{%- endmacro %} + + +{% macro result_sub_header(result) -%} + {% if result.publishedDate %}{% endif %} + {% if result.magnetlink %} • {{ result_link(result.magnetlink, icon('magnet') + _('magnet link'), "magnetlink") }}{% endif %} + {% if result.torrentfile %} • {{ result_link(result.torrentfile, icon('download-alt') + _('torrent file'), "torrentfile") }}{% endif %} +{%- endmacro %} + + +{% macro result_footer(result) -%} +
+
+ {% for engine in result.engines %} + {{ engine }} + {% endfor %} + {{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }} + {% if proxify %} + {{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }} + {% endif %} +
+ +{%- endmacro %} + + +{% macro result_footer_rtl(result) -%} +
+ {% for engine in result.engines %} + {{ engine }} + {% endfor %} + {{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }} + {% if proxify %} + {{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }} + {% endif %} + +{%- endmacro %} + +{% macro preferences_item_header(info, label, rtl) -%} + {% if rtl %} +
+ + {{ info }} +
+ {% else %} +
+ +
+ {% endif %} +{%- endmacro %} + +{% macro preferences_item_footer(info, label, rtl) -%} + {% if rtl %} +
+
+ {% else %} +
+ {{ info }} +
+ {% endif %} +{%- endmacro %} + +{% macro checkbox_toggle(id, blocked) -%} +
+ + +
+{%- endmacro %} diff --git a/searx/templates/simple/macros.html b/searx/templates/simple/macros.html index 76c53a635..883503683 100644 --- a/searx/templates/simple/macros.html +++ b/searx/templates/simple/macros.html @@ -8,9 +8,8 @@ {%- endmacro %} - {% macro draw_favicon(favicon) -%} - {{ favicon }} + {{ favicon }} {%- endmacro %} {% macro result_open_link(url, classes='') -%} diff --git a/searx/webapp.py b/searx/webapp.py index 3afdbefd8..0751fb983 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -792,7 +792,8 @@ def opensearch(): @app.route('/favicon.ico') def favicon(): return send_from_directory(os.path.join(app.root_path, - 'static/themes', + static_path, + 'themes', get_current_theme_name(), 'img'), 'favicon.png', From e73cb14889d29082c3a585644d547e6798fdb6fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Thu, 20 Jul 2017 15:44:02 +0200 Subject: [PATCH 23/39] fix hmac python3 compatibility --- searx/utils.py | 9 +++++++++ searx/webapp.py | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/searx/utils.py b/searx/utils.py index 35b20ad83..8be7beb62 100644 --- a/searx/utils.py +++ b/searx/utils.py @@ -1,4 +1,6 @@ import csv +import hashlib +import hmac import os import re @@ -321,3 +323,10 @@ def load_module(filename, module_dir): module = load_source(modname, filepath) module.name = modname return module + + +def new_hmac(secret_key, url): + if sys.version_info[0] == 2: + return hmac.new(bytes(secret_key), url, hashlib.sha256).hexdigest() + else: + return hmac.new(bytes(secret_key, 'utf-8'), url, hashlib.sha256).hexdigest() diff --git a/searx/webapp.py b/searx/webapp.py index 0751fb983..f90299b2a 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -69,6 +69,7 @@ from searx.plugins import plugins from searx.preferences import Preferences, ValidationException from searx.answerers import answerers from searx.url_utils import urlencode, urlparse, urljoin +from searx.utils import new_hmac # check if the pyopenssl package is installed. # It is needed for SSL connection without trouble, see #298 @@ -290,7 +291,7 @@ def image_proxify(url): if settings.get('result_proxy'): return proxify(url) - h = hmac.new(settings['server']['secret_key'], url.encode('utf-8'), hashlib.sha256).hexdigest() + h = new_hmac(settings['server']['secret_key'], url.encode('utf-8')) return '{0}?{1}'.format(url_for('image_proxy'), urlencode(dict(url=url.encode('utf-8'), h=h))) @@ -704,7 +705,7 @@ def image_proxy(): if not url: return '', 400 - h = hmac.new(settings['server']['secret_key'], url, hashlib.sha256).hexdigest() + h = new_hmac(settings['server']['secret_key'], url) if h != request.args.get('h'): return '', 400 @@ -731,7 +732,7 @@ def image_proxy(): logger.debug('image-proxy: wrong content-type: {0}'.format(resp.headers.get('content-type'))) return '', 400 - img = '' + img = b'' chunk_counter = 0 for chunk in resp.iter_content(1024 * 1024): From fb587f11febc1951f42f5643b1532823675c2acf Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Wed, 13 Sep 2017 22:58:52 +0200 Subject: [PATCH 24/39] Switch to code-cov --- .travis.yml | 4 ++-- manage.sh | 6 +++--- requirements-dev.txt | 1 + requirements.txt | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1da7974be..74cf2371a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,14 +20,14 @@ before_install: install: - ./manage.sh npm_packages - ./manage.sh update_dev_packages - - pip install coveralls + - pip install codecov script: - ./manage.sh styles - ./manage.sh grunt_build - ./manage.sh tests after_success: - ./manage.sh py_test_coverage - - coveralls + - codecov notifications: irc: channels: diff --git a/manage.sh b/manage.sh index 319a14f2a..e3929c917 100755 --- a/manage.sh +++ b/manage.sh @@ -73,9 +73,9 @@ unit_tests() { py_test_coverage() { echo '[!] Running python test coverage' - PYTHONPATH=`pwd` python -m nose2 -C --coverage "$SEARX_DIR" -s "$BASE_DIR/tests/unit" - coverage report - coverage html + PYTHONPATH=`pwd` python -m nose2 -C --log-capture --with-coverage --coverage "$SEARX_DIR" -s "$BASE_DIR/tests/unit" \ + && coverage report \ + && coverage html } robot_tests() { diff --git a/requirements-dev.txt b/requirements-dev.txt index 8c2b72305..077a9fa2a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,6 +1,7 @@ babel==2.3.4 mock==2.0.0 nose2[coverage-plugin] +cov-core==1.15.0 pep8==1.7.0 plone.testing==5.0.0 splinter==0.7.5 diff --git a/requirements.txt b/requirements.txt index 1807205e4..e1b7c160b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,4 @@ pygments==2.1.3 pyopenssl==17.2.0 python-dateutil==2.6.1 pyyaml==3.12 -requests[socks]==2.14.2 +requests[socks]==2.18.4 From d081eee3f8c6b5eba39ee07916850f06aeee8658 Mon Sep 17 00:00:00 2001 From: jibe-b Date: Fri, 22 Sep 2017 22:26:37 +0200 Subject: [PATCH 25/39] [add] unit_test for base engine --- tests/unit/engines/test_base.py | 91 +++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tests/unit/engines/test_base.py diff --git a/tests/unit/engines/test_base.py b/tests/unit/engines/test_base.py new file mode 100644 index 000000000..e008b034c --- /dev/null +++ b/tests/unit/engines/test_base.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +from collections import defaultdict +import mock +from searx.engines import base +from searx.testing import SearxTestCase + + +class TestBaseEngine(SearxTestCase): + + def test_request(self): + query = 'test_query' + dicto = defaultdict(dict) + dicto['pageno'] = 1 + params = base.request(query, dicto) + self.assertIn('url', params) + self.assertIn('base-search.net', params['url']) + + def test_response(self): + self.assertRaises(AttributeError, base.response, None) + self.assertRaises(AttributeError, base.response, []) + self.assertRaises(AttributeError, base.response, '') + self.assertRaises(AttributeError, base.response, '[]') + + response = mock.Mock(text='') + self.assertEqual(base.response(response), []) + + xml_mock = """ + + + 0 + 1 + + + + 2000-01-01T01:01:01Z + 1 + cna + us + ftciteseerx + CiteSeerX + Science and more + + Someone + + + Someone + + + Science and more + + Science, and even more. + + The neighbour + + 2001 + 2001 + + text + + + 1 + + + application/pdf + + + application/pdf + + + http://example.org/ + + http://example.org + http://example.org + + en + + Under the example.org licence + 1 + + eng + + + +""" + + response = mock.Mock(text=xml_mock.encode('utf-8')) + results = base.response(response) + self.assertEqual(type(results), list) + self.assertEqual(len(results), 1) + self.assertEqual(results[0]['title'], 'Science and more') + self.assertEqual(results[0]['content'], 'Science, and even more.') From eddc162f2c926d3741d3b2b122d0ccbf777c75ef Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Wed, 27 Sep 2017 00:20:16 +0200 Subject: [PATCH 26/39] [fix] remove duplicated german translation - closes #937 --- searx/settings.yml | 1 - .../de_DE/LC_MESSAGES/messages.mo | Bin 11113 -> 0 bytes .../de_DE/LC_MESSAGES/messages.po | 844 ------------------ 3 files changed, 845 deletions(-) delete mode 100644 searx/translations/de_DE/LC_MESSAGES/messages.mo delete mode 100644 searx/translations/de_DE/LC_MESSAGES/messages.po diff --git a/searx/settings.yml b/searx/settings.yml index 07b7d09cc..818a32c1f 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -672,7 +672,6 @@ locales: bg : Български (Bulgarian) cs : Čeština (Czech) de : Deutsch (German) - de_DE : Deutsch (German_Germany) el_GR : Ελληνικά (Greek_Greece) eo : Esperanto (Esperanto) es : Español (Spanish) diff --git a/searx/translations/de_DE/LC_MESSAGES/messages.mo b/searx/translations/de_DE/LC_MESSAGES/messages.mo deleted file mode 100644 index c5f5012c86c6b39b05f8a17a1e12ee424eefd7cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11113 zcmb7}ZH!#kS;tS?^vx+Pq%=T7%kid3cFE4H?IumSiIeWy>)5q7>+Y^&QC{3TGiPRQ z_RhV-y?1uJ4guvuXrW4ZX=#);r4@C6R!F6gn3oy_GN=WK7N{yAAylLyKvg7=sA$C( z;P*f0-q~G~e!yDq|DJo#%X6Oh=h?5{aNVyN{{1%pf0+M2@k)($|2=)cnD1lw2~eLt z2fh}34tzEEe1%^EU&r{b!4>cyK+T)E-k42r9@P5Bz}JKCuf`t*U&Hum@EPzK@QvVU zHaiGj0B-^x182ccfZFGa75)|YHpX8CS!%umimq3Dk1=lnuLrLK=RiK0CU^sQ5BR;{ zgP_)307b_Z_>*8+eg7(`{r(Bmyca?3^BqupxsJ=|`;FkMz_(U-3#k3(E4&lr$K1!S z8^Kjj>pGwX6Hxqm0(=GdB&c~G2X)`ytG@psC^}vM-vE9E6g^)Db*~q}CivgrJlJ58 z=y-31Z4l9z1k`!s3LgVS&j&%B_hC@`J_Tz1Z-Tnt=RnbSrF#Fzp!hohx52-t#`nWq z9?fx3eA)!Ht_y0vhrySF1$Ya%4Ql_VL4M4q`Nb8?vtR~JK+*ShHWU5#fa1dmQ1V{~ z#ji1_b3OzvfWHcApBKOTe$Rk9|93&Am_MlA|0Rg1&DTKP=NsS; zf&T$&-`BC3*4+fker7=3?|$%2;K}OyPl4j61HT{4tM~5*#qSS+y3a?zH-n$5zJCF{ zmGKMU2KY_z$HAj)BKvp>Tm!!Vz5~3TLv{aUQ1?0kvc$Xx)Hx2+Ia{FkJO)Mo2SCmL zB~X0%7W1;}!lgsP!KQ zr3b$OitcAX(f65Z{2Zu#{|MB%&x6w2KLs3*^Uq z6Q$8PFGsjP0$va59=C&%&z&GFHmAVj-~~|nb{UMoXF<_-BhFCo4}zlWFsOa*0-pz$ zK@LBjCHh7}P$W1-1S;@MiD}pywkf{=Eo_&Tm!YH{wji-G-^_uc z<6cmFJp*d}kAcsE4rHl$^II$WK&@K>Wj~vs>?Z}a@1vm3{U9j*ei+ofJ_c(4%b?Et zJSckqtor`Xp!ojpp!R1$EE6K+$)!dVdNOzgwX6=px9E`2~L63w{P{ zg8u@_AH2y1`fdY7?*b^gj#l_?Q1qV%b>0O~>l~>0V^H582Swi#)%aIH>FHD8r@&ta zwf=sLTl`r8wa+G~bzM;VJPgWia_}~A1d4B;06o7z>A~m0PlI0srGF341U?m@==yo^ zZtx?Z=6@N~Io|;N{Xv$RH{FbmfOmo7>$ku=z}LMk=+jb#XF$p0JgD5iS2NFoWAN|5!{8ds)cqd=MgQZV?)xF|I`FqZ(epc??r{}-HTYFf zbo@PdC-|@6Iq)sB=sZ|}(&y(u&3_(z4frLHqs`w`@4o|T-v5A-`)lXIc{hR5)7z`@ zz2GYup8;PEu7jfc9O(G~zKXE}H7}{&=b-fJXF^<_)(8dKSSO8Lxw8 zsk0rWZP&4dE6X_T6=o?(vawl8i?PdH&e%T*cglF+%+jdL+Sy>3xH1d|Q5mCKF+;!sIwMCnD$c8R$MD4aK3cC$?ah4X^Z#ZftP*M7^KRDWs;v{M%&MYTcdyC&A zXJ)_&mTm+H15WZ8JXoO;slBj6+4?oI>kTpE=V0!85LgVw6%3< zFHR+lohUWO*OpFk_i+y6&G8^Di(nd-nIwG+6iE;l zWVLfe(>#znmzt9<>J)Y~JZMg7fgR@A#T|1h?ZzpxsSI0Vw8R@86CpD1M(tfyEvK*E4o8KoKWKe7&WqABvT07copF|T z3UemnT_@TJ4+D7B507K#w!+g6S2SmwYxf-(r(3L&yOPB}IC&Hb$0awy*HyKz7pUNgNZJ7FvK^d&Sr@u2pcY+cj%_Tci;J zTT9Ivj|K+X;$JcMrp^K-RBEX zpn)7;=`dvMC93Un2i7F`YS(Gn$`qwv;iVm5Dlx*ZXJgIHmu8bWn~boI!ko<%ggV3l z1LLMjf>XV?BbD%)JQYOQ&$Cev9>_hK^*wqIJ7pgwzH1%tub+_z9x)3UYE^-rpbr=veBP;7H0`Dw?$BS# za&qpyn|HzW9NThz^h@3fj%im+V2{)!ErN`8{;piB>8b?n1-u?SsXe*5dA8b-{WaQ< z=!RKQ#EOv{QP*t*PruQ|BnlHiVW48L3Ew?Osz*#;wo{F!F1Z>*N9DL{#i(bpzxSIP z&S7D^4Y>#W+g4Z@`S{))kyEgFKg-KDfo>yHD3sX8@@wNfOM86I@_gr@*(jsDtSnQ5 zGA_tU3OkKZyv*Y^yC@2pjZv>hG*;;1c{t>VVye8;IBGT(BMSjx84*@l3u>Qc_?t4a z(=4NDH4VSk4zZ5ia&*kcpCXgiXX&;}W4XC`ZeTlEdRwVDD9zck4)J)!)Y4|PXYD*g zR)QJ_mGhfd=gqSX6p}WfA#4kUxJispv%|MQuum?ky;%S&iHLoINeibB?-4k$nFBC7 zueVHsLX-y|tIVyspModvy%K5TuGcT zdaWO1oe@!xW%%Mva!{g11YRZ&z^N_-uc__xg6&O)l&-*ZGZY`G6CmkMocs>YLo*=m zwhb|(;8&H@8$^q1juPp!QeCq*dh;wFhObkGp@bpkBC={zw7u$^`qoN&>VcnKDEF@E z_5;xn9z5OtG0O!$%rN-f0gXTD;@P?S~E@I>f}r zIzm$6v^(#v#-TeKhu_JP#lv^qeu#eulu|XYw6sVRHy3St=k5q5-P_)2fp;8v*Vwh1 z9d{oyL)Ec}^e!AZ=D*IjH!bxd_3Gd zbl_M>pc|W{%ZpZ;yFi5yr}x-)Kf>dcM@MD1arf>#U7d`hv68m44(@2t-rb7J10mBU z#c3?>EZXI$aj?9<}(5}dv;b=zqtJJ)Al*m=2B*VeSErptTVIw1g z%IlHFlHOBe*H6nXiCru1!SVO9=_uVQedUd>+oql_%E{%l!{^jIIJw;JbC})G;WnZ? zS2|u$SS3-%r3yA_YA=ljVMgjw90bwN7v{v#IHz91W%gN;HvMrVgjEGT8uT1x{571|Hy*4+__;S4_+-wYqVuaO>D{S~w?0zfbgk+_U*n5^E zbKICxgk^`Tx#aSUTA-Uq?vi&go?PxH@bR>2d5GDd?3QRc1a*8#FP~hQeA4A?R`gKB zd1Rpt?Z!wOKsrk4)o-KSN9&lIniEmpa%OLV54-JBl_)!s1)4H_bg8QC8@@z3R@M2d zq-s>osq$_pmU42|0Q)9?W6dUa+KMUWDfS!Zq+$@Kw9RV(Iuj(HPG1#)TV@%xMF4S2 z^N+h|tBki%qS9a_z0#iI8`XYese_;Qp1sokQ0~)F5*<-cCF`(i*K;jcCL^#^I*22+ z=TsgoL3(Lhm&Q%cN9+zWB0M=u%Y;u29Cj~{27~H^nxXaP+GuH1bn+4XmA&l)WnBHq z<)kEcl>l-mNMljU^GF4>H(Rqbz1u$C1xD|G1>=0ai}1yWvgI(OE~VU@KVp~fCmf1G zw;>?hq)ifImPQdHt`r3?)sJX85H!_#z&??6Onxjqlk&r)Tpq3$wJ3RX2Rv7j$T(v; zyRLe7qGhN2;1@7Kf$b$<4CCw5IPw=ZEzY}1=urADO|Msnk*pUhiaKG&FBMc;?{ zk$ozs&+aGd76XAz$h>kB(@xEmD)l9 z+jbN#t5{IkzYeg|m?gK|bKWtBc-OSM-U<@rqJvLg^PNk7`2jM-RCafv!kBt@*~r%9 zN{WKn*_UR#Z<{pKHwhN23YQ$DR5Ug#`!bSXIE`x@kXLi>0z=5!XK=wQ?Xhle+o7kD zm32|p*bNbqaxF%PR<(xfBc)OVc!;WWFGYA@wE}Q~p5~h2Q~8p4TlgpD& z#_9ms9%+Tw%M(sXSB}gkS0w!srYmk1B>STtj0tvJMG&MIKGtCeuM%|52ZCygT@4Dl zgU%ES)j{7~5W9LQ-P>Jh&JC*5xr%ZmpL+x)O-TnrW2VxmI?dYKn>njQ(7RT%`>4*W zt&jAI+ECZZ3zyTiukX^}sp~kp_uEuyt1M6seYzbz|Efu|Pk|6@H%suja2|eB;YtKK zG3_*={gO+hZ#IM(3Vy13`SFsj8h<&V_g%t=`;oQ_@hdrBPQ)V6KlL!Bf$xr&Sb^f@_MZMWgnSB%Md2LGV-L zE;14IyyS*_9d%x5|s$ zc+Djx+B%1~LDQ%Da6j?5v?1tuZ$#d?d%fD-SHZ$=PCHDO_FO$|$t|#j$z{p|#OD=K z3_YtRR9Ou9f>Qcc6c(j?tV6(6I|?m#mh2$%!JtkR&E#oVBdsu(Mn06&E3(H_vG}~| zTEnR|+V`Z`A304!^)xd)9-2}z2R0XbPs`%>j8`!!ShhRiA+@RYj8E{_RQ^b`>HAfy zzF*al`wTm!W|fxJ7Ksf-g2FdPr2EQab1ugPl304f<%XxLF4jI%GuxRWkrF{)RMSt2 zVC8Q1X{M$^Z%~yzypOv4b zBfCWROHvcJR3lBZ|IN?^^PQa-J%xMxoy&o_-O5s&WN-<=-FfD, 2015 -# cy8aer , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: searx\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-12-29 10:42+0100\n" -"PO-Revision-Date: 2017-05-19 20:17+0000\n" -"Last-Translator: cy8aer \n" -"Language-Team: German (Germany) (http://www.transifex.com/asciimoo/searx/language/de_DE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.3.4\n" -"Language: de_DE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: searx/webapp.py:123 -msgid "files" -msgstr "Dateien" - -#: searx/webapp.py:124 -msgid "general" -msgstr "Allgemein" - -#: searx/webapp.py:125 -msgid "music" -msgstr "Musik" - -#: searx/webapp.py:126 -msgid "social media" -msgstr "Soziale Medien" - -#: searx/webapp.py:127 -msgid "images" -msgstr "Fotos" - -#: searx/webapp.py:128 -msgid "videos" -msgstr "Videos" - -#: searx/webapp.py:129 -msgid "it" -msgstr "IT" - -#: searx/webapp.py:130 -msgid "news" -msgstr "Nachrichten" - -#: searx/webapp.py:131 -msgid "map" -msgstr "Karten" - -#: searx/webapp.py:132 -msgid "science" -msgstr "Wissenschaft" - -#: searx/webapp.py:384 searx/webapp.py:594 -msgid "Invalid settings, please edit your preferences" -msgstr "Ungültige Auswahl, bitte überprüfen Sie die Einstellungen" - -#: searx/webapp.py:425 -msgid "search error" -msgstr "Fehler bei der Suche" - -#: searx/webapp.py:467 -msgid "{minutes} minute(s) ago" -msgstr "vor {minutes} Minute(n)" - -#: searx/webapp.py:469 -msgid "{hours} hour(s), {minutes} minute(s) ago" -msgstr "vor {hours} Stunde(n). {minutes} Minute(n)" - -#: searx/answerers/random/answerer.py:48 -msgid "Random value generator" -msgstr "Zufallswertgenerator" - -#: searx/answerers/random/answerer.py:49 -msgid "Generate different random values" -msgstr "Zufallswerte generieren" - -#: searx/answerers/statistics/answerer.py:49 -msgid "Statistics functions" -msgstr "Statistik-Funktionen" - -#: searx/answerers/statistics/answerer.py:50 -msgid "Compute {functions} of the arguments" -msgstr "{functions} der Argumente berechnen" - -#: searx/engines/__init__.py:192 -msgid "Engine time (sec)" -msgstr "Zeitbedarf (s)" - -#: searx/engines/__init__.py:196 -msgid "Page loads (sec)" -msgstr "Ladezeit (s)" - -#: searx/engines/__init__.py:200 searx/templates/oscar/results.html:88 -msgid "Number of results" -msgstr "Anzahl Ergebnisse" - -#: searx/engines/__init__.py:204 -msgid "Scores" -msgstr "Punktwerte" - -#: searx/engines/__init__.py:208 -msgid "Scores per result" -msgstr "Punktwerte pro Ergebnis" - -#: searx/engines/__init__.py:212 -msgid "Errors" -msgstr "Fehler" - -#: searx/engines/pdbe.py:87 -msgid "{title} (OBSOLETE)" -msgstr "{title} (OBSOLET)" - -#: searx/engines/pdbe.py:91 -msgid "This entry has been superseded by" -msgstr "Dieser Eintrag wurde ersetzt durch" - -#: searx/plugins/doai_rewrite.py:7 -msgid "DOAI rewrite" -msgstr "DOAI-Umgehung" - -#: searx/plugins/doai_rewrite.py:8 -msgid "" -"Avoid paywalls by redirecting to open-access versions of publications when " -"available" -msgstr "Paywalls umgehen, indem wenn möglich auf Open-Access-Versionen von Publikationen umgeleitet wird" - -#: searx/plugins/https_rewrite.py:29 -msgid "Rewrite HTTP links to HTTPS if possible" -msgstr "Umschreiben von HTTP-Links nach HTTPS, wenn möglich" - -#: searx/plugins/infinite_scroll.py:3 -msgid "Infinite scroll" -msgstr "Unbegrenztes Scrollen" - -#: searx/plugins/infinite_scroll.py:4 -msgid "Automatically load next page when scrolling to bottom of current page" -msgstr "Nächste Seite automatisch laden, wenn zum Seitenende gescrollt wird" - -#: searx/plugins/open_results_on_new_tab.py:18 -#: searx/templates/oscar/preferences.html:113 -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 "Suchergebnisse werden standardmäßig im gleichen Fenster geöffnet. Dieses Plug-in überschreibt dieses Standardverhalten und öffnet Links in neuen Tabs/Fenstern (benötigt JavaScript)." - -#: searx/plugins/search_on_category_select.py:18 -msgid "Search on category select" -msgstr "Suchen nach Kategorie" - -#: searx/plugins/search_on_category_select.py:19 -msgid "" -"Perform search immediately if a category selected. Disable to select " -"multiple categories. (JavaScript required)" -msgstr "Suche sofort durchführen, wenn eine Kategorie ausgewählt wird. Deaktivieren Sie diese Option, um mehrere Kategorien auswählen zu können (benötigt 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 "Zeigt Ihre IP-Adresse an, wenn \"ip\" als Suchanfrage eingegeben wird und den User Agent bzw. das verwendete Client-Programm, wenn die Suchanfrage den Ausdruck \"user agent\" enthält." - -#: searx/plugins/tracker_url_remover.py:26 -msgid "Tracker URL remover" -msgstr "Tracking-URLs bereinigen" - -#: searx/plugins/tracker_url_remover.py:27 -msgid "Remove trackers arguments from the returned URL" -msgstr "Tracker-Argumente der erhaltenen URL entfernen" - -#: searx/plugins/vim_hotkeys.py:3 -msgid "Vim-like hotkeys" -msgstr "Vim-ähnliche Hotkeys" - -#: 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 "Durch Suchergebnisse navigieren mit Vim-ähnlichen Hotkeys (benötigt JavaScript). \"h\" drücken auf der Hauptseite oder der Ergebnisseite, um Hilfe zu erhalten." - -#: searx/templates/courgette/404.html:4 searx/templates/legacy/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/legacy/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/legacy/404.html:6 -#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6 -msgid "search page" -msgstr "Seite durchsuchen" - -#: searx/templates/courgette/index.html:9 -#: searx/templates/courgette/index.html:13 -#: searx/templates/courgette/results.html:5 -#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12 -#: searx/templates/oscar/navbar.html:12 -#: searx/templates/oscar/preferences.html:3 -#: searx/templates/pix-art/index.html:8 -msgid "preferences" -msgstr "Einstellungen" - -#: searx/templates/courgette/index.html:11 -#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2 -#: searx/templates/oscar/navbar.html:11 searx/templates/pix-art/index.html:7 -msgid "about" -msgstr "Über uns" - -#: searx/templates/courgette/preferences.html:5 -#: searx/templates/legacy/preferences.html:5 -#: searx/templates/oscar/preferences.html:7 -#: searx/templates/pix-art/preferences.html:5 -msgid "Preferences" -msgstr "Einstellungen" - -#: searx/templates/courgette/preferences.html:9 -#: searx/templates/legacy/preferences.html:9 -#: searx/templates/oscar/preferences.html:32 -#: searx/templates/oscar/preferences.html:34 -msgid "Default categories" -msgstr "Standardkategorien" - -#: searx/templates/courgette/preferences.html:13 -#: searx/templates/legacy/preferences.html:14 -#: searx/templates/oscar/preferences.html:40 -#: searx/templates/pix-art/preferences.html:9 -msgid "Search language" -msgstr "Suchsprache" - -#: searx/templates/courgette/preferences.html:16 -#: searx/templates/legacy/preferences.html:17 -#: searx/templates/oscar/languages.html:6 -#: searx/templates/pix-art/preferences.html:12 -msgid "Default language" -msgstr "Standardsprache" - -#: searx/templates/courgette/preferences.html:24 -#: searx/templates/legacy/preferences.html:25 -#: searx/templates/oscar/preferences.html:46 -#: searx/templates/pix-art/preferences.html:20 -msgid "Interface language" -msgstr "Sprache der Benutzeroberfläche" - -#: searx/templates/courgette/preferences.html:34 -#: searx/templates/legacy/preferences.html:35 -#: searx/templates/oscar/preferences.html:56 -msgid "Autocomplete" -msgstr "Autovervollständigen" - -#: searx/templates/courgette/preferences.html:45 -#: searx/templates/legacy/preferences.html:46 -#: searx/templates/oscar/preferences.html:67 -msgid "Image proxy" -msgstr "Proxy-Server für Bilder" - -#: searx/templates/courgette/preferences.html:48 -#: searx/templates/legacy/preferences.html:49 -#: searx/templates/oscar/preferences.html:71 -msgid "Enabled" -msgstr "Aktiviert" - -#: searx/templates/courgette/preferences.html:49 -#: searx/templates/legacy/preferences.html:50 -#: searx/templates/oscar/preferences.html:72 -msgid "Disabled" -msgstr "Deaktiviert" - -#: searx/templates/courgette/preferences.html:54 -#: searx/templates/legacy/preferences.html:55 -#: searx/templates/oscar/preferences.html:76 -#: searx/templates/pix-art/preferences.html:30 -msgid "Method" -msgstr "Methode" - -#: searx/templates/courgette/preferences.html:63 -#: searx/templates/legacy/preferences.html:64 -#: searx/templates/oscar/preferences.html:85 -#: searx/templates/oscar/preferences.html:152 -#: searx/templates/oscar/preferences.html:159 -msgid "SafeSearch" -msgstr "SafeSearch" - -#: searx/templates/courgette/preferences.html:66 -#: searx/templates/legacy/preferences.html:67 -#: searx/templates/oscar/preferences.html:89 -msgid "Strict" -msgstr "Streng" - -#: searx/templates/courgette/preferences.html:67 -#: searx/templates/legacy/preferences.html:68 -#: searx/templates/oscar/preferences.html:90 -msgid "Moderate" -msgstr "Moderat" - -#: searx/templates/courgette/preferences.html:68 -#: searx/templates/legacy/preferences.html:69 -#: searx/templates/oscar/preferences.html:91 -msgid "None" -msgstr "Keine" - -#: searx/templates/courgette/preferences.html:73 -#: searx/templates/legacy/preferences.html:74 -#: searx/templates/oscar/preferences.html:95 -#: searx/templates/pix-art/preferences.html:39 -msgid "Themes" -msgstr "Oberflächen" - -#: searx/templates/courgette/preferences.html:83 -msgid "Color" -msgstr "Farbe" - -#: searx/templates/courgette/preferences.html:86 -msgid "Blue (default)" -msgstr "Blau (Standard)" - -#: searx/templates/courgette/preferences.html:87 -msgid "Violet" -msgstr "Violett" - -#: searx/templates/courgette/preferences.html:88 -msgid "Green" -msgstr "Grün" - -#: searx/templates/courgette/preferences.html:89 -msgid "Cyan" -msgstr "Türkis" - -#: searx/templates/courgette/preferences.html:90 -msgid "Orange" -msgstr "Orange" - -#: searx/templates/courgette/preferences.html:91 -msgid "Red" -msgstr "Rot" - -#: searx/templates/courgette/preferences.html:96 -#: searx/templates/legacy/preferences.html:93 -#: searx/templates/pix-art/preferences.html:49 -msgid "Currently used search engines" -msgstr "Momentan genutzte Suchmaschinen" - -#: searx/templates/courgette/preferences.html:100 -#: searx/templates/legacy/preferences.html:97 -#: searx/templates/oscar/preferences.html:149 -#: searx/templates/oscar/preferences.html:162 -#: searx/templates/pix-art/preferences.html:53 -msgid "Engine name" -msgstr "Suchmaschinen-Name" - -#: searx/templates/courgette/preferences.html:101 -#: searx/templates/legacy/preferences.html:98 -msgid "Category" -msgstr "Kategorie" - -#: searx/templates/courgette/preferences.html:102 -#: searx/templates/courgette/preferences.html:113 -#: searx/templates/legacy/preferences.html:99 -#: searx/templates/legacy/preferences.html:110 -#: searx/templates/oscar/preferences.html:148 -#: searx/templates/oscar/preferences.html:163 -#: searx/templates/pix-art/preferences.html:54 -#: searx/templates/pix-art/preferences.html:64 -msgid "Allow" -msgstr "Zulassen" - -#: searx/templates/courgette/preferences.html:102 -#: searx/templates/courgette/preferences.html:114 -#: searx/templates/legacy/preferences.html:99 -#: searx/templates/legacy/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/legacy/preferences.html:119 -#: searx/templates/oscar/preferences.html:282 -#: 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 "Diese Einstellungen werden in Ihren Cookies gespeichert, deshalb müssen wir diese persönlichen Daten nicht bei uns speichern." - -#: searx/templates/courgette/preferences.html:124 -#: searx/templates/legacy/preferences.html:121 -#: searx/templates/oscar/preferences.html:284 -#: searx/templates/pix-art/preferences.html:75 -msgid "" -"These cookies serve your sole convenience, we don't use these cookies to " -"track you." -msgstr "Diese Cookies ermöglichen lediglich eine komfortablere Nutzung, wir verwenden diese Cookies nicht, um Sie zu tracken." - -#: searx/templates/courgette/preferences.html:127 -#: searx/templates/legacy/preferences.html:124 -#: searx/templates/oscar/preferences.html:287 -#: searx/templates/pix-art/preferences.html:78 -msgid "save" -msgstr "speichern" - -#: searx/templates/courgette/preferences.html:128 -#: searx/templates/legacy/preferences.html:125 -#: searx/templates/oscar/preferences.html:289 -msgid "Reset defaults" -msgstr "Voreinstellungen wiederherstellen" - -#: searx/templates/courgette/preferences.html:129 -#: searx/templates/legacy/preferences.html:126 -#: searx/templates/oscar/preferences.html:288 -#: searx/templates/pix-art/preferences.html:79 -msgid "back" -msgstr "zurück" - -#: searx/templates/courgette/results.html:12 -#: searx/templates/legacy/results.html:13 -#: searx/templates/oscar/results.html:124 -msgid "Search URL" -msgstr "Such-URL" - -#: searx/templates/courgette/results.html:16 -#: searx/templates/legacy/results.html:17 -#: searx/templates/oscar/results.html:129 -msgid "Download results" -msgstr "Suchergebnisse herunterladen" - -#: searx/templates/courgette/results.html:34 -#: searx/templates/legacy/results.html:35 -msgid "Answers" -msgstr "Antworten" - -#: searx/templates/courgette/results.html:42 -#: searx/templates/legacy/results.html:43 -#: searx/templates/oscar/results.html:104 -msgid "Suggestions" -msgstr "Vorschläge" - -#: searx/templates/courgette/results.html:70 -#: searx/templates/legacy/results.html:81 -#: 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/legacy/results.html:92 -#: searx/templates/oscar/results.html:45 searx/templates/oscar/results.html:75 -msgid "next page" -msgstr "nächste Seite" - -#: searx/templates/courgette/search.html:3 -#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:4 -#: searx/templates/oscar/search_full.html:9 -#: searx/templates/pix-art/search.html:3 -msgid "Search for..." -msgstr "Suchen nach ..." - -#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4 -#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4 -msgid "Engine stats" -msgstr "Suchmaschinen-Statistiken" - -#: searx/templates/courgette/result_templates/images.html:4 -#: searx/templates/legacy/result_templates/images.html:4 -#: searx/templates/pix-art/result_templates/images.html:4 -msgid "original context" -msgstr "Ursprünglicher Kontext" - -#: searx/templates/courgette/result_templates/torrent.html:7 -#: searx/templates/legacy/result_templates/torrent.html:11 -#: searx/templates/oscar/result_templates/torrent.html:6 -msgid "Seeder" -msgstr "Seeder" - -#: searx/templates/courgette/result_templates/torrent.html:7 -#: searx/templates/legacy/result_templates/torrent.html:11 -#: searx/templates/oscar/result_templates/torrent.html:6 -msgid "Leecher" -msgstr "Leecher" - -#: searx/templates/courgette/result_templates/torrent.html:9 -#: searx/templates/legacy/result_templates/torrent.html:9 -#: searx/templates/oscar/macros.html:24 -msgid "magnet link" -msgstr "Magnet-Link" - -#: searx/templates/courgette/result_templates/torrent.html:10 -#: searx/templates/legacy/result_templates/torrent.html:10 -#: searx/templates/oscar/macros.html:25 -msgid "torrent file" -msgstr "Torrent-Datei" - -#: searx/templates/legacy/categories.html:8 -msgid "Click on the magnifier to perform search" -msgstr "Klicken Sie auf das Vergrößerungsglas, um die Suche zu starten" - -#: searx/templates/legacy/preferences.html:84 -#: searx/templates/oscar/preferences.html:112 -msgid "Results on new tabs" -msgstr "Ergebnisse in neuen Tabs" - -#: searx/templates/legacy/preferences.html:87 -#: searx/templates/oscar/preferences.html:116 -msgid "On" -msgstr "An" - -#: searx/templates/legacy/preferences.html:88 -#: searx/templates/oscar/preferences.html:117 -msgid "Off" -msgstr "Aus" - -#: searx/templates/legacy/result_templates/code.html:3 -#: searx/templates/legacy/result_templates/default.html:3 -#: searx/templates/legacy/result_templates/map.html:9 -#: searx/templates/oscar/macros.html:35 searx/templates/oscar/macros.html:49 -msgid "cached" -msgstr "im Cache" - -#: searx/templates/oscar/advanced.html:4 -msgid "Advanced settings" -msgstr "Erweiterte Einstellungen" - -#: searx/templates/oscar/base.html:62 -#: 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 -#: searx/templates/oscar/messages/unknow_error.html:5 -msgid "Close" -msgstr "Schließen" - -#: searx/templates/oscar/base.html:64 -msgid "Error!" -msgstr "Fehler!" - -#: searx/templates/oscar/base.html:90 -msgid "Powered by" -msgstr "Bereitgestellt von" - -#: searx/templates/oscar/base.html:90 -msgid "a privacy-respecting, hackable metasearch engine" -msgstr "eine die Privatsphäre respektierende, hackbare Meta-Suchmaschine" - -#: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:51 -msgid "proxied" -msgstr "via Proxy-Server" - -#: searx/templates/oscar/preferences.html:12 -#: searx/templates/oscar/preferences.html:21 -msgid "General" -msgstr "Allgemein" - -#: searx/templates/oscar/preferences.html:13 -#: searx/templates/oscar/preferences.html:133 -msgid "Engines" -msgstr "Suchmaschinen" - -#: searx/templates/oscar/preferences.html:14 -#: searx/templates/oscar/preferences.html:204 -msgid "Plugins" -msgstr "Plug-ins" - -#: searx/templates/oscar/preferences.html:15 -#: searx/templates/oscar/preferences.html:230 -msgid "Answerers" -msgstr "Instant Answers/Sofortantworten" - -#: searx/templates/oscar/preferences.html:16 -#: searx/templates/oscar/preferences.html:257 -msgid "Cookies" -msgstr "Cookies" - -#: searx/templates/oscar/preferences.html:41 -msgid "What language do you prefer for search?" -msgstr "Welche Sprache möchten Sie für die Suche verwenden?" - -#: searx/templates/oscar/preferences.html:47 -msgid "Change the language of the layout" -msgstr "Sprache des Layouts ändern" - -#: searx/templates/oscar/preferences.html:57 -msgid "Find stuff as you type" -msgstr "Bereits während der Eingabe suchen" - -#: searx/templates/oscar/preferences.html:68 -msgid "Proxying image results through searx" -msgstr "Bilder-Suchergebnisse über den searx-Proxy-Server laden" - -#: searx/templates/oscar/preferences.html:77 -msgid "" -"Change how forms are submited, learn more about request methods" -msgstr "HTTP-Anfragemethode ändern (weiterführende Informationen zu HTTP-Anfragemethoden)" - -#: searx/templates/oscar/preferences.html:86 -msgid "Filter content" -msgstr "Inhalte filtern" - -#: searx/templates/oscar/preferences.html:96 -msgid "Change searx layout" -msgstr "searx-Layout ändern" - -#: searx/templates/oscar/preferences.html:105 -#: searx/templates/oscar/preferences.html:110 -msgid "Choose style for this theme" -msgstr "Stilrichtung für diese Benutzeroberfläche auswählen" - -#: searx/templates/oscar/preferences.html:105 -#: searx/templates/oscar/preferences.html:110 -msgid "Style" -msgstr "Stilrichtung" - -#: searx/templates/oscar/preferences.html:150 -#: searx/templates/oscar/preferences.html:161 -msgid "Shortcut" -msgstr "Kürzel" - -#: searx/templates/oscar/preferences.html:151 -#: searx/templates/oscar/preferences.html:160 -msgid "Supports selected language" -msgstr "Unterstützt die ausgewähle Sprache" - -#: searx/templates/oscar/preferences.html:153 -msgid "Time range" -msgstr "Zeitraum" - -#: searx/templates/oscar/preferences.html:154 -#: searx/templates/oscar/preferences.html:158 -msgid "Avg. time" -msgstr "Durchschn. Zeit" - -#: searx/templates/oscar/preferences.html:155 -#: searx/templates/oscar/preferences.html:157 -msgid "Max time" -msgstr "Maximale Zeit" - -#: searx/templates/oscar/preferences.html:233 -msgid "This is the list of searx's instant answering modules." -msgstr "Auflistung der searx-Module für Sofortantworten:" - -#: searx/templates/oscar/preferences.html:237 -msgid "Name" -msgstr "Name" - -#: searx/templates/oscar/preferences.html:238 -msgid "Keywords" -msgstr "Schlüsselwörter" - -#: searx/templates/oscar/preferences.html:239 -msgid "Description" -msgstr "Beschreibung" - -#: searx/templates/oscar/preferences.html:240 -msgid "Examples" -msgstr "Beispiele" - -#: searx/templates/oscar/preferences.html:260 -msgid "" -"This is the list of cookies and their values searx is storing on your " -"computer." -msgstr "Hier werden die Cookies und die gespeicherten Cookie-Informationen aufgelistet, die searx auf Ihrem Computer speichert." - -#: searx/templates/oscar/preferences.html:261 -msgid "With that list, you can assess searx transparency." -msgstr "Mit Hilfe dieser Auflistung können Sie die Transparenz der searx-Suche einschätzen." - -#: searx/templates/oscar/preferences.html:266 -msgid "Cookie name" -msgstr "Cookie-Name" - -#: searx/templates/oscar/preferences.html:267 -msgid "Value" -msgstr "Wert" - -#: searx/templates/oscar/results.html:7 -msgid "Search results" -msgstr "Durchsuche Ergebnisse" - -#: searx/templates/oscar/results.html:119 -msgid "Links" -msgstr "Links" - -#: searx/templates/oscar/search.html:6 -#: searx/templates/oscar/search_full.html:11 -msgid "Start search" -msgstr "Suche starten" - -#: searx/templates/oscar/stats.html:2 -msgid "stats" -msgstr "Statistiken" - -#: searx/templates/oscar/time-range.html:3 -msgid "Anytime" -msgstr "Beliebiger Zeitunkt" - -#: searx/templates/oscar/time-range.html:6 -msgid "Last day" -msgstr "Gestern" - -#: searx/templates/oscar/time-range.html:9 -msgid "Last week" -msgstr "Letzte Woche" - -#: searx/templates/oscar/time-range.html:12 -msgid "Last month" -msgstr "Letzter Monat" - -#: searx/templates/oscar/time-range.html:15 -msgid "Last year" -msgstr "Letztes Jahr" - -#: searx/templates/oscar/messages/first_time.html:6 -#: searx/templates/oscar/messages/no_data_available.html:3 -msgid "Heads up!" -msgstr "Aufgepasst!" - -#: searx/templates/oscar/messages/first_time.html:7 -msgid "It look like you are using searx first time." -msgstr "Anscheinend benutzen Sie searx zum ersten Mal." - -#: searx/templates/oscar/messages/no_cookies.html:3 -msgid "Information!" -msgstr "Zur Information!" - -#: searx/templates/oscar/messages/no_cookies.html:4 -msgid "currently, there are no cookies defined." -msgstr "Zur Zeit sind keine Cookies definiert." - -#: searx/templates/oscar/messages/no_data_available.html:4 -msgid "There is currently no data available. " -msgstr "Zur Zeit sind keine Daten verfügbar." - -#: searx/templates/oscar/messages/no_results.html:7 -msgid "Sorry!" -msgstr "Entschuldigung!" - -#: searx/templates/oscar/messages/no_results.html:8 -msgid "" -"we didn't find any results. Please use another query or search in more " -"categories." -msgstr "Leider konnten wir keine Suchergebnisse finden. Bitte verwenden Sie eine andere Suchabfrage oder erweitern Sie die Suche auf mehr Kategorien." - -#: searx/templates/oscar/messages/save_settings_successfull.html:7 -msgid "Well done!" -msgstr "Gut gemacht!" - -#: searx/templates/oscar/messages/save_settings_successfull.html:8 -msgid "Settings saved successfully." -msgstr "Einstellungen erfolgreich gespeichert." - -#: searx/templates/oscar/messages/unknow_error.html:7 -msgid "Oh snap!" -msgstr "Hoppla!" - -#: searx/templates/oscar/messages/unknow_error.html:8 -msgid "Something went wrong." -msgstr "Ein Fehler ist aufgetreten." - -#: searx/templates/oscar/result_templates/default.html:7 -msgid "show media" -msgstr "Medien anzeigen" - -#: searx/templates/oscar/result_templates/default.html:7 -msgid "hide media" -msgstr "Medien verbergen" - -#: searx/templates/oscar/result_templates/images.html:30 -msgid "Get image" -msgstr "Bild herunterladen" - -#: searx/templates/oscar/result_templates/images.html:33 -msgid "View source" -msgstr "Quelle anzeigen" - -#: searx/templates/oscar/result_templates/map.html:7 -msgid "show map" -msgstr "Karte anzeigen" - -#: searx/templates/oscar/result_templates/map.html:7 -msgid "hide map" -msgstr "Karte verbergen" - -#: searx/templates/oscar/result_templates/map.html:11 -msgid "show details" -msgstr "Details anzeigen" - -#: searx/templates/oscar/result_templates/map.html:11 -msgid "hide details" -msgstr "Details verbergen" - -#: searx/templates/oscar/result_templates/torrent.html:7 -msgid "Filesize" -msgstr "Dateigröße" - -#: searx/templates/oscar/result_templates/torrent.html:9 -msgid "Bytes" -msgstr "Bytes" - -#: searx/templates/oscar/result_templates/torrent.html:10 -msgid "kiB" -msgstr "kiB" - -#: searx/templates/oscar/result_templates/torrent.html:11 -msgid "MiB" -msgstr "MiB" - -#: searx/templates/oscar/result_templates/torrent.html:12 -msgid "GiB" -msgstr "GiB" - -#: searx/templates/oscar/result_templates/torrent.html:13 -msgid "TiB" -msgstr "TiB" - -#: searx/templates/oscar/result_templates/torrent.html:15 -msgid "Number of Files" -msgstr "Anzahl Dateien" - -#: searx/templates/oscar/result_templates/videos.html:7 -msgid "show video" -msgstr "Video anzeigen" - -#: searx/templates/oscar/result_templates/videos.html:7 -msgid "hide video" -msgstr "Video verbergen" - -#: searx/templates/pix-art/results.html:28 -msgid "Load more..." -msgstr "Mehr anzeigen ..." From cf3a099c65abca441770e613f1a224a80a0ac997 Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Thu, 28 Sep 2017 19:08:57 +0200 Subject: [PATCH 27/39] codecov: disable comments in the PR --- .codecov.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 000000000..69cb76019 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1 @@ +comment: false From c12e0c39b93d28469038296ce6f1178bc9b5f2aa Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Thu, 28 Sep 2017 19:43:58 +0200 Subject: [PATCH 28/39] codecov : update the commit status --- .codecov.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.codecov.yml b/.codecov.yml index 69cb76019..6cdbc2885 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1 +1,31 @@ comment: false +coverage: + status: + project: + default: + # basic + target: auto + threshold: null + base: auto + # advanced + branches: null + if_no_uploads: error + if_not_found: success + if_ci_failed: error + only_pulls: false + flags: null + paths: null + patch: + default: + # basic + target: auto + threshold: null + base: auto + # advanced + branches: null + if_no_uploads: error + if_not_found: success + if_ci_failed: error + only_pulls: false + flags: null + paths: null From e2afc1cdba43cf35327b3b8dfb6d54115035df43 Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Fri, 6 Oct 2017 20:16:03 +0200 Subject: [PATCH 29/39] [mod] disable yahoo by default closes #869 closes #1055 --- searx/settings.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/searx/settings.yml b/searx/settings.yml index 818a32c1f..185efc30d 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -581,6 +581,7 @@ engines: - name : yahoo engine : yahoo shortcut : yh + disabled : True - name : yandex engine : yandex From 2790402060c37aa5bb1e0f371e17225bd51bf5e1 Mon Sep 17 00:00:00 2001 From: Thirnearez Date: Fri, 6 Oct 2017 18:43:15 +0000 Subject: [PATCH 30/39] fix a shell typo that generated a bogus file --- manage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage.sh b/manage.sh index e3929c917..e5e39f51a 100755 --- a/manage.sh +++ b/manage.sh @@ -22,7 +22,7 @@ install_geckodriver() { echo '[!] Checking geckodriver' # TODO : check the current geckodriver version set -e - geckodriver -V 2>1 > /dev/null || NOTFOUND=1 + geckodriver -V > /dev/null 2>&1 || NOTFOUND=1 set +e if [ -z $NOTFOUND ]; then return From 076cfe25d778201081972a6848f9173115b530f4 Mon Sep 17 00:00:00 2001 From: Thirnearez Date: Fri, 6 Oct 2017 18:24:21 +0000 Subject: [PATCH 31/39] handle input carefully in shell scripts - prevent whitespace-splitting of variable expansions - prevent interpretation of values as flags/options (mostly) --- manage.sh | 36 ++++++++++++++++++------------------ utils/update-translations.sh | 6 +++--- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/manage.sh b/manage.sh index e5e39f51a..3de273e84 100755 --- a/manage.sh +++ b/manage.sh @@ -1,11 +1,11 @@ #!/bin/sh -BASE_DIR=$(dirname "`readlink -f "$0"`") -PYTHONPATH=$BASE_DIR +BASE_DIR="$(dirname -- "`readlink -f -- "$0"`")" +PYTHONPATH="$BASE_DIR" SEARX_DIR="$BASE_DIR/searx" -ACTION=$1 +ACTION="$1" -cd "$BASE_DIR" +cd -- "$BASE_DIR" update_packages() { pip install --upgrade pip @@ -24,12 +24,12 @@ install_geckodriver() { set -e geckodriver -V > /dev/null 2>&1 || NOTFOUND=1 set +e - if [ -z $NOTFOUND ]; then + if [ -z "$NOTFOUND" ]; then return fi GECKODRIVER_VERSION="v0.18.0" - PLATFORM=`python -c "import six; import platform; six.print_(platform.system().lower(), platform.architecture()[0])"` - case $PLATFORM in + PLATFORM="`python -c "import six; import platform; six.print_(platform.system().lower(), platform.architecture()[0])"`" + case "$PLATFORM" in "linux 32bit" | "linux2 32bit") ARCH="linux32";; "linux 64bit" | "linux2 64bit") ARCH="linux64";; "windows 32 bit") ARCH="win32";; @@ -47,15 +47,15 @@ install_geckodriver() { fi else GECKODRIVER_DIR="$1" - mkdir -p "$GECKODRIVER_DIR" + mkdir -p -- "$GECKODRIVER_DIR" fi echo "Installing $GECKODRIVER_DIR/geckodriver from\n $GECKODRIVER_URL" - FILE=`mktemp` - wget "$GECKODRIVER_URL" -qO $FILE && tar xz -C "$GECKODRIVER_DIR" -f $FILE geckodriver - rm $FILE - chmod 777 "$GECKODRIVER_DIR/geckodriver" + FILE="`mktemp`" + wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "$GECKODRIVER_DIR" -f "$FILE" geckodriver + rm -- "$FILE" + chmod 777 -- "$GECKODRIVER_DIR/geckodriver" } pep8_check() { @@ -73,14 +73,14 @@ unit_tests() { py_test_coverage() { echo '[!] Running python test coverage' - PYTHONPATH=`pwd` python -m nose2 -C --log-capture --with-coverage --coverage "$SEARX_DIR" -s "$BASE_DIR/tests/unit" \ + PYTHONPATH="`pwd`" python -m nose2 -C --log-capture --with-coverage --coverage "$SEARX_DIR" -s "$BASE_DIR/tests/unit" \ && coverage report \ && coverage html } robot_tests() { echo '[!] Running robot tests' - PYTHONPATH=`pwd` python "$SEARX_DIR/testing.py" robot + PYTHONPATH="`pwd`" python "$SEARX_DIR/testing.py" robot } tests() { @@ -113,11 +113,11 @@ styles() { npm_packages() { echo '[!] install NPM packages for oscar theme' - cd $BASE_DIR/searx/static/themes/oscar + cd -- "$BASE_DIR/searx/static/themes/oscar" npm install echo '[!] install NPM packages for simple theme' - cd $BASE_DIR/searx/static/themes/simple + cd -- "$BASE_DIR/searx/static/themes/simple" npm install } @@ -133,7 +133,7 @@ locales() { } help() { - [ -z "$1" ] || printf "Error: $1\n" + [ -z "$1" ] || printf 'Error: %s\n' "$1" echo "Searx manage.sh help Commands @@ -156,4 +156,4 @@ Commands [ "$(command -V "$ACTION" | grep ' function$')" = "" ] \ && help "action not found" \ - || $ACTION "$2" + || "$ACTION" "$2" diff --git a/utils/update-translations.sh b/utils/update-translations.sh index 00e7fb1e0..240387ae7 100755 --- a/utils/update-translations.sh +++ b/utils/update-translations.sh @@ -7,9 +7,9 @@ SEARX_DIR='searx' -pybabel extract -F babel.cfg -o messages.pot $SEARX_DIR -for f in `ls $SEARX_DIR'/translations/'`; do - pybabel update -N -i messages.pot -d $SEARX_DIR'/translations/' -l $f +pybabel extract -F babel.cfg -o messages.pot "$SEARX_DIR" +for f in `ls "$SEARX_DIR"'/translations/'`; do + pybabel update -N -i messages.pot -d "$SEARX_DIR"'/translations/' -l "$f" done echo '[!] update done, edit .po files if required and run pybabel compile -d searx/translations/' From 9224b3c3f04d0757466a4ff6a6e1280ce630c9ff Mon Sep 17 00:00:00 2001 From: Thirnearez Date: Fri, 6 Oct 2017 18:31:19 +0000 Subject: [PATCH 32/39] adjust whitespace in shell scripts --- manage.sh | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/manage.sh b/manage.sh index 3de273e84..d5b385195 100755 --- a/manage.sh +++ b/manage.sh @@ -25,33 +25,33 @@ install_geckodriver() { geckodriver -V > /dev/null 2>&1 || NOTFOUND=1 set +e if [ -z "$NOTFOUND" ]; then - return + return fi GECKODRIVER_VERSION="v0.18.0" PLATFORM="`python -c "import six; import platform; six.print_(platform.system().lower(), platform.architecture()[0])"`" case "$PLATFORM" in - "linux 32bit" | "linux2 32bit") ARCH="linux32";; - "linux 64bit" | "linux2 64bit") ARCH="linux64";; - "windows 32 bit") ARCH="win32";; - "windows 64 bit") ARCH="win64";; - "mac 64bit") ARCH="macos";; + "linux 32bit" | "linux2 32bit") ARCH="linux32";; + "linux 64bit" | "linux2 64bit") ARCH="linux64";; + "windows 32 bit") ARCH="win32";; + "windows 64 bit") ARCH="win64";; + "mac 64bit") ARCH="macos";; esac GECKODRIVER_URL="https://github.com/mozilla/geckodriver/releases/download/$GECKODRIVER_VERSION/geckodriver-$GECKODRIVER_VERSION-$ARCH.tar.gz"; if [ -z "$1" ]; then - if [ -z "$VIRTUAL_ENV" ]; then - echo "geckodriver can't be installed because VIRTUAL_ENV is not set, you should download it from\n $GECKODRIVER_URL" - exit - else - GECKODRIVER_DIR="$VIRTUAL_ENV/bin" - fi + if [ -z "$VIRTUAL_ENV" ]; then + echo "geckodriver can't be installed because VIRTUAL_ENV is not set, you should download it from\n $GECKODRIVER_URL" + exit + else + GECKODRIVER_DIR="$VIRTUAL_ENV/bin" + fi else - GECKODRIVER_DIR="$1" - mkdir -p -- "$GECKODRIVER_DIR" + GECKODRIVER_DIR="$1" + mkdir -p -- "$GECKODRIVER_DIR" fi echo "Installing $GECKODRIVER_DIR/geckodriver from\n $GECKODRIVER_URL" - + FILE="`mktemp`" wget -qO "$FILE" -- "$GECKODRIVER_URL" && tar xz -C "$GECKODRIVER_DIR" -f "$FILE" geckodriver rm -- "$FILE" @@ -116,7 +116,7 @@ npm_packages() { cd -- "$BASE_DIR/searx/static/themes/oscar" npm install - echo '[!] install NPM packages for simple theme' + echo '[!] install NPM packages for simple theme' cd -- "$BASE_DIR/searx/static/themes/simple" npm install } @@ -124,7 +124,7 @@ npm_packages() { grunt_build() { echo '[!] Grunt build : oscar theme' grunt --gruntfile "$SEARX_DIR/static/themes/oscar/gruntfile.js" - echo '[!] Grunt build : simple theme' + echo '[!] Grunt build : simple theme' grunt --gruntfile "$SEARX_DIR/static/themes/simple/gruntfile.js" } From 47ee15f5cee81ac1c68c07592349caecd2bf137a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Fri, 6 Oct 2017 21:50:59 +0200 Subject: [PATCH 33/39] preferences: make supported/not supported labels Also, Time range support display was missing from RTL locales. Now it is fixed. Closes #558 --- .../static/themes/oscar/css/logicodev.min.css | 9 +----- searx/static/themes/oscar/css/pointhi.min.css | 2 +- searx/static/themes/oscar/js/searx.min.js | 2 +- .../themes/oscar/less/logicodev/oscar.less | 2 ++ .../oscar/less/logicodev/preferences.less | 3 ++ .../themes/oscar/less/pointhi/oscar.less | 2 ++ .../oscar/less/pointhi/preferences.less | 3 ++ searx/templates/oscar/macros.html | 12 +++++++ searx/templates/oscar/preferences.html | 31 ++++++++++--------- 9 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 searx/static/themes/oscar/less/logicodev/preferences.less create mode 100644 searx/static/themes/oscar/less/pointhi/preferences.less diff --git a/searx/static/themes/oscar/css/logicodev.min.css b/searx/static/themes/oscar/css/logicodev.min.css index 78dfc4483..2f679b971 100644 --- a/searx/static/themes/oscar/css/logicodev.min.css +++ b/searx/static/themes/oscar/css/logicodev.min.css @@ -1,8 +1 @@ -.searx-navbar{background:#29314D;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:bold;margin-bottom:.8rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;color:white;text-decoration:none}.searx-navbar .instance a{color:#01D7D4;margin-left:2rem}#main-logo{margin-top:20vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}*{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:white}body a{color:#0088CC}.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 #FFFFFF !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:#EEEEEE}.onoffswitch-switch{display:block;width:37px;background-color:#01D7D4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFFFFF !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:0;margin-bottom:2px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314D;text-decoration:none}.result_header a:hover{color:#0088CC}.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:bold}.external-link{color:#069025;font-size:12px}.external-link 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;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#A4A4A4;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}.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:white;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:normal;background-color:white;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:bold;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:white}.custom-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:normal;background-color:white;border:#DDD 1px solid;color:#666;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN -AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ -cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn -sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8 -6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0 -ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w -Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb -7jwaAAAAAElFTkSuQmCC) 96% no-repeat}.search-margin{margin-bottom:.6em}#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:normal;background-color:white;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:bold;border-bottom:#01D7D4 5px solid}#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:#ffffcc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #FFA92F}.highlight .k{color:#BE74D5;font-weight:bold}.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:#FF0000}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00A000}.highlight .go{color:#888888}.highlight .gp{color:#000080;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#0044DD}.highlight .kc{color:#BE74D5;font-weight:bold}.highlight .kd{color:#BE74D5;font-weight:bold}.highlight .kn{color:#BE74D5;font-weight:bold}.highlight .kp{color:#BE74D5}.highlight .kr{color:#BE74D5;font-weight:bold}.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:bold}.highlight .no{color:#D19A66}.highlight .nd{color:#AA22FF}.highlight .ni{color:#999999;font-weight:bold}.highlight .ne{color:#D2413A;font-weight:bold}.highlight .nf{color:#61AFEF}.highlight .nl{color:#A0A000}.highlight .nn{color:#61AFEF;font-weight:bold}.highlight .nt{color:#BE74D5;font-weight:bold}.highlight .nv{color:#DFC06F}.highlight .ow{color:#AA22FF;font-weight:bold}.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:#BB6622;font-weight:bold}.highlight .sh{color:#86C372}.highlight .si{color:#BB6688;font-weight:bold}.highlight .sx{color:#BE74D5}.highlight .sr{color:#BB6688}.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:transparent}.highlight .lineno::-moz-selection{background:transparent}.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 +.searx-navbar{background:#29314d;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:700;margin-bottom:.8rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;color:#fff;text-decoration:none}.searx-navbar .instance a{color:#01d7d4;margin-left:2rem}#main-logo{margin-top:20vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}*{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:0;margin-bottom:2px;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{color:#069025;font-size:12px}.external-link 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;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.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}.custom-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;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}.search-margin{margin-bottom:.6em}#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}#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}.table>tbody>tr>td,.table>tbody>tr>th{vertical-align:middle!important} \ 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 0f1e51845..53c472de5 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 #FFFFFF !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:#EEEEEE}.onoffswitch-switch{display:block;width:37px;background-color:#00CC00;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFFFFF !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:bold}.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:bold}.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;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.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,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}.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:normal;background-color:white;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:black;font-weight:bold;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:normal;background-color:white;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:black;font-weight:bold;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:#ffffcc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid #FF0000}.highlight .k{color:#008000;font-weight:bold}.highlight .o{color:#666666}.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:#FF0000}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00A000}.highlight .go{color:#888888}.highlight .gp{color:#000080;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#0044DD}.highlight .kc{color:#008000;font-weight:bold}.highlight .kd{color:#008000;font-weight:bold}.highlight .kn{color:#008000;font-weight:bold}.highlight .kp{color:#008000}.highlight .kr{color:#008000;font-weight:bold}.highlight .kt{color:#B00040}.highlight .m{color:#666666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:#008000}.highlight .nc{color:#0000FF;font-weight:bold}.highlight .no{color:#880000}.highlight .nd{color:#AA22FF}.highlight .ni{color:#999999;font-weight:bold}.highlight .ne{color:#D2413A;font-weight:bold}.highlight .nf{color:#0000FF}.highlight .nl{color:#A0A000}.highlight .nn{color:#0000FF;font-weight:bold}.highlight .nt{color:#008000;font-weight:bold}.highlight .nv{color:#19177C}.highlight .ow{color:#AA22FF;font-weight:bold}.highlight .w{color:#bbbbbb}.highlight .mf{color:#666666}.highlight .mh{color:#666666}.highlight .mi{color:#666666}.highlight .mo{color:#666666}.highlight .sb{color:#BA2121}.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121;font-style:italic}.highlight .s2{color:#BA2121}.highlight .se{color:#BB6622;font-weight:bold}.highlight .sh{color:#BA2121}.highlight .si{color:#BB6688;font-weight:bold}.highlight .sx{color:#008000}.highlight .sr{color:#BB6688}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:#008000}.highlight .vc{color:#19177C}.highlight .vg{color:#19177C}.highlight .vi{color:#19177C}.highlight .il{color:#666666}.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:transparent}.highlight .lineno::-moz-selection{background:transparent}.searx-navbar{background:#eee;color:#aaa;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:bold;margin-bottom:1.3rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;text-decoration:none}.searx-navbar .instance a{color:#444;margin-left:2rem} \ 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;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.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}.searx-navbar{background:#eee;color:#aaa;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:700;margin-bottom:1.3rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;text-decoration:none}.searx-navbar .instance a{color:#444;margin-left:2rem}.table>tbody>tr>td,.table>tbody>tr>th{vertical-align:middle!important} \ No newline at end of file diff --git a/searx/static/themes/oscar/js/searx.min.js b/searx/static/themes/oscar/js/searx.min.js index 9bc4aae87..d714149f6 100644 --- a/searx/static/themes/oscar/js/searx.min.js +++ b/searx/static/themes/oscar/js/searx.min.js @@ -1,2 +1,2 @@ -/*! oscar/searx.min.js | 25-07-2016 | https://github.com/asciimoo/searx */ +/*! oscar/searx.min.js | 06-10-2017 | https://github.com/asciimoo/searx */ requirejs.config({baseUrl:"./static/themes/oscar/js",paths:{app:"../app"}}),searx.autocompleter&&(searx.searchResults=new Bloodhound({datumTokenizer:Bloodhound.tokenizers.obj.whitespace("value"),queryTokenizer:Bloodhound.tokenizers.whitespace,remote:"./autocompleter?q=%QUERY"}),searx.searchResults.initialize()),$(document).ready(function(){searx.autocompleter&&$("#q").typeahead(null,{name:"search-results",displayKey:function(a){return a},source:searx.searchResults.ttAdapter()})}),$(document).ready(function(){$("#q.autofocus").focus(),$(".select-all-on-click").click(function(){$(this).select()}),$(".btn-collapse").click(function(){var a=$(this).data("btn-text-collapsed"),b=$(this).data("btn-text-not-collapsed");""!==a&&""!==b&&($(this).hasClass("collapsed")?new_html=$(this).html().replace(a,b):new_html=$(this).html().replace(b,a),$(this).html(new_html))}),$(".btn-toggle .btn").click(function(){var a="btn-"+$(this).data("btn-class"),b=$(this).data("btn-label-default"),c=$(this).data("btn-label-toggled");""!==c&&($(this).hasClass("btn-default")?new_html=$(this).html().replace(b,c):new_html=$(this).html().replace(c,b),$(this).html(new_html)),$(this).toggleClass(a),$(this).toggleClass("btn-default")}),$(".media-loader").click(function(){var a=$(this).data("target"),b=$(a+" > iframe"),c=b.attr("src");void 0!==c&&c!==!1||b.attr("src",b.data("src"))}),$(".btn-sm").dblclick(function(){var a="btn-"+$(this).data("btn-class");$(this).hasClass("btn-default")?($(".btn-sm > input").attr("checked","checked"),$(".btn-sm > input").prop("checked",!0),$(".btn-sm").addClass(a),$(".btn-sm").addClass("active"),$(".btn-sm").removeClass("btn-default")):($(".btn-sm > input").attr("checked",""),$(".btn-sm > input").removeAttr("checked"),$(".btn-sm > input").checked=!1,$(".btn-sm").removeClass(a),$(".btn-sm").removeClass("active"),$(".btn-sm").addClass("btn-default"))})}),$(document).ready(function(){$(".searx_overpass_request").on("click",function(a){var b="https://overpass-api.de/api/interpreter?data=",c=b+"[out:json][timeout:25];(",d=");out meta;",e=$(this).data("osm-id"),f=$(this).data("osm-type"),g=$(this).data("result-table"),h="#"+$(this).data("result-table-loadicon"),i=["addr:city","addr:country","addr:housenumber","addr:postcode","addr:street"];if(e&&f&&g){g="#"+g;var j=null;switch(f){case"node":j=c+"node("+e+");"+d;break;case"way":j=c+"way("+e+");"+d;break;case"relation":j=c+"relation("+e+");"+d}if(j){$.ajax(j).done(function(a){if(a&&a.elements&&a.elements[0]){var b=a.elements[0],c=$(g).html();for(var d in b.tags)if(null===b.tags.name||i.indexOf(d)==-1){switch(c+=""+d+"",d){case"phone":case"fax":c+=''+b.tags[d]+"";break;case"email":c+=''+b.tags[d]+"";break;case"website":case"url":c+=''+b.tags[d]+"";break;case"wikidata":c+=''+b.tags[d]+"";break;case"wikipedia":if(b.tags[d].indexOf(":")!=-1){c+=''+b.tags[d]+"";break}default:c+=b.tags[d]}c+=""}$(g).html(c),$(g).removeClass("hidden"),$(h).addClass("hidden")}}).fail(function(){$(h).html($(h).html()+'

could not load data!

')})}}$(this).off(a)}),$(".searx_init_map").on("click",function(a){var b=$(this).data("leaflet-target"),c=$(this).data("map-lon"),d=$(this).data("map-lat"),e=$(this).data("map-zoom"),f=$(this).data("map-boundingbox"),g=$(this).data("map-geojson");require(["leaflet-0.7.3.min"],function(a){f&&(southWest=L.latLng(f[0],f[2]),northEast=L.latLng(f[1],f[3]),map_bounds=L.latLngBounds(southWest,northEast)),L.Icon.Default.imagePath="./static/themes/oscar/img/map";var h=L.map(b),i="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",j='Map data © OpenStreetMap contributors',k=new L.TileLayer(i,{minZoom:1,maxZoom:19,attribution:j}),l="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",m='Wikimedia maps beta | Maps data © OpenStreetMap contributors';new L.TileLayer(l,{minZoom:1,maxZoom:19,attribution:m});map_bounds?setTimeout(function(){h.fitBounds(map_bounds,{maxZoom:17})},0):c&&d&&(e?h.setView(new L.LatLng(d,c),e):h.setView(new L.LatLng(d,c),8)),h.addLayer(k);var n={"OSM Mapnik":k};L.control.layers(n).addTo(h),g&&L.geoJson(g).addTo(h)}),$(this).off(a)})}); \ No newline at end of file diff --git a/searx/static/themes/oscar/less/logicodev/oscar.less b/searx/static/themes/oscar/less/logicodev/oscar.less index 55181cb9c..da80d1e94 100644 --- a/searx/static/themes/oscar/less/logicodev/oscar.less +++ b/searx/static/themes/oscar/less/logicodev/oscar.less @@ -19,3 +19,5 @@ @import "cursor.less"; @import "code.less"; + +@import "preferences.less"; diff --git a/searx/static/themes/oscar/less/logicodev/preferences.less b/searx/static/themes/oscar/less/logicodev/preferences.less new file mode 100644 index 000000000..9672d5011 --- /dev/null +++ b/searx/static/themes/oscar/less/logicodev/preferences.less @@ -0,0 +1,3 @@ +.table > tbody > tr > td, .table > tbody > tr > th { + vertical-align: middle !important; +} diff --git a/searx/static/themes/oscar/less/pointhi/oscar.less b/searx/static/themes/oscar/less/pointhi/oscar.less index 4e2fee129..fc1c525ff 100644 --- a/searx/static/themes/oscar/less/pointhi/oscar.less +++ b/searx/static/themes/oscar/less/pointhi/oscar.less @@ -17,3 +17,5 @@ @import "code.less"; @import "navbar.less"; + +@import "preferences.less"; diff --git a/searx/static/themes/oscar/less/pointhi/preferences.less b/searx/static/themes/oscar/less/pointhi/preferences.less new file mode 100644 index 000000000..9672d5011 --- /dev/null +++ b/searx/static/themes/oscar/less/pointhi/preferences.less @@ -0,0 +1,3 @@ +.table > tbody > tr > td, .table > tbody > tr > th { + vertical-align: middle !important; +} diff --git a/searx/templates/oscar/macros.html b/searx/templates/oscar/macros.html index c35a19158..6235bcc62 100644 --- a/searx/templates/oscar/macros.html +++ b/searx/templates/oscar/macros.html @@ -85,3 +85,15 @@
{%- endmacro %} + +{% macro support_toggle(supports) -%} + {% if supports %} + + {{ _("supported") }} + + {% else %} + + {{ _("not supported") }} + + {% endif %} +{%- endmacro %} diff --git a/searx/templates/oscar/preferences.html b/searx/templates/oscar/preferences.html index afb389e44..64706b06b 100644 --- a/searx/templates/oscar/preferences.html +++ b/searx/templates/oscar/preferences.html @@ -1,7 +1,8 @@ -{% from 'oscar/macros.html' import preferences_item_header, preferences_item_header_rtl, preferences_item_footer, preferences_item_footer_rtl, checkbox_toggle %} +{% from 'oscar/macros.html' import preferences_item_header, preferences_item_header_rtl, preferences_item_footer, preferences_item_footer_rtl, checkbox_toggle, support_toggle %} {% extends "oscar/base.html" %} {% block title %}{{ _('preferences') }} - {% endblock %} {% block content %} +

{{ _('Preferences') }}

@@ -148,7 +149,7 @@ {{ _("Allow") }} {{ _("Engine name") }} {{ _("Shortcut") }} - {{ _("Supports selected language") }} + {{ _("Selected language") }} {{ _("SafeSearch") }} {{ _("Time range") }} {{ _("Avg. time") }} @@ -156,8 +157,9 @@ {% else %} {{ _("Max time") }} {{ _("Avg. time") }} + {{ _("Time range") }} {{ _("SafeSearch") }} - {{ _("Supports selected language") }} + {{ _("Selected language") }} {{ _("Shortcut") }} {{ _("Engine name") }} {{ _("Allow") }} @@ -172,17 +174,18 @@ {{ search_engine.name }} {{ shortcuts[search_engine.name] }} - - - - {{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }} - {{ search_engine.timeout }} - {% else %} - {{ search_engine.timeout }} - {{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }} - - - {{ shortcuts[search_engine.name] }} + {{ support_toggle(current_language == 'all' or current_language in search_engine.supported_languages or current_language.split('-')[0] in search_engine.supported_languages) }} + {{ support_toggle(search_engine.safesearch==True) }} + {{ support_toggle(search_engine.time_range_support==True) }} + {{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }} + {{ search_engine.timeout }} + {% else %} + {{ search_engine.timeout }} + {{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }} + {{ support_toggle(search_engine.time_range_support==True) }} + {{ support_toggle(search_engine.safesearch==True) }} + {{ support_toggle(current_language == 'all' or current_language in search_engine.supported_languages or current_language.split('-')[0] in search_engine.supported_languages) }} + {{ shortcuts[search_engine.name] }} {{ search_engine.name }} {{ checkbox_toggle('engine_' + search_engine.name|replace(' ', '_') + '__' + categ|replace(' ', '_'), (search_engine.name, categ) in disabled_engines) }} From a524dbb823e88482a762d56ac1ed352641f3f0c3 Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 10 Oct 2017 16:49:49 -0500 Subject: [PATCH 34/39] [fix] language support for bing images and videos --- searx/engines/bing_images.py | 56 +++++++++++++++++++++----- searx/engines/bing_videos.py | 5 ++- tests/unit/engines/test_bing_images.py | 12 ++++-- tests/unit/engines/test_bing_videos.py | 2 + 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/searx/engines/bing_images.py b/searx/engines/bing_images.py index 6300c94e4..15679056c 100644 --- a/searx/engines/bing_images.py +++ b/searx/engines/bing_images.py @@ -18,7 +18,6 @@ from lxml import html from json import loads import re -from searx.engines.bing import _fetch_supported_languages, supported_languages_url from searx.url_utils import urlencode # engine dependent config @@ -26,6 +25,8 @@ categories = ['images'] paging = True safesearch = True time_range_support = True +language_support = True +supported_languages_url = 'https://www.bing.com/account/general' # search-url base_url = 'https://www.bing.com/' @@ -45,23 +46,41 @@ safesearch_types = {2: 'STRICT', _quote_keys_regex = re.compile('({|,)([a-z][a-z0-9]*):(")', re.I | re.U) +# get supported region code +def get_region_code(lang, lang_list=None): + region = None + if lang in (lang_list or supported_languages): + region = lang + elif lang.startswith('no'): + region = 'nb-NO' + else: + # try to get a supported country code with language + lang = lang.split('-')[0] + for lc in (lang_list or supported_languages): + if lang == lc.split('-')[0]: + region = lc + break + if region: + return region.lower() + else: + return 'en-us' + + # do search-request def request(query, params): offset = (params['pageno'] - 1) * 10 + 1 - # required for cookie - if params['language'] == 'all': - language = 'en-US' - else: - language = params['language'] - search_path = search_string.format( query=urlencode({'q': query}), offset=offset) + language = get_region_code(params['language']) + params['cookies']['SRCHHPGUSR'] = \ - 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0] +\ - '&ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') + 'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') + + params['cookies']['_EDGE_S'] = 'mkt=' + language +\ + '&ui=' + language + '&F=1' params['url'] = base_url + search_path if params['time_range'] in time_range_dict: @@ -106,3 +125,22 @@ def response(resp): # return results return results + + +# get supported languages from their site +def _fetch_supported_languages(resp): + supported_languages = [] + dom = html.fromstring(resp.text) + + regions_xpath = '//div[@id="region-section-content"]' \ + + '//ul[@class="b_vList"]/li/a/@href' + + regions = dom.xpath(regions_xpath) + for region in regions: + code = re.search('setmkt=[^\&]+', region).group()[7:] + if code == 'nb-NO': + code = 'no-NO' + + supported_languages.append(code) + + return supported_languages diff --git a/searx/engines/bing_videos.py b/searx/engines/bing_videos.py index 918064c9b..bd91bce37 100644 --- a/searx/engines/bing_videos.py +++ b/searx/engines/bing_videos.py @@ -12,6 +12,7 @@ from json import loads from lxml import html +from searx.engines.bing_images import _fetch_supported_languages, supported_languages_url, get_region_code from searx.engines.xpath import extract_text from searx.url_utils import urlencode @@ -21,6 +22,7 @@ paging = True safesearch = True time_range_support = True number_of_results = 10 +language_support = True search_url = 'https://www.bing.com/videos/asyncv2?{query}&async=content&'\ 'first={offset}&count={number_of_results}&CW=1366&CH=25&FORM=R5VR5' @@ -45,7 +47,8 @@ def request(query, params): 'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') # language cookie - params['cookies']['_EDGE_S'] = 'mkt=' + params['language'].lower() + '&F=1' + region = get_region_code(params['language'], lang_list=supported_languages) + params['cookies']['_EDGE_S'] = 'mkt=' + region + '&F=1' # query and paging params['url'] = search_url.format(query=urlencode({'q': query}), diff --git a/tests/unit/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py index 287f13499..8b0bdb39d 100644 --- a/tests/unit/engines/test_bing_images.py +++ b/tests/unit/engines/test_bing_images.py @@ -8,10 +8,12 @@ from searx.testing import SearxTestCase class TestBingImagesEngine(SearxTestCase): def test_request(self): + bing_images.supported_languages = ['fr-FR', 'en-US'] + query = 'test_query' dicto = defaultdict(dict) dicto['pageno'] = 1 - dicto['language'] = 'fr_FR' + dicto['language'] = 'fr-FR' dicto['safesearch'] = 1 dicto['time_range'] = '' params = bing_images.request(query, dicto) @@ -19,12 +21,14 @@ class TestBingImagesEngine(SearxTestCase): self.assertTrue(query in params['url']) self.assertTrue('bing.com' in params['url']) self.assertTrue('SRCHHPGUSR' in params['cookies']) - self.assertTrue('fr' in params['cookies']['SRCHHPGUSR']) + self.assertTrue('DEMOTE' in params['cookies']['SRCHHPGUSR']) + self.assertTrue('_EDGE_S' in params['cookies']) + self.assertTrue('fr-fr' in params['cookies']['_EDGE_S']) dicto['language'] = 'all' params = bing_images.request(query, dicto) - self.assertIn('SRCHHPGUSR', params['cookies']) - self.assertIn('en', params['cookies']['SRCHHPGUSR']) + self.assertTrue('_EDGE_S' in params['cookies']) + self.assertTrue('en' in params['cookies']['_EDGE_S']) def test_response(self): self.assertRaises(AttributeError, bing_images.response, None) diff --git a/tests/unit/engines/test_bing_videos.py b/tests/unit/engines/test_bing_videos.py index 011b5410a..118754b25 100644 --- a/tests/unit/engines/test_bing_videos.py +++ b/tests/unit/engines/test_bing_videos.py @@ -8,6 +8,8 @@ from searx.testing import SearxTestCase class TestBingVideosEngine(SearxTestCase): def test_request(self): + bing_videos.supported_languages = ['fr-FR', 'en-US'] + query = 'test_query' dicto = defaultdict(dict) dicto['pageno'] = 1 From 44085e31d0ccf140f307389bd42654f5ada8667f Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 10 Oct 2017 16:52:41 -0500 Subject: [PATCH 35/39] update engines_languages.json and languages.py Also, fix fetch_languages.py so it can run on python3. --- searx/data/engines_languages.json | 2 +- searx/engines/duckduckgo.py | 2 +- searx/engines/swisscows.py | 2 +- searx/languages.py | 18 ++++++++---------- tests/unit/engines/test_swisscows.py | 6 +++--- utils/fetch_languages.py | 16 ++++++++-------- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/searx/data/engines_languages.json b/searx/data/engines_languages.json index c0c3ef814..8b34c46d5 100644 --- a/searx/data/engines_languages.json +++ b/searx/data/engines_languages.json @@ -1 +1 @@ -{"duckduckgo images": ["da-DK", "vi-VN", "en-SG", "sl-SL", "en-XA", "tzh-HK", "en-UK", "ro-RO", "en-MY", "el-GR", "it-CH", "hu-HU", "fr-FR", "en-PH", "tl-PH", "fr-CA", "fi-FI", "et-EE", "sv-SE", "es-XL", "th-TH", "sk-SK", "es-ES", "en-IE", "es-US", "es-PE", "nl-NL", "en-US", "de-DE", "de-AT", "wt-WT", "no-NO", "tr-TR", "ca-ES", "it-IT", "es-CO", "ru-RU", "ca-CT", "en-ZA", "en-CA", "jp-JP", "es-MX", "id-ID", "es-AR", "he-IL", "kr-KR", "en-AU", "ms-MY", "pl-PL", "lv-LV", "bg-BG", "zh-CN", "en-NZ", "lt-LT", "tzh-TW", "hr-HR", "pt-PT", "fr-BE", "de-CH", "cs-CZ", "en-IN", "nl-BE", "fr-CH", "en-ID", "ar-XA", "pt-BR", "uk-UA", "es-CL"], "bing news": ["sq", "de", "ar", "bg", "ca", "cs", "zh-CHS", "zh-CHT", "ko", "hr", "da", "sk", "sl", "es", "et", "fi", "fr", "el", "he", "nl", "hu", "id", "en", "is", "it", "ja", "lv", "lt", "ms", "no", "fa", "pl", "pt-BR", "pt-PT", "ro", "ru", "sr", "sv", "th", "tr", "uk", "vi"], "google": {"el": {"name": "Ελληνικά"}, "eo": {"name": "Esperanto"}, "en": {"name": "English"}, "af": {"name": "Afrikaans"}, "vi": {"name": "Tiếng Việt"}, "ca": {"name": "Català"}, "it": {"name": "Italiano"}, "iw": {"name": "עברית"}, "hy": {"name": "Հայերեն"}, "cs": {"name": "Čeština"}, "et": {"name": "Eesti"}, "id": {"name": "Indonesia"}, "es": {"name": "Español"}, "ru": {"name": "Русский"}, "nl": {"name": "Nederlands"}, "pt": {"name": "Português"}, "no": {"name": "Norsk"}, "tr": {"name": "Türkçe"}, "lt": {"name": "Lietuvių"}, "lv": {"name": "Latviešu"}, "tl": {"name": "Filipino"}, "zh-TW": {"name": "中文 (繁體)"}, "th": {"name": "ไทย"}, "ro": {"name": "Română"}, "is": {"name": "Íslenska"}, "pl": {"name": "Polski"}, "be": {"name": "Беларуская"}, "fr": {"name": "Français"}, "bg": {"name": "Български"}, "hr": {"name": "Hrvatski"}, "de": {"name": "Deutsch"}, "ko": {"name": "한국어"}, "da": {"name": "Dansk"}, "fa": {"name": "فارسی"}, "hi": {"name": "हिन्दी"}, "fi": {"name": "Suomi"}, "hu": {"name": "Magyar"}, "ja": {"name": "日本語"}, "sr": {"name": "Српски"}, "sw": {"name": "Kiswahili"}, "sv": {"name": "Svenska"}, "sk": {"name": "Slovenčina"}, "zh-CN": {"name": "中文 (简体)"}, "ar": {"name": "العربية"}, "uk": {"name": "Українська"}, "sl": {"name": "Slovenščina"}}, "duckduckgo": ["da-DK", "vi-VN", "en-SG", "sl-SL", "en-XA", "tzh-HK", "en-UK", "ro-RO", "en-MY", "el-GR", "it-CH", "hu-HU", "fr-FR", "en-PH", "tl-PH", "fr-CA", "fi-FI", "et-EE", "sv-SE", "es-XL", "th-TH", "sk-SK", "es-ES", "en-IE", "es-US", "es-PE", "nl-NL", "en-US", "de-DE", "de-AT", "wt-WT", "no-NO", "tr-TR", "ca-ES", "it-IT", "es-CO", "ru-RU", "ca-CT", "en-ZA", "en-CA", "jp-JP", "es-MX", "id-ID", "es-AR", "he-IL", "kr-KR", "en-AU", "ms-MY", "pl-PL", "lv-LV", "bg-BG", "zh-CN", "en-NZ", "lt-LT", "tzh-TW", "hr-HR", "pt-PT", "fr-BE", "de-CH", "cs-CZ", "en-IN", "nl-BE", "fr-CH", "en-ID", "ar-XA", "pt-BR", "uk-UA", "es-CL"], "google news": {"el": {"name": "Ελληνικά"}, "eo": {"name": "Esperanto"}, "en": {"name": "English"}, "af": {"name": "Afrikaans"}, "vi": {"name": "Tiếng Việt"}, "ca": {"name": "Català"}, "it": {"name": "Italiano"}, "iw": {"name": "עברית"}, "hy": {"name": "Հայերեն"}, "cs": {"name": "Čeština"}, "et": {"name": "Eesti"}, "id": {"name": "Indonesia"}, "es": {"name": "Español"}, "ru": {"name": "Русский"}, "nl": {"name": "Nederlands"}, "pt": {"name": "Português"}, "no": {"name": "Norsk"}, "tr": {"name": "Türkçe"}, "lt": {"name": "Lietuvių"}, "lv": {"name": "Latviešu"}, "tl": {"name": "Filipino"}, "zh-TW": {"name": "中文 (繁體)"}, "th": {"name": "ไทย"}, "ro": {"name": "Română"}, "is": {"name": "Íslenska"}, "pl": {"name": "Polski"}, "be": {"name": "Беларуская"}, "fr": {"name": "Français"}, "bg": {"name": "Български"}, "hr": {"name": "Hrvatski"}, "de": {"name": "Deutsch"}, "ko": {"name": "한국어"}, "da": {"name": "Dansk"}, "fa": {"name": "فارسی"}, "hi": {"name": "हिन्दी"}, "fi": {"name": "Suomi"}, "hu": {"name": "Magyar"}, "ja": {"name": "日本語"}, "sr": {"name": "Српски"}, "sw": {"name": "Kiswahili"}, "sv": {"name": "Svenska"}, "sk": {"name": "Slovenčina"}, "zh-CN": {"name": "中文 (简体)"}, "ar": {"name": "العربية"}, "uk": {"name": "Українська"}, "sl": {"name": "Slovenščina"}}, "bing": ["sq", "de", "ar", "bg", "ca", "cs", "zh-CHS", "zh-CHT", "ko", "hr", "da", "sk", "sl", "es", "et", "fi", "fr", "el", "he", "nl", "hu", "id", "en", "is", "it", "ja", "lv", "lt", "ms", "no", "fa", "pl", "pt-BR", "pt-PT", "ro", "ru", "sr", "sv", "th", "tr", "uk", "vi"], "wikipedia": {"gv": {"articles": 4960, "name": "Gaelg", "english_name": "Manx"}, "sco": {"articles": 45568, "name": "Scots", "english_name": "Scots"}, "scn": {"articles": 25391, "name": "Sicilianu", "english_name": "Sicilian"}, "wuu": {"articles": 5942, "name": "吴语", "english_name": "Wu"}, "tcy": {"articles": 784, "name": "ತುಳು", "english_name": "Tulu"}, "cdo": {"articles": 12982, "name": "Mìng-dĕ̤ng-ngṳ̄", "english_name": "Min Dong"}, "gu": {"articles": 27219, "name": "ગુજરાતી", "english_name": "Gujarati"}, "kbd": {"articles": 1579, "name": "Адыгэбзэ (Adighabze)", "english_name": "Kabardian Circassian"}, "gd": {"articles": 14477, "name": "Gàidhlig", "english_name": "Scottish Gaelic"}, "jbo": {"articles": 1198, "name": "Lojban", "english_name": "Lojban"}, "ga": {"articles": 41082, "name": "Gaeilge", "english_name": "Irish"}, "gn": {"articles": 3184, "name": "Avañe'ẽ", "english_name": "Guarani"}, "kbp": {"articles": 233, "name": "Kabɩyɛ", "english_name": "Kabɩyɛ"}, "gl": {"articles": 139974, "name": "Galego", "english_name": "Galician"}, "als": {"articles": 23056, "name": "Alemannisch", "english_name": "Alemannic"}, "lg": {"articles": 1142, "name": "Luganda", "english_name": "Luganda"}, "hak": {"articles": 7481, "name": "Hak-kâ-fa / 客家話", "english_name": "Hakka"}, "lb": {"articles": 49627, "name": "Lëtzebuergesch", "english_name": "Luxembourgish"}, "szl": {"articles": 5890, "name": "Ślůnski", "english_name": "Silesian"}, "vep": {"articles": 5554, "name": "Vepsän", "english_name": "Vepsian"}, "la": {"articles": 126877, "name": "Latina", "english_name": "Latin"}, "ln": {"articles": 2911, "name": "Lingala", "english_name": "Lingala"}, "lo": {"articles": 2716, "name": "ລາວ", "english_name": "Lao"}, "tt": {"articles": 71613, "name": "Tatarça / Татарча", "english_name": "Tatar"}, "tr": {"articles": 294438, "name": "Türkçe", "english_name": "Turkish"}, "cbk-zam": {"articles": 2985, "name": "Chavacano de Zamboanga", "english_name": "Zamboanga Chavacano"}, "li": {"articles": 11872, "name": "Limburgs", "english_name": "Limburgish"}, "lv": {"articles": 77804, "name": "Latviešu", "english_name": "Latvian"}, "to": {"articles": 1689, "name": "faka Tonga", "english_name": "Tongan"}, "tl": {"articles": 72202, "name": "Tagalog", "english_name": "Tagalog"}, "jam": {"articles": 1603, "name": "Jumiekan Kryuol", "english_name": "Jamaican Patois"}, "vec": {"articles": 10936, "name": "Vèneto", "english_name": "Venetian"}, "th": {"articles": 117834, "name": "ไทย", "english_name": "Thai"}, "ti": {"articles": 178, "name": "ትግርኛ", "english_name": "Tigrinya"}, "tg": {"articles": 68201, "name": "Тоҷикӣ", "english_name": "Tajik"}, "te": {"articles": 67172, "name": "తెలుగు", "english_name": "Telugu"}, "ksh": {"articles": 2838, "name": "Ripoarisch", "english_name": "Ripuarian"}, "pcd": {"articles": 3487, "name": "Picard", "english_name": "Picard"}, "ta": {"articles": 105913, "name": "தமிழ்", "english_name": "Tamil"}, "yi": {"articles": 13965, "name": "ייִדיש", "english_name": "Yiddish"}, "lrc": {"articles": 5311, "name": "لۊری شومالی", "english_name": "Northern Luri"}, "xmf": {"articles": 10156, "name": "მარგალური (Margaluri)", "english_name": "Mingrelian"}, "ceb": {"articles": 4852036, "name": "Sinugboanong Binisaya", "english_name": "Cebuano"}, "yo": {"articles": 31573, "name": "Yorùbá", "english_name": "Yoruba"}, "de": {"articles": 2076891, "name": "Deutsch", "english_name": "German"}, "da": {"articles": 227211, "name": "Dansk", "english_name": "Danish"}, "za": {"articles": 1166, "name": "Cuengh", "english_name": "Zhuang"}, "pdc": {"articles": 1793, "name": "Deitsch", "english_name": "Pennsylvania German"}, "bxr": {"articles": 1963, "name": "Буряад", "english_name": "Buryat"}, "dz": {"articles": 220, "name": "ཇོང་ཁ", "english_name": "Dzongkha"}, "hif": {"articles": 9669, "name": "Fiji Hindi", "english_name": "Fiji Hindi"}, "rm": {"articles": 3441, "name": "Rumantsch", "english_name": "Romansh"}, "dv": {"articles": 2971, "name": "ދިވެހިބަސް", "english_name": "Divehi"}, "qu": {"articles": 20181, "name": "Runa Simi", "english_name": "Quechua"}, "vls": {"articles": 6144, "name": "West-Vlams", "english_name": "West Flemish"}, "bar": {"articles": 22735, "name": "Boarisch", "english_name": "Bavarian"}, "pnt": {"articles": 449, "name": "Ποντιακά", "english_name": "Pontic"}, "eml": {"articles": 8873, "name": "Emiliàn e rumagnòl", "english_name": "Emilian-Romagnol"}, "kn": {"articles": 22010, "name": "ಕನ್ನಡ", "english_name": "Kannada"}, "fiu-vro": {"articles": 5466, "name": "Võro", "english_name": "Võro"}, "mo": {"articles": 394, "name": "Молдовеняскэ", "english_name": "Moldovan"}, "bpy": {"articles": 25070, "name": "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী", "english_name": "Bishnupriya Manipuri"}, "crh": {"articles": 5287, "name": "Qırımtatarca", "english_name": "Crimean Tatar"}, "mhr": {"articles": 9618, "name": "Олык Марий (Olyk Marij)", "english_name": "Meadow Mari"}, "diq": {"articles": 8505, "name": "Zazaki", "english_name": "Zazaki"}, "el": {"articles": 132709, "name": "Ελληνικά", "english_name": "Greek"}, "eo": {"articles": 240289, "name": "Esperanto", "english_name": "Esperanto"}, "en": {"articles": 5435374, "name": "English", "english_name": "English"}, "zh": {"articles": 949200, "name": "中文", "english_name": "Chinese"}, "pms": {"articles": 64144, "name": "Piemontèis", "english_name": "Piedmontese"}, "ee": {"articles": 338, "name": "Eʋegbe", "english_name": "Ewe"}, "tpi": {"articles": 1357, "name": "Tok Pisin", "english_name": "Tok Pisin"}, "arz": {"articles": 16800, "name": "مصرى (Maṣri)", "english_name": "Egyptian Arabic"}, "rmy": {"articles": 596, "name": "romani - रोमानी", "english_name": "Romani"}, "mdf": {"articles": 1170, "name": "Мокшень (Mokshanj Kälj)", "english_name": "Moksha"}, "kaa": {"articles": 1888, "name": "Qaraqalpaqsha", "english_name": "Karakalpak"}, "olo": {"articles": 2225, "name": "Karjalan", "english_name": "Livvi-Karelian"}, "arc": {"articles": 1620, "name": "ܐܪܡܝܐ", "english_name": "Aramaic"}, "cr": {"articles": 127, "name": "Nehiyaw", "english_name": "Cree"}, "eu": {"articles": 281566, "name": "Euskara", "english_name": "Basque"}, "et": {"articles": 158968, "name": "Eesti", "english_name": "Estonian"}, "tet": {"articles": 1392, "name": "Tetun", "english_name": "Tetum"}, "es": {"articles": 1342185, "name": "Español", "english_name": "Spanish"}, "ba": {"articles": 39300, "name": "Башҡорт", "english_name": "Bashkir"}, "gom": {"articles": 3363, "name": "गोंयची कोंकणी / Gõychi Konknni", "english_name": "Goan Konkani"}, "ru": {"articles": 1405027, "name": "Русский", "english_name": "Russian"}, "roa-tara": {"articles": 9231, "name": "Tarandíne", "english_name": "Tarantino"}, "ha": {"articles": 1433, "name": "هَوُسَ", "english_name": "Hausa"}, "ak": {"articles": 289, "name": "Akana", "english_name": "Akan"}, "lad": {"articles": 4518, "name": "Dzhudezmo", "english_name": "Ladino"}, "bm": {"articles": 428, "name": "Bamanankan", "english_name": "Bambara"}, "new": {"articles": 72132, "name": "नेपाल भाषा", "english_name": "Newar"}, "rn": {"articles": 498, "name": "Kirundi", "english_name": "Kirundi"}, "ro": {"articles": 377409, "name": "Română", "english_name": "Romanian"}, "dsb": {"articles": 3085, "name": "Dolnoserbski", "english_name": "Lower Sorbian"}, "bn": {"articles": 51178, "name": "বাংলা", "english_name": "Bengali"}, "hsb": {"articles": 11854, "name": "Hornjoserbsce", "english_name": "Upper Sorbian"}, "be": {"articles": 144452, "name": "Беларуская", "english_name": "Belarusian"}, "bg": {"articles": 231561, "name": "Български", "english_name": "Bulgarian"}, "myv": {"articles": 3810, "name": "Эрзянь (Erzjanj Kelj)", "english_name": "Erzya"}, "uk": {"articles": 704961, "name": "Українська", "english_name": "Ukrainian"}, "wa": {"articles": 14537, "name": "Walon", "english_name": "Walloon"}, "ast": {"articles": 49236, "name": "Asturianu", "english_name": "Asturian"}, "wo": {"articles": 1152, "name": "Wolof", "english_name": "Wolof"}, "got": {"articles": 499, "name": "𐌲𐌿𐍄𐌹𐍃𐌺", "english_name": "Gothic"}, "jv": {"articles": 50176, "name": "Basa Jawa", "english_name": "Javanese"}, "bo": {"articles": 5723, "name": "བོད་སྐད", "english_name": "Tibetan"}, "bh": {"articles": 9116, "name": "भोजपुरी", "english_name": "Bihari"}, "bi": {"articles": 1115, "name": "Bislama", "english_name": "Bislama"}, "rue": {"articles": 6071, "name": "Русиньскый", "english_name": "Rusyn"}, "map-bms": {"articles": 13285, "name": "Basa Banyumasan", "english_name": "Banyumasan"}, "tum": {"articles": 567, "name": "chiTumbuka", "english_name": "Tumbuka"}, "br": {"articles": 62422, "name": "Brezhoneg", "english_name": "Breton"}, "bs": {"articles": 74769, "name": "Bosanski", "english_name": "Bosnian"}, "lez": {"articles": 3810, "name": "Лезги чІал (Lezgi č’al)", "english_name": "Lezgian"}, "ja": {"articles": 1066670, "name": "日本語", "english_name": "Japanese"}, "om": {"articles": 724, "name": "Oromoo", "english_name": "Oromo"}, "glk": {"articles": 5696, "name": "گیلکی", "english_name": "Gilaki"}, "ace": {"articles": 4561, "name": "Bahsa Acèh", "english_name": "Acehnese"}, "ilo": {"articles": 10802, "name": "Ilokano", "english_name": "Ilokano"}, "roa-rup": {"articles": 1211, "name": "Armãneashce", "english_name": "Aromanian"}, "oc": {"articles": 83443, "name": "Occitan", "english_name": "Occitan"}, "ltg": {"articles": 801, "name": "Latgaļu", "english_name": "Latgalian"}, "be-tarask": {"articles": 61048, "name": "Беларуская (тарашкевіца)", "english_name": "Belarusian (Taraškievica)"}, "st": {"articles": 516, "name": "Sesotho", "english_name": "Sesotho"}, "tw": {"articles": 591, "name": "Twi", "english_name": "Twi"}, "krc": {"articles": 2017, "name": "Къарачай-Малкъар (Qarachay-Malqar)", "english_name": "Karachay-Balkar"}, "nds": {"articles": 26351, "name": "Plattdüütsch", "english_name": "Low Saxon"}, "os": {"articles": 10496, "name": "Иронау", "english_name": "Ossetian"}, "or": {"articles": 12744, "name": "ଓଡ଼ିଆ", "english_name": "Oriya"}, "udm": {"articles": 3959, "name": "Удмурт кыл", "english_name": "Udmurt"}, "xh": {"articles": 685, "name": "isiXhosa", "english_name": "Xhosa"}, "ch": {"articles": 423, "name": "Chamoru", "english_name": "Chamorro"}, "co": {"articles": 5441, "name": "Corsu", "english_name": "Corsican"}, "nso": {"articles": 7675, "name": "Sepedi", "english_name": "Northern Sotho"}, "simple": {"articles": 125998, "name": "Simple English", "english_name": "Simple English"}, "bjn": {"articles": 1723, "name": "Bahasa Banjar", "english_name": "Banjar"}, "ca": {"articles": 546671, "name": "Català", "english_name": "Catalan"}, "lmo": {"articles": 35508, "name": "Lumbaart", "english_name": "Lombard"}, "ce": {"articles": 164256, "name": "Нохчийн", "english_name": "Chechen"}, "ts": {"articles": 403, "name": "Xitsonga", "english_name": "Tsonga"}, "cy": {"articles": 91573, "name": "Cymraeg", "english_name": "Welsh"}, "ang": {"articles": 2925, "name": "Englisc", "english_name": "Anglo-Saxon"}, "cs": {"articles": 384508, "name": "Čeština", "english_name": "Czech"}, "ty": {"articles": 1189, "name": "Reo Mā`ohi", "english_name": "Tahitian"}, "ady": {"articles": 402, "name": "Адыгэбзэ", "english_name": "Adyghe"}, "cv": {"articles": 40393, "name": "Чăваш", "english_name": "Chuvash"}, "cu": {"articles": 584, "name": "Словѣньскъ", "english_name": "Old Church Slavonic"}, "ve": {"articles": 240, "name": "Tshivenda", "english_name": "Venda"}, "koi": {"articles": 3448, "name": "Перем Коми (Perem Komi)", "english_name": "Komi-Permyak"}, "ps": {"articles": 8090, "name": "پښتو", "english_name": "Pashto"}, "fj": {"articles": 394, "name": "Na Vosa Vakaviti", "english_name": "Fijian"}, "srn": {"articles": 1055, "name": "Sranantongo", "english_name": "Sranan"}, "pt": {"articles": 972627, "name": "Português", "english_name": "Portuguese"}, "sm": {"articles": 768, "name": "Gagana Samoa", "english_name": "Samoan"}, "ext": {"articles": 2910, "name": "Estremeñu", "english_name": "Extremaduran"}, "lt": {"articles": 182235, "name": "Lietuvių", "english_name": "Lithuanian"}, "zh-min-nan": {"articles": 216493, "name": "Bân-lâm-gú", "english_name": "Min Nan"}, "frr": {"articles": 5000, "name": "Nordfriisk", "english_name": "North Frisian"}, "chr": {"articles": 787, "name": "ᏣᎳᎩ", "english_name": "Cherokee"}, "pa": {"articles": 26315, "name": "ਪੰਜਾਬੀ", "english_name": "Punjabi"}, "xal": {"articles": 2071, "name": "Хальмг", "english_name": "Kalmyk"}, "chy": {"articles": 610, "name": "Tsetsêhestâhese", "english_name": "Cheyenne"}, "pi": {"articles": 2518, "name": "पाऴि", "english_name": "Pali"}, "war": {"articles": 1262769, "name": "Winaray", "english_name": "Waray-Waray"}, "pl": {"articles": 1230127, "name": "Polski", "english_name": "Polish"}, "tk": {"articles": 5236, "name": "تركمن / Туркмен", "english_name": "Turkmen"}, "hy": {"articles": 224894, "name": "Հայերեն", "english_name": "Armenian"}, "an": {"articles": 32133, "name": "Aragonés", "english_name": "Aragonese"}, "nrm": {"articles": 3621, "name": "Nouormand/Normaund", "english_name": "Norman"}, "hr": {"articles": 175429, "name": "Hrvatski", "english_name": "Croatian"}, "iu": {"articles": 397, "name": "ᐃᓄᒃᑎᑐᑦ", "english_name": "Inuktitut"}, "pfl": {"articles": 2068, "name": "Pälzisch", "english_name": "Palatinate German"}, "ht": {"articles": 51431, "name": "Krèyol ayisyen", "english_name": "Haitian"}, "hu": {"articles": 412975, "name": "Magyar", "english_name": "Hungarian"}, "gan": {"articles": 6393, "name": "贛語", "english_name": "Gan"}, "bat-smg": {"articles": 16091, "name": "Žemaitėška", "english_name": "Samogitian"}, "hi": {"articles": 120110, "name": "हिन्दी", "english_name": "Hindi"}, "gag": {"articles": 2753, "name": "Gagauz", "english_name": "Gagauz"}, "kg": {"articles": 1174, "name": "KiKongo", "english_name": "Kongo"}, "pnb": {"articles": 44512, "name": "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)", "english_name": "Western Punjabi"}, "bug": {"articles": 14132, "name": "Basa Ugi", "english_name": "Buginese"}, "he": {"articles": 209094, "name": "עברית", "english_name": "Hebrew"}, "mg": {"articles": 83450, "name": "Malagasy", "english_name": "Malagasy"}, "fur": {"articles": 3183, "name": "Furlan", "english_name": "Friulian"}, "uz": {"articles": 128931, "name": "O‘zbek", "english_name": "Uzbek"}, "ml": {"articles": 51523, "name": "മലയാളം", "english_name": "Malayalam"}, "azb": {"articles": 27395, "name": "تۆرکجه", "english_name": "South Azerbaijani"}, "mn": {"articles": 17294, "name": "Монгол", "english_name": "Mongolian"}, "mi": {"articles": 7125, "name": "Māori", "english_name": "Maori"}, "ik": {"articles": 253, "name": "Iñupiak", "english_name": "Inupiak"}, "mk": {"articles": 90005, "name": "Македонски", "english_name": "Macedonian"}, "ur": {"articles": 121938, "name": "اردو", "english_name": "Urdu"}, "zea": {"articles": 4378, "name": "Zeêuws", "english_name": "Zeelandic"}, "mt": {"articles": 3199, "name": "Malti", "english_name": "Maltese"}, "dty": {"articles": 1479, "name": "डोटेली", "english_name": "डोटेली"}, "stq": {"articles": 3770, "name": "Seeltersk", "english_name": "Saterland Frisian"}, "ms": {"articles": 294429, "name": "Bahasa Melayu", "english_name": "Malay"}, "mr": {"articles": 47938, "name": "मराठी", "english_name": "Marathi"}, "ug": {"articles": 3361, "name": "ئۇيغۇر تىلى", "english_name": "Uyghur"}, "mwl": {"articles": 3534, "name": "Mirandés", "english_name": "Mirandese"}, "my": {"articles": 36303, "name": "မြန်မာဘာသာ", "english_name": "Burmese"}, "ki": {"articles": 1344, "name": "Gĩkũyũ", "english_name": "Kikuyu"}, "pih": {"articles": 544, "name": "Norfuk", "english_name": "Norfolk"}, "sah": {"articles": 11379, "name": "Саха тыла (Saxa Tyla)", "english_name": "Sakha"}, "ss": {"articles": 431, "name": "SiSwati", "english_name": "Swati"}, "af": {"articles": 45696, "name": "Afrikaans", "english_name": "Afrikaans"}, "tn": {"articles": 634, "name": "Setswana", "english_name": "Tswana"}, "vi": {"articles": 1158435, "name": "Tiếng Việt", "english_name": "Vietnamese"}, "is": {"articles": 43353, "name": "Íslenska", "english_name": "Icelandic"}, "am": {"articles": 13730, "name": "አማርኛ", "english_name": "Amharic"}, "it": {"articles": 1367402, "name": "Italiano", "english_name": "Italian"}, "vo": {"articles": 120494, "name": "Volapük", "english_name": "Volapük"}, "ay": {"articles": 4192, "name": "Aymar", "english_name": "Aymara"}, "as": {"articles": 4700, "name": "অসমীয়া", "english_name": "Assamese"}, "ar": {"articles": 528143, "name": "العربية", "english_name": "Arabic"}, "lbe": {"articles": 1211, "name": "Лакку", "english_name": "Lak"}, "km": {"articles": 5249, "name": "ភាសាខ្មែរ", "english_name": "Khmer"}, "io": {"articles": 27090, "name": "Ido", "english_name": "Ido"}, "av": {"articles": 2311, "name": "Авар", "english_name": "Avar"}, "ia": {"articles": 20513, "name": "Interlingua", "english_name": "Interlingua"}, "haw": {"articles": 1987, "name": "Hawai`i", "english_name": "Hawaiian"}, "az": {"articles": 121494, "name": "Azərbaycanca", "english_name": "Azerbaijani"}, "ie": {"articles": 3659, "name": "Interlingue", "english_name": "Interlingue"}, "id": {"articles": 405232, "name": "Bahasa Indonesia", "english_name": "Indonesian"}, "nds-nl": {"articles": 6731, "name": "Nedersaksisch", "english_name": "Dutch Low Saxon"}, "pap": {"articles": 1783, "name": "Papiamentu", "english_name": "Papiamentu"}, "ks": {"articles": 303, "name": "कश्मीरी / كشميري", "english_name": "Kashmiri"}, "nl": {"articles": 1905677, "name": "Nederlands", "english_name": "Dutch"}, "nn": {"articles": 133931, "name": "Nynorsk", "english_name": "Norwegian (Nynorsk)"}, "no": {"articles": 471251, "name": "Norsk (Bokmål)", "english_name": "Norwegian (Bokmål)"}, "na": {"articles": 1282, "name": "dorerin Naoero", "english_name": "Nauruan"}, "nah": {"articles": 7098, "name": "Nāhuatl", "english_name": "Nahuatl"}, "ne": {"articles": 30502, "name": "नेपाली", "english_name": "Nepali"}, "lij": {"articles": 3276, "name": "Líguru", "english_name": "Ligurian"}, "csb": {"articles": 5177, "name": "Kaszëbsczi", "english_name": "Kashubian"}, "tyv": {"articles": 1402, "name": "Тыва", "english_name": "Tuvan"}, "ny": {"articles": 377, "name": "Chichewa", "english_name": "Chichewa"}, "nap": {"articles": 14467, "name": "Nnapulitano", "english_name": "Neapolitan"}, "ig": {"articles": 1344, "name": "Igbo", "english_name": "Igbo"}, "pag": {"articles": 2537, "name": "Pangasinan", "english_name": "Pangasinan"}, "zu": {"articles": 933, "name": "isiZulu", "english_name": "Zulu"}, "kw": {"articles": 3790, "name": "Kernewek/Karnuack", "english_name": "Cornish"}, "pam": {"articles": 8541, "name": "Kapampangan", "english_name": "Kapampangan"}, "nv": {"articles": 3481, "name": "Diné bizaad", "english_name": "Navajo"}, "sn": {"articles": 2803, "name": "chiShona", "english_name": "Shona"}, "kab": {"articles": 2854, "name": "Taqbaylit", "english_name": "Kabyle"}, "fr": {"articles": 1885277, "name": "Français", "english_name": "French"}, "mrj": {"articles": 10169, "name": "Кырык Мары (Kyryk Mary)", "english_name": "Hill Mari"}, "zh-yue": {"articles": 55080, "name": "粵語", "english_name": "Cantonese"}, "fy": {"articles": 38789, "name": "Frysk", "english_name": "West Frisian"}, "frp": {"articles": 2625, "name": "Arpitan", "english_name": "Franco-Provençal"}, "fa": {"articles": 560450, "name": "فارسی", "english_name": "Persian"}, "rw": {"articles": 1806, "name": "Ikinyarwanda", "english_name": "Kinyarwanda"}, "ff": {"articles": 219, "name": "Fulfulde", "english_name": "Fula"}, "mai": {"articles": 11388, "name": "मैथिली", "english_name": "Maithili"}, "fi": {"articles": 416814, "name": "Suomi", "english_name": "Finnish"}, "mzn": {"articles": 12490, "name": "مَزِروني", "english_name": "Mazandarani"}, "ab": {"articles": 1237, "name": "Аҧсуа", "english_name": "Abkhazian"}, "sa": {"articles": 11162, "name": "संस्कृतम्", "english_name": "Sanskrit"}, "zh-classical": {"articles": 6414, "name": "古文 / 文言文", "english_name": "Classical Chinese"}, "fo": {"articles": 12572, "name": "Føroyskt", "english_name": "Faroese"}, "bcl": {"articles": 7146, "name": "Bikol", "english_name": "Central Bicolano"}, "ka": {"articles": 116570, "name": "ქართული", "english_name": "Georgian"}, "nov": {"articles": 1652, "name": "Novial", "english_name": "Novial"}, "ckb": {"articles": 19159, "name": "Soranî / کوردی", "english_name": "Sorani"}, "kk": {"articles": 219194, "name": "Қазақша", "english_name": "Kazakh"}, "sr": {"articles": 352998, "name": "Српски / Srpski", "english_name": "Serbian"}, "sq": {"articles": 65954, "name": "Shqip", "english_name": "Albanian"}, "min": {"articles": 221983, "name": "Minangkabau", "english_name": "Minangkabau"}, "ko": {"articles": 387353, "name": "한국어", "english_name": "Korean"}, "sv": {"articles": 3789049, "name": "Svenska", "english_name": "Swedish"}, "su": {"articles": 38623, "name": "Basa Sunda", "english_name": "Sundanese"}, "kl": {"articles": 1644, "name": "Kalaallisut", "english_name": "Greenlandic"}, "sk": {"articles": 218344, "name": "Slovenčina", "english_name": "Slovak"}, "si": {"articles": 13471, "name": "සිංහල", "english_name": "Sinhalese"}, "sh": {"articles": 439151, "name": "Srpskohrvatski / Српскохрватски", "english_name": "Serbo-Croatian"}, "so": {"articles": 4661, "name": "Soomaali", "english_name": "Somali"}, "kv": {"articles": 5232, "name": "Коми", "english_name": "Komi"}, "ku": {"articles": 22845, "name": "Kurdî / كوردی", "english_name": "Kurdish"}, "sl": {"articles": 156803, "name": "Slovenščina", "english_name": "Slovenian"}, "sc": {"articles": 5496, "name": "Sardu", "english_name": "Sardinian"}, "ky": {"articles": 69216, "name": "Кыргызча", "english_name": "Kirghiz"}, "sg": {"articles": 250, "name": "Sängö", "english_name": "Sango"}, "sw": {"articles": 36588, "name": "Kiswahili", "english_name": "Swahili"}, "se": {"articles": 7299, "name": "Sámegiella", "english_name": "Northern Sami"}, "sd": {"articles": 8015, "name": "سنڌي، سندھی ، सिन्ध", "english_name": "Sindhi"}}, "dailymotion": {"gv": {"english_name": "Manx"}, "gu": {"name": "ગુજરાતી", "english_name": "Gujarati"}, "gd": {"english_name": "Gaelic, Scottish"}, "ga": {"name": "Gaeilge", "english_name": "Irish"}, "gn": {"english_name": "Guarani"}, "gl": {"name": "Galego", "english_name": "Galician"}, "lg": {"english_name": "Ganda"}, "lb": {"english_name": "Luxembourgish"}, "la": {"english_name": "Latin"}, "ln": {"english_name": "Lingala"}, "lo": {"english_name": "Lao"}, "tt": {"name": "Татарча", "english_name": "Tatar"}, "tr": {"name": "Türkçe", "english_name": "Turkish"}, "ts": {"english_name": "Tsonga"}, "li": {"english_name": "Limburgan"}, "lv": {"name": "Latviešu", "english_name": "Latvian"}, "to": {"english_name": "Tonga (Tonga Islands)"}, "lt": {"name": "Lietuvių", "english_name": "Lithuanian"}, "lu": {"english_name": "Luba-Katanga"}, "tk": {"english_name": "Turkmen"}, "th": {"name": "ไทย", "english_name": "Thai"}, "ti": {"name": "ትግርኛ", "english_name": "Tigrinya"}, "tg": {"english_name": "Tajik"}, "te": {"english_name": "Telugu"}, "ta": {"name": "தமிழ்", "english_name": "Tamil"}, "yi": {"english_name": "Yiddish"}, "yo": {"english_name": "Yoruba"}, "de": {"name": "Deutsch", "english_name": "German"}, "da": {"name": "Dansk", "english_name": "Danish"}, "dz": {"english_name": "Dzongkha"}, "st": {"english_name": "Sotho, Southern"}, "dv": {"english_name": "Dhivehi"}, "qu": {"english_name": "Quechua"}, "el": {"name": "Ελληνικά", "english_name": "Greek, Modern (1453-)"}, "eo": {"name": "Esperanto", "english_name": "Esperanto"}, "en": {"english_name": "English"}, "zh": {"name": "中文", "english_name": "Chinese"}, "ee": {"english_name": "Ewe"}, "za": {"english_name": "Zhuang"}, "mh": {"english_name": "Marshallese"}, "uk": {"name": "українська", "english_name": "Ukrainian"}, "eu": {"name": "Euskara", "english_name": "Basque"}, "et": {"name": "Eesti", "english_name": "Estonian"}, "es": {"name": "Español", "english_name": "Spanish"}, "ru": {"name": "русский", "english_name": "Russian"}, "rw": {"name": "Ikinyarwanda", "english_name": "Kinyarwanda"}, "rm": {"english_name": "Romansh"}, "rn": {"english_name": "Rundi"}, "ro": {"name": "Română", "english_name": "Romanian"}, "bn": {"name": "বাংলা", "english_name": "Bengali"}, "be": {"english_name": "Belarusian"}, "bg": {"name": "Български", "english_name": "Bulgarian"}, "ba": {"english_name": "Bashkir"}, "wa": {"name": "Walon", "english_name": "Walloon"}, "wo": {"english_name": "Wolof"}, "bm": {"english_name": "Bambara"}, "jv": {"english_name": "Javanese"}, "bo": {"english_name": "Tibetan"}, "bi": {"english_name": "Bislama"}, "br": {"name": "Brezhoneg", "english_name": "Breton"}, "bs": {"name": "Bosnian", "english_name": "Bosnian"}, "ja": {"name": "日本語", "english_name": "Japanese"}, "om": {"english_name": "Oromo"}, "oj": {"english_name": "Ojibwa"}, "ty": {"english_name": "Tahitian"}, "oc": {"name": "Occitan", "english_name": "Occitan"}, "tw": {"english_name": "Twi"}, "os": {"english_name": "Ossetian"}, "or": {"name": "Oriya", "english_name": "Oriya"}, "xh": {"name": "Xhosa", "english_name": "Xhosa"}, "ch": {"english_name": "Chamorro"}, "co": {"english_name": "Corsican"}, "ca": {"name": "Català", "english_name": "Catalan"}, "ce": {"english_name": "Chechen"}, "cy": {"name": "Cymraeg", "english_name": "Welsh"}, "cs": {"name": "čeština", "english_name": "Czech"}, "cr": {"english_name": "Cree"}, "cv": {"english_name": "Chuvash"}, "cu": {"english_name": "Slavic, Church"}, "ve": {"name": "Venda", "english_name": "Venda"}, "ps": {"name": "Pushto", "english_name": "Pushto"}, "pt": {"name": "Português", "english_name": "Portuguese"}, "tl": {"english_name": "Tagalog"}, "pa": {"name": "ਪੰਜਾਬੀ", "english_name": "Panjabi"}, "vi": {"name": "Tiếng Việt", "english_name": "Vietnamese"}, "pi": {"english_name": "Pali"}, "is": {"name": "Íslenska", "english_name": "Icelandic"}, "pl": {"name": "polski", "english_name": "Polish"}, "hz": {"english_name": "Herero"}, "hy": {"english_name": "Armenian"}, "hr": {"name": "hrvatski", "english_name": "Croatian"}, "iu": {"english_name": "Inuktitut"}, "ht": {"english_name": "Haitian"}, "hu": {"name": "magyar", "english_name": "Hungarian"}, "hi": {"name": "हिंदी", "english_name": "Hindi"}, "ho": {"english_name": "Hiri Motu"}, "ha": {"english_name": "Hausa"}, "he": {"name": "עברית", "english_name": "Hebrew"}, "mg": {"english_name": "Malagasy"}, "uz": {"english_name": "Uzbek"}, "ml": {"english_name": "Malayalam"}, "mn": {"name": "Монгол", "english_name": "Mongolian"}, "mi": {"name": "Reo Māori", "english_name": "Maori"}, "ik": {"english_name": "Inupiaq"}, "mk": {"name": "Македонски", "english_name": "Macedonian"}, "ur": {"english_name": "Urdu"}, "mt": {"name": "Malti", "english_name": "Maltese"}, "ms": {"name": "Malay", "english_name": "Malay"}, "mr": {"name": "मराठी", "english_name": "Marathi"}, "ug": {"english_name": "Uighur"}, "my": {"english_name": "Burmese"}, "sq": {"english_name": "Albanian"}, "ae": {"english_name": "Avestan"}, "ss": {"english_name": "Swati"}, "af": {"name": "Afrikaans", "english_name": "Afrikaans"}, "tn": {"english_name": "Tswana"}, "sw": {"english_name": "Swahili (macrolanguage)"}, "ak": {"english_name": "Akan"}, "am": {"name": "አማርኛ", "english_name": "Amharic"}, "it": {"name": "Italiano", "english_name": "Italian"}, "an": {"english_name": "Aragonese"}, "ii": {"english_name": "Yi, Sichuan"}, "ia": {"english_name": "Interlingua"}, "as": {"english_name": "Assamese"}, "ar": {"name": "العربية", "english_name": "Arabic"}, "su": {"english_name": "Sundanese"}, "io": {"english_name": "Ido"}, "av": {"english_name": "Avaric"}, "ay": {"english_name": "Aymara"}, "az": {"name": "Azerbaijani", "english_name": "Azerbaijani"}, "ie": {"english_name": "Interlingue"}, "id": {"name": "Indonesian", "english_name": "Indonesian"}, "ig": {"english_name": "Igbo"}, "sk": {"name": "Slovenský", "english_name": "Slovak"}, "sr": {"name": "српски", "english_name": "Serbian"}, "nl": {"name": "Nederlands", "english_name": "Dutch"}, "nn": {"name": "Norwegian Nynorsk", "english_name": "Norwegian Nynorsk"}, "no": {"english_name": "Norwegian"}, "na": {"english_name": "Nauru"}, "nb": {"name": "Norwegian Bokmål", "english_name": "Norwegian Bokmål"}, "nd": {"english_name": "Ndebele, North"}, "ne": {"english_name": "Nepali (macrolanguage)"}, "ng": {"english_name": "Ndonga"}, "ny": {"english_name": "Nyanja"}, "vo": {"english_name": "Volapük"}, "zu": {"name": "Isi-Zulu", "english_name": "Zulu"}, "so": {"english_name": "Somali"}, "nr": {"english_name": "Ndebele, South"}, "nv": {"english_name": "Navajo"}, "sn": {"english_name": "Shona"}, "fr": {"name": "français", "english_name": "French"}, "sm": {"english_name": "Samoan"}, "fy": {"english_name": "Frisian, Western"}, "sv": {"name": "Svenska", "english_name": "Swedish"}, "fa": {"name": "فارسی", "english_name": "Persian"}, "ff": {"english_name": "Fulah"}, "fi": {"name": "suomi", "english_name": "Finnish"}, "fj": {"english_name": "Fijian"}, "sa": {"english_name": "Sanskrit"}, "fo": {"english_name": "Faroese"}, "ka": {"english_name": "Georgian"}, "kg": {"english_name": "Kongo"}, "kk": {"english_name": "Kazakh"}, "kj": {"english_name": "Kuanyama"}, "ki": {"english_name": "Kikuyu"}, "ko": {"name": "한국어", "english_name": "Korean"}, "kn": {"name": "ಕನ್ನಡ", "english_name": "Kannada"}, "km": {"english_name": "Khmer, Central"}, "kl": {"english_name": "Kalaallisut"}, "ks": {"english_name": "Kashmiri"}, "kr": {"english_name": "Kanuri"}, "si": {"english_name": "Sinhala"}, "sh": {"name": "Serbo-Croatian", "english_name": "Serbo-Croatian"}, "kw": {"english_name": "Cornish"}, "kv": {"english_name": "Komi"}, "ku": {"english_name": "Kurdish"}, "sl": {"name": "slovenščina", "english_name": "Slovenian"}, "sc": {"english_name": "Sardinian"}, "ky": {"english_name": "Kirghiz"}, "sg": {"english_name": "Sango"}, "se": {"english_name": "Sami, Northern"}, "sd": {"english_name": "Sindhi"}}, "yahoo news": ["ar", "bg", "zh-chs", "zh-cht", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "el", "he", "hu", "it", "ja", "ko", "lv", "lt", "no", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr"], "swisscows": ["browser", "ar-SA", "es-AR", "en-AU", "de-AT", "fr-BE", "nl-BE", "pt-BR", "en-CA", "fr-CA", "es-CL", "zh-CN", "da-DK", "fi-FI", "fr-FR", "de-DE", "zh-HK", "en-IN", "en-IE", "it-IT", "ja-JP", "ko-KR", "en-MY", "es-MX", "nl-NL", "en-NZ", "no-NO", "en-PH", "pl-PL", "pt-PT", "ru-RU", "en-ZA", "es-ES", "sv-SE", "de-CH", "fr-CH", "zh-TW", "tr-TR", "en-GB", "en-US", "es-US"], "qwant images": ["el-GR", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "co-FR", "ca-FR", "ca-ES", "ca-AD", "it-IT", "it-CH", "cs-CZ", "cy-GB", "gd-GB", "eu-FR", "eu-ES", "et-EE", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "ru-RU", "nl-BE", "nl-NL", "pt-PT", "pt-AD", "pt-BR", "no-NO", "tr-TR", "th-TH", "ro-RO", "pl-PL", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "bg-BG", "de-DE", "de-AT", "de-CH", "hu-HU", "br-FR", "fi-FI", "da-DK", "ja-JP", "he-IL", "ko-KR", "sv-SE", "ms-MY"], "wikidata": {"gv": {"articles": 4960, "name": "Gaelg", "english_name": "Manx"}, "sco": {"articles": 45568, "name": "Scots", "english_name": "Scots"}, "scn": {"articles": 25391, "name": "Sicilianu", "english_name": "Sicilian"}, "wuu": {"articles": 5942, "name": "吴语", "english_name": "Wu"}, "tcy": {"articles": 784, "name": "ತುಳು", "english_name": "Tulu"}, "cdo": {"articles": 12982, "name": "Mìng-dĕ̤ng-ngṳ̄", "english_name": "Min Dong"}, "gu": {"articles": 27219, "name": "ગુજરાતી", "english_name": "Gujarati"}, "kbd": {"articles": 1579, "name": "Адыгэбзэ (Adighabze)", "english_name": "Kabardian Circassian"}, "gd": {"articles": 14477, "name": "Gàidhlig", "english_name": "Scottish Gaelic"}, "jbo": {"articles": 1198, "name": "Lojban", "english_name": "Lojban"}, "ga": {"articles": 41082, "name": "Gaeilge", "english_name": "Irish"}, "gn": {"articles": 3184, "name": "Avañe'ẽ", "english_name": "Guarani"}, "kbp": {"articles": 233, "name": "Kabɩyɛ", "english_name": "Kabɩyɛ"}, "gl": {"articles": 139974, "name": "Galego", "english_name": "Galician"}, "als": {"articles": 23056, "name": "Alemannisch", "english_name": "Alemannic"}, "lg": {"articles": 1142, "name": "Luganda", "english_name": "Luganda"}, "hak": {"articles": 7481, "name": "Hak-kâ-fa / 客家話", "english_name": "Hakka"}, "lb": {"articles": 49627, "name": "Lëtzebuergesch", "english_name": "Luxembourgish"}, "szl": {"articles": 5890, "name": "Ślůnski", "english_name": "Silesian"}, "vep": {"articles": 5554, "name": "Vepsän", "english_name": "Vepsian"}, "la": {"articles": 126877, "name": "Latina", "english_name": "Latin"}, "ln": {"articles": 2911, "name": "Lingala", "english_name": "Lingala"}, "lo": {"articles": 2716, "name": "ລາວ", "english_name": "Lao"}, "tt": {"articles": 71613, "name": "Tatarça / Татарча", "english_name": "Tatar"}, "tr": {"articles": 294438, "name": "Türkçe", "english_name": "Turkish"}, "cbk-zam": {"articles": 2985, "name": "Chavacano de Zamboanga", "english_name": "Zamboanga Chavacano"}, "li": {"articles": 11872, "name": "Limburgs", "english_name": "Limburgish"}, "lv": {"articles": 77804, "name": "Latviešu", "english_name": "Latvian"}, "to": {"articles": 1689, "name": "faka Tonga", "english_name": "Tongan"}, "tl": {"articles": 72202, "name": "Tagalog", "english_name": "Tagalog"}, "jam": {"articles": 1603, "name": "Jumiekan Kryuol", "english_name": "Jamaican Patois"}, "vec": {"articles": 10936, "name": "Vèneto", "english_name": "Venetian"}, "th": {"articles": 117834, "name": "ไทย", "english_name": "Thai"}, "ti": {"articles": 178, "name": "ትግርኛ", "english_name": "Tigrinya"}, "tg": {"articles": 68201, "name": "Тоҷикӣ", "english_name": "Tajik"}, "te": {"articles": 67172, "name": "తెలుగు", "english_name": "Telugu"}, "ksh": {"articles": 2838, "name": "Ripoarisch", "english_name": "Ripuarian"}, "pcd": {"articles": 3487, "name": "Picard", "english_name": "Picard"}, "ta": {"articles": 105913, "name": "தமிழ்", "english_name": "Tamil"}, "yi": {"articles": 13965, "name": "ייִדיש", "english_name": "Yiddish"}, "lrc": {"articles": 5311, "name": "لۊری شومالی", "english_name": "Northern Luri"}, "xmf": {"articles": 10156, "name": "მარგალური (Margaluri)", "english_name": "Mingrelian"}, "ceb": {"articles": 4852036, "name": "Sinugboanong Binisaya", "english_name": "Cebuano"}, "yo": {"articles": 31573, "name": "Yorùbá", "english_name": "Yoruba"}, "de": {"articles": 2076891, "name": "Deutsch", "english_name": "German"}, "da": {"articles": 227211, "name": "Dansk", "english_name": "Danish"}, "za": {"articles": 1166, "name": "Cuengh", "english_name": "Zhuang"}, "pdc": {"articles": 1793, "name": "Deitsch", "english_name": "Pennsylvania German"}, "bxr": {"articles": 1963, "name": "Буряад", "english_name": "Buryat"}, "dz": {"articles": 220, "name": "ཇོང་ཁ", "english_name": "Dzongkha"}, "hif": {"articles": 9669, "name": "Fiji Hindi", "english_name": "Fiji Hindi"}, "rm": {"articles": 3441, "name": "Rumantsch", "english_name": "Romansh"}, "dv": {"articles": 2971, "name": "ދިވެހިބަސް", "english_name": "Divehi"}, "qu": {"articles": 20181, "name": "Runa Simi", "english_name": "Quechua"}, "vls": {"articles": 6144, "name": "West-Vlams", "english_name": "West Flemish"}, "bar": {"articles": 22735, "name": "Boarisch", "english_name": "Bavarian"}, "pnt": {"articles": 449, "name": "Ποντιακά", "english_name": "Pontic"}, "eml": {"articles": 8873, "name": "Emiliàn e rumagnòl", "english_name": "Emilian-Romagnol"}, "kn": {"articles": 22010, "name": "ಕನ್ನಡ", "english_name": "Kannada"}, "fiu-vro": {"articles": 5466, "name": "Võro", "english_name": "Võro"}, "mo": {"articles": 394, "name": "Молдовеняскэ", "english_name": "Moldovan"}, "bpy": {"articles": 25070, "name": "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী", "english_name": "Bishnupriya Manipuri"}, "crh": {"articles": 5287, "name": "Qırımtatarca", "english_name": "Crimean Tatar"}, "mhr": {"articles": 9618, "name": "Олык Марий (Olyk Marij)", "english_name": "Meadow Mari"}, "diq": {"articles": 8505, "name": "Zazaki", "english_name": "Zazaki"}, "el": {"articles": 132709, "name": "Ελληνικά", "english_name": "Greek"}, "eo": {"articles": 240289, "name": "Esperanto", "english_name": "Esperanto"}, "en": {"articles": 5435374, "name": "English", "english_name": "English"}, "zh": {"articles": 949200, "name": "中文", "english_name": "Chinese"}, "pms": {"articles": 64144, "name": "Piemontèis", "english_name": "Piedmontese"}, "ee": {"articles": 338, "name": "Eʋegbe", "english_name": "Ewe"}, "tpi": {"articles": 1357, "name": "Tok Pisin", "english_name": "Tok Pisin"}, "arz": {"articles": 16800, "name": "مصرى (Maṣri)", "english_name": "Egyptian Arabic"}, "rmy": {"articles": 596, "name": "romani - रोमानी", "english_name": "Romani"}, "mdf": {"articles": 1170, "name": "Мокшень (Mokshanj Kälj)", "english_name": "Moksha"}, "kaa": {"articles": 1888, "name": "Qaraqalpaqsha", "english_name": "Karakalpak"}, "olo": {"articles": 2225, "name": "Karjalan", "english_name": "Livvi-Karelian"}, "arc": {"articles": 1620, "name": "ܐܪܡܝܐ", "english_name": "Aramaic"}, "cr": {"articles": 127, "name": "Nehiyaw", "english_name": "Cree"}, "eu": {"articles": 281566, "name": "Euskara", "english_name": "Basque"}, "et": {"articles": 158968, "name": "Eesti", "english_name": "Estonian"}, "tet": {"articles": 1392, "name": "Tetun", "english_name": "Tetum"}, "es": {"articles": 1342185, "name": "Español", "english_name": "Spanish"}, "ba": {"articles": 39300, "name": "Башҡорт", "english_name": "Bashkir"}, "gom": {"articles": 3363, "name": "गोंयची कोंकणी / Gõychi Konknni", "english_name": "Goan Konkani"}, "ru": {"articles": 1405027, "name": "Русский", "english_name": "Russian"}, "roa-tara": {"articles": 9231, "name": "Tarandíne", "english_name": "Tarantino"}, "ha": {"articles": 1433, "name": "هَوُسَ", "english_name": "Hausa"}, "ak": {"articles": 289, "name": "Akana", "english_name": "Akan"}, "lad": {"articles": 4518, "name": "Dzhudezmo", "english_name": "Ladino"}, "bm": {"articles": 428, "name": "Bamanankan", "english_name": "Bambara"}, "new": {"articles": 72132, "name": "नेपाल भाषा", "english_name": "Newar"}, "rn": {"articles": 498, "name": "Kirundi", "english_name": "Kirundi"}, "ro": {"articles": 377409, "name": "Română", "english_name": "Romanian"}, "dsb": {"articles": 3085, "name": "Dolnoserbski", "english_name": "Lower Sorbian"}, "bn": {"articles": 51178, "name": "বাংলা", "english_name": "Bengali"}, "hsb": {"articles": 11854, "name": "Hornjoserbsce", "english_name": "Upper Sorbian"}, "be": {"articles": 144452, "name": "Беларуская", "english_name": "Belarusian"}, "bg": {"articles": 231561, "name": "Български", "english_name": "Bulgarian"}, "myv": {"articles": 3810, "name": "Эрзянь (Erzjanj Kelj)", "english_name": "Erzya"}, "uk": {"articles": 704961, "name": "Українська", "english_name": "Ukrainian"}, "wa": {"articles": 14537, "name": "Walon", "english_name": "Walloon"}, "ast": {"articles": 49236, "name": "Asturianu", "english_name": "Asturian"}, "wo": {"articles": 1152, "name": "Wolof", "english_name": "Wolof"}, "got": {"articles": 499, "name": "𐌲𐌿𐍄𐌹𐍃𐌺", "english_name": "Gothic"}, "jv": {"articles": 50176, "name": "Basa Jawa", "english_name": "Javanese"}, "bo": {"articles": 5723, "name": "བོད་སྐད", "english_name": "Tibetan"}, "bh": {"articles": 9116, "name": "भोजपुरी", "english_name": "Bihari"}, "bi": {"articles": 1115, "name": "Bislama", "english_name": "Bislama"}, "rue": {"articles": 6071, "name": "Русиньскый", "english_name": "Rusyn"}, "map-bms": {"articles": 13285, "name": "Basa Banyumasan", "english_name": "Banyumasan"}, "tum": {"articles": 567, "name": "chiTumbuka", "english_name": "Tumbuka"}, "br": {"articles": 62422, "name": "Brezhoneg", "english_name": "Breton"}, "bs": {"articles": 74769, "name": "Bosanski", "english_name": "Bosnian"}, "lez": {"articles": 3810, "name": "Лезги чІал (Lezgi č’al)", "english_name": "Lezgian"}, "ja": {"articles": 1066670, "name": "日本語", "english_name": "Japanese"}, "om": {"articles": 724, "name": "Oromoo", "english_name": "Oromo"}, "glk": {"articles": 5696, "name": "گیلکی", "english_name": "Gilaki"}, "ace": {"articles": 4561, "name": "Bahsa Acèh", "english_name": "Acehnese"}, "ilo": {"articles": 10802, "name": "Ilokano", "english_name": "Ilokano"}, "roa-rup": {"articles": 1211, "name": "Armãneashce", "english_name": "Aromanian"}, "oc": {"articles": 83443, "name": "Occitan", "english_name": "Occitan"}, "ltg": {"articles": 801, "name": "Latgaļu", "english_name": "Latgalian"}, "be-tarask": {"articles": 61048, "name": "Беларуская (тарашкевіца)", "english_name": "Belarusian (Taraškievica)"}, "st": {"articles": 516, "name": "Sesotho", "english_name": "Sesotho"}, "tw": {"articles": 591, "name": "Twi", "english_name": "Twi"}, "krc": {"articles": 2017, "name": "Къарачай-Малкъар (Qarachay-Malqar)", "english_name": "Karachay-Balkar"}, "nds": {"articles": 26351, "name": "Plattdüütsch", "english_name": "Low Saxon"}, "os": {"articles": 10496, "name": "Иронау", "english_name": "Ossetian"}, "or": {"articles": 12744, "name": "ଓଡ଼ିଆ", "english_name": "Oriya"}, "udm": {"articles": 3959, "name": "Удмурт кыл", "english_name": "Udmurt"}, "xh": {"articles": 685, "name": "isiXhosa", "english_name": "Xhosa"}, "ch": {"articles": 423, "name": "Chamoru", "english_name": "Chamorro"}, "co": {"articles": 5441, "name": "Corsu", "english_name": "Corsican"}, "nso": {"articles": 7675, "name": "Sepedi", "english_name": "Northern Sotho"}, "simple": {"articles": 125998, "name": "Simple English", "english_name": "Simple English"}, "bjn": {"articles": 1723, "name": "Bahasa Banjar", "english_name": "Banjar"}, "ca": {"articles": 546671, "name": "Català", "english_name": "Catalan"}, "lmo": {"articles": 35508, "name": "Lumbaart", "english_name": "Lombard"}, "ce": {"articles": 164256, "name": "Нохчийн", "english_name": "Chechen"}, "ts": {"articles": 403, "name": "Xitsonga", "english_name": "Tsonga"}, "cy": {"articles": 91573, "name": "Cymraeg", "english_name": "Welsh"}, "ang": {"articles": 2925, "name": "Englisc", "english_name": "Anglo-Saxon"}, "cs": {"articles": 384508, "name": "Čeština", "english_name": "Czech"}, "ty": {"articles": 1189, "name": "Reo Mā`ohi", "english_name": "Tahitian"}, "ady": {"articles": 402, "name": "Адыгэбзэ", "english_name": "Adyghe"}, "cv": {"articles": 40393, "name": "Чăваш", "english_name": "Chuvash"}, "cu": {"articles": 584, "name": "Словѣньскъ", "english_name": "Old Church Slavonic"}, "ve": {"articles": 240, "name": "Tshivenda", "english_name": "Venda"}, "koi": {"articles": 3448, "name": "Перем Коми (Perem Komi)", "english_name": "Komi-Permyak"}, "ps": {"articles": 8090, "name": "پښتو", "english_name": "Pashto"}, "fj": {"articles": 394, "name": "Na Vosa Vakaviti", "english_name": "Fijian"}, "srn": {"articles": 1055, "name": "Sranantongo", "english_name": "Sranan"}, "pt": {"articles": 972627, "name": "Português", "english_name": "Portuguese"}, "sm": {"articles": 768, "name": "Gagana Samoa", "english_name": "Samoan"}, "ext": {"articles": 2910, "name": "Estremeñu", "english_name": "Extremaduran"}, "lt": {"articles": 182235, "name": "Lietuvių", "english_name": "Lithuanian"}, "zh-min-nan": {"articles": 216493, "name": "Bân-lâm-gú", "english_name": "Min Nan"}, "frr": {"articles": 5000, "name": "Nordfriisk", "english_name": "North Frisian"}, "chr": {"articles": 787, "name": "ᏣᎳᎩ", "english_name": "Cherokee"}, "pa": {"articles": 26315, "name": "ਪੰਜਾਬੀ", "english_name": "Punjabi"}, "xal": {"articles": 2071, "name": "Хальмг", "english_name": "Kalmyk"}, "chy": {"articles": 610, "name": "Tsetsêhestâhese", "english_name": "Cheyenne"}, "pi": {"articles": 2518, "name": "पाऴि", "english_name": "Pali"}, "war": {"articles": 1262769, "name": "Winaray", "english_name": "Waray-Waray"}, "pl": {"articles": 1230127, "name": "Polski", "english_name": "Polish"}, "tk": {"articles": 5236, "name": "تركمن / Туркмен", "english_name": "Turkmen"}, "hy": {"articles": 224894, "name": "Հայերեն", "english_name": "Armenian"}, "an": {"articles": 32133, "name": "Aragonés", "english_name": "Aragonese"}, "nrm": {"articles": 3621, "name": "Nouormand/Normaund", "english_name": "Norman"}, "hr": {"articles": 175429, "name": "Hrvatski", "english_name": "Croatian"}, "iu": {"articles": 397, "name": "ᐃᓄᒃᑎᑐᑦ", "english_name": "Inuktitut"}, "pfl": {"articles": 2068, "name": "Pälzisch", "english_name": "Palatinate German"}, "ht": {"articles": 51431, "name": "Krèyol ayisyen", "english_name": "Haitian"}, "hu": {"articles": 412975, "name": "Magyar", "english_name": "Hungarian"}, "gan": {"articles": 6393, "name": "贛語", "english_name": "Gan"}, "bat-smg": {"articles": 16091, "name": "Žemaitėška", "english_name": "Samogitian"}, "hi": {"articles": 120110, "name": "हिन्दी", "english_name": "Hindi"}, "gag": {"articles": 2753, "name": "Gagauz", "english_name": "Gagauz"}, "kg": {"articles": 1174, "name": "KiKongo", "english_name": "Kongo"}, "pnb": {"articles": 44512, "name": "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)", "english_name": "Western Punjabi"}, "bug": {"articles": 14132, "name": "Basa Ugi", "english_name": "Buginese"}, "he": {"articles": 209094, "name": "עברית", "english_name": "Hebrew"}, "mg": {"articles": 83450, "name": "Malagasy", "english_name": "Malagasy"}, "fur": {"articles": 3183, "name": "Furlan", "english_name": "Friulian"}, "uz": {"articles": 128931, "name": "O‘zbek", "english_name": "Uzbek"}, "ml": {"articles": 51523, "name": "മലയാളം", "english_name": "Malayalam"}, "azb": {"articles": 27395, "name": "تۆرکجه", "english_name": "South Azerbaijani"}, "mn": {"articles": 17294, "name": "Монгол", "english_name": "Mongolian"}, "mi": {"articles": 7125, "name": "Māori", "english_name": "Maori"}, "ik": {"articles": 253, "name": "Iñupiak", "english_name": "Inupiak"}, "mk": {"articles": 90005, "name": "Македонски", "english_name": "Macedonian"}, "ur": {"articles": 121938, "name": "اردو", "english_name": "Urdu"}, "zea": {"articles": 4378, "name": "Zeêuws", "english_name": "Zeelandic"}, "mt": {"articles": 3199, "name": "Malti", "english_name": "Maltese"}, "dty": {"articles": 1479, "name": "डोटेली", "english_name": "डोटेली"}, "stq": {"articles": 3770, "name": "Seeltersk", "english_name": "Saterland Frisian"}, "ms": {"articles": 294429, "name": "Bahasa Melayu", "english_name": "Malay"}, "mr": {"articles": 47938, "name": "मराठी", "english_name": "Marathi"}, "ug": {"articles": 3361, "name": "ئۇيغۇر تىلى", "english_name": "Uyghur"}, "mwl": {"articles": 3534, "name": "Mirandés", "english_name": "Mirandese"}, "my": {"articles": 36303, "name": "မြန်မာဘာသာ", "english_name": "Burmese"}, "ki": {"articles": 1344, "name": "Gĩkũyũ", "english_name": "Kikuyu"}, "pih": {"articles": 544, "name": "Norfuk", "english_name": "Norfolk"}, "sah": {"articles": 11379, "name": "Саха тыла (Saxa Tyla)", "english_name": "Sakha"}, "ss": {"articles": 431, "name": "SiSwati", "english_name": "Swati"}, "af": {"articles": 45696, "name": "Afrikaans", "english_name": "Afrikaans"}, "tn": {"articles": 634, "name": "Setswana", "english_name": "Tswana"}, "vi": {"articles": 1158435, "name": "Tiếng Việt", "english_name": "Vietnamese"}, "is": {"articles": 43353, "name": "Íslenska", "english_name": "Icelandic"}, "am": {"articles": 13730, "name": "አማርኛ", "english_name": "Amharic"}, "it": {"articles": 1367402, "name": "Italiano", "english_name": "Italian"}, "vo": {"articles": 120494, "name": "Volapük", "english_name": "Volapük"}, "ay": {"articles": 4192, "name": "Aymar", "english_name": "Aymara"}, "as": {"articles": 4700, "name": "অসমীয়া", "english_name": "Assamese"}, "ar": {"articles": 528143, "name": "العربية", "english_name": "Arabic"}, "lbe": {"articles": 1211, "name": "Лакку", "english_name": "Lak"}, "km": {"articles": 5249, "name": "ភាសាខ្មែរ", "english_name": "Khmer"}, "io": {"articles": 27090, "name": "Ido", "english_name": "Ido"}, "av": {"articles": 2311, "name": "Авар", "english_name": "Avar"}, "ia": {"articles": 20513, "name": "Interlingua", "english_name": "Interlingua"}, "haw": {"articles": 1987, "name": "Hawai`i", "english_name": "Hawaiian"}, "az": {"articles": 121494, "name": "Azərbaycanca", "english_name": "Azerbaijani"}, "ie": {"articles": 3659, "name": "Interlingue", "english_name": "Interlingue"}, "id": {"articles": 405232, "name": "Bahasa Indonesia", "english_name": "Indonesian"}, "nds-nl": {"articles": 6731, "name": "Nedersaksisch", "english_name": "Dutch Low Saxon"}, "pap": {"articles": 1783, "name": "Papiamentu", "english_name": "Papiamentu"}, "ks": {"articles": 303, "name": "कश्मीरी / كشميري", "english_name": "Kashmiri"}, "nl": {"articles": 1905677, "name": "Nederlands", "english_name": "Dutch"}, "nn": {"articles": 133931, "name": "Nynorsk", "english_name": "Norwegian (Nynorsk)"}, "no": {"articles": 471251, "name": "Norsk (Bokmål)", "english_name": "Norwegian (Bokmål)"}, "na": {"articles": 1282, "name": "dorerin Naoero", "english_name": "Nauruan"}, "nah": {"articles": 7098, "name": "Nāhuatl", "english_name": "Nahuatl"}, "ne": {"articles": 30502, "name": "नेपाली", "english_name": "Nepali"}, "lij": {"articles": 3276, "name": "Líguru", "english_name": "Ligurian"}, "csb": {"articles": 5177, "name": "Kaszëbsczi", "english_name": "Kashubian"}, "tyv": {"articles": 1402, "name": "Тыва", "english_name": "Tuvan"}, "ny": {"articles": 377, "name": "Chichewa", "english_name": "Chichewa"}, "nap": {"articles": 14467, "name": "Nnapulitano", "english_name": "Neapolitan"}, "ig": {"articles": 1344, "name": "Igbo", "english_name": "Igbo"}, "pag": {"articles": 2537, "name": "Pangasinan", "english_name": "Pangasinan"}, "zu": {"articles": 933, "name": "isiZulu", "english_name": "Zulu"}, "kw": {"articles": 3790, "name": "Kernewek/Karnuack", "english_name": "Cornish"}, "pam": {"articles": 8541, "name": "Kapampangan", "english_name": "Kapampangan"}, "nv": {"articles": 3481, "name": "Diné bizaad", "english_name": "Navajo"}, "sn": {"articles": 2803, "name": "chiShona", "english_name": "Shona"}, "kab": {"articles": 2854, "name": "Taqbaylit", "english_name": "Kabyle"}, "fr": {"articles": 1885277, "name": "Français", "english_name": "French"}, "mrj": {"articles": 10169, "name": "Кырык Мары (Kyryk Mary)", "english_name": "Hill Mari"}, "zh-yue": {"articles": 55080, "name": "粵語", "english_name": "Cantonese"}, "fy": {"articles": 38789, "name": "Frysk", "english_name": "West Frisian"}, "frp": {"articles": 2625, "name": "Arpitan", "english_name": "Franco-Provençal"}, "fa": {"articles": 560450, "name": "فارسی", "english_name": "Persian"}, "rw": {"articles": 1806, "name": "Ikinyarwanda", "english_name": "Kinyarwanda"}, "ff": {"articles": 219, "name": "Fulfulde", "english_name": "Fula"}, "mai": {"articles": 11388, "name": "मैथिली", "english_name": "Maithili"}, "fi": {"articles": 416814, "name": "Suomi", "english_name": "Finnish"}, "mzn": {"articles": 12490, "name": "مَزِروني", "english_name": "Mazandarani"}, "ab": {"articles": 1237, "name": "Аҧсуа", "english_name": "Abkhazian"}, "sa": {"articles": 11162, "name": "संस्कृतम्", "english_name": "Sanskrit"}, "zh-classical": {"articles": 6414, "name": "古文 / 文言文", "english_name": "Classical Chinese"}, "fo": {"articles": 12572, "name": "Føroyskt", "english_name": "Faroese"}, "bcl": {"articles": 7146, "name": "Bikol", "english_name": "Central Bicolano"}, "ka": {"articles": 116570, "name": "ქართული", "english_name": "Georgian"}, "nov": {"articles": 1652, "name": "Novial", "english_name": "Novial"}, "ckb": {"articles": 19159, "name": "Soranî / کوردی", "english_name": "Sorani"}, "kk": {"articles": 219194, "name": "Қазақша", "english_name": "Kazakh"}, "sr": {"articles": 352998, "name": "Српски / Srpski", "english_name": "Serbian"}, "sq": {"articles": 65954, "name": "Shqip", "english_name": "Albanian"}, "min": {"articles": 221983, "name": "Minangkabau", "english_name": "Minangkabau"}, "ko": {"articles": 387353, "name": "한국어", "english_name": "Korean"}, "sv": {"articles": 3789049, "name": "Svenska", "english_name": "Swedish"}, "su": {"articles": 38623, "name": "Basa Sunda", "english_name": "Sundanese"}, "kl": {"articles": 1644, "name": "Kalaallisut", "english_name": "Greenlandic"}, "sk": {"articles": 218344, "name": "Slovenčina", "english_name": "Slovak"}, "si": {"articles": 13471, "name": "සිංහල", "english_name": "Sinhalese"}, "sh": {"articles": 439151, "name": "Srpskohrvatski / Српскохрватски", "english_name": "Serbo-Croatian"}, "so": {"articles": 4661, "name": "Soomaali", "english_name": "Somali"}, "kv": {"articles": 5232, "name": "Коми", "english_name": "Komi"}, "ku": {"articles": 22845, "name": "Kurdî / كوردی", "english_name": "Kurdish"}, "sl": {"articles": 156803, "name": "Slovenščina", "english_name": "Slovenian"}, "sc": {"articles": 5496, "name": "Sardu", "english_name": "Sardinian"}, "ky": {"articles": 69216, "name": "Кыргызча", "english_name": "Kirghiz"}, "sg": {"articles": 250, "name": "Sängö", "english_name": "Sango"}, "sw": {"articles": 36588, "name": "Kiswahili", "english_name": "Swahili"}, "se": {"articles": 7299, "name": "Sámegiella", "english_name": "Northern Sami"}, "sd": {"articles": 8015, "name": "سنڌي، سندھی ، सिन्ध", "english_name": "Sindhi"}}, "qwant news": ["el-GR", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "co-FR", "ca-FR", "ca-ES", "ca-AD", "it-IT", "it-CH", "cs-CZ", "cy-GB", "gd-GB", "eu-FR", "eu-ES", "et-EE", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "ru-RU", "nl-BE", "nl-NL", "pt-PT", "pt-AD", "pt-BR", "no-NO", "tr-TR", "th-TH", "ro-RO", "pl-PL", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "bg-BG", "de-DE", "de-AT", "de-CH", "hu-HU", "br-FR", "fi-FI", "da-DK", "ja-JP", "he-IL", "ko-KR", "sv-SE", "ms-MY"], "ddg definitions": ["da-DK", "vi-VN", "en-SG", "sl-SL", "en-XA", "tzh-HK", "en-UK", "ro-RO", "en-MY", "el-GR", "it-CH", "hu-HU", "fr-FR", "en-PH", "tl-PH", "fr-CA", "fi-FI", "et-EE", "sv-SE", "es-XL", "th-TH", "sk-SK", "es-ES", "en-IE", "es-US", "es-PE", "nl-NL", "en-US", "de-DE", "de-AT", "wt-WT", "no-NO", "tr-TR", "ca-ES", "it-IT", "es-CO", "ru-RU", "ca-CT", "en-ZA", "en-CA", "jp-JP", "es-MX", "id-ID", "es-AR", "he-IL", "kr-KR", "en-AU", "ms-MY", "pl-PL", "lv-LV", "bg-BG", "zh-CN", "en-NZ", "lt-LT", "tzh-TW", "hr-HR", "pt-PT", "fr-BE", "de-CH", "cs-CZ", "en-IN", "nl-BE", "fr-CH", "en-ID", "ar-XA", "pt-BR", "uk-UA", "es-CL"], "bing images": ["sq", "de", "ar", "bg", "ca", "cs", "zh-CHS", "zh-CHT", "ko", "hr", "da", "sk", "sl", "es", "et", "fi", "fr", "el", "he", "nl", "hu", "id", "en", "is", "it", "ja", "lv", "lt", "ms", "no", "fa", "pl", "pt-BR", "pt-PT", "ro", "ru", "sr", "sv", "th", "tr", "uk", "vi"], "qwant social": ["el-GR", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "co-FR", "ca-FR", "ca-ES", "ca-AD", "it-IT", "it-CH", "cs-CZ", "cy-GB", "gd-GB", "eu-FR", "eu-ES", "et-EE", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "ru-RU", "nl-BE", "nl-NL", "pt-PT", "pt-AD", "pt-BR", "no-NO", "tr-TR", "th-TH", "ro-RO", "pl-PL", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "bg-BG", "de-DE", "de-AT", "de-CH", "hu-HU", "br-FR", "fi-FI", "da-DK", "ja-JP", "he-IL", "ko-KR", "sv-SE", "ms-MY"], "qwant": ["el-GR", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "co-FR", "ca-FR", "ca-ES", "ca-AD", "it-IT", "it-CH", "cs-CZ", "cy-GB", "gd-GB", "eu-FR", "eu-ES", "et-EE", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "ru-RU", "nl-BE", "nl-NL", "pt-PT", "pt-AD", "pt-BR", "no-NO", "tr-TR", "th-TH", "ro-RO", "pl-PL", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "bg-BG", "de-DE", "de-AT", "de-CH", "hu-HU", "br-FR", "fi-FI", "da-DK", "ja-JP", "he-IL", "ko-KR", "sv-SE", "ms-MY"], "yahoo": ["ar", "bg", "zh-chs", "zh-cht", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "el", "he", "hu", "it", "ja", "ko", "lv", "lt", "no", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr"], "gigablast": []} \ No newline at end of file +{"qwant news": ["bg-BG", "sv-SE", "ro-RO", "ms-MY", "pt-PT", "pt-AD", "pt-BR", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "gd-GB", "ko-KR", "he-IL", "br-FR", "ja-JP", "fi-FI", "eu-FR", "eu-ES", "el-GR", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "th-TH", "et-EE", "ca-FR", "ca-ES", "ca-AD", "da-DK", "co-FR", "it-IT", "it-CH", "tr-TR", "cs-CZ", "nl-BE", "nl-NL", "no-NO", "hu-HU", "cy-GB", "pl-PL", "ru-RU", "de-DE", "de-AT", "de-CH"], "bing videos": ["de-DE", "ar-SA", "es-AR", "en-AU", "de-AT", "fr-BE", "nl-BE", "pt-BR", "fr-CA", "en-CA", "ko-KR", "es-ES", "es-US", "en-US", "fr-FR", "zh-HK", "en-IN", "en-ID", "it-IT", "ja-JP", "en-MY", "es-MX", "no-NO", "nl-NL", "pl-PL", "en-GB", "zh-CN", "ru-RU", "en-ZA", "sv-SE", "de-CH", "fr-CH", "zh-TW", "tr-TR"], "bing": ["sq", "de", "ar", "bg", "ca", "cs", "zh-CHS", "zh-CHT", "ko", "hr", "da", "sk", "sl", "es", "et", "fi", "fr", "el", "he", "nl", "hu", "id", "en", "is", "it", "ja", "lv", "lt", "ms", "no", "fa", "pl", "pt-BR", "pt-PT", "ro", "ru", "sr", "sv", "th", "tr", "uk", "vi"], "wikidata": {"io": {"english_name": "Ido", "articles": 27273, "name": "Ido"}, "xh": {"english_name": "Xhosa", "articles": 714, "name": "isiXhosa"}, "ksh": {"english_name": "Ripuarian", "articles": 2836, "name": "Ripoarisch"}, "ha": {"english_name": "Hausa", "articles": 1530, "name": "هَوُسَ"}, "as": {"english_name": "Assamese", "articles": 4808, "name": "অসমীয়া"}, "fy": {"english_name": "West Frisian", "articles": 39195, "name": "Frysk"}, "arc": {"english_name": "Aramaic", "articles": 1622, "name": "ܐܪܡܝܐ"}, "ast": {"english_name": "Asturian", "articles": 51716, "name": "Asturianu"}, "pap": {"english_name": "Papiamentu", "articles": 1888, "name": "Papiamentu"}, "vls": {"english_name": "West Flemish", "articles": 6243, "name": "West-Vlams"}, "zh-classical": {"english_name": "Classical Chinese", "articles": 7007, "name": "古文 / 文言文"}, "yi": {"english_name": "Yiddish", "articles": 14126, "name": "ייִדיש"}, "pl": {"english_name": "Polish", "articles": 1244203, "name": "Polski"}, "ks": {"english_name": "Kashmiri", "articles": 315, "name": "कश्मीरी / كشميري"}, "no": {"english_name": "Norwegian (Bokmål)", "articles": 476388, "name": "Norsk (Bokmål)"}, "wa": {"english_name": "Walloon", "articles": 14611, "name": "Walon"}, "pnt": {"english_name": "Pontic", "articles": 454, "name": "Ποντιακά"}, "ilo": {"english_name": "Ilokano", "articles": 10848, "name": "Ilokano"}, "iu": {"english_name": "Inuktitut", "articles": 399, "name": "ᐃᓄᒃᑎᑐᑦ"}, "se": {"english_name": "Northern Sami", "articles": 7327, "name": "Sámegiella"}, "tn": {"english_name": "Tswana", "articles": 639, "name": "Setswana"}, "ny": {"english_name": "Chichewa", "articles": 381, "name": "Chichewa"}, "da": {"english_name": "Danish", "articles": 232125, "name": "Dansk"}, "gv": {"english_name": "Manx", "articles": 4961, "name": "Gaelg"}, "cbk-zam": {"english_name": "Zamboanga Chavacano", "articles": 3019, "name": "Chavacano de Zamboanga"}, "zh": {"english_name": "Chinese", "articles": 967529, "name": "中文"}, "qu": {"english_name": "Quechua", "articles": 20284, "name": "Runa Simi"}, "cs": {"english_name": "Czech", "articles": 391061, "name": "Čeština"}, "my": {"english_name": "Burmese", "articles": 37500, "name": "မြန်မာဘာသာ"}, "nl": {"english_name": "Dutch", "articles": 1912963, "name": "Nederlands"}, "glk": {"english_name": "Gilaki", "articles": 5680, "name": "گیلکی"}, "be": {"english_name": "Belarusian", "articles": 146603, "name": "Беларуская"}, "dsb": {"english_name": "Lower Sorbian", "articles": 3092, "name": "Dolnoserbski"}, "ml": {"english_name": "Malayalam", "articles": 52442, "name": "മലയാളം"}, "simple": {"english_name": "Simple English", "articles": 128493, "name": "Simple English"}, "bcl": {"english_name": "Central Bicolano", "articles": 7223, "name": "Bikol"}, "oc": {"english_name": "Occitan", "articles": 83602, "name": "Occitan"}, "bar": {"english_name": "Bavarian", "articles": 23153, "name": "Boarisch"}, "bm": {"english_name": "Bambara", "articles": 429, "name": "Bamanankan"}, "de": {"english_name": "German", "articles": 2109224, "name": "Deutsch"}, "gl": {"english_name": "Galician", "articles": 141613, "name": "Galego"}, "fo": {"english_name": "Faroese", "articles": 12610, "name": "Føroyskt"}, "gu": {"english_name": "Gujarati", "articles": 27423, "name": "ગુજરાતી"}, "pag": {"english_name": "Pangasinan", "articles": 2545, "name": "Pangasinan"}, "fur": {"english_name": "Friulian", "articles": 3195, "name": "Furlan"}, "an": {"english_name": "Aragonese", "articles": 32408, "name": "Aragonés"}, "lij": {"english_name": "Ligurian", "articles": 3281, "name": "Líguru"}, "ab": {"english_name": "Abkhazian", "articles": 3336, "name": "Аҧсуа"}, "ig": {"english_name": "Igbo", "articles": 1387, "name": "Igbo"}, "os": {"english_name": "Ossetian", "articles": 10528, "name": "Иронау"}, "mo": {"english_name": "Moldovan", "articles": 394, "name": "Молдовеняскэ"}, "mg": {"english_name": "Malagasy", "articles": 84696, "name": "Malagasy"}, "fiu-vro": {"english_name": "Võro", "articles": 5483, "name": "Võro"}, "sl": {"english_name": "Slovenian", "articles": 158478, "name": "Slovenščina"}, "nov": {"english_name": "Novial", "articles": 1660, "name": "Novial"}, "az": {"english_name": "Azerbaijani", "articles": 126053, "name": "Azərbaycanca"}, "ay": {"english_name": "Aymara", "articles": 4256, "name": "Aymar"}, "za": {"english_name": "Zhuang", "articles": 1167, "name": "Cuengh"}, "es": {"english_name": "Spanish", "articles": 1358005, "name": "Español"}, "ve": {"english_name": "Venda", "articles": 256, "name": "Tshivenda"}, "gan": {"english_name": "Gan", "articles": 6395, "name": "贛語"}, "zh-min-nan": {"english_name": "Min Nan", "articles": 224681, "name": "Bân-lâm-gú"}, "diq": {"english_name": "Zazaki", "articles": 8688, "name": "Zazaki"}, "av": {"english_name": "Avar", "articles": 2312, "name": "Авар"}, "got": {"english_name": "Gothic", "articles": 507, "name": "𐌲𐌿𐍄𐌹𐍃𐌺"}, "sh": {"english_name": "Serbo-Croatian", "articles": 440192, "name": "Srpskohrvatski / Српскохрватски"}, "ps": {"english_name": "Pashto", "articles": 8391, "name": "پښتو"}, "yo": {"english_name": "Yoruba", "articles": 31588, "name": "Yorùbá"}, "sco": {"english_name": "Scots", "articles": 46796, "name": "Scots"}, "bug": {"english_name": "Buginese", "articles": 14131, "name": "Basa Ugi"}, "tum": {"english_name": "Tumbuka", "articles": 567, "name": "chiTumbuka"}, "tg": {"english_name": "Tajik", "articles": 73631, "name": "Тоҷикӣ"}, "kg": {"english_name": "Kongo", "articles": 1176, "name": "KiKongo"}, "gag": {"english_name": "Gagauz", "articles": 2757, "name": "Gagauz"}, "lv": {"english_name": "Latvian", "articles": 79265, "name": "Latviešu"}, "mai": {"english_name": "Maithili", "articles": 11838, "name": "मैथिली"}, "kbd": {"english_name": "Kabardian Circassian", "articles": 1573, "name": "Адыгэбзэ (Adighabze)"}, "ak": {"english_name": "Akan", "articles": 306, "name": "Akana"}, "ckb": {"english_name": "Sorani", "articles": 19805, "name": "Soranî / کوردی"}, "eo": {"english_name": "Esperanto", "articles": 242064, "name": "Esperanto"}, "wo": {"english_name": "Wolof", "articles": 1157, "name": "Wolof"}, "li": {"english_name": "Limburgish", "articles": 12048, "name": "Limburgs"}, "roa-rup": {"english_name": "Aromanian", "articles": 1210, "name": "Armãneashce"}, "is": {"english_name": "Icelandic", "articles": 43613, "name": "Íslenska"}, "nrm": {"english_name": "Norman", "articles": 3627, "name": "Nouormand/Normaund"}, "so": {"english_name": "Somali", "articles": 4981, "name": "Soomaali"}, "bat-smg": {"english_name": "Samogitian", "articles": 16143, "name": "Žemaitėška"}, "eml": {"english_name": "Emilian-Romagnol", "articles": 9083, "name": "Emiliàn e rumagnòl"}, "nv": {"english_name": "Navajo", "articles": 3604, "name": "Diné bizaad"}, "nso": {"english_name": "Northern Sotho", "articles": 7824, "name": "Sepedi"}, "olo": {"english_name": "Livvi-Karelian", "articles": 2358, "name": "Karjalan"}, "cr": {"english_name": "Cree", "articles": 128, "name": "Nehiyaw"}, "mwl": {"english_name": "Mirandese", "articles": 3469, "name": "Mirandés"}, "krc": {"english_name": "Karachay-Balkar", "articles": 2018, "name": "Къарачай-Малкъар (Qarachay-Malqar)"}, "el": {"english_name": "Greek", "articles": 137467, "name": "Ελληνικά"}, "kn": {"english_name": "Kannada", "articles": 22233, "name": "ಕನ್ನಡ"}, "tt": {"english_name": "Tatar", "articles": 72927, "name": "Tatarça / Татарча"}, "haw": {"english_name": "Hawaiian", "articles": 2017, "name": "Hawai`i"}, "ext": {"english_name": "Extremaduran", "articles": 2911, "name": "Estremeñu"}, "xal": {"english_name": "Kalmyk", "articles": 2074, "name": "Хальмг"}, "fa": {"english_name": "Persian", "articles": 576947, "name": "فارسی"}, "la": {"english_name": "Latin", "articles": 127329, "name": "Latina"}, "lmo": {"english_name": "Lombard", "articles": 36249, "name": "Lumbaart"}, "ltg": {"english_name": "Latgalian", "articles": 801, "name": "Latgaļu"}, "war": {"english_name": "Waray-Waray", "articles": 1262905, "name": "Winaray"}, "zea": {"english_name": "Zeelandic", "articles": 4381, "name": "Zeêuws"}, "ia": {"english_name": "Interlingua", "articles": 20561, "name": "Interlingua"}, "kbp": {"english_name": "Kabɩyɛ", "articles": 573, "name": "Kabiye"}, "cy": {"english_name": "Welsh", "articles": 92570, "name": "Cymraeg"}, "na": {"english_name": "Nauruan", "articles": 1283, "name": "dorerin Naoero"}, "gn": {"english_name": "Guarani", "articles": 3217, "name": "Avañe'ẽ"}, "mn": {"english_name": "Mongolian", "articles": 17575, "name": "Монгол"}, "bs": {"english_name": "Bosnian", "articles": 75821, "name": "Bosanski"}, "sah": {"english_name": "Sakha", "articles": 11415, "name": "Саха тыла (Saxa Tyla)"}, "csb": {"english_name": "Kashubian", "articles": 5213, "name": "Kaszëbsczi"}, "rmy": {"english_name": "Romani", "articles": 601, "name": "romani - रोमानी"}, "pih": {"english_name": "Norfolk", "articles": 620, "name": "Norfuk"}, "tl": {"english_name": "Tagalog", "articles": 83924, "name": "Tagalog"}, "mhr": {"english_name": "Meadow Mari", "articles": 9689, "name": "Олык Марий (Olyk Marij)"}, "bpy": {"english_name": "Bishnupriya Manipuri", "articles": 25079, "name": "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী"}, "stq": {"english_name": "Saterland Frisian", "articles": 3794, "name": "Seeltersk"}, "lrc": {"english_name": "Northern Luri", "articles": 5326, "name": "لۊری شومالی"}, "koi": {"english_name": "Komi-Permyak", "articles": 3453, "name": "Перем Коми (Perem Komi)"}, "hif": {"english_name": "Fiji Hindi", "articles": 9707, "name": "Fiji Hindi"}, "br": {"english_name": "Breton", "articles": 63123, "name": "Brezhoneg"}, "jam": {"english_name": "Jamaican Patois", "articles": 1615, "name": "Jumiekan Kryuol"}, "ja": {"english_name": "Japanese", "articles": 1079370, "name": "日本語"}, "tcy": {"english_name": "Tulu", "articles": 849, "name": "ತುಳು"}, "sq": {"english_name": "Albanian", "articles": 69317, "name": "Shqip"}, "eu": {"english_name": "Basque", "articles": 284158, "name": "Euskara"}, "vo": {"english_name": "Volapük", "articles": 120622, "name": "Volapük"}, "ceb": {"english_name": "Cebuano", "articles": 5382720, "name": "Sinugboanong Binisaya"}, "bh": {"english_name": "Bihari", "articles": 9277, "name": "भोजपुरी"}, "ie": {"english_name": "Interlingue", "articles": 3700, "name": "Interlingue"}, "ang": {"english_name": "Anglo-Saxon", "articles": 2945, "name": "Englisc"}, "pdc": {"english_name": "Pennsylvania German", "articles": 1799, "name": "Deitsch"}, "mdf": {"english_name": "Moksha", "articles": 1179, "name": "Мокшень (Mokshanj Kälj)"}, "si": {"english_name": "Sinhalese", "articles": 13820, "name": "සිංහල"}, "he": {"english_name": "Hebrew", "articles": 213812, "name": "עברית"}, "frr": {"english_name": "North Frisian", "articles": 5475, "name": "Nordfriisk"}, "lbe": {"english_name": "Lak", "articles": 1213, "name": "Лакку"}, "kaa": {"english_name": "Karakalpak", "articles": 1892, "name": "Qaraqalpaqsha"}, "kw": {"english_name": "Cornish", "articles": 3792, "name": "Kernewek/Karnuack"}, "pcd": {"english_name": "Picard", "articles": 3535, "name": "Picard"}, "lo": {"english_name": "Lao", "articles": 2758, "name": "ລາວ"}, "pfl": {"english_name": "Palatinate German", "articles": 2070, "name": "Pälzisch"}, "vi": {"english_name": "Vietnamese", "articles": 1162191, "name": "Tiếng Việt"}, "be-tarask": {"english_name": "Belarusian (Taraškievica)", "articles": 61480, "name": "Беларуская (тарашкевіца)"}, "pms": {"english_name": "Piedmontese", "articles": 64198, "name": "Piemontèis"}, "rn": {"english_name": "Kirundi", "articles": 500, "name": "Kirundi"}, "su": {"english_name": "Sundanese", "articles": 38784, "name": "Basa Sunda"}, "ms": {"english_name": "Malay", "articles": 304280, "name": "Bahasa Melayu"}, "nah": {"english_name": "Nahuatl", "articles": 7119, "name": "Nāhuatl"}, "fr": {"english_name": "French", "articles": 1917429, "name": "Français"}, "ba": {"english_name": "Bashkir", "articles": 40027, "name": "Башҡорт"}, "tpi": {"english_name": "Tok Pisin", "articles": 1425, "name": "Tok Pisin"}, "ff": {"english_name": "Fula", "articles": 224, "name": "Fulfulde"}, "sm": {"english_name": "Samoan", "articles": 786, "name": "Gagana Samoa"}, "bxr": {"english_name": "Buryat", "articles": 2018, "name": "Буряад"}, "tet": {"english_name": "Tetum", "articles": 1418, "name": "Tetun"}, "dv": {"english_name": "Divehi", "articles": 3008, "name": "ދިވެހިބަސް"}, "fj": {"english_name": "Fijian", "articles": 430, "name": "Na Vosa Vakaviti"}, "szl": {"english_name": "Silesian", "articles": 6409, "name": "Ślůnski"}, "en": {"english_name": "English", "articles": 5490540, "name": "English"}, "uz": {"english_name": "Uzbek", "articles": 129075, "name": "O‘zbek"}, "dty": {"english_name": "डोटेली", "articles": 2128, "name": "Doteli"}, "ln": {"english_name": "Lingala", "articles": 2916, "name": "Lingala"}, "vep": {"english_name": "Vepsian", "articles": 5645, "name": "Vepsän"}, "vec": {"english_name": "Venetian", "articles": 10982, "name": "Vèneto"}, "new": {"english_name": "Newar", "articles": 72139, "name": "नेपाल भाषा"}, "ur": {"english_name": "Urdu", "articles": 124450, "name": "اردو"}, "mrj": {"english_name": "Hill Mari", "articles": 10265, "name": "Кырык Мары (Kyryk Mary)"}, "ts": {"english_name": "Tsonga", "articles": 540, "name": "Xitsonga"}, "hu": {"english_name": "Hungarian", "articles": 418142, "name": "Magyar"}, "sk": {"english_name": "Slovak", "articles": 223150, "name": "Slovenčina"}, "id": {"english_name": "Indonesian", "articles": 411506, "name": "Bahasa Indonesia"}, "ga": {"english_name": "Irish", "articles": 44243, "name": "Gaeilge"}, "ru": {"english_name": "Russian", "articles": 1425925, "name": "Русский"}, "to": {"english_name": "Tongan", "articles": 1689, "name": "faka Tonga"}, "chr": {"english_name": "Cherokee", "articles": 883, "name": "ᏣᎳᎩ"}, "hak": {"english_name": "Hakka", "articles": 8009, "name": "Hak-kâ-fa / 客家話"}, "map-bms": {"english_name": "Banyumasan", "articles": 13294, "name": "Basa Banyumasan"}, "gom": {"english_name": "Goan Konkani", "articles": 3380, "name": "गोंयची कोंकणी / Gõychi Konknni"}, "kv": {"english_name": "Komi", "articles": 5254, "name": "Коми"}, "tw": {"english_name": "Twi", "articles": 595, "name": "Twi"}, "bi": {"english_name": "Bislama", "articles": 1140, "name": "Bislama"}, "srn": {"english_name": "Sranan", "articles": 1059, "name": "Sranantongo"}, "lg": {"english_name": "Luganda", "articles": 1154, "name": "Luganda"}, "ady": {"english_name": "Adyghe", "articles": 403, "name": "Адыгэбзэ"}, "udm": {"english_name": "Udmurt", "articles": 4125, "name": "Удмурт кыл"}, "rw": {"english_name": "Kinyarwanda", "articles": 1812, "name": "Ikinyarwanda"}, "ss": {"english_name": "Swati", "articles": 432, "name": "SiSwati"}, "nds-nl": {"english_name": "Dutch Low Saxon", "articles": 6743, "name": "Nedersaksisch"}, "fi": {"english_name": "Finnish", "articles": 423220, "name": "Suomi"}, "ki": {"english_name": "Kikuyu", "articles": 1349, "name": "Gĩkũyũ"}, "tyv": {"english_name": "Tuvan", "articles": 1419, "name": "Тыва"}, "rue": {"english_name": "Rusyn", "articles": 6194, "name": "Русиньскый"}, "th": {"english_name": "Thai", "articles": 119427, "name": "ไทย"}, "bn": {"english_name": "Bengali", "articles": 52765, "name": "বাংলা"}, "ku": {"english_name": "Kurdish", "articles": 23052, "name": "Kurdî / كوردی"}, "ca": {"english_name": "Catalan", "articles": 557833, "name": "Català"}, "sa": {"english_name": "Sanskrit", "articles": 11182, "name": "संस्कृतम्"}, "or": {"english_name": "Oriya", "articles": 13175, "name": "ଓଡ଼ିଆ"}, "st": {"english_name": "Sesotho", "articles": 526, "name": "Sesotho"}, "af": {"english_name": "Afrikaans", "articles": 47107, "name": "Afrikaans"}, "sg": {"english_name": "Sango", "articles": 253, "name": "Sängö"}, "kk": {"english_name": "Kazakh", "articles": 219662, "name": "Қазақша"}, "ik": {"english_name": "Inupiak", "articles": 256, "name": "Iñupiak"}, "kab": {"english_name": "Kabyle", "articles": 2894, "name": "Taqbaylit"}, "hi": {"english_name": "Hindi", "articles": 121543, "name": "हिन्दी"}, "scn": {"english_name": "Sicilian", "articles": 25670, "name": "Sicilianu"}, "mk": {"english_name": "Macedonian", "articles": 90814, "name": "Македонски"}, "wuu": {"english_name": "Wu", "articles": 6073, "name": "吴语"}, "azb": {"english_name": "South Azerbaijani", "articles": 47457, "name": "تۆرکجه"}, "kl": {"english_name": "Greenlandic", "articles": 1638, "name": "Kalaallisut"}, "cu": {"english_name": "Old Church Slavonic", "articles": 591, "name": "Словѣньскъ"}, "crh": {"english_name": "Crimean Tatar", "articles": 5414, "name": "Qırımtatarca"}, "hr": {"english_name": "Croatian", "articles": 178083, "name": "Hrvatski"}, "lez": {"english_name": "Lezgian", "articles": 3852, "name": "Лезги чІал (Lezgi č’al)"}, "ti": {"english_name": "Tigrinya", "articles": 163, "name": "ትግርኛ"}, "jv": {"english_name": "Javanese", "articles": 50293, "name": "Basa Jawa"}, "hy": {"english_name": "Armenian", "articles": 232758, "name": "Հայերեն"}, "ro": {"english_name": "Romanian", "articles": 379516, "name": "Română"}, "mi": {"english_name": "Maori", "articles": 7133, "name": "Māori"}, "sc": {"english_name": "Sardinian", "articles": 5528, "name": "Sardu"}, "myv": {"english_name": "Erzya", "articles": 3939, "name": "Эрзянь (Erzjanj Kelj)"}, "pi": {"english_name": "Pali", "articles": 2525, "name": "पाऴि"}, "bjn": {"english_name": "Banjar", "articles": 1761, "name": "Bahasa Banjar"}, "cv": {"english_name": "Chuvash", "articles": 40690, "name": "Чăваш"}, "zu": {"english_name": "Zulu", "articles": 957, "name": "isiZulu"}, "tk": {"english_name": "Turkmen", "articles": 5267, "name": "تركمن / Туркмен"}, "sv": {"english_name": "Swedish", "articles": 3789235, "name": "Svenska"}, "am": {"english_name": "Amharic", "articles": 13861, "name": "አማርኛ"}, "arz": {"english_name": "Egyptian Arabic", "articles": 17363, "name": "مصرى (Maṣri)"}, "sn": {"english_name": "Shona", "articles": 2868, "name": "chiShona"}, "ee": {"english_name": "Ewe", "articles": 338, "name": "Eʋegbe"}, "xmf": {"english_name": "Mingrelian", "articles": 12279, "name": "მარგალური (Margaluri)"}, "nn": {"english_name": "Norwegian (Nynorsk)", "articles": 135175, "name": "Nynorsk"}, "ch": {"english_name": "Chamorro", "articles": 423, "name": "Chamoru"}, "als": {"english_name": "Alemannic", "articles": 23406, "name": "Alemannisch"}, "nds": {"english_name": "Low Saxon", "articles": 26780, "name": "Plattdüütsch"}, "it": {"english_name": "Italian", "articles": 1388262, "name": "Italiano"}, "dz": {"english_name": "Dzongkha", "articles": 228, "name": "ཇོང་ཁ"}, "tr": {"english_name": "Turkish", "articles": 299690, "name": "Türkçe"}, "ty": {"english_name": "Tahitian", "articles": 1191, "name": "Reo Mā`ohi"}, "pnb": {"english_name": "Western Punjabi", "articles": 45249, "name": "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)"}, "sd": {"english_name": "Sindhi", "articles": 8251, "name": "سنڌي، سندھی ، सिन्ध"}, "rm": {"english_name": "Romansh", "articles": 3455, "name": "Rumantsch"}, "ko": {"english_name": "Korean", "articles": 399300, "name": "한국어"}, "lt": {"english_name": "Lithuanian", "articles": 183261, "name": "Lietuvių"}, "et": {"english_name": "Estonian", "articles": 162182, "name": "Eesti"}, "ky": {"english_name": "Kirghiz", "articles": 80579, "name": "Кыргызча"}, "ht": {"english_name": "Haitian", "articles": 51554, "name": "Krèyol ayisyen"}, "ce": {"english_name": "Chechen", "articles": 164438, "name": "Нохчийн"}, "bg": {"english_name": "Bulgarian", "articles": 235084, "name": "Български"}, "ka": {"english_name": "Georgian", "articles": 117872, "name": "ქართული"}, "frp": {"english_name": "Franco-Provençal", "articles": 2633, "name": "Arpitan"}, "nap": {"english_name": "Neapolitan", "articles": 14470, "name": "Nnapulitano"}, "pa": {"english_name": "Punjabi", "articles": 26967, "name": "ਪੰਜਾਬੀ"}, "pam": {"english_name": "Kapampangan", "articles": 8553, "name": "Kapampangan"}, "lb": {"english_name": "Luxembourgish", "articles": 50445, "name": "Lëtzebuergesch"}, "mr": {"english_name": "Marathi", "articles": 48748, "name": "मराठी"}, "gd": {"english_name": "Scottish Gaelic", "articles": 14594, "name": "Gàidhlig"}, "sw": {"english_name": "Swahili", "articles": 37911, "name": "Kiswahili"}, "ug": {"english_name": "Uyghur", "articles": 3367, "name": "ئۇيغۇر تىلى"}, "sr": {"english_name": "Serbian", "articles": 357090, "name": "Српски / Srpski"}, "km": {"english_name": "Khmer", "articles": 5385, "name": "ភាសាខ្មែរ"}, "pt": {"english_name": "Portuguese", "articles": 979830, "name": "Português"}, "te": {"english_name": "Telugu", "articles": 67631, "name": "తెలుగు"}, "ne": {"english_name": "Nepali", "articles": 30112, "name": "नेपाली"}, "chy": {"english_name": "Cheyenne", "articles": 610, "name": "Tsetsêhestâhese"}, "om": {"english_name": "Oromo", "articles": 728, "name": "Oromoo"}, "jbo": {"english_name": "Lojban", "articles": 1201, "name": "Lojban"}, "bo": {"english_name": "Tibetan", "articles": 5726, "name": "བོད་སྐད"}, "uk": {"english_name": "Ukrainian", "articles": 740713, "name": "Українська"}, "hsb": {"english_name": "Upper Sorbian", "articles": 12354, "name": "Hornjoserbsce"}, "co": {"english_name": "Corsican", "articles": 5460, "name": "Corsu"}, "min": {"english_name": "Minangkabau", "articles": 222028, "name": "Minangkabau"}, "lad": {"english_name": "Ladino", "articles": 4512, "name": "Dzhudezmo"}, "roa-tara": {"english_name": "Tarantino", "articles": 9234, "name": "Tarandíne"}, "ace": {"english_name": "Acehnese", "articles": 7231, "name": "Bahsa Acèh"}, "zh-yue": {"english_name": "Cantonese", "articles": 61128, "name": "粵語"}, "mzn": {"english_name": "Mazandarani", "articles": 12564, "name": "مَزِروني"}, "ar": {"english_name": "Arabic", "articles": 542561, "name": "العربية"}, "ta": {"english_name": "Tamil", "articles": 113411, "name": "தமிழ்"}, "cdo": {"english_name": "Min Dong", "articles": 13442, "name": "Mìng-dĕ̤ng-ngṳ̄"}, "mt": {"english_name": "Maltese", "articles": 3213, "name": "Malti"}}, "duckduckgo": ["ru-RU", "pt-PT", "es-PE", "fr-BE", "tzh-HK", "pt-BR", "tzh-TW", "en-ZA", "ro-RO", "bg-BG", "es-XL", "en-XA", "en-CA", "en-NZ", "pl-PL", "es-MX", "hr-HR", "es-ES", "en-PH", "ms-MY", "vi-VN", "en-IN", "jp-JP", "es-CL", "en-IE", "wt-WT", "nl-NL", "fr-FR", "en-ID", "ca-ES", "en-SG", "hu-HU", "tl-PH", "lv-LV", "de-CH", "nl-BE", "sk-SK", "el-GR", "zh-CN", "es-CO", "kr-KR", "sv-SE", "id-ID", "ca-CT", "fr-CH", "cs-CZ", "he-IL", "da-DK", "de-DE", "en-MY", "es-US", "lt-LT", "uk-UA", "tr-TR", "th-TH", "en-US", "en-UK", "it-IT", "et-EE", "fi-FI", "ar-XA", "fr-CA", "en-AU", "it-CH", "sl-SL", "de-AT", "no-NO", "es-AR"], "ddg definitions": ["ru-RU", "pt-PT", "es-PE", "fr-BE", "tzh-HK", "pt-BR", "tzh-TW", "en-ZA", "ro-RO", "bg-BG", "es-XL", "en-XA", "en-CA", "en-NZ", "pl-PL", "es-MX", "hr-HR", "es-ES", "en-PH", "ms-MY", "vi-VN", "en-IN", "jp-JP", "es-CL", "en-IE", "wt-WT", "nl-NL", "fr-FR", "en-ID", "ca-ES", "en-SG", "hu-HU", "tl-PH", "lv-LV", "de-CH", "nl-BE", "sk-SK", "el-GR", "zh-CN", "es-CO", "kr-KR", "sv-SE", "id-ID", "ca-CT", "fr-CH", "cs-CZ", "he-IL", "da-DK", "de-DE", "en-MY", "es-US", "lt-LT", "uk-UA", "tr-TR", "th-TH", "en-US", "en-UK", "it-IT", "et-EE", "fi-FI", "ar-XA", "fr-CA", "en-AU", "it-CH", "sl-SL", "de-AT", "no-NO", "es-AR"], "yahoo news": ["ar", "bg", "zh-chs", "zh-cht", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "el", "he", "hu", "it", "ja", "ko", "lv", "lt", "no", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr"], "duckduckgo images": ["ru-RU", "pt-PT", "es-PE", "fr-BE", "tzh-HK", "pt-BR", "tzh-TW", "en-ZA", "ro-RO", "bg-BG", "es-XL", "en-XA", "en-CA", "en-NZ", "pl-PL", "es-MX", "hr-HR", "es-ES", "en-PH", "ms-MY", "vi-VN", "en-IN", "jp-JP", "es-CL", "en-IE", "wt-WT", "nl-NL", "fr-FR", "en-ID", "ca-ES", "en-SG", "hu-HU", "tl-PH", "lv-LV", "de-CH", "nl-BE", "sk-SK", "el-GR", "zh-CN", "es-CO", "kr-KR", "sv-SE", "id-ID", "ca-CT", "fr-CH", "cs-CZ", "he-IL", "da-DK", "de-DE", "en-MY", "es-US", "lt-LT", "uk-UA", "tr-TR", "th-TH", "en-US", "en-UK", "it-IT", "et-EE", "fi-FI", "ar-XA", "fr-CA", "en-AU", "it-CH", "sl-SL", "de-AT", "no-NO", "es-AR"], "bing images": ["de-DE", "ar-SA", "es-AR", "en-AU", "de-AT", "fr-BE", "nl-BE", "pt-BR", "fr-CA", "en-CA", "ko-KR", "es-ES", "es-US", "en-US", "fr-FR", "zh-HK", "en-IN", "en-ID", "it-IT", "ja-JP", "en-MY", "es-MX", "no-NO", "nl-NL", "pl-PL", "en-GB", "zh-CN", "ru-RU", "en-ZA", "sv-SE", "de-CH", "fr-CH", "zh-TW", "tr-TR"], "qwant social": ["bg-BG", "sv-SE", "ro-RO", "ms-MY", "pt-PT", "pt-AD", "pt-BR", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "gd-GB", "ko-KR", "he-IL", "br-FR", "ja-JP", "fi-FI", "eu-FR", "eu-ES", "el-GR", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "th-TH", "et-EE", "ca-FR", "ca-ES", "ca-AD", "da-DK", "co-FR", "it-IT", "it-CH", "tr-TR", "cs-CZ", "nl-BE", "nl-NL", "no-NO", "hu-HU", "cy-GB", "pl-PL", "ru-RU", "de-DE", "de-AT", "de-CH"], "swisscows": ["browser", "ar-SA", "es-AR", "en-AU", "de-AT", "fr-BE", "nl-BE", "pt-BR", "en-CA", "fr-CA", "es-CL", "zh-CN", "da-DK", "fi-FI", "fr-FR", "de-DE", "zh-HK", "en-IN", "en-IE", "it-IT", "ja-JP", "ko-KR", "en-MY", "es-MX", "nl-NL", "en-NZ", "no-NO", "en-PH", "pl-PL", "pt-PT", "ru-RU", "en-ZA", "es-ES", "sv-SE", "de-CH", "fr-CH", "zh-TW", "tr-TR", "uk-UA", "en-GB", "en-US", "es-US"], "qwant": ["bg-BG", "sv-SE", "ro-RO", "ms-MY", "pt-PT", "pt-AD", "pt-BR", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "gd-GB", "ko-KR", "he-IL", "br-FR", "ja-JP", "fi-FI", "eu-FR", "eu-ES", "el-GR", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "th-TH", "et-EE", "ca-FR", "ca-ES", "ca-AD", "da-DK", "co-FR", "it-IT", "it-CH", "tr-TR", "cs-CZ", "nl-BE", "nl-NL", "no-NO", "hu-HU", "cy-GB", "pl-PL", "ru-RU", "de-DE", "de-AT", "de-CH"], "google news": {"hy": {"name": "Հայերեն"}, "ro": {"name": "Română"}, "eo": {"name": "Esperanto"}, "is": {"name": "Íslenska"}, "ja": {"name": "日本語"}, "fr": {"name": "Français"}, "zh-CN": {"name": "中文 (简体)"}, "pl": {"name": "Polski"}, "sv": {"name": "Svenska"}, "no": {"name": "Norsk"}, "el": {"name": "Ελληνικά"}, "en": {"name": "English"}, "fa": {"name": "فارسی"}, "da": {"name": "Dansk"}, "it": {"name": "Italiano"}, "tr": {"name": "Türkçe"}, "cs": {"name": "Čeština"}, "nl": {"name": "Nederlands"}, "zh-TW": {"name": "中文 (繁體)"}, "be": {"name": "Беларуская"}, "hu": {"name": "Magyar"}, "sk": {"name": "Slovenčina"}, "uk": {"name": "Українська"}, "ko": {"name": "한국어"}, "lt": {"name": "Lietuvių"}, "ru": {"name": "Русский"}, "af": {"name": "Afrikaans"}, "bg": {"name": "Български"}, "tl": {"name": "Filipino"}, "sw": {"name": "Kiswahili"}, "id": {"name": "Indonesia"}, "sl": {"name": "Slovenščina"}, "pt": {"name": "Português"}, "fi": {"name": "Suomi"}, "es": {"name": "Español"}, "th": {"name": "ไทย"}, "et": {"name": "Eesti"}, "ca": {"name": "Català"}, "de": {"name": "Deutsch"}, "sr": {"name": "Српски"}, "hi": {"name": "हिन्दी"}, "ar": {"name": "العربية"}, "lv": {"name": "Latviešu"}, "iw": {"name": "עברית"}, "hr": {"name": "Hrvatski"}, "vi": {"name": "Tiếng Việt"}}, "google": {"hy": {"name": "Հայերեն"}, "ro": {"name": "Română"}, "eo": {"name": "Esperanto"}, "is": {"name": "Íslenska"}, "ja": {"name": "日本語"}, "fr": {"name": "Français"}, "zh-CN": {"name": "中文 (简体)"}, "pl": {"name": "Polski"}, "sv": {"name": "Svenska"}, "no": {"name": "Norsk"}, "el": {"name": "Ελληνικά"}, "en": {"name": "English"}, "fa": {"name": "فارسی"}, "da": {"name": "Dansk"}, "it": {"name": "Italiano"}, "tr": {"name": "Türkçe"}, "cs": {"name": "Čeština"}, "nl": {"name": "Nederlands"}, "zh-TW": {"name": "中文 (繁體)"}, "be": {"name": "Беларуская"}, "hu": {"name": "Magyar"}, "sk": {"name": "Slovenčina"}, "uk": {"name": "Українська"}, "ko": {"name": "한국어"}, "lt": {"name": "Lietuvių"}, "ru": {"name": "Русский"}, "af": {"name": "Afrikaans"}, "bg": {"name": "Български"}, "tl": {"name": "Filipino"}, "sw": {"name": "Kiswahili"}, "id": {"name": "Indonesia"}, "sl": {"name": "Slovenščina"}, "pt": {"name": "Português"}, "fi": {"name": "Suomi"}, "es": {"name": "Español"}, "th": {"name": "ไทย"}, "et": {"name": "Eesti"}, "ca": {"name": "Català"}, "de": {"name": "Deutsch"}, "sr": {"name": "Српски"}, "hi": {"name": "हिन्दी"}, "ar": {"name": "العربية"}, "lv": {"name": "Latviešu"}, "iw": {"name": "עברית"}, "hr": {"name": "Hrvatski"}, "vi": {"name": "Tiếng Việt"}}, "bing news": ["sq", "de", "ar", "bg", "ca", "cs", "zh-CHS", "zh-CHT", "ko", "hr", "da", "sk", "sl", "es", "et", "fi", "fr", "el", "he", "nl", "hu", "id", "en", "is", "it", "ja", "lv", "lt", "ms", "no", "fa", "pl", "pt-BR", "pt-PT", "ro", "ru", "sr", "sv", "th", "tr", "uk", "vi"], "dailymotion": {"io": {"english_name": "Ido"}, "xh": {"english_name": "Xhosa", "name": "Xhosa"}, "as": {"english_name": "Assamese"}, "fy": {"english_name": "Frisian, Western"}, "ff": {"english_name": "Fulah"}, "pl": {"english_name": "Polish", "name": "polski"}, "ks": {"english_name": "Kashmiri"}, "no": {"english_name": "Norwegian"}, "wa": {"english_name": "Walloon", "name": "Walon"}, "iu": {"english_name": "Inuktitut"}, "se": {"english_name": "Sami, Northern"}, "tn": {"english_name": "Tswana"}, "ny": {"english_name": "Nyanja"}, "da": {"english_name": "Danish", "name": "Dansk"}, "gv": {"english_name": "Manx"}, "zh": {"english_name": "Chinese", "name": "中文"}, "qu": {"english_name": "Quechua"}, "cs": {"english_name": "Czech", "name": "čeština"}, "my": {"english_name": "Burmese"}, "nl": {"english_name": "Dutch", "name": "Nederlands"}, "lu": {"english_name": "Luba-Katanga"}, "be": {"english_name": "Belarusian"}, "ml": {"english_name": "Malayalam"}, "oc": {"english_name": "Occitan", "name": "Occitan"}, "de": {"english_name": "German", "name": "Deutsch"}, "gl": {"english_name": "Galician", "name": "Galego"}, "fo": {"english_name": "Faroese"}, "gu": {"english_name": "Gujarati", "name": "ગુજરાતી"}, "st": {"english_name": "Sotho, Southern"}, "ig": {"english_name": "Igbo"}, "os": {"english_name": "Ossetian"}, "mg": {"english_name": "Malagasy"}, "ki": {"english_name": "Kikuyu"}, "sl": {"english_name": "Slovenian", "name": "slovenščina"}, "az": {"english_name": "Azerbaijani", "name": "Azerbaijani"}, "mn": {"english_name": "Mongolian", "name": "Монгол"}, "za": {"english_name": "Zhuang"}, "es": {"english_name": "Spanish", "name": "Español"}, "an": {"english_name": "Aragonese"}, "av": {"english_name": "Avaric"}, "ay": {"english_name": "Aymara"}, "sh": {"english_name": "Serbo-Croatian", "name": "Serbo-Croatian"}, "ps": {"english_name": "Pushto", "name": "Pushto"}, "yo": {"english_name": "Yoruba"}, "tg": {"english_name": "Tajik"}, "kg": {"english_name": "Kongo"}, "lv": {"english_name": "Latvian", "name": "Latviešu"}, "ak": {"english_name": "Akan"}, "it": {"english_name": "Italian", "name": "Italiano"}, "eo": {"english_name": "Esperanto", "name": "Esperanto"}, "wo": {"english_name": "Wolof"}, "is": {"english_name": "Icelandic", "name": "Íslenska"}, "nv": {"english_name": "Navajo"}, "el": {"english_name": "Greek, Modern (1453-)", "name": "Ελληνικά"}, "kn": {"english_name": "Kannada", "name": "ಕನ್ನಡ"}, "tt": {"english_name": "Tatar", "name": "Татарча"}, "nb": {"english_name": "Norwegian Bokmål", "name": "Norwegian Bokmål"}, "fa": {"english_name": "Persian", "name": "فارسی"}, "la": {"english_name": "Latin"}, "ha": {"english_name": "Hausa"}, "ia": {"english_name": "Interlingua"}, "cy": {"english_name": "Welsh", "name": "Cymraeg"}, "na": {"english_name": "Nauru"}, "gn": {"english_name": "Guarani"}, "uk": {"english_name": "Ukrainian", "name": "українська"}, "kl": {"english_name": "Kalaallisut"}, "bs": {"english_name": "Bosnian", "name": "Bosnian"}, "tk": {"english_name": "Turkmen"}, "tl": {"english_name": "Tagalog"}, "so": {"english_name": "Somali"}, "br": {"english_name": "Breton", "name": "Brezhoneg"}, "ko": {"english_name": "Korean", "name": "한국어"}, "nr": {"english_name": "Ndebele, South"}, "sq": {"english_name": "Albanian"}, "eu": {"english_name": "Basque", "name": "Euskara"}, "vo": {"english_name": "Volapük"}, "ee": {"english_name": "Ewe"}, "ve": {"english_name": "Venda", "name": "Venda"}, "ie": {"english_name": "Interlingue"}, "ng": {"english_name": "Ndonga"}, "si": {"english_name": "Sinhala"}, "sr": {"english_name": "Serbian", "name": "српски"}, "lg": {"english_name": "Ganda"}, "ty": {"english_name": "Tahitian"}, "kw": {"english_name": "Cornish"}, "lo": {"english_name": "Lao"}, "ur": {"english_name": "Urdu"}, "ae": {"english_name": "Avestan"}, "yi": {"english_name": "Yiddish"}, "su": {"english_name": "Sundanese"}, "ms": {"english_name": "Malay", "name": "Malay"}, "ja": {"english_name": "Japanese", "name": "日本語"}, "fr": {"english_name": "French", "name": "français"}, "ba": {"english_name": "Bashkir"}, "dv": {"english_name": "Dhivehi"}, "fj": {"english_name": "Fijian"}, "en": {"english_name": "English"}, "uz": {"english_name": "Uzbek"}, "ln": {"english_name": "Lingala"}, "hu": {"english_name": "Hungarian", "name": "magyar"}, "sm": {"english_name": "Samoan"}, "ts": {"english_name": "Tsonga"}, "bm": {"english_name": "Bambara"}, "sk": {"english_name": "Slovak", "name": "Slovenský"}, "id": {"english_name": "Indonesian", "name": "Indonesian"}, "ga": {"english_name": "Irish", "name": "Gaeilge"}, "ku": {"english_name": "Kurdish"}, "to": {"english_name": "Tonga (Tonga Islands)"}, "cr": {"english_name": "Cree"}, "cu": {"english_name": "Slavic, Church"}, "kv": {"english_name": "Komi"}, "tw": {"english_name": "Twi"}, "sc": {"english_name": "Sardinian"}, "ss": {"english_name": "Swati"}, "fi": {"english_name": "Finnish", "name": "suomi"}, "ne": {"english_name": "Nepali (macrolanguage)"}, "vi": {"english_name": "Vietnamese", "name": "Tiếng Việt"}, "kr": {"english_name": "Kanuri"}, "th": {"english_name": "Thai", "name": "ไทย"}, "ru": {"english_name": "Russian", "name": "русский"}, "ca": {"english_name": "Catalan", "name": "Català"}, "sa": {"english_name": "Sanskrit"}, "or": {"english_name": "Oriya", "name": "Oriya"}, "af": {"english_name": "Afrikaans", "name": "Afrikaans"}, "co": {"english_name": "Corsican"}, "kk": {"english_name": "Kazakh"}, "ik": {"english_name": "Inupiaq"}, "hi": {"english_name": "Hindi", "name": "हिंदी"}, "mk": {"english_name": "Macedonian", "name": "Македонски"}, "ho": {"english_name": "Hiri Motu"}, "hr": {"english_name": "Croatian", "name": "hrvatski"}, "jv": {"english_name": "Javanese"}, "hy": {"english_name": "Armenian"}, "ro": {"english_name": "Romanian", "name": "Română"}, "mi": {"english_name": "Maori", "name": "Reo Māori"}, "rn": {"english_name": "Rundi"}, "pi": {"english_name": "Pali"}, "cv": {"english_name": "Chuvash"}, "zu": {"english_name": "Zulu", "name": "Isi-Zulu"}, "mh": {"english_name": "Marshallese"}, "sv": {"english_name": "Swedish", "name": "Svenska"}, "am": {"english_name": "Amharic", "name": "አማርኛ"}, "sn": {"english_name": "Shona"}, "nn": {"english_name": "Norwegian Nynorsk", "name": "Norwegian Nynorsk"}, "ch": {"english_name": "Chamorro"}, "nd": {"english_name": "Ndebele, North"}, "bi": {"english_name": "Bislama"}, "kj": {"english_name": "Kuanyama"}, "dz": {"english_name": "Dzongkha"}, "tr": {"english_name": "Turkish", "name": "Türkçe"}, "sd": {"english_name": "Sindhi"}, "rm": {"english_name": "Romansh"}, "ii": {"english_name": "Yi, Sichuan"}, "ti": {"english_name": "Tigrinya", "name": "ትግርኛ"}, "lt": {"english_name": "Lithuanian", "name": "Lietuvių"}, "et": {"english_name": "Estonian", "name": "Eesti"}, "ky": {"english_name": "Kirghiz"}, "ht": {"english_name": "Haitian"}, "ce": {"english_name": "Chechen"}, "bg": {"english_name": "Bulgarian", "name": "Български"}, "ka": {"english_name": "Georgian"}, "pa": {"english_name": "Panjabi", "name": "ਪੰਜਾਬੀ"}, "lb": {"english_name": "Luxembourgish"}, "mr": {"english_name": "Marathi", "name": "मराठी"}, "gd": {"english_name": "Gaelic, Scottish"}, "sw": {"english_name": "Swahili (macrolanguage)"}, "ug": {"english_name": "Uighur"}, "he": {"english_name": "Hebrew", "name": "עברית"}, "km": {"english_name": "Khmer, Central"}, "pt": {"english_name": "Portuguese", "name": "Português"}, "te": {"english_name": "Telugu"}, "om": {"english_name": "Oromo"}, "bo": {"english_name": "Tibetan"}, "li": {"english_name": "Limburgan"}, "rw": {"english_name": "Kinyarwanda", "name": "Ikinyarwanda"}, "sg": {"english_name": "Sango"}, "bn": {"english_name": "Bengali", "name": "বাংলা"}, "hz": {"english_name": "Herero"}, "ar": {"english_name": "Arabic", "name": "العربية"}, "oj": {"english_name": "Ojibwa"}, "ta": {"english_name": "Tamil", "name": "தமிழ்"}, "mt": {"english_name": "Maltese", "name": "Malti"}}, "gigablast": [], "wikipedia": {"io": {"english_name": "Ido", "articles": 27273, "name": "Ido"}, "xh": {"english_name": "Xhosa", "articles": 714, "name": "isiXhosa"}, "ksh": {"english_name": "Ripuarian", "articles": 2836, "name": "Ripoarisch"}, "ha": {"english_name": "Hausa", "articles": 1530, "name": "هَوُسَ"}, "as": {"english_name": "Assamese", "articles": 4808, "name": "অসমীয়া"}, "fy": {"english_name": "West Frisian", "articles": 39195, "name": "Frysk"}, "arc": {"english_name": "Aramaic", "articles": 1622, "name": "ܐܪܡܝܐ"}, "ast": {"english_name": "Asturian", "articles": 51716, "name": "Asturianu"}, "pap": {"english_name": "Papiamentu", "articles": 1888, "name": "Papiamentu"}, "vls": {"english_name": "West Flemish", "articles": 6243, "name": "West-Vlams"}, "zh-classical": {"english_name": "Classical Chinese", "articles": 7007, "name": "古文 / 文言文"}, "yi": {"english_name": "Yiddish", "articles": 14126, "name": "ייִדיש"}, "pl": {"english_name": "Polish", "articles": 1244203, "name": "Polski"}, "ks": {"english_name": "Kashmiri", "articles": 315, "name": "कश्मीरी / كشميري"}, "no": {"english_name": "Norwegian (Bokmål)", "articles": 476388, "name": "Norsk (Bokmål)"}, "wa": {"english_name": "Walloon", "articles": 14611, "name": "Walon"}, "pnt": {"english_name": "Pontic", "articles": 454, "name": "Ποντιακά"}, "ilo": {"english_name": "Ilokano", "articles": 10848, "name": "Ilokano"}, "iu": {"english_name": "Inuktitut", "articles": 399, "name": "ᐃᓄᒃᑎᑐᑦ"}, "se": {"english_name": "Northern Sami", "articles": 7327, "name": "Sámegiella"}, "tn": {"english_name": "Tswana", "articles": 639, "name": "Setswana"}, "ny": {"english_name": "Chichewa", "articles": 381, "name": "Chichewa"}, "da": {"english_name": "Danish", "articles": 232125, "name": "Dansk"}, "gv": {"english_name": "Manx", "articles": 4961, "name": "Gaelg"}, "cbk-zam": {"english_name": "Zamboanga Chavacano", "articles": 3019, "name": "Chavacano de Zamboanga"}, "zh": {"english_name": "Chinese", "articles": 967529, "name": "中文"}, "qu": {"english_name": "Quechua", "articles": 20284, "name": "Runa Simi"}, "cs": {"english_name": "Czech", "articles": 391061, "name": "Čeština"}, "my": {"english_name": "Burmese", "articles": 37500, "name": "မြန်မာဘာသာ"}, "nl": {"english_name": "Dutch", "articles": 1912963, "name": "Nederlands"}, "glk": {"english_name": "Gilaki", "articles": 5680, "name": "گیلکی"}, "be": {"english_name": "Belarusian", "articles": 146603, "name": "Беларуская"}, "dsb": {"english_name": "Lower Sorbian", "articles": 3092, "name": "Dolnoserbski"}, "ml": {"english_name": "Malayalam", "articles": 52442, "name": "മലയാളം"}, "simple": {"english_name": "Simple English", "articles": 128493, "name": "Simple English"}, "bcl": {"english_name": "Central Bicolano", "articles": 7223, "name": "Bikol"}, "oc": {"english_name": "Occitan", "articles": 83602, "name": "Occitan"}, "bar": {"english_name": "Bavarian", "articles": 23153, "name": "Boarisch"}, "bm": {"english_name": "Bambara", "articles": 429, "name": "Bamanankan"}, "de": {"english_name": "German", "articles": 2109224, "name": "Deutsch"}, "gl": {"english_name": "Galician", "articles": 141613, "name": "Galego"}, "fo": {"english_name": "Faroese", "articles": 12610, "name": "Føroyskt"}, "gu": {"english_name": "Gujarati", "articles": 27423, "name": "ગુજરાતી"}, "pag": {"english_name": "Pangasinan", "articles": 2545, "name": "Pangasinan"}, "fur": {"english_name": "Friulian", "articles": 3195, "name": "Furlan"}, "an": {"english_name": "Aragonese", "articles": 32408, "name": "Aragonés"}, "lij": {"english_name": "Ligurian", "articles": 3281, "name": "Líguru"}, "ab": {"english_name": "Abkhazian", "articles": 3336, "name": "Аҧсуа"}, "ig": {"english_name": "Igbo", "articles": 1387, "name": "Igbo"}, "os": {"english_name": "Ossetian", "articles": 10528, "name": "Иронау"}, "mo": {"english_name": "Moldovan", "articles": 394, "name": "Молдовеняскэ"}, "mg": {"english_name": "Malagasy", "articles": 84696, "name": "Malagasy"}, "fiu-vro": {"english_name": "Võro", "articles": 5483, "name": "Võro"}, "sl": {"english_name": "Slovenian", "articles": 158478, "name": "Slovenščina"}, "nov": {"english_name": "Novial", "articles": 1660, "name": "Novial"}, "az": {"english_name": "Azerbaijani", "articles": 126053, "name": "Azərbaycanca"}, "ay": {"english_name": "Aymara", "articles": 4256, "name": "Aymar"}, "za": {"english_name": "Zhuang", "articles": 1167, "name": "Cuengh"}, "es": {"english_name": "Spanish", "articles": 1358005, "name": "Español"}, "ve": {"english_name": "Venda", "articles": 256, "name": "Tshivenda"}, "gan": {"english_name": "Gan", "articles": 6395, "name": "贛語"}, "zh-min-nan": {"english_name": "Min Nan", "articles": 224681, "name": "Bân-lâm-gú"}, "diq": {"english_name": "Zazaki", "articles": 8688, "name": "Zazaki"}, "av": {"english_name": "Avar", "articles": 2312, "name": "Авар"}, "got": {"english_name": "Gothic", "articles": 507, "name": "𐌲𐌿𐍄𐌹𐍃𐌺"}, "sh": {"english_name": "Serbo-Croatian", "articles": 440192, "name": "Srpskohrvatski / Српскохрватски"}, "ps": {"english_name": "Pashto", "articles": 8391, "name": "پښتو"}, "yo": {"english_name": "Yoruba", "articles": 31588, "name": "Yorùbá"}, "sco": {"english_name": "Scots", "articles": 46796, "name": "Scots"}, "bug": {"english_name": "Buginese", "articles": 14131, "name": "Basa Ugi"}, "tum": {"english_name": "Tumbuka", "articles": 567, "name": "chiTumbuka"}, "tg": {"english_name": "Tajik", "articles": 73631, "name": "Тоҷикӣ"}, "kg": {"english_name": "Kongo", "articles": 1176, "name": "KiKongo"}, "gag": {"english_name": "Gagauz", "articles": 2757, "name": "Gagauz"}, "lv": {"english_name": "Latvian", "articles": 79265, "name": "Latviešu"}, "mai": {"english_name": "Maithili", "articles": 11838, "name": "मैथिली"}, "kbd": {"english_name": "Kabardian Circassian", "articles": 1573, "name": "Адыгэбзэ (Adighabze)"}, "ak": {"english_name": "Akan", "articles": 306, "name": "Akana"}, "ckb": {"english_name": "Sorani", "articles": 19805, "name": "Soranî / کوردی"}, "eo": {"english_name": "Esperanto", "articles": 242064, "name": "Esperanto"}, "wo": {"english_name": "Wolof", "articles": 1157, "name": "Wolof"}, "li": {"english_name": "Limburgish", "articles": 12048, "name": "Limburgs"}, "roa-rup": {"english_name": "Aromanian", "articles": 1210, "name": "Armãneashce"}, "is": {"english_name": "Icelandic", "articles": 43613, "name": "Íslenska"}, "nrm": {"english_name": "Norman", "articles": 3627, "name": "Nouormand/Normaund"}, "so": {"english_name": "Somali", "articles": 4981, "name": "Soomaali"}, "bat-smg": {"english_name": "Samogitian", "articles": 16143, "name": "Žemaitėška"}, "eml": {"english_name": "Emilian-Romagnol", "articles": 9083, "name": "Emiliàn e rumagnòl"}, "nv": {"english_name": "Navajo", "articles": 3604, "name": "Diné bizaad"}, "nso": {"english_name": "Northern Sotho", "articles": 7824, "name": "Sepedi"}, "olo": {"english_name": "Livvi-Karelian", "articles": 2358, "name": "Karjalan"}, "cr": {"english_name": "Cree", "articles": 128, "name": "Nehiyaw"}, "mwl": {"english_name": "Mirandese", "articles": 3469, "name": "Mirandés"}, "krc": {"english_name": "Karachay-Balkar", "articles": 2018, "name": "Къарачай-Малкъар (Qarachay-Malqar)"}, "el": {"english_name": "Greek", "articles": 137467, "name": "Ελληνικά"}, "kn": {"english_name": "Kannada", "articles": 22233, "name": "ಕನ್ನಡ"}, "tt": {"english_name": "Tatar", "articles": 72927, "name": "Tatarça / Татарча"}, "haw": {"english_name": "Hawaiian", "articles": 2017, "name": "Hawai`i"}, "ext": {"english_name": "Extremaduran", "articles": 2911, "name": "Estremeñu"}, "xal": {"english_name": "Kalmyk", "articles": 2074, "name": "Хальмг"}, "fa": {"english_name": "Persian", "articles": 576947, "name": "فارسی"}, "la": {"english_name": "Latin", "articles": 127329, "name": "Latina"}, "lmo": {"english_name": "Lombard", "articles": 36249, "name": "Lumbaart"}, "ltg": {"english_name": "Latgalian", "articles": 801, "name": "Latgaļu"}, "war": {"english_name": "Waray-Waray", "articles": 1262905, "name": "Winaray"}, "zea": {"english_name": "Zeelandic", "articles": 4381, "name": "Zeêuws"}, "ia": {"english_name": "Interlingua", "articles": 20561, "name": "Interlingua"}, "kbp": {"english_name": "Kabɩyɛ", "articles": 573, "name": "Kabiye"}, "cy": {"english_name": "Welsh", "articles": 92570, "name": "Cymraeg"}, "na": {"english_name": "Nauruan", "articles": 1283, "name": "dorerin Naoero"}, "gn": {"english_name": "Guarani", "articles": 3217, "name": "Avañe'ẽ"}, "mn": {"english_name": "Mongolian", "articles": 17575, "name": "Монгол"}, "bs": {"english_name": "Bosnian", "articles": 75821, "name": "Bosanski"}, "sah": {"english_name": "Sakha", "articles": 11415, "name": "Саха тыла (Saxa Tyla)"}, "csb": {"english_name": "Kashubian", "articles": 5213, "name": "Kaszëbsczi"}, "rmy": {"english_name": "Romani", "articles": 601, "name": "romani - रोमानी"}, "pih": {"english_name": "Norfolk", "articles": 620, "name": "Norfuk"}, "tl": {"english_name": "Tagalog", "articles": 83924, "name": "Tagalog"}, "mhr": {"english_name": "Meadow Mari", "articles": 9689, "name": "Олык Марий (Olyk Marij)"}, "bpy": {"english_name": "Bishnupriya Manipuri", "articles": 25079, "name": "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী"}, "stq": {"english_name": "Saterland Frisian", "articles": 3794, "name": "Seeltersk"}, "lrc": {"english_name": "Northern Luri", "articles": 5326, "name": "لۊری شومالی"}, "koi": {"english_name": "Komi-Permyak", "articles": 3453, "name": "Перем Коми (Perem Komi)"}, "hif": {"english_name": "Fiji Hindi", "articles": 9707, "name": "Fiji Hindi"}, "br": {"english_name": "Breton", "articles": 63123, "name": "Brezhoneg"}, "jam": {"english_name": "Jamaican Patois", "articles": 1615, "name": "Jumiekan Kryuol"}, "ja": {"english_name": "Japanese", "articles": 1079370, "name": "日本語"}, "tcy": {"english_name": "Tulu", "articles": 849, "name": "ತುಳು"}, "sq": {"english_name": "Albanian", "articles": 69317, "name": "Shqip"}, "eu": {"english_name": "Basque", "articles": 284158, "name": "Euskara"}, "vo": {"english_name": "Volapük", "articles": 120622, "name": "Volapük"}, "ceb": {"english_name": "Cebuano", "articles": 5382720, "name": "Sinugboanong Binisaya"}, "bh": {"english_name": "Bihari", "articles": 9277, "name": "भोजपुरी"}, "ie": {"english_name": "Interlingue", "articles": 3700, "name": "Interlingue"}, "ang": {"english_name": "Anglo-Saxon", "articles": 2945, "name": "Englisc"}, "pdc": {"english_name": "Pennsylvania German", "articles": 1799, "name": "Deitsch"}, "mdf": {"english_name": "Moksha", "articles": 1179, "name": "Мокшень (Mokshanj Kälj)"}, "si": {"english_name": "Sinhalese", "articles": 13820, "name": "සිංහල"}, "he": {"english_name": "Hebrew", "articles": 213812, "name": "עברית"}, "frr": {"english_name": "North Frisian", "articles": 5475, "name": "Nordfriisk"}, "lbe": {"english_name": "Lak", "articles": 1213, "name": "Лакку"}, "kaa": {"english_name": "Karakalpak", "articles": 1892, "name": "Qaraqalpaqsha"}, "kw": {"english_name": "Cornish", "articles": 3792, "name": "Kernewek/Karnuack"}, "pcd": {"english_name": "Picard", "articles": 3535, "name": "Picard"}, "lo": {"english_name": "Lao", "articles": 2758, "name": "ລາວ"}, "pfl": {"english_name": "Palatinate German", "articles": 2070, "name": "Pälzisch"}, "vi": {"english_name": "Vietnamese", "articles": 1162191, "name": "Tiếng Việt"}, "be-tarask": {"english_name": "Belarusian (Taraškievica)", "articles": 61480, "name": "Беларуская (тарашкевіца)"}, "pms": {"english_name": "Piedmontese", "articles": 64198, "name": "Piemontèis"}, "rn": {"english_name": "Kirundi", "articles": 500, "name": "Kirundi"}, "su": {"english_name": "Sundanese", "articles": 38784, "name": "Basa Sunda"}, "ms": {"english_name": "Malay", "articles": 304280, "name": "Bahasa Melayu"}, "nah": {"english_name": "Nahuatl", "articles": 7119, "name": "Nāhuatl"}, "fr": {"english_name": "French", "articles": 1917429, "name": "Français"}, "ba": {"english_name": "Bashkir", "articles": 40027, "name": "Башҡорт"}, "tpi": {"english_name": "Tok Pisin", "articles": 1425, "name": "Tok Pisin"}, "ff": {"english_name": "Fula", "articles": 224, "name": "Fulfulde"}, "sm": {"english_name": "Samoan", "articles": 786, "name": "Gagana Samoa"}, "bxr": {"english_name": "Buryat", "articles": 2018, "name": "Буряад"}, "tet": {"english_name": "Tetum", "articles": 1418, "name": "Tetun"}, "dv": {"english_name": "Divehi", "articles": 3008, "name": "ދިވެހިބަސް"}, "fj": {"english_name": "Fijian", "articles": 430, "name": "Na Vosa Vakaviti"}, "szl": {"english_name": "Silesian", "articles": 6409, "name": "Ślůnski"}, "en": {"english_name": "English", "articles": 5490540, "name": "English"}, "uz": {"english_name": "Uzbek", "articles": 129075, "name": "O‘zbek"}, "dty": {"english_name": "डोटेली", "articles": 2128, "name": "Doteli"}, "ln": {"english_name": "Lingala", "articles": 2916, "name": "Lingala"}, "vep": {"english_name": "Vepsian", "articles": 5645, "name": "Vepsän"}, "vec": {"english_name": "Venetian", "articles": 10982, "name": "Vèneto"}, "new": {"english_name": "Newar", "articles": 72139, "name": "नेपाल भाषा"}, "ur": {"english_name": "Urdu", "articles": 124450, "name": "اردو"}, "mrj": {"english_name": "Hill Mari", "articles": 10265, "name": "Кырык Мары (Kyryk Mary)"}, "ts": {"english_name": "Tsonga", "articles": 540, "name": "Xitsonga"}, "hu": {"english_name": "Hungarian", "articles": 418142, "name": "Magyar"}, "sk": {"english_name": "Slovak", "articles": 223150, "name": "Slovenčina"}, "id": {"english_name": "Indonesian", "articles": 411506, "name": "Bahasa Indonesia"}, "ga": {"english_name": "Irish", "articles": 44243, "name": "Gaeilge"}, "ru": {"english_name": "Russian", "articles": 1425925, "name": "Русский"}, "to": {"english_name": "Tongan", "articles": 1689, "name": "faka Tonga"}, "chr": {"english_name": "Cherokee", "articles": 883, "name": "ᏣᎳᎩ"}, "hak": {"english_name": "Hakka", "articles": 8009, "name": "Hak-kâ-fa / 客家話"}, "map-bms": {"english_name": "Banyumasan", "articles": 13294, "name": "Basa Banyumasan"}, "gom": {"english_name": "Goan Konkani", "articles": 3380, "name": "गोंयची कोंकणी / Gõychi Konknni"}, "kv": {"english_name": "Komi", "articles": 5254, "name": "Коми"}, "tw": {"english_name": "Twi", "articles": 595, "name": "Twi"}, "bi": {"english_name": "Bislama", "articles": 1140, "name": "Bislama"}, "srn": {"english_name": "Sranan", "articles": 1059, "name": "Sranantongo"}, "lg": {"english_name": "Luganda", "articles": 1154, "name": "Luganda"}, "ady": {"english_name": "Adyghe", "articles": 403, "name": "Адыгэбзэ"}, "udm": {"english_name": "Udmurt", "articles": 4125, "name": "Удмурт кыл"}, "rw": {"english_name": "Kinyarwanda", "articles": 1812, "name": "Ikinyarwanda"}, "ss": {"english_name": "Swati", "articles": 432, "name": "SiSwati"}, "nds-nl": {"english_name": "Dutch Low Saxon", "articles": 6743, "name": "Nedersaksisch"}, "fi": {"english_name": "Finnish", "articles": 423220, "name": "Suomi"}, "ki": {"english_name": "Kikuyu", "articles": 1349, "name": "Gĩkũyũ"}, "tyv": {"english_name": "Tuvan", "articles": 1419, "name": "Тыва"}, "rue": {"english_name": "Rusyn", "articles": 6194, "name": "Русиньскый"}, "th": {"english_name": "Thai", "articles": 119427, "name": "ไทย"}, "bn": {"english_name": "Bengali", "articles": 52765, "name": "বাংলা"}, "ku": {"english_name": "Kurdish", "articles": 23052, "name": "Kurdî / كوردی"}, "ca": {"english_name": "Catalan", "articles": 557833, "name": "Català"}, "sa": {"english_name": "Sanskrit", "articles": 11182, "name": "संस्कृतम्"}, "or": {"english_name": "Oriya", "articles": 13175, "name": "ଓଡ଼ିଆ"}, "st": {"english_name": "Sesotho", "articles": 526, "name": "Sesotho"}, "af": {"english_name": "Afrikaans", "articles": 47107, "name": "Afrikaans"}, "sg": {"english_name": "Sango", "articles": 253, "name": "Sängö"}, "kk": {"english_name": "Kazakh", "articles": 219662, "name": "Қазақша"}, "ik": {"english_name": "Inupiak", "articles": 256, "name": "Iñupiak"}, "kab": {"english_name": "Kabyle", "articles": 2894, "name": "Taqbaylit"}, "hi": {"english_name": "Hindi", "articles": 121543, "name": "हिन्दी"}, "scn": {"english_name": "Sicilian", "articles": 25670, "name": "Sicilianu"}, "mk": {"english_name": "Macedonian", "articles": 90814, "name": "Македонски"}, "wuu": {"english_name": "Wu", "articles": 6073, "name": "吴语"}, "azb": {"english_name": "South Azerbaijani", "articles": 47457, "name": "تۆرکجه"}, "kl": {"english_name": "Greenlandic", "articles": 1638, "name": "Kalaallisut"}, "cu": {"english_name": "Old Church Slavonic", "articles": 591, "name": "Словѣньскъ"}, "crh": {"english_name": "Crimean Tatar", "articles": 5414, "name": "Qırımtatarca"}, "hr": {"english_name": "Croatian", "articles": 178083, "name": "Hrvatski"}, "lez": {"english_name": "Lezgian", "articles": 3852, "name": "Лезги чІал (Lezgi č’al)"}, "ti": {"english_name": "Tigrinya", "articles": 163, "name": "ትግርኛ"}, "jv": {"english_name": "Javanese", "articles": 50293, "name": "Basa Jawa"}, "hy": {"english_name": "Armenian", "articles": 232758, "name": "Հայերեն"}, "ro": {"english_name": "Romanian", "articles": 379516, "name": "Română"}, "mi": {"english_name": "Maori", "articles": 7133, "name": "Māori"}, "sc": {"english_name": "Sardinian", "articles": 5528, "name": "Sardu"}, "myv": {"english_name": "Erzya", "articles": 3939, "name": "Эрзянь (Erzjanj Kelj)"}, "pi": {"english_name": "Pali", "articles": 2525, "name": "पाऴि"}, "bjn": {"english_name": "Banjar", "articles": 1761, "name": "Bahasa Banjar"}, "cv": {"english_name": "Chuvash", "articles": 40690, "name": "Чăваш"}, "zu": {"english_name": "Zulu", "articles": 957, "name": "isiZulu"}, "tk": {"english_name": "Turkmen", "articles": 5267, "name": "تركمن / Туркмен"}, "sv": {"english_name": "Swedish", "articles": 3789235, "name": "Svenska"}, "am": {"english_name": "Amharic", "articles": 13861, "name": "አማርኛ"}, "arz": {"english_name": "Egyptian Arabic", "articles": 17363, "name": "مصرى (Maṣri)"}, "sn": {"english_name": "Shona", "articles": 2868, "name": "chiShona"}, "ee": {"english_name": "Ewe", "articles": 338, "name": "Eʋegbe"}, "xmf": {"english_name": "Mingrelian", "articles": 12279, "name": "მარგალური (Margaluri)"}, "nn": {"english_name": "Norwegian (Nynorsk)", "articles": 135175, "name": "Nynorsk"}, "ch": {"english_name": "Chamorro", "articles": 423, "name": "Chamoru"}, "als": {"english_name": "Alemannic", "articles": 23406, "name": "Alemannisch"}, "nds": {"english_name": "Low Saxon", "articles": 26780, "name": "Plattdüütsch"}, "it": {"english_name": "Italian", "articles": 1388262, "name": "Italiano"}, "dz": {"english_name": "Dzongkha", "articles": 228, "name": "ཇོང་ཁ"}, "tr": {"english_name": "Turkish", "articles": 299690, "name": "Türkçe"}, "ty": {"english_name": "Tahitian", "articles": 1191, "name": "Reo Mā`ohi"}, "pnb": {"english_name": "Western Punjabi", "articles": 45249, "name": "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)"}, "sd": {"english_name": "Sindhi", "articles": 8251, "name": "سنڌي، سندھی ، सिन्ध"}, "rm": {"english_name": "Romansh", "articles": 3455, "name": "Rumantsch"}, "ko": {"english_name": "Korean", "articles": 399300, "name": "한국어"}, "lt": {"english_name": "Lithuanian", "articles": 183261, "name": "Lietuvių"}, "et": {"english_name": "Estonian", "articles": 162182, "name": "Eesti"}, "ky": {"english_name": "Kirghiz", "articles": 80579, "name": "Кыргызча"}, "ht": {"english_name": "Haitian", "articles": 51554, "name": "Krèyol ayisyen"}, "ce": {"english_name": "Chechen", "articles": 164438, "name": "Нохчийн"}, "bg": {"english_name": "Bulgarian", "articles": 235084, "name": "Български"}, "ka": {"english_name": "Georgian", "articles": 117872, "name": "ქართული"}, "frp": {"english_name": "Franco-Provençal", "articles": 2633, "name": "Arpitan"}, "nap": {"english_name": "Neapolitan", "articles": 14470, "name": "Nnapulitano"}, "pa": {"english_name": "Punjabi", "articles": 26967, "name": "ਪੰਜਾਬੀ"}, "pam": {"english_name": "Kapampangan", "articles": 8553, "name": "Kapampangan"}, "lb": {"english_name": "Luxembourgish", "articles": 50445, "name": "Lëtzebuergesch"}, "mr": {"english_name": "Marathi", "articles": 48748, "name": "मराठी"}, "gd": {"english_name": "Scottish Gaelic", "articles": 14594, "name": "Gàidhlig"}, "sw": {"english_name": "Swahili", "articles": 37911, "name": "Kiswahili"}, "ug": {"english_name": "Uyghur", "articles": 3367, "name": "ئۇيغۇر تىلى"}, "sr": {"english_name": "Serbian", "articles": 357090, "name": "Српски / Srpski"}, "km": {"english_name": "Khmer", "articles": 5385, "name": "ភាសាខ្មែរ"}, "pt": {"english_name": "Portuguese", "articles": 979830, "name": "Português"}, "te": {"english_name": "Telugu", "articles": 67631, "name": "తెలుగు"}, "ne": {"english_name": "Nepali", "articles": 30112, "name": "नेपाली"}, "chy": {"english_name": "Cheyenne", "articles": 610, "name": "Tsetsêhestâhese"}, "om": {"english_name": "Oromo", "articles": 728, "name": "Oromoo"}, "jbo": {"english_name": "Lojban", "articles": 1201, "name": "Lojban"}, "bo": {"english_name": "Tibetan", "articles": 5726, "name": "བོད་སྐད"}, "uk": {"english_name": "Ukrainian", "articles": 740713, "name": "Українська"}, "hsb": {"english_name": "Upper Sorbian", "articles": 12354, "name": "Hornjoserbsce"}, "co": {"english_name": "Corsican", "articles": 5460, "name": "Corsu"}, "min": {"english_name": "Minangkabau", "articles": 222028, "name": "Minangkabau"}, "lad": {"english_name": "Ladino", "articles": 4512, "name": "Dzhudezmo"}, "roa-tara": {"english_name": "Tarantino", "articles": 9234, "name": "Tarandíne"}, "ace": {"english_name": "Acehnese", "articles": 7231, "name": "Bahsa Acèh"}, "zh-yue": {"english_name": "Cantonese", "articles": 61128, "name": "粵語"}, "mzn": {"english_name": "Mazandarani", "articles": 12564, "name": "مَزِروني"}, "ar": {"english_name": "Arabic", "articles": 542561, "name": "العربية"}, "ta": {"english_name": "Tamil", "articles": 113411, "name": "தமிழ்"}, "cdo": {"english_name": "Min Dong", "articles": 13442, "name": "Mìng-dĕ̤ng-ngṳ̄"}, "mt": {"english_name": "Maltese", "articles": 3213, "name": "Malti"}}, "qwant images": ["bg-BG", "sv-SE", "ro-RO", "ms-MY", "pt-PT", "pt-AD", "pt-BR", "fr-FR", "fr-BE", "fr-CH", "fr-AD", "fr-CA", "gd-GB", "ko-KR", "he-IL", "br-FR", "ja-JP", "fi-FI", "eu-FR", "eu-ES", "el-GR", "es-ES", "es-AD", "es-AR", "es-CL", "es-MX", "en-GB", "en-IE", "en-SG", "en-IN", "en-MY", "en-AU", "en-US", "en-CA", "en-PH", "en-NZ", "th-TH", "et-EE", "ca-FR", "ca-ES", "ca-AD", "da-DK", "co-FR", "it-IT", "it-CH", "tr-TR", "cs-CZ", "nl-BE", "nl-NL", "no-NO", "hu-HU", "cy-GB", "pl-PL", "ru-RU", "de-DE", "de-AT", "de-CH"], "yahoo": ["ar", "bg", "zh-chs", "zh-cht", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "el", "he", "hu", "it", "ja", "ko", "lv", "lt", "no", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr"]} \ No newline at end of file diff --git a/searx/engines/duckduckgo.py b/searx/engines/duckduckgo.py index 407d731f0..921e29f8b 100644 --- a/searx/engines/duckduckgo.py +++ b/searx/engines/duckduckgo.py @@ -134,4 +134,4 @@ def _fetch_supported_languages(resp): regions_json = loads(response_page) supported_languages = map((lambda x: x[3:] + '-' + x[:2].upper()), regions_json.keys()) - return supported_languages + return list(supported_languages) diff --git a/searx/engines/swisscows.py b/searx/engines/swisscows.py index e9c13ca24..00346a7d0 100644 --- a/searx/engines/swisscows.py +++ b/searx/engines/swisscows.py @@ -118,7 +118,7 @@ def _fetch_supported_languages(resp): dom = fromstring(resp.text) options = dom.xpath('//div[@id="regions-popup"]//ul/li/a') for option in options: - code = option.xpath('./@data-val')[0] + code = option.xpath('./@data-search-language')[0] if code.startswith('nb-'): code = code.replace('nb', 'no', 1) supported_languages.append(code) diff --git a/searx/languages.py b/searx/languages.py index 22229f797..5fa952708 100644 --- a/searx/languages.py +++ b/searx/languages.py @@ -5,6 +5,11 @@ language_codes = ( (u"ar-SA", u"العربية", u"", u"Arabic"), (u"bg-BG", u"Български", u"", u"Bulgarian"), + (u"ca", u"Català", u"", u"Catalan"), + (u"ca-AD", u"Català", u"Andorra", u"Catalan"), + (u"ca-CT", u"Català", u"", u"Catalan"), + (u"ca-ES", u"Català", u"Espanya", u"Catalan"), + (u"ca-FR", u"Català", u"França", u"Catalan"), (u"cs-CZ", u"Čeština", u"", u"Czech"), (u"da-DK", u"Dansk", u"", u"Danish"), (u"de", u"Deutsch", u"", u"German"), @@ -15,9 +20,7 @@ language_codes = ( (u"en", u"English", u"", u"English"), (u"en-AU", u"English", u"Australia", u"English"), (u"en-CA", u"English", u"Canada", u"English"), - (u"en-CY", u"English", u"Cyprus", u"English"), (u"en-GB", u"English", u"United Kingdom", u"English"), - (u"en-GD", u"English", u"Grenada", u"English"), (u"en-ID", u"English", u"Indonesia", u"English"), (u"en-IE", u"English", u"Ireland", u"English"), (u"en-IN", u"English", u"India", u"English"), @@ -28,6 +31,7 @@ language_codes = ( (u"en-US", u"English", u"United States", u"English"), (u"en-ZA", u"English", u"South Africa", u"English"), (u"es", u"Español", u"", u"Spanish"), + (u"es-AD", u"Español", u"Andorra", u"Spanish"), (u"es-AR", u"Español", u"Argentina", u"Spanish"), (u"es-CL", u"Español", u"Chile", u"Spanish"), (u"es-CO", u"Español", u"Colombia", u"Spanish"), @@ -38,38 +42,32 @@ language_codes = ( (u"et-EE", u"Eesti", u"", u"Estonian"), (u"fi-FI", u"Suomi", u"", u"Finnish"), (u"fr", u"Français", u"", u"French"), + (u"fr-AD", u"Français", u"Andorre", u"French"), (u"fr-BE", u"Français", u"Belgique", u"French"), (u"fr-CA", u"Français", u"Canada", u"French"), (u"fr-CH", u"Français", u"Suisse", u"French"), (u"fr-FR", u"Français", u"France", u"French"), (u"he-IL", u"עברית", u"", u"Hebrew"), - (u"hr-HR", u"Hrvatski", u"", u"Croatian"), (u"hu-HU", u"Magyar", u"", u"Hungarian"), - (u"id-ID", u"Bahasa Indonesia", u"", u"Indonesian"), (u"it", u"Italiano", u"", u"Italian"), (u"it-CH", u"Italiano", u"Svizzera", u"Italian"), (u"it-IT", u"Italiano", u"Italia", u"Italian"), (u"ja-JP", u"日本語", u"", u"Japanese"), (u"ko-KR", u"한국어", u"", u"Korean"), - (u"lt-LT", u"Lietuvių", u"", u"Lithuanian"), - (u"lv-LV", u"Latviešu", u"", u"Latvian"), - (u"ms-MY", u"Bahasa Melayu", u"", u"Malay"), (u"nl", u"Nederlands", u"", u"Dutch"), (u"nl-BE", u"Nederlands", u"België", u"Dutch"), (u"nl-NL", u"Nederlands", u"Nederland", u"Dutch"), (u"no-NO", u"Norsk", u"", u"Norwegian"), (u"pl-PL", u"Polski", u"", u"Polish"), (u"pt", u"Português", u"", u"Portuguese"), + (u"pt-AD", u"Português", u"Andorra", u"Portuguese"), (u"pt-BR", u"Português", u"Brasil", u"Portuguese"), (u"pt-PT", u"Português", u"Portugal", u"Portuguese"), (u"ro-RO", u"Română", u"", u"Romanian"), (u"ru-RU", u"Русский", u"", u"Russian"), - (u"sk-SK", u"Slovenčina", u"", u"Slovak"), - (u"sl", u"Slovenščina", u"", u"Slovenian"), (u"sv-SE", u"Svenska", u"", u"Swedish"), (u"th-TH", u"ไทย", u"", u"Thai"), (u"tr-TR", u"Türkçe", u"", u"Turkish"), - (u"vi-VN", u"Tiếng Việt", u"", u"Vietnamese"), (u"zh", u"中文", u"", u"Chinese"), (u"zh-CN", u"中文", u"中国", u"Chinese"), (u"zh-HK", u"中文", u"香港", u"Chinese"), diff --git a/tests/unit/engines/test_swisscows.py b/tests/unit/engines/test_swisscows.py index 53890be78..492526f94 100644 --- a/tests/unit/engines/test_swisscows.py +++ b/tests/unit/engines/test_swisscows.py @@ -139,9 +139,9 @@ class TestSwisscowsEngine(SearxTestCase):
    -
  • -
  • -
  • +
  • +
  • +
diff --git a/utils/fetch_languages.py b/utils/fetch_languages.py index 3241370c0..424f400fa 100644 --- a/utils/fetch_languages.py +++ b/utils/fetch_languages.py @@ -8,13 +8,13 @@ # are written in current directory to avoid overwriting in case something goes wrong. from requests import get -from urllib import urlencode from lxml.html import fromstring -from json import loads, dumps +from json import loads, dump import io from sys import path path.append('../searx') # noqa from searx import settings +from searx.url_utils import urlencode from searx.engines import initialize_engines, engines # Geonames API for country names. @@ -70,7 +70,7 @@ def get_country_name(locale): json = loads(response.text) content = json.get('geonames', None) if content is None or len(content) != 1: - print "No country name found for " + locale[0] + "-" + locale[1] + print("No country name found for " + locale[0] + "-" + locale[1]) return '' return content[0].get('countryName', '') @@ -84,11 +84,11 @@ def fetch_supported_languages(): try: engines_languages[engine_name] = engines[engine_name].fetch_supported_languages() except Exception as e: - print e + print(e) # write json file with io.open(engines_languages_file, "w", encoding="utf-8") as f: - f.write(unicode(dumps(engines_languages, ensure_ascii=False, encoding="utf-8"))) + dump(engines_languages, f, ensure_ascii=False) # Join all language lists. @@ -97,7 +97,7 @@ def join_language_lists(): global languages # include wikipedia first for more accurate language names languages = {code: lang for code, lang - in engines_languages['wikipedia'].iteritems() + in engines_languages['wikipedia'].items() if valid_code(code)} for engine_name in engines_languages: @@ -121,7 +121,7 @@ def join_language_lists(): # filter list to include only languages supported by most engines min_supported_engines = int(0.70 * len(engines_languages)) languages = {code: lang for code, lang - in languages.iteritems() + in languages.items() if len(lang.get('counter', [])) >= min_supported_engines or len(languages.get(code.split('-')[0], {}).get('counter', [])) >= min_supported_engines} @@ -165,7 +165,7 @@ def filter_single_country_languages(): # Write languages.py. def write_languages_file(): - new_file = open(languages_file, 'w') + new_file = open(languages_file, 'wb') file_content = '# -*- coding: utf-8 -*-\n'\ + '# list of language codes\n'\ + '# this file is generated automatically by utils/update_search_languages.py\n'\ From 54f0ab1f3bd6bcd05eb2108a3a2eeaf5bd71ab61 Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 10 Oct 2017 17:30:43 -0500 Subject: [PATCH 36/39] test fetch langauges function on bing images --- tests/unit/engines/test_bing_images.py | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/unit/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py index 8b0bdb39d..3f3006124 100644 --- a/tests/unit/engines/test_bing_images.py +++ b/tests/unit/engines/test_bing_images.py @@ -25,10 +25,15 @@ class TestBingImagesEngine(SearxTestCase): self.assertTrue('_EDGE_S' in params['cookies']) self.assertTrue('fr-fr' in params['cookies']['_EDGE_S']) + dicto['language'] = 'fr' + params = bing_images.request(query, dicto) + self.assertTrue('_EDGE_S' in params['cookies']) + self.assertTrue('fr-fr' in params['cookies']['_EDGE_S']) + dicto['language'] = 'all' params = bing_images.request(query, dicto) self.assertTrue('_EDGE_S' in params['cookies']) - self.assertTrue('en' in params['cookies']['_EDGE_S']) + self.assertTrue('en-us' in params['cookies']['_EDGE_S']) def test_response(self): self.assertRaises(AttributeError, bing_images.response, None) @@ -86,3 +91,28 @@ class TestBingImagesEngine(SearxTestCase): self.assertEqual(results[0]['content'], '') self.assertEqual(results[0]['thumbnail_src'], 'thumb_url') self.assertEqual(results[0]['img_src'], 'img_url') + + def test_fetch_supported_languages(self): + html = """ +
+
+ + +
+
+ """ + response = mock.Mock(text=html) + languages = list(bing_images._fetch_supported_languages(response)) + self.assertEqual(len(languages), 3) + self.assertIn('de-DE', languages) + self.assertIn('no-NO', languages) + self.assertIn('es-AR', languages) From db27c6fa5f2845c0ff533d324a51400f4a625cea Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 10 Oct 2017 19:10:36 -0500 Subject: [PATCH 37/39] fix less to stable version 3.0 is still alpha and currently breaks when building styles --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 74cf2371a..ce0509201 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ python: before_install: - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" - - npm install less less-plugin-clean-css grunt-cli + - npm install less@2.7 less-plugin-clean-css grunt-cli - export PATH=`pwd`/node_modules/.bin:$PATH - ./manage.sh install_geckodriver ~/drivers - export PATH=~/drivers:$PATH From 904a8e7e3f62b32c117ecddfeae39ef3f5e47d1f Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Wed, 18 Oct 2017 23:44:11 -0400 Subject: [PATCH 38/39] Remove extra / in url_for parameter for oscar theme The `filename` parameter of the `url_for` function doesn't need a leading `/`, or else the resulting URL features a double-slash `//` that throws off searx 0.12.0 with Apache 2.4.25 on Debian, resulting in missing favicons. --- searx/templates/oscar/macros.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/templates/oscar/macros.html b/searx/templates/oscar/macros.html index 6235bcc62..0ff957521 100644 --- a/searx/templates/oscar/macros.html +++ b/searx/templates/oscar/macros.html @@ -5,7 +5,7 @@ {% macro draw_favicon(favicon) -%} - {{ favicon }} + {{ favicon }} {%- endmacro %} {%- macro result_link(url, title, classes='') -%} From d506d87f60662ece723bae04e930b6b1d8d1f2d0 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Wed, 18 Oct 2017 23:45:30 -0400 Subject: [PATCH 39/39] Remove / in url_for parameter for simple theme Same change as with the oscar theme. --- searx/templates/simple/macros.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/templates/simple/macros.html b/searx/templates/simple/macros.html index 883503683..f0b36276c 100644 --- a/searx/templates/simple/macros.html +++ b/searx/templates/simple/macros.html @@ -9,7 +9,7 @@ {% macro draw_favicon(favicon) -%} - {{ favicon }} + {{ favicon }} {%- endmacro %} {% macro result_open_link(url, classes='') -%}