on master help sign in
[enh] search language support init
commit2a788c8f29f63bc069436f1a12343a47d66f2523 authorasciimoo <asciimoo@gmail.com> dateFri 31 Jan 2014, 04:35 (13 years ago) parent90a9342
9 files changed+162−13
searx/engines/__init__.py+11−1 searx/engines/bing.py+9−3 searx/engines/google.py+9−4 searx/engines/wikipedia.py+30 searx/languages.py+59 searx/settings.yml+1−2 searx/static/css/style.css+2−1 searx/templates/preferences.html+11 searx/webapp.py+30−2
searx/engines/__init__.py+11−1
@@ -53,8 +53,14 @@ if not 'engines' in settings or not settings['engines']:
5353for engine_data in settings['engines']:
5454 engine_name = engine_data['engine']
5555 engine = load_module(engine_name + '.py')
56+
5657 if not hasattr(engine, 'paging'):
5758 engine.paging = False
59+
60+ if not hasattr(engine, 'language_support'):
61+ #engine.language_support = False
62+ engine.language_support = True
63+
5864 for param_name in engine_data:
5965 if param_name == 'engine':
6066 continue
@@ -158,7 +164,7 @@ def score_results(results):
158164 return sorted(results, key=itemgetter('score'), reverse=True)
159165
160166
161−def search(query, request, selected_engines, pageno=1):
167+def search(query, request, selected_engines, pageno=1, lang='all'):
162168 global engines, categories, number_of_searches
163169 requests = []
164170 results = {}
@@ -176,11 +182,15 @@ def search(query, request, selected_engines, pageno=1):
176182 if pageno > 1 and not engine.paging:
177183 continue
178184
185+ if lang != 'all' and not engine.language_support:
186+ continue
187+
179188 request_params = default_request_params()
180189 request_params['headers']['User-Agent'] = user_agent
181190 request_params['category'] = selected_engine['category']
182191 request_params['started'] = datetime.now()
183192 request_params['pageno'] = pageno
193+ request_params['language'] = lang
184194 request_params = engine.request(query, request_params)
185195
186196 callback = make_callback(
searx/engines/bing.py+9−3
@@ -4,16 +4,22 @@ from cgi import escape
44
55base_url = 'http://www.bing.com/'
66search_string = 'search?{query}&first={offset}'
7−locale = 'en-US' # see http://msdn.microsoft.com/en-us/library/dd251064.aspx
8−
97paging = True
8+language_support = True
109
1110
1211def request(query, params):
1312 offset = (params['pageno'] - 1) * 10 + 1
13+ if params['language'] == 'all':
14+ language = 'en-US'
15+ else:
16+ language = params['language'].replace('_', '-')
1417 search_path = search_string.format(
15− query=urlencode({'q': query, 'setmkt': locale}),
18+ query=urlencode({'q': query, 'setmkt': language}),
1619 offset=offset)
20+
21+ params['cookies']['SRCHHPGUSR'] = \
22+ 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0]
1723 #if params['category'] == 'images':
1824 # params['url'] = base_url + 'images/' + search_path
1925 params['url'] = base_url + search_path
searx/engines/google.py+9−4
@@ -5,16 +5,21 @@ from json import loads
55
66categories = ['general']
77
8−paging = True
9−
108url = 'https://ajax.googleapis.com/'
11−search_url = url + 'ajax/services/search/web?v=1.0&start={offset}&rsz=large&safe=off&filter=off&{query}' # noqa
9+search_url = url + 'ajax/services/search/web?v=2.0&start={offset}&rsz=large&safe=off&filter=off&{query}&hl={language}' # noqa
10+
11+paging = True
12+language_support = True
1213
1314
1415def request(query, params):
1516 offset = (params['pageno'] - 1) * 8
17+ language = 'en-US'
18+ if params['language'] != 'all':
19+ language = params['language'].replace('_', '-')
1620 params['url'] = search_url.format(offset=offset,
17− query=urlencode({'q': query}))
21+ query=urlencode({'q': query}),
22+ language=language)
1823 return params
1924
2025
searx/engines/wikipedia.pynew file+30
@@ -0,0 +1,30 @@
1+from json import loads
2+from urllib import urlencode, quote
3+
4+url = 'https://{language}.wikipedia.org/'
5+
6+search_url = url + 'w/api.php?action=query&list=search&{query}&srprop=timestamp&format=json&sroffset={offset}' # noqa
7+
8+number_of_results = 10
9+
10+language_support = True
11+
12+
13+def request(query, params):
14+ offset = (params['pageno'] - 1) * 10
15+ if params['language'] == 'all':
16+ language = 'en'
17+ else:
18+ language = params['language'].split('_')[0]
19+ params['language'] = language
20+ params['url'] = search_url.format(query=urlencode({'srsearch': query}),
21+ offset=offset,
22+ language=language)
23+ return params
24+
25+
26+def response(resp):
27+ search_results = loads(resp.text)
28+ res = search_results.get('query', {}).get('search', [])
29+ return [{'url': url.format(language=resp.search_params['language']) + 'wiki/' + quote(result['title'].replace(' ', '_').encode('utf-8')), # noqa
30+ 'title': result['title']} for result in res[:int(number_of_results)]]
searx/languages.pynew file+59
@@ -0,0 +1,59 @@
1+language_codes = (
2+ ("ar_XA", "Arabic", "Arabia"),
3+ ("bg_BG", "Bulgarian", "Bulgaria"),
4+ ("cs_CZ", "Czech", "Czech Republic"),
5+ ("de_DE", "German", "Germany"),
6+ ("da_DK", "Danish", "Denmark"),
7+ ("de_AT", "German", "Austria"),
8+ ("de_CH", "German", "Switzerland"),
9+ ("el_GR", "Greek", "Greece"),
10+ ("en_AU", "English", "Australia"),
11+ ("en_CA", "English", "Canada"),
12+ ("en_GB", "English", "United Kingdom"),
13+ ("en_ID", "English", "Indonesia"),
14+ ("en_IE", "English", "Ireland"),
15+ ("en_IN", "English", "India"),
16+ ("en_MY", "English", "Malaysia"),
17+ ("en_NZ", "English", "New Zealand"),
18+ ("en_PH", "English", "Philippines"),
19+ ("en_SG", "English", "Singapore"),
20+ ("en_US", "English", "United States"),
21+ ("en_XA", "English", "Arabia"),
22+ ("en_ZA", "English", "South Africa"),
23+ ("es_AR", "Spanish", "Argentina"),
24+ ("es_CL", "Spanish", "Chile"),
25+ ("es_ES", "Spanish", "Spain"),
26+ ("es_MX", "Spanish", "Mexico"),
27+ ("es_US", "Spanish", "United States"),
28+ ("es_XL", "Spanish", "Latin America"),
29+ ("et_EE", "Estonian", "Estonia"),
30+ ("fi_FI", "Finnish", "Finland"),
31+ ("fr_BE", "French", "Belgium"),
32+ ("fr_CA", "French", "Canada"),
33+ ("fr_CH", "French", "Switzerland"),
34+ ("fr_FR", "French", "France"),
35+ ("he_IL", "Hebrew", "Israel"),
36+ ("hr_HR", "Croatian", "Croatia"),
37+ ("hu_HU", "Hungarian", "Hungary"),
38+ ("it_IT", "Italian", "Italy"),
39+ ("ja_JP", "Japanese", "Japan"),
40+ ("ko_KR", "Korean", "Korea"),
41+ ("lt_LT", "Lithuanian", "Lithuania"),
42+ ("lv_LV", "Latvian", "Latvia"),
43+ ("nb_NO", "Norwegian", "Norway"),
44+ ("nl_BE", "Dutch", "Belgium"),
45+ ("nl_NL", "Dutch", "Netherlands"),
46+ ("pl_PL", "Polish", "Poland"),
47+ ("pt_BR", "Portuguese", "Brazil"),
48+ ("pt_PT", "Portuguese", "Portugal"),
49+ ("ro_RO", "Romanian", "Romania"),
50+ ("ru_RU", "Russian", "Russia"),
51+ ("sk_SK", "Slovak", "Slovak Republic"),
52+ ("sl_SL", "Slovenian", "Slovenia"),
53+ ("sv_SE", "Swedish", "Sweden"),
54+ ("th_TH", "Thai", "Thailand"),
55+ ("tr_TR", "Turkish", "Turkey"),
56+ ("uk_UA", "Ukrainian", "Ukraine"),
57+ ("zh_CN", "Chinese", "China"),
58+ ("zh_HK", "Chinese", "Hong Kong SAR"),
59+ ("zh_TW", "Chinese", "Taiwan"))
searx/settings.yml+1−2
@@ -7,8 +7,7 @@ server:
77
88engines:
99 - name : wikipedia
10− engine : mediawiki
11− url : https://en.wikipedia.org/
10+ engine : wikipedia
1211 number_of_results : 1
1312 paging : False
1413
searx/static/css/style.css+2−1
@@ -152,7 +152,7 @@ tr:hover td { background: #DDDDDD; }
152152#results { margin: 10px; padding: 0; margin-bottom: 20px; }
153153
154154#sidebar { position: absolute; left: 54em; width: 12em; margin: 0 2px 5px 5px; padding: 0 2px 2px 2px; }
155−#suggestions span { display: block; margin: 0 2px 10px 2px; padding: 0; }
155+#suggestions span { display: block; margin: 0 2px 2px 2px; padding: 0; }
156156#suggestions form { display: block; }
157157#suggestions input { padding: 2px 6px; margin: 2px 4px; font-size: 0.8em; display: inline-block; background: #3498DB; color: #FFFFFF; border-radius: 4px; border: 0; cursor: pointer; }
158158
@@ -177,6 +177,7 @@ tr:hover td { background: #DDDDDD; }
177177}
178178
179179#apis {
180+ margin-top: 8px;
180181 clear: both;
181182}
182183
searx/templates/preferences.html+11
@@ -11,6 +11,17 @@
1111 {% include 'categories.html' %}
1212 </p>
1313 </fieldset>
14+ <fieldset>
15+ <legend>{{ _('Search language') }}</legend>
16+ <p>
17+ <select name='language'>
18+ <option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Automatic') }}</option>
19+ {% for lang_id,lang_name,country_name in language_codes %}
20+ <option value={{ lang_id }} {% if lang_id == current_language %}selected="selected"{% endif %}>{{ lang_name}} ({{ country_name }})</option>
21+ {% endfor %}
22+ </select>
23+ </p>
24+ </fieldset>
1425 <fieldset>
1526 <legend>{{ _('Interface language') }}</legend>
1627 <p>
searx/webapp.py+30−2
@@ -29,6 +29,7 @@ from searx import settings, searx_dir
2929from searx.engines import search, categories, engines, get_engines_stats
3030from searx.utils import UnicodeWriter
3131from searx.utils import highlight_content, html_to_text
32+from searx.languages import language_codes
3233
3334from flask.ext.babel import Babel
3435
@@ -117,6 +118,11 @@ def parse_query(query):
117118@app.route('/', methods=['GET', 'POST'])
118119def index():
119120 paging = False
121+ lang = 'all'
122+
123+ if request.cookies.get('language')\
124+ and request.cookies['language'] in (x[0] for x in language_codes):
125+ lang = request.cookies['language']
120126
121127 if request.method == 'POST':
122128 request_data = request.form
@@ -159,7 +165,11 @@ def index():
159165 'name': x.name}
160166 for x in categories[categ])
161167
162− results, suggestions = search(query, request, selected_engines, pageno)
168+ results, suggestions = search(query,
169+ request,
170+ selected_engines,
171+ pageno,
172+ lang)
163173
164174 for result in results:
165175 if not paging and engines[result['engine']].paging:
@@ -232,6 +242,11 @@ def list_engines():
232242
233243@app.route('/preferences', methods=['GET', 'POST'])
234244def preferences():
245+ lang = None
246+
247+ if request.cookies.get('language')\
248+ and request.cookies['language'] in (x[0] for x in language_codes):
249+ lang = request.cookies['language']
235250
236251 if request.method == 'POST':
237252 selected_categories = []
@@ -244,6 +259,10 @@ def preferences():
244259 selected_categories.append(category)
245260 elif pd_name == 'locale' and pd in settings['locales']:
246261 locale = pd
262+ elif pd_name == 'language' and (pd == 'all' or
263+ pd in (x[0] for
264+ x in language_codes)):
265+ lang = pd
247266
248267 resp = make_response(redirect('/'))
249268
@@ -254,6 +273,13 @@ def preferences():
254273 max_age=60 * 60 * 24 * 7 * 4
255274 )
256275
276+ if lang:
277+ # cookie max age: 4 weeks
278+ resp.set_cookie(
279+ 'language', lang,
280+ max_age=60 * 60 * 24 * 7 * 4
281+ )
282+
257283 if selected_categories:
258284 # cookie max age: 4 weeks
259285 resp.set_cookie(
@@ -263,7 +289,9 @@ def preferences():
263289 return resp
264290 return render('preferences.html',
265291 locales=settings['locales'],
266− current_locale=get_locale())
292+ current_locale=get_locale(),
293+ current_language=lang or 'all',
294+ language_codes=language_codes)
267295
268296
269297@app.route('/stats', methods=['GET'])