on master help sign in
[mod] fetch supported languages for several engines

utils/fetch_languages.py gets languages supported by each engine and generates engines_languages.json with each engine's supported language.

commitf62ce21f50b540315a708ebfbf36878ddec9d1c4 authormarc <a01200356@itesm.mx> dateSat 5 Nov 2016, 20:51 (10 years ago) parent92c6e88
26 files changed+3633−362
searx/data/engines_languages.json+3256 searx/engines/__init__.py+6 searx/engines/bing.py+15 searx/engines/bing_images.py+1−1 searx/engines/bing_news.py+1−1 searx/engines/dailymotion.py+23−18 searx/engines/duckduckgo.py+18−9 searx/engines/duckduckgo_definitions.py+1−1 searx/engines/gigablast.py+17−5 searx/engines/google.py+16−14 searx/engines/google_news.py+1−1 searx/engines/mediawiki.py−1 searx/engines/qwant.py+1−14 searx/engines/startpage.py−5 searx/engines/subtitleseeker.py+3−2 searx/engines/swisscows.py+15−6 searx/engines/wikidata.py+3−3 searx/engines/wikipedia.py+24−29 searx/engines/yahoo.py+16−4 searx/engines/yahoo_news.py+1−1 searx/languages.py+47−76 searx/webapp.py+1−1 tests/unit/engines/test_subtitleseeker.py+1−1 tests/unit/engines/test_wikipedia.py+2 utils/fetch_languages.py+164 utils/update_languages.py−169
searx/data/engines_languages.jsonnew file+3256
@@ -0,0 +1,3256 @@
1+{
2+ "google news": {
3+ "gu": {
4+ "name": "ગુજરાતી"
5+ },
6+ "mfe": {
7+ "name": "Kreol Morisien"
8+ },
9+ "gd": {
10+ "name": "Gàidhlig"
11+ },
12+ "ga": {
13+ "name": "Gaeilge"
14+ },
15+ "gn": {
16+ "name": "Guarani"
17+ },
18+ "gl": {
19+ "name": "Galego"
20+ },
21+ "lg": {
22+ "name": "Luganda"
23+ },
24+ "la": {
25+ "name": "Latin"
26+ },
27+ "ln": {
28+ "name": "Lingála"
29+ },
30+ "tw": {
31+ "name": "Twi"
32+ },
33+ "tt": {
34+ "name": "Tatar"
35+ },
36+ "tr": {
37+ "name": "Türkçe"
38+ },
39+ "lv": {
40+ "name": "Latviešu"
41+ },
42+ "to": {
43+ "name": "Lea Fakatonga"
44+ },
45+ "lt": {
46+ "name": "Lietuvių"
47+ },
48+ "tk": {
49+ "name": "Turkmen"
50+ },
51+ "th": {
52+ "name": "ไทย"
53+ },
54+ "pcm": {
55+ "name": "Nigerian Pidgin"
56+ },
57+ "tg": {
58+ "name": "Tajik"
59+ },
60+ "te": {
61+ "name": "తెలుగు"
62+ },
63+ "haw": {
64+ "name": "ʻŌlelo HawaiʻI"
65+ },
66+ "yi": {
67+ "name": "ייִדיש"
68+ },
69+ "ceb": {
70+ "name": "Cebuano"
71+ },
72+ "yo": {
73+ "name": "Èdè Yorùbá"
74+ },
75+ "de": {
76+ "name": "Deutsch"
77+ },
78+ "ko": {
79+ "name": "한국어"
80+ },
81+ "da": {
82+ "name": "Dansk"
83+ },
84+ "crs": {
85+ "name": "Seychellois Creole"
86+ },
87+ "qu": {
88+ "name": "Runasimi"
89+ },
90+ "bem": {
91+ "name": "Ichibemba"
92+ },
93+ "xx": {
94+ "name": "Pirate"
95+ },
96+ "ban": {
97+ "name": "Balinese"
98+ },
99+ "el": {
100+ "name": "Ελληνικά"
101+ },
102+ "eo": {
103+ "name": "Esperanto"
104+ },
105+ "en": {
106+ "name": "English"
107+ },
108+ "zh": {
109+ "name": "中文 (繁體)"
110+ },
111+ "ee": {
112+ "name": "Eʋegbe"
113+ },
114+ "eu": {
115+ "name": "Euskara"
116+ },
117+ "et": {
118+ "name": "Eesti"
119+ },
120+ "es": {
121+ "name": "Español (Latinoamérica)"
122+ },
123+ "ru": {
124+ "name": "Русский"
125+ },
126+ "rw": {
127+ "name": "Kinyarwanda"
128+ },
129+ "lua": {
130+ "name": "Luba-Lulua"
131+ },
132+ "rm": {
133+ "name": "Rumantsch"
134+ },
135+ "rn": {
136+ "name": "Ikirundi"
137+ },
138+ "ro": {
139+ "name": "Română"
140+ },
141+ "be": {
142+ "name": "Беларуская"
143+ },
144+ "bg": {
145+ "name": "Български"
146+ },
147+ "uk": {
148+ "name": "Українська"
149+ },
150+ "ps": {
151+ "name": "پښتو"
152+ },
153+ "wo": {
154+ "name": "Wolof"
155+ },
156+ "bn": {
157+ "name": "বাংলা"
158+ },
159+ "jw": {
160+ "name": "Javanese"
161+ },
162+ "tum": {
163+ "name": "Tumbuka"
164+ },
165+ "br": {
166+ "name": "Brezhoneg"
167+ },
168+ "bs": {
169+ "name": "Bosanski"
170+ },
171+ "ja": {
172+ "name": "日本語"
173+ },
174+ "om": {
175+ "name": "Oromoo"
176+ },
177+ "ach": {
178+ "name": "Acoli"
179+ },
180+ "oc": {
181+ "name": "Occitan"
182+ },
183+ "kri": {
184+ "name": "Krio (Sierra Leone)"
185+ },
186+ "lo": {
187+ "name": "ລາວ"
188+ },
189+ "tlh": {
190+ "name": "Klingon"
191+ },
192+ "or": {
193+ "name": "ଓଡ଼ିଆ"
194+ },
195+ "xh": {
196+ "name": "Xhosa"
197+ },
198+ "co": {
199+ "name": "Corsican"
200+ },
201+ "nso": {
202+ "name": "Northern Sotho"
203+ },
204+ "ca": {
205+ "name": "Català"
206+ },
207+ "cy": {
208+ "name": "Cymraeg"
209+ },
210+ "cs": {
211+ "name": "Čeština"
212+ },
213+ "tn": {
214+ "name": "Tswana"
215+ },
216+ "pt": {
217+ "name": "Português (Portugal)"
218+ },
219+ "tl": {
220+ "name": "Filipino"
221+ },
222+ "chr": {
223+ "name": "ᏣᎳᎩ"
224+ },
225+ "pa": {
226+ "name": "ਪੰਜਾਬੀ"
227+ },
228+ "loz": {
229+ "name": "Lozi"
230+ },
231+ "is": {
232+ "name": "Íslenska"
233+ },
234+ "pl": {
235+ "name": "Polski"
236+ },
237+ "hy": {
238+ "name": "Հայերեն"
239+ },
240+ "hr": {
241+ "name": "Hrvatski"
242+ },
243+ "ti": {
244+ "name": "ትግርኛ"
245+ },
246+ "ht": {
247+ "name": "Haitian Creole"
248+ },
249+ "hu": {
250+ "name": "Magyar"
251+ },
252+ "hi": {
253+ "name": "हिन्दी"
254+ },
255+ "ha": {
256+ "name": "Hausa"
257+ },
258+ "gaa": {
259+ "name": "Ga"
260+ },
261+ "mg": {
262+ "name": "Malagasy"
263+ },
264+ "uz": {
265+ "name": "O‘Zbek"
266+ },
267+ "ml": {
268+ "name": "മലയാളം"
269+ },
270+ "mn": {
271+ "name": "Монгол"
272+ },
273+ "mi": {
274+ "name": "Maori"
275+ },
276+ "mk": {
277+ "name": "Македонски"
278+ },
279+ "ur": {
280+ "name": "اردو"
281+ },
282+ "mt": {
283+ "name": "Malti"
284+ },
285+ "ms": {
286+ "name": "Bahasa Melayu"
287+ },
288+ "mr": {
289+ "name": "मराठी"
290+ },
291+ "ug": {
292+ "name": "ئۇيغۇرچە"
293+ },
294+ "ta": {
295+ "name": "தமிழ்"
296+ },
297+ "my": {
298+ "name": "ဗမာ"
299+ },
300+ "af": {
301+ "name": "Afrikaans"
302+ },
303+ "vi": {
304+ "name": "Tiếng Việt"
305+ },
306+ "ak": {
307+ "name": "Akan"
308+ },
309+ "am": {
310+ "name": "አማርኛ"
311+ },
312+ "it": {
313+ "name": "Italiano"
314+ },
315+ "iw": {
316+ "name": "עברית"
317+ },
318+ "kn": {
319+ "name": "ಕನ್ನಡ"
320+ },
321+ "ar": {
322+ "name": "العربية"
323+ },
324+ "km": {
325+ "name": "ខ្មែរ"
326+ },
327+ "zu": {
328+ "name": "Isizulu"
329+ },
330+ "ia": {
331+ "name": "Interlingua"
332+ },
333+ "az": {
334+ "name": "Azərbaycan Dili"
335+ },
336+ "id": {
337+ "name": "Indonesia"
338+ },
339+ "ig": {
340+ "name": "Igbo"
341+ },
342+ "nl": {
343+ "name": "Nederlands"
344+ },
345+ "nn": {
346+ "name": "Nynorsk"
347+ },
348+ "no": {
349+ "name": "Norsk"
350+ },
351+ "ne": {
352+ "name": "नेपाली"
353+ },
354+ "ny": {
355+ "name": "Nyanja"
356+ },
357+ "nyn": {
358+ "name": "Runyankore"
359+ },
360+ "fr": {
361+ "name": "Français"
362+ },
363+ "fy": {
364+ "name": "West-Frysk"
365+ },
366+ "fa": {
367+ "name": "فارسی"
368+ },
369+ "fi": {
370+ "name": "Suomi"
371+ },
372+ "fo": {
373+ "name": "Føroyskt"
374+ },
375+ "ka": {
376+ "name": "ქართული"
377+ },
378+ "kg": {
379+ "name": "Kongo"
380+ },
381+ "ckb": {
382+ "name": "Central Kurdish"
383+ },
384+ "kk": {
385+ "name": "Қазақ Тілі"
386+ },
387+ "sr": {
388+ "name": "Српски"
389+ },
390+ "sq": {
391+ "name": "Shqip"
392+ },
393+ "sw": {
394+ "name": "Kiswahili"
395+ },
396+ "sv": {
397+ "name": "Svenska"
398+ },
399+ "su": {
400+ "name": "Sundanese"
401+ },
402+ "st": {
403+ "name": "Southern Sotho"
404+ },
405+ "sk": {
406+ "name": "Slovenčina"
407+ },
408+ "si": {
409+ "name": "සිංහල"
410+ },
411+ "so": {
412+ "name": "Soomaali"
413+ },
414+ "sn": {
415+ "name": "Chishona"
416+ },
417+ "sl": {
418+ "name": "Slovenščina"
419+ },
420+ "ky": {
421+ "name": "Кыргызча"
422+ },
423+ "sd": {
424+ "name": "Sindhi"
425+ }
426+ },
427+ "dailymotion": {
428+ "gv": {
429+ "english_name": "Manx"
430+ },
431+ "gu": {
432+ "name": "ગુજરાતી",
433+ "english_name": "Gujarati"
434+ },
435+ "gd": {
436+ "english_name": "Gaelic, Scottish"
437+ },
438+ "ga": {
439+ "name": "Gaeilge",
440+ "english_name": "Irish"
441+ },
442+ "gn": {
443+ "english_name": "Guarani"
444+ },
445+ "gl": {
446+ "name": "Galego",
447+ "english_name": "Galician"
448+ },
449+ "lg": {
450+ "english_name": "Ganda"
451+ },
452+ "lb": {
453+ "english_name": "Luxembourgish"
454+ },
455+ "la": {
456+ "english_name": "Latin"
457+ },
458+ "ln": {
459+ "english_name": "Lingala"
460+ },
461+ "lo": {
462+ "english_name": "Lao"
463+ },
464+ "tt": {
465+ "name": "Татарча",
466+ "english_name": "Tatar"
467+ },
468+ "tr": {
469+ "name": "Türkçe",
470+ "english_name": "Turkish"
471+ },
472+ "ts": {
473+ "english_name": "Tsonga"
474+ },
475+ "li": {
476+ "english_name": "Limburgan"
477+ },
478+ "lv": {
479+ "name": "Latviešu",
480+ "english_name": "Latvian"
481+ },
482+ "to": {
483+ "english_name": "Tonga (Tonga Islands)"
484+ },
485+ "lt": {
486+ "name": "Lietuvių",
487+ "english_name": "Lithuanian"
488+ },
489+ "lu": {
490+ "english_name": "Luba-Katanga"
491+ },
492+ "tk": {
493+ "english_name": "Turkmen"
494+ },
495+ "th": {
496+ "name": "ไทย",
497+ "english_name": "Thai"
498+ },
499+ "ti": {
500+ "name": "ትግርኛ",
501+ "english_name": "Tigrinya"
502+ },
503+ "tg": {
504+ "english_name": "Tajik"
505+ },
506+ "te": {
507+ "english_name": "Telugu"
508+ },
509+ "ta": {
510+ "name": "தமிழ்",
511+ "english_name": "Tamil"
512+ },
513+ "yi": {
514+ "english_name": "Yiddish"
515+ },
516+ "yo": {
517+ "english_name": "Yoruba"
518+ },
519+ "de": {
520+ "name": "Deutsch",
521+ "english_name": "German"
522+ },
523+ "da": {
524+ "name": "Dansk",
525+ "english_name": "Danish"
526+ },
527+ "dz": {
528+ "english_name": "Dzongkha"
529+ },
530+ "st": {
531+ "english_name": "Sotho, Southern"
532+ },
533+ "dv": {
534+ "english_name": "Dhivehi"
535+ },
536+ "qu": {
537+ "english_name": "Quechua"
538+ },
539+ "el": {
540+ "name": "Ελληνικά",
541+ "english_name": "Greek, Modern (1453-)"
542+ },
543+ "eo": {
544+ "name": "Esperanto",
545+ "english_name": "Esperanto"
546+ },
547+ "en": {
548+ "english_name": "English"
549+ },
550+ "zh": {
551+ "name": "中文",
552+ "english_name": "Chinese"
553+ },
554+ "ee": {
555+ "english_name": "Ewe"
556+ },
557+ "za": {
558+ "english_name": "Zhuang"
559+ },
560+ "mh": {
561+ "english_name": "Marshallese"
562+ },
563+ "uk": {
564+ "name": "українська",
565+ "english_name": "Ukrainian"
566+ },
567+ "eu": {
568+ "name": "Euskara",
569+ "english_name": "Basque"
570+ },
571+ "et": {
572+ "name": "Eesti",
573+ "english_name": "Estonian"
574+ },
575+ "es": {
576+ "name": "Español",
577+ "english_name": "Spanish"
578+ },
579+ "ru": {
580+ "name": "русский",
581+ "english_name": "Russian"
582+ },
583+ "rw": {
584+ "name": "Ikinyarwanda",
585+ "english_name": "Kinyarwanda"
586+ },
587+ "rm": {
588+ "english_name": "Romansh"
589+ },
590+ "rn": {
591+ "english_name": "Rundi"
592+ },
593+ "ro": {
594+ "name": "Română",
595+ "english_name": "Romanian"
596+ },
597+ "bn": {
598+ "name": "বাংলা",
599+ "english_name": "Bengali"
600+ },
601+ "be": {
602+ "english_name": "Belarusian"
603+ },
604+ "bg": {
605+ "name": "Български",
606+ "english_name": "Bulgarian"
607+ },
608+ "ba": {
609+ "english_name": "Bashkir"
610+ },
611+ "wa": {
612+ "name": "Walon",
613+ "english_name": "Walloon"
614+ },
615+ "wo": {
616+ "english_name": "Wolof"
617+ },
618+ "bm": {
619+ "english_name": "Bambara"
620+ },
621+ "jv": {
622+ "english_name": "Javanese"
623+ },
624+ "bo": {
625+ "english_name": "Tibetan"
626+ },
627+ "bi": {
628+ "english_name": "Bislama"
629+ },
630+ "br": {
631+ "name": "Brezhoneg",
632+ "english_name": "Breton"
633+ },
634+ "bs": {
635+ "name": "Bosnian",
636+ "english_name": "Bosnian"
637+ },
638+ "ja": {
639+ "name": "日本語",
640+ "english_name": "Japanese"
641+ },
642+ "om": {
643+ "english_name": "Oromo"
644+ },
645+ "oj": {
646+ "english_name": "Ojibwa"
647+ },
648+ "ty": {
649+ "english_name": "Tahitian"
650+ },
651+ "oc": {
652+ "name": "Occitan",
653+ "english_name": "Occitan"
654+ },
655+ "tw": {
656+ "english_name": "Twi"
657+ },
658+ "os": {
659+ "english_name": "Ossetian"
660+ },
661+ "or": {
662+ "name": "Oriya",
663+ "english_name": "Oriya"
664+ },
665+ "xh": {
666+ "name": "Xhosa",
667+ "english_name": "Xhosa"
668+ },
669+ "ch": {
670+ "english_name": "Chamorro"
671+ },
672+ "co": {
673+ "english_name": "Corsican"
674+ },
675+ "ca": {
676+ "name": "Català",
677+ "english_name": "Catalan"
678+ },
679+ "ce": {
680+ "english_name": "Chechen"
681+ },
682+ "cy": {
683+ "name": "Cymraeg",
684+ "english_name": "Welsh"
685+ },
686+ "cs": {
687+ "name": "čeština",
688+ "english_name": "Czech"
689+ },
690+ "cr": {
691+ "english_name": "Cree"
692+ },
693+ "cv": {
694+ "english_name": "Chuvash"
695+ },
696+ "cu": {
697+ "english_name": "Slavic, Church"
698+ },
699+ "ve": {
700+ "name": "Venda",
701+ "english_name": "Venda"
702+ },
703+ "ps": {
704+ "name": "Pushto",
705+ "english_name": "Pushto"
706+ },
707+ "pt": {
708+ "name": "Português",
709+ "english_name": "Portuguese"
710+ },
711+ "tl": {
712+ "english_name": "Tagalog"
713+ },
714+ "pa": {
715+ "name": "ਪੰਜਾਬੀ",
716+ "english_name": "Panjabi"
717+ },
718+ "vi": {
719+ "name": "Tiếng Việt",
720+ "english_name": "Vietnamese"
721+ },
722+ "pi": {
723+ "english_name": "Pali"
724+ },
725+ "is": {
726+ "name": "Íslenska",
727+ "english_name": "Icelandic"
728+ },
729+ "pl": {
730+ "name": "polski",
731+ "english_name": "Polish"
732+ },
733+ "hz": {
734+ "english_name": "Herero"
735+ },
736+ "hy": {
737+ "english_name": "Armenian"
738+ },
739+ "hr": {
740+ "name": "hrvatski",
741+ "english_name": "Croatian"
742+ },
743+ "iu": {
744+ "english_name": "Inuktitut"
745+ },
746+ "ht": {
747+ "english_name": "Haitian"
748+ },
749+ "hu": {
750+ "name": "magyar",
751+ "english_name": "Hungarian"
752+ },
753+ "hi": {
754+ "name": "हिंदी",
755+ "english_name": "Hindi"
756+ },
757+ "ho": {
758+ "english_name": "Hiri Motu"
759+ },
760+ "ha": {
761+ "english_name": "Hausa"
762+ },
763+ "he": {
764+ "name": "עברית",
765+ "english_name": "Hebrew"
766+ },
767+ "mg": {
768+ "english_name": "Malagasy"
769+ },
770+ "uz": {
771+ "english_name": "Uzbek"
772+ },
773+ "ml": {
774+ "english_name": "Malayalam"
775+ },
776+ "mn": {
777+ "name": "Монгол",
778+ "english_name": "Mongolian"
779+ },
780+ "mi": {
781+ "name": "Reo Māori",
782+ "english_name": "Maori"
783+ },
784+ "ik": {
785+ "english_name": "Inupiaq"
786+ },
787+ "mk": {
788+ "name": "Македонски",
789+ "english_name": "Macedonian"
790+ },
791+ "ur": {
792+ "english_name": "Urdu"
793+ },
794+ "mt": {
795+ "name": "Malti",
796+ "english_name": "Maltese"
797+ },
798+ "ms": {
799+ "name": "Malay",
800+ "english_name": "Malay"
801+ },
802+ "mr": {
803+ "name": "मराठी",
804+ "english_name": "Marathi"
805+ },
806+ "ug": {
807+ "english_name": "Uighur"
808+ },
809+ "my": {
810+ "english_name": "Burmese"
811+ },
812+ "sq": {
813+ "english_name": "Albanian"
814+ },
815+ "ae": {
816+ "english_name": "Avestan"
817+ },
818+ "ss": {
819+ "english_name": "Swati"
820+ },
821+ "af": {
822+ "name": "Afrikaans",
823+ "english_name": "Afrikaans"
824+ },
825+ "tn": {
826+ "english_name": "Tswana"
827+ },
828+ "sw": {
829+ "english_name": "Swahili (macrolanguage)"
830+ },
831+ "ak": {
832+ "english_name": "Akan"
833+ },
834+ "am": {
835+ "name": "አማርኛ",
836+ "english_name": "Amharic"
837+ },
838+ "it": {
839+ "name": "Italiano",
840+ "english_name": "Italian"
841+ },
842+ "an": {
843+ "english_name": "Aragonese"
844+ },
845+ "ii": {
846+ "english_name": "Yi, Sichuan"
847+ },
848+ "ia": {
849+ "english_name": "Interlingua"
850+ },
851+ "as": {
852+ "english_name": "Assamese"
853+ },
854+ "ar": {
855+ "name": "العربية",
856+ "english_name": "Arabic"
857+ },
858+ "su": {
859+ "english_name": "Sundanese"
860+ },
861+ "io": {
862+ "english_name": "Ido"
863+ },
864+ "av": {
865+ "english_name": "Avaric"
866+ },
867+ "ay": {
868+ "english_name": "Aymara"
869+ },
870+ "az": {
871+ "name": "Azerbaijani",
872+ "english_name": "Azerbaijani"
873+ },
874+ "ie": {
875+ "english_name": "Interlingue"
876+ },
877+ "id": {
878+ "name": "Indonesian",
879+ "english_name": "Indonesian"
880+ },
881+ "ig": {
882+ "english_name": "Igbo"
883+ },
884+ "sk": {
885+ "name": "Slovenský",
886+ "english_name": "Slovak"
887+ },
888+ "sr": {
889+ "name": "српски",
890+ "english_name": "Serbian"
891+ },
892+ "nl": {
893+ "name": "Nederlands",
894+ "english_name": "Dutch"
895+ },
896+ "nn": {
897+ "name": "Norwegian Nynorsk",
898+ "english_name": "Norwegian Nynorsk"
899+ },
900+ "no": {
901+ "english_name": "Norwegian"
902+ },
903+ "na": {
904+ "english_name": "Nauru"
905+ },
906+ "nb": {
907+ "name": "Norwegian Bokmål",
908+ "english_name": "Norwegian Bokmål"
909+ },
910+ "nd": {
911+ "english_name": "Ndebele, North"
912+ },
913+ "ne": {
914+ "english_name": "Nepali (macrolanguage)"
915+ },
916+ "ng": {
917+ "english_name": "Ndonga"
918+ },
919+ "ny": {
920+ "english_name": "Nyanja"
921+ },
922+ "vo": {
923+ "english_name": "Volapük"
924+ },
925+ "zu": {
926+ "name": "Isi-Zulu",
927+ "english_name": "Zulu"
928+ },
929+ "so": {
930+ "english_name": "Somali"
931+ },
932+ "nr": {
933+ "english_name": "Ndebele, South"
934+ },
935+ "nv": {
936+ "english_name": "Navajo"
937+ },
938+ "sn": {
939+ "english_name": "Shona"
940+ },
941+ "fr": {
942+ "name": "français",
943+ "english_name": "French"
944+ },
945+ "sm": {
946+ "english_name": "Samoan"
947+ },
948+ "fy": {
949+ "english_name": "Frisian, Western"
950+ },
951+ "sv": {
952+ "name": "Svenska",
953+ "english_name": "Swedish"
954+ },
955+ "fa": {
956+ "name": "فارسی",
957+ "english_name": "Persian"
958+ },
959+ "ff": {
960+ "english_name": "Fulah"
961+ },
962+ "fi": {
963+ "name": "suomi",
964+ "english_name": "Finnish"
965+ },
966+ "fj": {
967+ "english_name": "Fijian"
968+ },
969+ "sa": {
970+ "english_name": "Sanskrit"
971+ },
972+ "fo": {
973+ "english_name": "Faroese"
974+ },
975+ "ka": {
976+ "english_name": "Georgian"
977+ },
978+ "kg": {
979+ "english_name": "Kongo"
980+ },
981+ "kk": {
982+ "english_name": "Kazakh"
983+ },
984+ "kj": {
985+ "english_name": "Kuanyama"
986+ },
987+ "ki": {
988+ "english_name": "Kikuyu"
989+ },
990+ "ko": {
991+ "name": "한국어",
992+ "english_name": "Korean"
993+ },
994+ "kn": {
995+ "name": "ಕನ್ನಡ",
996+ "english_name": "Kannada"
997+ },
998+ "km": {
999+ "english_name": "Khmer, Central"
1000+ },
1001+ "kl": {
1002+ "english_name": "Kalaallisut"
1003+ },
1004+ "ks": {
1005+ "english_name": "Kashmiri"
1006+ },
1007+ "kr": {
1008+ "english_name": "Kanuri"
1009+ },
1010+ "si": {
1011+ "english_name": "Sinhala"
1012+ },
1013+ "sh": {
1014+ "name": "Serbo-Croatian",
1015+ "english_name": "Serbo-Croatian"
1016+ },
1017+ "kw": {
1018+ "english_name": "Cornish"
1019+ },
1020+ "kv": {
1021+ "english_name": "Komi"
1022+ },
1023+ "ku": {
1024+ "english_name": "Kurdish"
1025+ },
1026+ "sl": {
1027+ "name": "slovenščina",
1028+ "english_name": "Slovenian"
1029+ },
1030+ "sc": {
1031+ "english_name": "Sardinian"
1032+ },
1033+ "ky": {
1034+ "english_name": "Kirghiz"
1035+ },
1036+ "sg": {
1037+ "english_name": "Sango"
1038+ },
1039+ "se": {
1040+ "english_name": "Sami, Northern"
1041+ },
1042+ "sd": {
1043+ "english_name": "Sindhi"
1044+ }
1045+ },
1046+ "google": {
1047+ "gu": {
1048+ "name": "ગુજરાતી"
1049+ },
1050+ "mfe": {
1051+ "name": "Kreol Morisien"
1052+ },
1053+ "gd": {
1054+ "name": "Gàidhlig"
1055+ },
1056+ "ga": {
1057+ "name": "Gaeilge"
1058+ },
1059+ "gn": {
1060+ "name": "Guarani"
1061+ },
1062+ "gl": {
1063+ "name": "Galego"
1064+ },
1065+ "lg": {
1066+ "name": "Luganda"
1067+ },
1068+ "la": {
1069+ "name": "Latin"
1070+ },
1071+ "ln": {
1072+ "name": "Lingála"
1073+ },
1074+ "tw": {
1075+ "name": "Twi"
1076+ },
1077+ "tt": {
1078+ "name": "Tatar"
1079+ },
1080+ "tr": {
1081+ "name": "Türkçe"
1082+ },
1083+ "lv": {
1084+ "name": "Latviešu"
1085+ },
1086+ "to": {
1087+ "name": "Lea Fakatonga"
1088+ },
1089+ "lt": {
1090+ "name": "Lietuvių"
1091+ },
1092+ "tk": {
1093+ "name": "Turkmen"
1094+ },
1095+ "th": {
1096+ "name": "ไทย"
1097+ },
1098+ "pcm": {
1099+ "name": "Nigerian Pidgin"
1100+ },
1101+ "tg": {
1102+ "name": "Tajik"
1103+ },
1104+ "te": {
1105+ "name": "తెలుగు"
1106+ },
1107+ "haw": {
1108+ "name": "ʻŌlelo HawaiʻI"
1109+ },
1110+ "yi": {
1111+ "name": "ייִדיש"
1112+ },
1113+ "ceb": {
1114+ "name": "Cebuano"
1115+ },
1116+ "yo": {
1117+ "name": "Èdè Yorùbá"
1118+ },
1119+ "de": {
1120+ "name": "Deutsch"
1121+ },
1122+ "ko": {
1123+ "name": "한국어"
1124+ },
1125+ "da": {
1126+ "name": "Dansk"
1127+ },
1128+ "crs": {
1129+ "name": "Seychellois Creole"
1130+ },
1131+ "qu": {
1132+ "name": "Runasimi"
1133+ },
1134+ "bem": {
1135+ "name": "Ichibemba"
1136+ },
1137+ "xx": {
1138+ "name": "Pirate"
1139+ },
1140+ "ban": {
1141+ "name": "Balinese"
1142+ },
1143+ "el": {
1144+ "name": "Ελληνικά"
1145+ },
1146+ "eo": {
1147+ "name": "Esperanto"
1148+ },
1149+ "en": {
1150+ "name": "English"
1151+ },
1152+ "zh": {
1153+ "name": "中文 (繁體)"
1154+ },
1155+ "ee": {
1156+ "name": "Eʋegbe"
1157+ },
1158+ "eu": {
1159+ "name": "Euskara"
1160+ },
1161+ "et": {
1162+ "name": "Eesti"
1163+ },
1164+ "es": {
1165+ "name": "Español (Latinoamérica)"
1166+ },
1167+ "ru": {
1168+ "name": "Русский"
1169+ },
1170+ "rw": {
1171+ "name": "Kinyarwanda"
1172+ },
1173+ "lua": {
1174+ "name": "Luba-Lulua"
1175+ },
1176+ "rm": {
1177+ "name": "Rumantsch"
1178+ },
1179+ "rn": {
1180+ "name": "Ikirundi"
1181+ },
1182+ "ro": {
1183+ "name": "Română"
1184+ },
1185+ "be": {
1186+ "name": "Беларуская"
1187+ },
1188+ "bg": {
1189+ "name": "Български"
1190+ },
1191+ "uk": {
1192+ "name": "Українська"
1193+ },
1194+ "ps": {
1195+ "name": "پښتو"
1196+ },
1197+ "wo": {
1198+ "name": "Wolof"
1199+ },
1200+ "bn": {
1201+ "name": "বাংলা"
1202+ },
1203+ "jw": {
1204+ "name": "Javanese"
1205+ },
1206+ "tum": {
1207+ "name": "Tumbuka"
1208+ },
1209+ "br": {
1210+ "name": "Brezhoneg"
1211+ },
1212+ "bs": {
1213+ "name": "Bosanski"
1214+ },
1215+ "ja": {
1216+ "name": "日本語"
1217+ },
1218+ "om": {
1219+ "name": "Oromoo"
1220+ },
1221+ "ach": {
1222+ "name": "Acoli"
1223+ },
1224+ "oc": {
1225+ "name": "Occitan"
1226+ },
1227+ "kri": {
1228+ "name": "Krio (Sierra Leone)"
1229+ },
1230+ "lo": {
1231+ "name": "ລາວ"
1232+ },
1233+ "tlh": {
1234+ "name": "Klingon"
1235+ },
1236+ "or": {
1237+ "name": "ଓଡ଼ିଆ"
1238+ },
1239+ "xh": {
1240+ "name": "Xhosa"
1241+ },
1242+ "co": {
1243+ "name": "Corsican"
1244+ },
1245+ "nso": {
1246+ "name": "Northern Sotho"
1247+ },
1248+ "ca": {
1249+ "name": "Català"
1250+ },
1251+ "cy": {
1252+ "name": "Cymraeg"
1253+ },
1254+ "cs": {
1255+ "name": "Čeština"
1256+ },
1257+ "tn": {
1258+ "name": "Tswana"
1259+ },
1260+ "pt": {
1261+ "name": "Português (Portugal)"
1262+ },
1263+ "tl": {
1264+ "name": "Filipino"
1265+ },
1266+ "chr": {
1267+ "name": "ᏣᎳᎩ"
1268+ },
1269+ "pa": {
1270+ "name": "ਪੰਜਾਬੀ"
1271+ },
1272+ "loz": {
1273+ "name": "Lozi"
1274+ },
1275+ "is": {
1276+ "name": "Íslenska"
1277+ },
1278+ "pl": {
1279+ "name": "Polski"
1280+ },
1281+ "hy": {
1282+ "name": "Հայերեն"
1283+ },
1284+ "hr": {
1285+ "name": "Hrvatski"
1286+ },
1287+ "ti": {
1288+ "name": "ትግርኛ"
1289+ },
1290+ "ht": {
1291+ "name": "Haitian Creole"
1292+ },
1293+ "hu": {
1294+ "name": "Magyar"
1295+ },
1296+ "hi": {
1297+ "name": "हिन्दी"
1298+ },
1299+ "ha": {
1300+ "name": "Hausa"
1301+ },
1302+ "gaa": {
1303+ "name": "Ga"
1304+ },
1305+ "mg": {
1306+ "name": "Malagasy"
1307+ },
1308+ "uz": {
1309+ "name": "O‘Zbek"
1310+ },
1311+ "ml": {
1312+ "name": "മലയാളം"
1313+ },
1314+ "mn": {
1315+ "name": "Монгол"
1316+ },
1317+ "mi": {
1318+ "name": "Maori"
1319+ },
1320+ "mk": {
1321+ "name": "Македонски"
1322+ },
1323+ "ur": {
1324+ "name": "اردو"
1325+ },
1326+ "mt": {
1327+ "name": "Malti"
1328+ },
1329+ "ms": {
1330+ "name": "Bahasa Melayu"
1331+ },
1332+ "mr": {
1333+ "name": "मराठी"
1334+ },
1335+ "ug": {
1336+ "name": "ئۇيغۇرچە"
1337+ },
1338+ "ta": {
1339+ "name": "தமிழ்"
1340+ },
1341+ "my": {
1342+ "name": "ဗမာ"
1343+ },
1344+ "af": {
1345+ "name": "Afrikaans"
1346+ },
1347+ "vi": {
1348+ "name": "Tiếng Việt"
1349+ },
1350+ "ak": {
1351+ "name": "Akan"
1352+ },
1353+ "am": {
1354+ "name": "አማርኛ"
1355+ },
1356+ "it": {
1357+ "name": "Italiano"
1358+ },
1359+ "iw": {
1360+ "name": "עברית"
1361+ },
1362+ "kn": {
1363+ "name": "ಕನ್ನಡ"
1364+ },
1365+ "ar": {
1366+ "name": "العربية"
1367+ },
1368+ "km": {
1369+ "name": "ខ្មែរ"
1370+ },
1371+ "zu": {
1372+ "name": "Isizulu"
1373+ },
1374+ "ia": {
1375+ "name": "Interlingua"
1376+ },
1377+ "az": {
1378+ "name": "Azərbaycan Dili"
1379+ },
1380+ "id": {
1381+ "name": "Indonesia"
1382+ },
1383+ "ig": {
1384+ "name": "Igbo"
1385+ },
1386+ "nl": {
1387+ "name": "Nederlands"
1388+ },
1389+ "nn": {
1390+ "name": "Nynorsk"
1391+ },
1392+ "no": {
1393+ "name": "Norsk"
1394+ },
1395+ "ne": {
1396+ "name": "नेपाली"
1397+ },
1398+ "ny": {
1399+ "name": "Nyanja"
1400+ },
1401+ "nyn": {
1402+ "name": "Runyankore"
1403+ },
1404+ "fr": {
1405+ "name": "Français"
1406+ },
1407+ "fy": {
1408+ "name": "West-Frysk"
1409+ },
1410+ "fa": {
1411+ "name": "فارسی"
1412+ },
1413+ "fi": {
1414+ "name": "Suomi"
1415+ },
1416+ "fo": {
1417+ "name": "Føroyskt"
1418+ },
1419+ "ka": {
1420+ "name": "ქართული"
1421+ },
1422+ "kg": {
1423+ "name": "Kongo"
1424+ },
1425+ "ckb": {
1426+ "name": "Central Kurdish"
1427+ },
1428+ "kk": {
1429+ "name": "Қазақ Тілі"
1430+ },
1431+ "sr": {
1432+ "name": "Српски"
1433+ },
1434+ "sq": {
1435+ "name": "Shqip"
1436+ },
1437+ "sw": {
1438+ "name": "Kiswahili"
1439+ },
1440+ "sv": {
1441+ "name": "Svenska"
1442+ },
1443+ "su": {
1444+ "name": "Sundanese"
1445+ },
1446+ "st": {
1447+ "name": "Southern Sotho"
1448+ },
1449+ "sk": {
1450+ "name": "Slovenčina"
1451+ },
1452+ "si": {
1453+ "name": "සිංහල"
1454+ },
1455+ "so": {
1456+ "name": "Soomaali"
1457+ },
1458+ "sn": {
1459+ "name": "Chishona"
1460+ },
1461+ "sl": {
1462+ "name": "Slovenščina"
1463+ },
1464+ "ky": {
1465+ "name": "Кыргызча"
1466+ },
1467+ "sd": {
1468+ "name": "Sindhi"
1469+ }
1470+ },
1471+ "duckduckgo": [
1472+ "da-DK",
1473+ "vi-VN",
1474+ "en-SG",
1475+ "sl-SL",
1476+ "en-XA",
1477+ "tzh-HK",
1478+ "en-UK",
1479+ "ro-RO",
1480+ "en-MY",
1481+ "el-GR",
1482+ "it-CH",
1483+ "hu-HU",
1484+ "fr-FR",
1485+ "en-PH",
1486+ "tl-PH",
1487+ "fr-CA",
1488+ "fi-FI",
1489+ "et-EE",
1490+ "sv-SE",
1491+ "es-XL",
1492+ "th-TH",
1493+ "sk-SK",
1494+ "es-ES",
1495+ "en-IE",
1496+ "es-US",
1497+ "es-PE",
1498+ "nl-NL",
1499+ "en-US",
1500+ "de-DE",
1501+ "de-AT",
1502+ "wt-WT",
1503+ "no-NO",
1504+ "tr-TR",
1505+ "ca-ES",
1506+ "it-IT",
1507+ "es-CO",
1508+ "ru-RU",
1509+ "ca-CT",
1510+ "en-ZA",
1511+ "en-CA",
1512+ "jp-JP",
1513+ "es-MX",
1514+ "id-ID",
1515+ "es-AR",
1516+ "he-IL",
1517+ "kr-KR",
1518+ "en-AU",
1519+ "ms-MY",
1520+ "pl-PL",
1521+ "lv-LV",
1522+ "bg-BG",
1523+ "zh-CN",
1524+ "en-NZ",
1525+ "lt-LT",
1526+ "tzh-TW",
1527+ "hr-HR",
1528+ "pt-PT",
1529+ "fr-BE",
1530+ "de-CH",
1531+ "cs-CZ",
1532+ "en-IN",
1533+ "nl-BE",
1534+ "fr-CH",
1535+ "en-ID",
1536+ "ar-XA",
1537+ "pt-BR",
1538+ "uk-UA",
1539+ "es-CL"
1540+ ],
1541+ "bing": [
1542+ "sq",
1543+ "de",
1544+ "ar",
1545+ "bg",
1546+ "ca",
1547+ "cs",
1548+ "zh-CHS",
1549+ "zh-CHT",
1550+ "ko",
1551+ "hr",
1552+ "da",
1553+ "sk",
1554+ "sl",
1555+ "es",
1556+ "et",
1557+ "fi",
1558+ "fr",
1559+ "el",
1560+ "he",
1561+ "nl",
1562+ "hu",
1563+ "id",
1564+ "en",
1565+ "is",
1566+ "it",
1567+ "ja",
1568+ "lv",
1569+ "lt",
1570+ "ms",
1571+ "nb",
1572+ "fa",
1573+ "pl",
1574+ "pt-BR",
1575+ "pt-PT",
1576+ "ro",
1577+ "ru",
1578+ "sr",
1579+ "sv",
1580+ "th",
1581+ "tr",
1582+ "uk",
1583+ "vi"
1584+ ],
1585+ "wikipedia": {
1586+ "sco": {
1587+ "articles": 41754,
1588+ "name": "Scots",
1589+ "english_name": "Scots"
1590+ },
1591+ "scn": {
1592+ "articles": 25373,
1593+ "name": "Sicilianu",
1594+ "english_name": "Sicilian"
1595+ },
1596+ "gu": {
1597+ "articles": 26690,
1598+ "name": "ગુજરાતી",
1599+ "english_name": "Gujarati"
1600+ },
1601+ "gd": {
1602+ "articles": 14246,
1603+ "name": "Gàidhlig",
1604+ "english_name": "Scottish Gaelic"
1605+ },
1606+ "ga": {
1607+ "articles": 38828,
1608+ "name": "Gaeilge",
1609+ "english_name": "Irish"
1610+ },
1611+ "gl": {
1612+ "articles": 134667,
1613+ "name": "Galego",
1614+ "english_name": "Galician"
1615+ },
1616+ "als": {
1617+ "articles": 22337,
1618+ "name": "Alemannisch",
1619+ "english_name": "Alemannic"
1620+ },
1621+ "lb": {
1622+ "articles": 47306,
1623+ "name": "Lëtzebuergesch",
1624+ "english_name": "Luxembourgish"
1625+ },
1626+ "la": {
1627+ "articles": 125689,
1628+ "name": "Latina",
1629+ "english_name": "Latin"
1630+ },
1631+ "tt": {
1632+ "articles": 69902,
1633+ "name": "Tatarça / Татарча",
1634+ "english_name": "Tatar"
1635+ },
1636+ "tr": {
1637+ "articles": 287403,
1638+ "name": "Türkçe",
1639+ "english_name": "Turkish"
1640+ },
1641+ "li": {
1642+ "articles": 11552,
1643+ "name": "Limburgs",
1644+ "english_name": "Limburgish"
1645+ },
1646+ "lv": {
1647+ "articles": 74333,
1648+ "name": "Latviešu",
1649+ "english_name": "Latvian"
1650+ },
1651+ "tl": {
1652+ "articles": 65681,
1653+ "name": "Tagalog",
1654+ "english_name": "Tagalog"
1655+ },
1656+ "vec": {
1657+ "articles": 10855,
1658+ "name": "Vèneto",
1659+ "english_name": "Venetian"
1660+ },
1661+ "th": {
1662+ "articles": 113214,
1663+ "name": "ไทย",
1664+ "english_name": "Thai"
1665+ },
1666+ "tg": {
1667+ "articles": 67389,
1668+ "name": "Тоҷикӣ",
1669+ "english_name": "Tajik"
1670+ },
1671+ "te": {
1672+ "articles": 66207,
1673+ "name": "తెలుగు",
1674+ "english_name": "Telugu"
1675+ },
1676+ "ta": {
1677+ "articles": 89565,
1678+ "name": "தமிழ்",
1679+ "english_name": "Tamil"
1680+ },
1681+ "yi": {
1682+ "articles": 13590,
1683+ "name": "ייִדיש",
1684+ "english_name": "Yiddish"
1685+ },
1686+ "ceb": {
1687+ "articles": 3525383,
1688+ "name": "Sinugboanong Binisaya",
1689+ "english_name": "Cebuano"
1690+ },
1691+ "yo": {
1692+ "articles": 31493,
1693+ "name": "Yorùbá",
1694+ "english_name": "Yoruba"
1695+ },
1696+ "de": {
1697+ "articles": 2008971,
1698+ "name": "Deutsch",
1699+ "english_name": "German"
1700+ },
1701+ "da": {
1702+ "articles": 221798,
1703+ "name": "Dansk",
1704+ "english_name": "Danish"
1705+ },
1706+ "qu": {
1707+ "articles": 19808,
1708+ "name": "Runa Simi",
1709+ "english_name": "Quechua"
1710+ },
1711+ "bar": {
1712+ "articles": 21966,
1713+ "name": "Boarisch",
1714+ "english_name": "Bavarian"
1715+ },
1716+ "kn": {
1717+ "articles": 21617,
1718+ "name": "ಕನ್ನಡ",
1719+ "english_name": "Kannada"
1720+ },
1721+ "bpy": {
1722+ "articles": 25067,
1723+ "name": "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী",
1724+ "english_name": "Bishnupriya Manipuri"
1725+ },
1726+ "el": {
1727+ "articles": 124348,
1728+ "name": "Ελληνικά",
1729+ "english_name": "Greek"
1730+ },
1731+ "eo": {
1732+ "articles": 235567,
1733+ "name": "Esperanto",
1734+ "english_name": "Esperanto"
1735+ },
1736+ "en": {
1737+ "articles": 5307436,
1738+ "name": "English",
1739+ "english_name": "English"
1740+ },
1741+ "zh": {
1742+ "articles": 915298,
1743+ "name": "中文",
1744+ "english_name": "Chinese"
1745+ },
1746+ "pms": {
1747+ "articles": 63988,
1748+ "name": "Piemontèis",
1749+ "english_name": "Piedmontese"
1750+ },
1751+ "arz": {
1752+ "articles": 16098,
1753+ "name": "مصرى (Maṣri)",
1754+ "english_name": "Egyptian Arabic"
1755+ },
1756+ "eu": {
1757+ "articles": 261846,
1758+ "name": "Euskara",
1759+ "english_name": "Basque"
1760+ },
1761+ "et": {
1762+ "articles": 151580,
1763+ "name": "Eesti",
1764+ "english_name": "Estonian"
1765+ },
1766+ "es": {
1767+ "articles": 1301725,
1768+ "name": "Español",
1769+ "english_name": "Spanish"
1770+ },
1771+ "ba": {
1772+ "articles": 36610,
1773+ "name": "Башҡорт",
1774+ "english_name": "Bashkir"
1775+ },
1776+ "ru": {
1777+ "articles": 1359173,
1778+ "name": "Русский",
1779+ "english_name": "Russian"
1780+ },
1781+ "new": {
1782+ "articles": 72175,
1783+ "name": "नेपाल भाषा",
1784+ "english_name": "Newar"
1785+ },
1786+ "ro": {
1787+ "articles": 373067,
1788+ "name": "Română",
1789+ "english_name": "Romanian"
1790+ },
1791+ "jv": {
1792+ "articles": 49675,
1793+ "name": "Basa Jawa",
1794+ "english_name": "Javanese"
1795+ },
1796+ "hsb": {
1797+ "articles": 10908,
1798+ "name": "Hornjoserbsce",
1799+ "english_name": "Upper Sorbian"
1800+ },
1801+ "be": {
1802+ "articles": 123470,
1803+ "name": "Беларуская",
1804+ "english_name": "Belarusian"
1805+ },
1806+ "bg": {
1807+ "articles": 223701,
1808+ "name": "Български",
1809+ "english_name": "Bulgarian"
1810+ },
1811+ "uk": {
1812+ "articles": 666877,
1813+ "name": "Українська",
1814+ "english_name": "Ukrainian"
1815+ },
1816+ "wa": {
1817+ "articles": 14312,
1818+ "name": "Walon",
1819+ "english_name": "Walloon"
1820+ },
1821+ "ast": {
1822+ "articles": 47712,
1823+ "name": "Asturianu",
1824+ "english_name": "Asturian"
1825+ },
1826+ "bn": {
1827+ "articles": 46038,
1828+ "name": "বাংলা",
1829+ "english_name": "Bengali"
1830+ },
1831+ "map-bms": {
1832+ "articles": 13275,
1833+ "name": "Basa Banyumasan",
1834+ "english_name": "Banyumasan"
1835+ },
1836+ "br": {
1837+ "articles": 60624,
1838+ "name": "Brezhoneg",
1839+ "english_name": "Breton"
1840+ },
1841+ "bs": {
1842+ "articles": 72057,
1843+ "name": "Bosanski",
1844+ "english_name": "Bosnian"
1845+ },
1846+ "ja": {
1847+ "articles": 1041538,
1848+ "name": "日本語",
1849+ "english_name": "Japanese"
1850+ },
1851+ "oc": {
1852+ "articles": 84521,
1853+ "name": "Occitan",
1854+ "english_name": "Occitan"
1855+ },
1856+ "be-tarask": {
1857+ "articles": 59872,
1858+ "name": "Беларуская (тарашкевіца)",
1859+ "english_name": "Belarusian (Taraškievica)"
1860+ },
1861+ "nds": {
1862+ "articles": 25732,
1863+ "name": "Plattdüütsch",
1864+ "english_name": "Low Saxon"
1865+ },
1866+ "os": {
1867+ "articles": 10293,
1868+ "name": "Иронау",
1869+ "english_name": "Ossetian"
1870+ },
1871+ "or": {
1872+ "articles": 11703,
1873+ "name": "ଓଡ଼ିଆ",
1874+ "english_name": "Oriya"
1875+ },
1876+ "simple": {
1877+ "articles": 121809,
1878+ "name": "Simple English",
1879+ "english_name": "Simple English"
1880+ },
1881+ "ca": {
1882+ "articles": 528658,
1883+ "name": "Català",
1884+ "english_name": "Catalan"
1885+ },
1886+ "lmo": {
1887+ "articles": 34556,
1888+ "name": "Lumbaart",
1889+ "english_name": "Lombard"
1890+ },
1891+ "ce": {
1892+ "articles": 158845,
1893+ "name": "Нохчийн",
1894+ "english_name": "Chechen"
1895+ },
1896+ "cy": {
1897+ "articles": 89271,
1898+ "name": "Cymraeg",
1899+ "english_name": "Welsh"
1900+ },
1901+ "cs": {
1902+ "articles": 369023,
1903+ "name": "Čeština",
1904+ "english_name": "Czech"
1905+ },
1906+ "cv": {
1907+ "articles": 36500,
1908+ "name": "Чăваш",
1909+ "english_name": "Chuvash"
1910+ },
1911+ "pt": {
1912+ "articles": 949039,
1913+ "name": "Português",
1914+ "english_name": "Portuguese"
1915+ },
1916+ "lt": {
1917+ "articles": 180372,
1918+ "name": "Lietuvių",
1919+ "english_name": "Lithuanian"
1920+ },
1921+ "zh-min-nan": {
1922+ "articles": 201851,
1923+ "name": "Bân-lâm-gú",
1924+ "english_name": "Min Nan"
1925+ },
1926+ "pa": {
1927+ "articles": 24065,
1928+ "name": "ਪੰਜਾਬੀ",
1929+ "english_name": "Punjabi"
1930+ },
1931+ "war": {
1932+ "articles": 1261969,
1933+ "name": "Winaray",
1934+ "english_name": "Waray-Waray"
1935+ },
1936+ "pl": {
1937+ "articles": 1197444,
1938+ "name": "Polski",
1939+ "english_name": "Polish"
1940+ },
1941+ "hy": {
1942+ "articles": 212704,
1943+ "name": "Հայերեն",
1944+ "english_name": "Armenian"
1945+ },
1946+ "an": {
1947+ "articles": 31832,
1948+ "name": "Aragonés",
1949+ "english_name": "Aragonese"
1950+ },
1951+ "hr": {
1952+ "articles": 171042,
1953+ "name": "Hrvatski",
1954+ "english_name": "Croatian"
1955+ },
1956+ "ht": {
1957+ "articles": 51108,
1958+ "name": "Krèyol ayisyen",
1959+ "english_name": "Haitian"
1960+ },
1961+ "hu": {
1962+ "articles": 399859,
1963+ "name": "Magyar",
1964+ "english_name": "Hungarian"
1965+ },
1966+ "bat-smg": {
1967+ "articles": 15940,
1968+ "name": "Žemaitėška",
1969+ "english_name": "Samogitian"
1970+ },
1971+ "hi": {
1972+ "articles": 114388,
1973+ "name": "हिन्दी",
1974+ "english_name": "Hindi"
1975+ },
1976+ "pnb": {
1977+ "articles": 42659,
1978+ "name": "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)",
1979+ "english_name": "Western Punjabi"
1980+ },
1981+ "bug": {
1982+ "articles": 14116,
1983+ "name": "Basa Ugi",
1984+ "english_name": "Buginese"
1985+ },
1986+ "he": {
1987+ "articles": 199202,
1988+ "name": "עברית",
1989+ "english_name": "Hebrew"
1990+ },
1991+ "mg": {
1992+ "articles": 82826,
1993+ "name": "Malagasy",
1994+ "english_name": "Malagasy"
1995+ },
1996+ "uz": {
1997+ "articles": 128742,
1998+ "name": "O‘zbek",
1999+ "english_name": "Uzbek"
2000+ },
2001+ "ml": {
2002+ "articles": 46792,
2003+ "name": "മലയാളം",
2004+ "english_name": "Malayalam"
2005+ },
2006+ "azb": {
2007+ "articles": 11813,
2008+ "name": "تۆرکجه",
2009+ "english_name": "South Azerbaijani"
2010+ },
2011+ "mn": {
2012+ "articles": 16281,
2013+ "name": "Монгол",
2014+ "english_name": "Mongolian"
2015+ },
2016+ "mk": {
2017+ "articles": 87527,
2018+ "name": "Македонски",
2019+ "english_name": "Macedonian"
2020+ },
2021+ "ur": {
2022+ "articles": 110767,
2023+ "name": "اردو",
2024+ "english_name": "Urdu"
2025+ },
2026+ "ms": {
2027+ "articles": 286177,
2028+ "name": "Bahasa Melayu",
2029+ "english_name": "Malay"
2030+ },
2031+ "mr": {
2032+ "articles": 45049,
2033+ "name": "मराठी",
2034+ "english_name": "Marathi"
2035+ },
2036+ "my": {
2037+ "articles": 33571,
2038+ "name": "မြန်မာဘာသာ",
2039+ "english_name": "Burmese"
2040+ },
2041+ "sah": {
2042+ "articles": 10965,
2043+ "name": "Саха тыла (Saxa Tyla)",
2044+ "english_name": "Sakha"
2045+ },
2046+ "af": {
2047+ "articles": 42949,
2048+ "name": "Afrikaans",
2049+ "english_name": "Afrikaans"
2050+ },
2051+ "vi": {
2052+ "articles": 1151564,
2053+ "name": "Tiếng Việt",
2054+ "english_name": "Vietnamese"
2055+ },
2056+ "is": {
2057+ "articles": 41500,
2058+ "name": "Íslenska",
2059+ "english_name": "Icelandic"
2060+ },
2061+ "am": {
2062+ "articles": 13291,
2063+ "name": "አማርኛ",
2064+ "english_name": "Amharic"
2065+ },
2066+ "it": {
2067+ "articles": 1317506,
2068+ "name": "Italiano",
2069+ "english_name": "Italian"
2070+ },
2071+ "vo": {
2072+ "articles": 120413,
2073+ "name": "Volapük",
2074+ "english_name": "Volapük"
2075+ },
2076+ "ar": {
2077+ "articles": 453499,
2078+ "name": "العربية",
2079+ "english_name": "Arabic"
2080+ },
2081+ "io": {
2082+ "articles": 26845,
2083+ "name": "Ido",
2084+ "english_name": "Ido"
2085+ },
2086+ "ia": {
2087+ "articles": 19784,
2088+ "name": "Interlingua",
2089+ "english_name": "Interlingua"
2090+ },
2091+ "az": {
2092+ "articles": 111474,
2093+ "name": "Azərbaycanca",
2094+ "english_name": "Azerbaijani"
2095+ },
2096+ "id": {
2097+ "articles": 390200,
2098+ "name": "Bahasa Indonesia",
2099+ "english_name": "Indonesian"
2100+ },
2101+ "nl": {
2102+ "articles": 1885741,
2103+ "name": "Nederlands",
2104+ "english_name": "Dutch"
2105+ },
2106+ "nn": {
2107+ "articles": 131696,
2108+ "name": "Nynorsk",
2109+ "english_name": "Norwegian (Nynorsk)"
2110+ },
2111+ "no": {
2112+ "articles": 458147,
2113+ "name": "Norsk (Bokmål)",
2114+ "english_name": "Norwegian (Bokmål)"
2115+ },
2116+ "nah": {
2117+ "articles": 10428,
2118+ "name": "Nāhuatl",
2119+ "english_name": "Nahuatl"
2120+ },
2121+ "ne": {
2122+ "articles": 29164,
2123+ "name": "नेपाली",
2124+ "english_name": "Nepali"
2125+ },
2126+ "nap": {
2127+ "articles": 14400,
2128+ "name": "Nnapulitano",
2129+ "english_name": "Neapolitan"
2130+ },
2131+ "fr": {
2132+ "articles": 1822985,
2133+ "name": "Français",
2134+ "english_name": "French"
2135+ },
2136+ "mrj": {
2137+ "articles": 10164,
2138+ "name": "Кырык Мары (Kyryk Mary)",
2139+ "english_name": "Hill Mari"
2140+ },
2141+ "zh-yue": {
2142+ "articles": 49352,
2143+ "name": "粵語",
2144+ "english_name": "Cantonese"
2145+ },
2146+ "fy": {
2147+ "articles": 36464,
2148+ "name": "Frysk",
2149+ "english_name": "West Frisian"
2150+ },
2151+ "fa": {
2152+ "articles": 516569,
2153+ "name": "فارسی",
2154+ "english_name": "Persian"
2155+ },
2156+ "fi": {
2157+ "articles": 405166,
2158+ "name": "Suomi",
2159+ "english_name": "Finnish"
2160+ },
2161+ "mzn": {
2162+ "articles": 12362,
2163+ "name": "مَزِروني",
2164+ "english_name": "Mazandarani"
2165+ },
2166+ "sa": {
2167+ "articles": 10198,
2168+ "name": "संस्कृतम्",
2169+ "english_name": "Sanskrit"
2170+ },
2171+ "fo": {
2172+ "articles": 12370,
2173+ "name": "Føroyskt",
2174+ "english_name": "Faroese"
2175+ },
2176+ "ka": {
2177+ "articles": 111155,
2178+ "name": "ქართული",
2179+ "english_name": "Georgian"
2180+ },
2181+ "ckb": {
2182+ "articles": 18217,
2183+ "name": "Soranî / کوردی",
2184+ "english_name": "Sorani"
2185+ },
2186+ "kk": {
2187+ "articles": 217477,
2188+ "name": "Қазақша",
2189+ "english_name": "Kazakh"
2190+ },
2191+ "sr": {
2192+ "articles": 342497,
2193+ "name": "Српски / Srpski",
2194+ "english_name": "Serbian"
2195+ },
2196+ "sq": {
2197+ "articles": 62437,
2198+ "name": "Shqip",
2199+ "english_name": "Albanian"
2200+ },
2201+ "min": {
2202+ "articles": 221961,
2203+ "name": "Minangkabau",
2204+ "english_name": "Minangkabau"
2205+ },
2206+ "ko": {
2207+ "articles": 367127,
2208+ "name": "한국어",
2209+ "english_name": "Korean"
2210+ },
2211+ "sv": {
2212+ "articles": 3783326,
2213+ "name": "Svenska",
2214+ "english_name": "Swedish"
2215+ },
2216+ "su": {
2217+ "articles": 19163,
2218+ "name": "Basa Sunda",
2219+ "english_name": "Sundanese"
2220+ },
2221+ "sk": {
2222+ "articles": 215360,
2223+ "name": "Slovenčina",
2224+ "english_name": "Slovak"
2225+ },
2226+ "si": {
2227+ "articles": 12832,
2228+ "name": "සිංහල",
2229+ "english_name": "Sinhalese"
2230+ },
2231+ "sh": {
2232+ "articles": 436526,
2233+ "name": "Srpskohrvatski / Српскохрватски",
2234+ "english_name": "Serbo-Croatian"
2235+ },
2236+ "ku": {
2237+ "articles": 22367,
2238+ "name": "Kurdî / كوردی",
2239+ "english_name": "Kurdish"
2240+ },
2241+ "sl": {
2242+ "articles": 153978,
2243+ "name": "Slovenščina",
2244+ "english_name": "Slovenian"
2245+ },
2246+ "ky": {
2247+ "articles": 59677,
2248+ "name": "Кыргызча",
2249+ "english_name": "Kirghiz"
2250+ },
2251+ "sw": {
2252+ "articles": 34773,
2253+ "name": "Kiswahili",
2254+ "english_name": "Swahili"
2255+ }
2256+ },
2257+ "bing news": [
2258+ "sq",
2259+ "de",
2260+ "ar",
2261+ "bg",
2262+ "ca",
2263+ "cs",
2264+ "zh-CHS",
2265+ "zh-CHT",
2266+ "ko",
2267+ "hr",
2268+ "da",
2269+ "sk",
2270+ "sl",
2271+ "es",
2272+ "et",
2273+ "fi",
2274+ "fr",
2275+ "el",
2276+ "he",
2277+ "nl",
2278+ "hu",
2279+ "id",
2280+ "en",
2281+ "is",
2282+ "it",
2283+ "ja",
2284+ "lv",
2285+ "lt",
2286+ "ms",
2287+ "nb",
2288+ "fa",
2289+ "pl",
2290+ "pt-BR",
2291+ "pt-PT",
2292+ "ro",
2293+ "ru",
2294+ "sr",
2295+ "sv",
2296+ "th",
2297+ "tr",
2298+ "uk",
2299+ "vi"
2300+ ],
2301+ "yahoo news": [
2302+ "ar",
2303+ "bg",
2304+ "zh_chs",
2305+ "zh_cht",
2306+ "hr",
2307+ "cs",
2308+ "da",
2309+ "nl",
2310+ "en",
2311+ "et",
2312+ "fi",
2313+ "fr",
2314+ "de",
2315+ "el",
2316+ "he",
2317+ "hu",
2318+ "it",
2319+ "ja",
2320+ "ko",
2321+ "lv",
2322+ "lt",
2323+ "no",
2324+ "pl",
2325+ "pt",
2326+ "ro",
2327+ "ru",
2328+ "sk",
2329+ "sl",
2330+ "es",
2331+ "sv",
2332+ "th",
2333+ "tr"
2334+ ],
2335+ "swisscows": [
2336+ "browser",
2337+ "ar-SA",
2338+ "es-AR",
2339+ "en-AU",
2340+ "de-AT",
2341+ "fr-BE",
2342+ "nl-BE",
2343+ "pt-BR",
2344+ "en-CA",
2345+ "fr-CA",
2346+ "es-CL",
2347+ "zh-CN",
2348+ "da-DK",
2349+ "fi-FI",
2350+ "fr-FR",
2351+ "de-DE",
2352+ "zh-HK",
2353+ "en-IN",
2354+ "en-IE",
2355+ "it-IT",
2356+ "ja-JP",
2357+ "ko-KR",
2358+ "en-MY",
2359+ "es-MX",
2360+ "nl-NL",
2361+ "en-NZ",
2362+ "nb-NO",
2363+ "en-PH",
2364+ "pl-PL",
2365+ "pt-PT",
2366+ "ru-RU",
2367+ "en-ZA",
2368+ "es-ES",
2369+ "sv-SE",
2370+ "de-CH",
2371+ "fr-CH",
2372+ "zh-TW",
2373+ "tr-TR",
2374+ "en-GB",
2375+ "en-US",
2376+ "es-US"
2377+ ],
2378+ "wikidata": {
2379+ "sco": {
2380+ "articles": 41754,
2381+ "name": "Scots",
2382+ "english_name": "Scots"
2383+ },
2384+ "scn": {
2385+ "articles": 25373,
2386+ "name": "Sicilianu",
2387+ "english_name": "Sicilian"
2388+ },
2389+ "gu": {
2390+ "articles": 26690,
2391+ "name": "ગુજરાતી",
2392+ "english_name": "Gujarati"
2393+ },
2394+ "gd": {
2395+ "articles": 14246,
2396+ "name": "Gàidhlig",
2397+ "english_name": "Scottish Gaelic"
2398+ },
2399+ "ga": {
2400+ "articles": 38828,
2401+ "name": "Gaeilge",
2402+ "english_name": "Irish"
2403+ },
2404+ "gl": {
2405+ "articles": 134667,
2406+ "name": "Galego",
2407+ "english_name": "Galician"
2408+ },
2409+ "als": {
2410+ "articles": 22337,
2411+ "name": "Alemannisch",
2412+ "english_name": "Alemannic"
2413+ },
2414+ "lb": {
2415+ "articles": 47306,
2416+ "name": "Lëtzebuergesch",
2417+ "english_name": "Luxembourgish"
2418+ },
2419+ "la": {
2420+ "articles": 125689,
2421+ "name": "Latina",
2422+ "english_name": "Latin"
2423+ },
2424+ "tt": {
2425+ "articles": 69902,
2426+ "name": "Tatarça / Татарча",
2427+ "english_name": "Tatar"
2428+ },
2429+ "tr": {
2430+ "articles": 287403,
2431+ "name": "Türkçe",
2432+ "english_name": "Turkish"
2433+ },
2434+ "li": {
2435+ "articles": 11552,
2436+ "name": "Limburgs",
2437+ "english_name": "Limburgish"
2438+ },
2439+ "lv": {
2440+ "articles": 74333,
2441+ "name": "Latviešu",
2442+ "english_name": "Latvian"
2443+ },
2444+ "tl": {
2445+ "articles": 65681,
2446+ "name": "Tagalog",
2447+ "english_name": "Tagalog"
2448+ },
2449+ "vec": {
2450+ "articles": 10855,
2451+ "name": "Vèneto",
2452+ "english_name": "Venetian"
2453+ },
2454+ "th": {
2455+ "articles": 113214,
2456+ "name": "ไทย",
2457+ "english_name": "Thai"
2458+ },
2459+ "tg": {
2460+ "articles": 67389,
2461+ "name": "Тоҷикӣ",
2462+ "english_name": "Tajik"
2463+ },
2464+ "te": {
2465+ "articles": 66207,
2466+ "name": "తెలుగు",
2467+ "english_name": "Telugu"
2468+ },
2469+ "ta": {
2470+ "articles": 89565,
2471+ "name": "தமிழ்",
2472+ "english_name": "Tamil"
2473+ },
2474+ "yi": {
2475+ "articles": 13590,
2476+ "name": "ייִדיש",
2477+ "english_name": "Yiddish"
2478+ },
2479+ "ceb": {
2480+ "articles": 3525383,
2481+ "name": "Sinugboanong Binisaya",
2482+ "english_name": "Cebuano"
2483+ },
2484+ "yo": {
2485+ "articles": 31493,
2486+ "name": "Yorùbá",
2487+ "english_name": "Yoruba"
2488+ },
2489+ "de": {
2490+ "articles": 2008971,
2491+ "name": "Deutsch",
2492+ "english_name": "German"
2493+ },
2494+ "da": {
2495+ "articles": 221798,
2496+ "name": "Dansk",
2497+ "english_name": "Danish"
2498+ },
2499+ "qu": {
2500+ "articles": 19808,
2501+ "name": "Runa Simi",
2502+ "english_name": "Quechua"
2503+ },
2504+ "bar": {
2505+ "articles": 21966,
2506+ "name": "Boarisch",
2507+ "english_name": "Bavarian"
2508+ },
2509+ "kn": {
2510+ "articles": 21617,
2511+ "name": "ಕನ್ನಡ",
2512+ "english_name": "Kannada"
2513+ },
2514+ "bpy": {
2515+ "articles": 25067,
2516+ "name": "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী",
2517+ "english_name": "Bishnupriya Manipuri"
2518+ },
2519+ "el": {
2520+ "articles": 124348,
2521+ "name": "Ελληνικά",
2522+ "english_name": "Greek"
2523+ },
2524+ "eo": {
2525+ "articles": 235567,
2526+ "name": "Esperanto",
2527+ "english_name": "Esperanto"
2528+ },
2529+ "en": {
2530+ "articles": 5307436,
2531+ "name": "English",
2532+ "english_name": "English"
2533+ },
2534+ "zh": {
2535+ "articles": 915298,
2536+ "name": "中文",
2537+ "english_name": "Chinese"
2538+ },
2539+ "pms": {
2540+ "articles": 63988,
2541+ "name": "Piemontèis",
2542+ "english_name": "Piedmontese"
2543+ },
2544+ "arz": {
2545+ "articles": 16098,
2546+ "name": "مصرى (Maṣri)",
2547+ "english_name": "Egyptian Arabic"
2548+ },
2549+ "eu": {
2550+ "articles": 261846,
2551+ "name": "Euskara",
2552+ "english_name": "Basque"
2553+ },
2554+ "et": {
2555+ "articles": 151580,
2556+ "name": "Eesti",
2557+ "english_name": "Estonian"
2558+ },
2559+ "es": {
2560+ "articles": 1301725,
2561+ "name": "Español",
2562+ "english_name": "Spanish"
2563+ },
2564+ "ba": {
2565+ "articles": 36610,
2566+ "name": "Башҡорт",
2567+ "english_name": "Bashkir"
2568+ },
2569+ "ru": {
2570+ "articles": 1359173,
2571+ "name": "Русский",
2572+ "english_name": "Russian"
2573+ },
2574+ "new": {
2575+ "articles": 72175,
2576+ "name": "नेपाल भाषा",
2577+ "english_name": "Newar"
2578+ },
2579+ "ro": {
2580+ "articles": 373067,
2581+ "name": "Română",
2582+ "english_name": "Romanian"
2583+ },
2584+ "jv": {
2585+ "articles": 49675,
2586+ "name": "Basa Jawa",
2587+ "english_name": "Javanese"
2588+ },
2589+ "hsb": {
2590+ "articles": 10908,
2591+ "name": "Hornjoserbsce",
2592+ "english_name": "Upper Sorbian"
2593+ },
2594+ "be": {
2595+ "articles": 123470,
2596+ "name": "Беларуская",
2597+ "english_name": "Belarusian"
2598+ },
2599+ "bg": {
2600+ "articles": 223701,
2601+ "name": "Български",
2602+ "english_name": "Bulgarian"
2603+ },
2604+ "uk": {
2605+ "articles": 666877,
2606+ "name": "Українська",
2607+ "english_name": "Ukrainian"
2608+ },
2609+ "wa": {
2610+ "articles": 14312,
2611+ "name": "Walon",
2612+ "english_name": "Walloon"
2613+ },
2614+ "ast": {
2615+ "articles": 47712,
2616+ "name": "Asturianu",
2617+ "english_name": "Asturian"
2618+ },
2619+ "bn": {
2620+ "articles": 46038,
2621+ "name": "বাংলা",
2622+ "english_name": "Bengali"
2623+ },
2624+ "map-bms": {
2625+ "articles": 13275,
2626+ "name": "Basa Banyumasan",
2627+ "english_name": "Banyumasan"
2628+ },
2629+ "br": {
2630+ "articles": 60624,
2631+ "name": "Brezhoneg",
2632+ "english_name": "Breton"
2633+ },
2634+ "bs": {
2635+ "articles": 72057,
2636+ "name": "Bosanski",
2637+ "english_name": "Bosnian"
2638+ },
2639+ "ja": {
2640+ "articles": 1041538,
2641+ "name": "日本語",
2642+ "english_name": "Japanese"
2643+ },
2644+ "oc": {
2645+ "articles": 84521,
2646+ "name": "Occitan",
2647+ "english_name": "Occitan"
2648+ },
2649+ "be-tarask": {
2650+ "articles": 59872,
2651+ "name": "Беларуская (тарашкевіца)",
2652+ "english_name": "Belarusian (Taraškievica)"
2653+ },
2654+ "nds": {
2655+ "articles": 25732,
2656+ "name": "Plattdüütsch",
2657+ "english_name": "Low Saxon"
2658+ },
2659+ "os": {
2660+ "articles": 10293,
2661+ "name": "Иронау",
2662+ "english_name": "Ossetian"
2663+ },
2664+ "or": {
2665+ "articles": 11703,
2666+ "name": "ଓଡ଼ିଆ",
2667+ "english_name": "Oriya"
2668+ },
2669+ "simple": {
2670+ "articles": 121809,
2671+ "name": "Simple English",
2672+ "english_name": "Simple English"
2673+ },
2674+ "ca": {
2675+ "articles": 528658,
2676+ "name": "Català",
2677+ "english_name": "Catalan"
2678+ },
2679+ "lmo": {
2680+ "articles": 34556,
2681+ "name": "Lumbaart",
2682+ "english_name": "Lombard"
2683+ },
2684+ "ce": {
2685+ "articles": 158845,
2686+ "name": "Нохчийн",
2687+ "english_name": "Chechen"
2688+ },
2689+ "cy": {
2690+ "articles": 89271,
2691+ "name": "Cymraeg",
2692+ "english_name": "Welsh"
2693+ },
2694+ "cs": {
2695+ "articles": 369023,
2696+ "name": "Čeština",
2697+ "english_name": "Czech"
2698+ },
2699+ "cv": {
2700+ "articles": 36500,
2701+ "name": "Чăваш",
2702+ "english_name": "Chuvash"
2703+ },
2704+ "pt": {
2705+ "articles": 949039,
2706+ "name": "Português",
2707+ "english_name": "Portuguese"
2708+ },
2709+ "lt": {
2710+ "articles": 180372,
2711+ "name": "Lietuvių",
2712+ "english_name": "Lithuanian"
2713+ },
2714+ "zh-min-nan": {
2715+ "articles": 201851,
2716+ "name": "Bân-lâm-gú",
2717+ "english_name": "Min Nan"
2718+ },
2719+ "pa": {
2720+ "articles": 24065,
2721+ "name": "ਪੰਜਾਬੀ",
2722+ "english_name": "Punjabi"
2723+ },
2724+ "war": {
2725+ "articles": 1261969,
2726+ "name": "Winaray",
2727+ "english_name": "Waray-Waray"
2728+ },
2729+ "pl": {
2730+ "articles": 1197444,
2731+ "name": "Polski",
2732+ "english_name": "Polish"
2733+ },
2734+ "hy": {
2735+ "articles": 212704,
2736+ "name": "Հայերեն",
2737+ "english_name": "Armenian"
2738+ },
2739+ "an": {
2740+ "articles": 31832,
2741+ "name": "Aragonés",
2742+ "english_name": "Aragonese"
2743+ },
2744+ "hr": {
2745+ "articles": 171042,
2746+ "name": "Hrvatski",
2747+ "english_name": "Croatian"
2748+ },
2749+ "ht": {
2750+ "articles": 51108,
2751+ "name": "Krèyol ayisyen",
2752+ "english_name": "Haitian"
2753+ },
2754+ "hu": {
2755+ "articles": 399859,
2756+ "name": "Magyar",
2757+ "english_name": "Hungarian"
2758+ },
2759+ "bat-smg": {
2760+ "articles": 15940,
2761+ "name": "Žemaitėška",
2762+ "english_name": "Samogitian"
2763+ },
2764+ "hi": {
2765+ "articles": 114388,
2766+ "name": "हिन्दी",
2767+ "english_name": "Hindi"
2768+ },
2769+ "pnb": {
2770+ "articles": 42659,
2771+ "name": "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)",
2772+ "english_name": "Western Punjabi"
2773+ },
2774+ "bug": {
2775+ "articles": 14116,
2776+ "name": "Basa Ugi",
2777+ "english_name": "Buginese"
2778+ },
2779+ "he": {
2780+ "articles": 199202,
2781+ "name": "עברית",
2782+ "english_name": "Hebrew"
2783+ },
2784+ "mg": {
2785+ "articles": 82826,
2786+ "name": "Malagasy",
2787+ "english_name": "Malagasy"
2788+ },
2789+ "uz": {
2790+ "articles": 128742,
2791+ "name": "O‘zbek",
2792+ "english_name": "Uzbek"
2793+ },
2794+ "ml": {
2795+ "articles": 46792,
2796+ "name": "മലയാളം",
2797+ "english_name": "Malayalam"
2798+ },
2799+ "azb": {
2800+ "articles": 11813,
2801+ "name": "تۆرکجه",
2802+ "english_name": "South Azerbaijani"
2803+ },
2804+ "mn": {
2805+ "articles": 16281,
2806+ "name": "Монгол",
2807+ "english_name": "Mongolian"
2808+ },
2809+ "mk": {
2810+ "articles": 87527,
2811+ "name": "Македонски",
2812+ "english_name": "Macedonian"
2813+ },
2814+ "ur": {
2815+ "articles": 110767,
2816+ "name": "اردو",
2817+ "english_name": "Urdu"
2818+ },
2819+ "ms": {
2820+ "articles": 286177,
2821+ "name": "Bahasa Melayu",
2822+ "english_name": "Malay"
2823+ },
2824+ "mr": {
2825+ "articles": 45049,
2826+ "name": "मराठी",
2827+ "english_name": "Marathi"
2828+ },
2829+ "my": {
2830+ "articles": 33571,
2831+ "name": "မြန်မာဘာသာ",
2832+ "english_name": "Burmese"
2833+ },
2834+ "sah": {
2835+ "articles": 10965,
2836+ "name": "Саха тыла (Saxa Tyla)",
2837+ "english_name": "Sakha"
2838+ },
2839+ "af": {
2840+ "articles": 42949,
2841+ "name": "Afrikaans",
2842+ "english_name": "Afrikaans"
2843+ },
2844+ "vi": {
2845+ "articles": 1151564,
2846+ "name": "Tiếng Việt",
2847+ "english_name": "Vietnamese"
2848+ },
2849+ "is": {
2850+ "articles": 41500,
2851+ "name": "Íslenska",
2852+ "english_name": "Icelandic"
2853+ },
2854+ "am": {
2855+ "articles": 13291,
2856+ "name": "አማርኛ",
2857+ "english_name": "Amharic"
2858+ },
2859+ "it": {
2860+ "articles": 1317506,
2861+ "name": "Italiano",
2862+ "english_name": "Italian"
2863+ },
2864+ "vo": {
2865+ "articles": 120413,
2866+ "name": "Volapük",
2867+ "english_name": "Volapük"
2868+ },
2869+ "ar": {
2870+ "articles": 453499,
2871+ "name": "العربية",
2872+ "english_name": "Arabic"
2873+ },
2874+ "io": {
2875+ "articles": 26845,
2876+ "name": "Ido",
2877+ "english_name": "Ido"
2878+ },
2879+ "ia": {
2880+ "articles": 19784,
2881+ "name": "Interlingua",
2882+ "english_name": "Interlingua"
2883+ },
2884+ "az": {
2885+ "articles": 111474,
2886+ "name": "Azərbaycanca",
2887+ "english_name": "Azerbaijani"
2888+ },
2889+ "id": {
2890+ "articles": 390200,
2891+ "name": "Bahasa Indonesia",
2892+ "english_name": "Indonesian"
2893+ },
2894+ "nl": {
2895+ "articles": 1885741,
2896+ "name": "Nederlands",
2897+ "english_name": "Dutch"
2898+ },
2899+ "nn": {
2900+ "articles": 131696,
2901+ "name": "Nynorsk",
2902+ "english_name": "Norwegian (Nynorsk)"
2903+ },
2904+ "no": {
2905+ "articles": 458147,
2906+ "name": "Norsk (Bokmål)",
2907+ "english_name": "Norwegian (Bokmål)"
2908+ },
2909+ "nah": {
2910+ "articles": 10428,
2911+ "name": "Nāhuatl",
2912+ "english_name": "Nahuatl"
2913+ },
2914+ "ne": {
2915+ "articles": 29164,
2916+ "name": "नेपाली",
2917+ "english_name": "Nepali"
2918+ },
2919+ "nap": {
2920+ "articles": 14400,
2921+ "name": "Nnapulitano",
2922+ "english_name": "Neapolitan"
2923+ },
2924+ "fr": {
2925+ "articles": 1822985,
2926+ "name": "Français",
2927+ "english_name": "French"
2928+ },
2929+ "mrj": {
2930+ "articles": 10164,
2931+ "name": "Кырык Мары (Kyryk Mary)",
2932+ "english_name": "Hill Mari"
2933+ },
2934+ "zh-yue": {
2935+ "articles": 49352,
2936+ "name": "粵語",
2937+ "english_name": "Cantonese"
2938+ },
2939+ "fy": {
2940+ "articles": 36464,
2941+ "name": "Frysk",
2942+ "english_name": "West Frisian"
2943+ },
2944+ "fa": {
2945+ "articles": 516569,
2946+ "name": "فارسی",
2947+ "english_name": "Persian"
2948+ },
2949+ "fi": {
2950+ "articles": 405166,
2951+ "name": "Suomi",
2952+ "english_name": "Finnish"
2953+ },
2954+ "mzn": {
2955+ "articles": 12362,
2956+ "name": "مَزِروني",
2957+ "english_name": "Mazandarani"
2958+ },
2959+ "sa": {
2960+ "articles": 10198,
2961+ "name": "संस्कृतम्",
2962+ "english_name": "Sanskrit"
2963+ },
2964+ "fo": {
2965+ "articles": 12370,
2966+ "name": "Føroyskt",
2967+ "english_name": "Faroese"
2968+ },
2969+ "ka": {
2970+ "articles": 111155,
2971+ "name": "ქართული",
2972+ "english_name": "Georgian"
2973+ },
2974+ "ckb": {
2975+ "articles": 18217,
2976+ "name": "Soranî / کوردی",
2977+ "english_name": "Sorani"
2978+ },
2979+ "kk": {
2980+ "articles": 217477,
2981+ "name": "Қазақша",
2982+ "english_name": "Kazakh"
2983+ },
2984+ "sr": {
2985+ "articles": 342497,
2986+ "name": "Српски / Srpski",
2987+ "english_name": "Serbian"
2988+ },
2989+ "sq": {
2990+ "articles": 62437,
2991+ "name": "Shqip",
2992+ "english_name": "Albanian"
2993+ },
2994+ "min": {
2995+ "articles": 221961,
2996+ "name": "Minangkabau",
2997+ "english_name": "Minangkabau"
2998+ },
2999+ "ko": {
3000+ "articles": 367127,
3001+ "name": "한국어",
3002+ "english_name": "Korean"
3003+ },
3004+ "sv": {
3005+ "articles": 3783326,
3006+ "name": "Svenska",
3007+ "english_name": "Swedish"
3008+ },
3009+ "su": {
3010+ "articles": 19163,
3011+ "name": "Basa Sunda",
3012+ "english_name": "Sundanese"
3013+ },
3014+ "sk": {
3015+ "articles": 215360,
3016+ "name": "Slovenčina",
3017+ "english_name": "Slovak"
3018+ },
3019+ "si": {
3020+ "articles": 12832,
3021+ "name": "සිංහල",
3022+ "english_name": "Sinhalese"
3023+ },
3024+ "sh": {
3025+ "articles": 436526,
3026+ "name": "Srpskohrvatski / Српскохрватски",
3027+ "english_name": "Serbo-Croatian"
3028+ },
3029+ "ku": {
3030+ "articles": 22367,
3031+ "name": "Kurdî / كوردی",
3032+ "english_name": "Kurdish"
3033+ },
3034+ "sl": {
3035+ "articles": 153978,
3036+ "name": "Slovenščina",
3037+ "english_name": "Slovenian"
3038+ },
3039+ "ky": {
3040+ "articles": 59677,
3041+ "name": "Кыргызча",
3042+ "english_name": "Kirghiz"
3043+ },
3044+ "sw": {
3045+ "articles": 34773,
3046+ "name": "Kiswahili",
3047+ "english_name": "Swahili"
3048+ }
3049+ },
3050+ "ddg definitions": [
3051+ "da-DK",
3052+ "vi-VN",
3053+ "en-SG",
3054+ "sl-SL",
3055+ "en-XA",
3056+ "tzh-HK",
3057+ "en-UK",
3058+ "ro-RO",
3059+ "en-MY",
3060+ "el-GR",
3061+ "it-CH",
3062+ "hu-HU",
3063+ "fr-FR",
3064+ "en-PH",
3065+ "tl-PH",
3066+ "fr-CA",
3067+ "fi-FI",
3068+ "et-EE",
3069+ "sv-SE",
3070+ "es-XL",
3071+ "th-TH",
3072+ "sk-SK",
3073+ "es-ES",
3074+ "en-IE",
3075+ "es-US",
3076+ "es-PE",
3077+ "nl-NL",
3078+ "en-US",
3079+ "de-DE",
3080+ "de-AT",
3081+ "wt-WT",
3082+ "no-NO",
3083+ "tr-TR",
3084+ "ca-ES",
3085+ "it-IT",
3086+ "es-CO",
3087+ "ru-RU",
3088+ "ca-CT",
3089+ "en-ZA",
3090+ "en-CA",
3091+ "jp-JP",
3092+ "es-MX",
3093+ "id-ID",
3094+ "es-AR",
3095+ "he-IL",
3096+ "kr-KR",
3097+ "en-AU",
3098+ "ms-MY",
3099+ "pl-PL",
3100+ "lv-LV",
3101+ "bg-BG",
3102+ "zh-CN",
3103+ "en-NZ",
3104+ "lt-LT",
3105+ "tzh-TW",
3106+ "hr-HR",
3107+ "pt-PT",
3108+ "fr-BE",
3109+ "de-CH",
3110+ "cs-CZ",
3111+ "en-IN",
3112+ "nl-BE",
3113+ "fr-CH",
3114+ "en-ID",
3115+ "ar-XA",
3116+ "pt-BR",
3117+ "uk-UA",
3118+ "es-CL"
3119+ ],
3120+ "bing images": [
3121+ "sq",
3122+ "de",
3123+ "ar",
3124+ "bg",
3125+ "ca",
3126+ "cs",
3127+ "zh-CHS",
3128+ "zh-CHT",
3129+ "ko",
3130+ "hr",
3131+ "da",
3132+ "sk",
3133+ "sl",
3134+ "es",
3135+ "et",
3136+ "fi",
3137+ "fr",
3138+ "el",
3139+ "he",
3140+ "nl",
3141+ "hu",
3142+ "id",
3143+ "en",
3144+ "is",
3145+ "it",
3146+ "ja",
3147+ "lv",
3148+ "lt",
3149+ "ms",
3150+ "nb",
3151+ "fa",
3152+ "pl",
3153+ "pt-BR",
3154+ "pt-PT",
3155+ "ro",
3156+ "ru",
3157+ "sr",
3158+ "sv",
3159+ "th",
3160+ "tr",
3161+ "uk",
3162+ "vi"
3163+ ],
3164+ "yahoo": [
3165+ "ar",
3166+ "bg",
3167+ "zh_chs",
3168+ "zh_cht",
3169+ "hr",
3170+ "cs",
3171+ "da",
3172+ "nl",
3173+ "en",
3174+ "et",
3175+ "fi",
3176+ "fr",
3177+ "de",
3178+ "el",
3179+ "he",
3180+ "hu",
3181+ "it",
3182+ "ja",
3183+ "ko",
3184+ "lv",
3185+ "lt",
3186+ "no",
3187+ "pl",
3188+ "pt",
3189+ "ro",
3190+ "ru",
3191+ "sk",
3192+ "sl",
3193+ "es",
3194+ "sv",
3195+ "th",
3196+ "tr"
3197+ ],
3198+ "gigablast": [
3199+ "en",
3200+ "fr",
3201+ "es",
3202+ "ru",
3203+ "tr",
3204+ "ja",
3205+ "h_",
3206+ "tw",
3207+ "cn",
3208+ "ko",
3209+ "de",
3210+ "nl",
3211+ "it",
3212+ "fi",
3213+ "sv",
3214+ "no",
3215+ "pt",
3216+ "vi",
3217+ "ar",
3218+ "he",
3219+ "id",
3220+ "el",
3221+ "th",
3222+ "hi",
3223+ "bn",
3224+ "pl",
3225+ "tl",
3226+ "la",
3227+ "eo",
3228+ "ca",
3229+ "bg",
3230+ "tx",
3231+ "sr",
3232+ "hu",
3233+ "da",
3234+ "lt",
3235+ "cs",
3236+ "gl",
3237+ "ka",
3238+ "gd",
3239+ "go",
3240+ "ro",
3241+ "ga",
3242+ "lv",
3243+ "hy",
3244+ "is",
3245+ "ag",
3246+ "gv",
3247+ "io",
3248+ "fa",
3249+ "te",
3250+ "vv",
3251+ "mg",
3252+ "ku",
3253+ "lb",
3254+ "et"
3255+ ]
3256+}
searx/engines/__init__.py+6
@@ -20,6 +20,7 @@ from os.path import realpath, dirname
2020import sys
2121from flask_babel import gettext
2222from operator import itemgetter
23+from json import loads
2324from searx import settings
2425from searx import logger
2526from searx.utils import load_module
@@ -78,6 +79,9 @@ def load_engine(engine_data):
7879 if not hasattr(engine, arg_name):
7980 setattr(engine, arg_name, arg_value)
8081
82+ if engine_data['name'] in languages:
83+ setattr(engine, 'supported_languages', languages[engine_data['name']])
84+
8185 # checking required variables
8286 for engine_attr in dir(engine):
8387 if engine_attr.startswith('_'):
@@ -207,6 +211,8 @@ if 'engines' not in settings or not settings['engines']:
207211 logger.error('No engines found. Edit your settings.yml')
208212 exit(2)
209213
214+languages = loads(open(engine_dir + '/../data/engines_languages.json').read())
215+
210216for engine_data in settings['engines']:
211217 engine = load_engine(engine_data)
212218 if engine is not None:
searx/engines/bing.py+15
@@ -15,12 +15,14 @@
1515
1616from urllib import urlencode
1717from lxml import html
18+from requests import get
1819from searx.engines.xpath import extract_text
1920
2021# engine dependent config
2122categories = ['general']
2223paging = True
2324language_support = True
25+supported_languages_url = 'https://www.bing.com/account/general'
2426
2527# search-url
2628base_url = 'https://www.bing.com/'
@@ -81,3 +83,16 @@ def response(resp):
8183
8284 # return results
8385 return results
86+
87+
88+# get supported languages from their site
89+def fetch_supported_languages():
90+ supported_languages = []
91+ response = get(supported_languages_url)
92+ dom = html.fromstring(response.text)
93+ options = dom.xpath('//div[@id="limit-languages"]//input')
94+ for option in options:
95+ code = option.xpath('./@id')[0].replace('_', '-')
96+ supported_languages.append(code)
97+
98+ return supported_languages
searx/engines/bing_images.py+1−1
@@ -19,7 +19,7 @@ from urllib import urlencode
1919from lxml import html
2020from json import loads
2121import re
22−from searx.engines.bing import supported_languages
22+from searx.engines.bing import fetch_supported_languages
2323
2424# engine dependent config
2525categories = ['images']
searx/engines/bing_news.py+1−1
@@ -17,7 +17,7 @@ from datetime import datetime
1717from dateutil import parser
1818from lxml import etree
1919from searx.utils import list_get
20−from searx.engines.bing import supported_languages
20+from searx.engines.bing import fetch_supported_languages
2121
2222# engine dependent config
2323categories = ['news']
searx/engines/dailymotion.py+23−18
@@ -15,29 +15,12 @@
1515from urllib import urlencode
1616from json import loads
1717from datetime import datetime
18+from requests import get
1819
1920# engine dependent config
2021categories = ['videos']
2122paging = True
2223language_support = True
23−supported_languages = ["af", "ak", "am", "ar", "an", "as", "av", "ae", "ay", "az",
24− "ba", "bm", "be", "bn", "bi", "bo", "bs", "br", "bg", "ca",
25− "cs", "ch", "ce", "cu", "cv", "kw", "co", "cr", "cy", "da",
26− "de", "dv", "dz", "el", "en", "eo", "et", "eu", "ee", "fo",
27− "fa", "fj", "fi", "fr", "fy", "ff", "gd", "ga", "gl", "gv",
28− "gn", "gu", "ht", "ha", "sh", "he", "hz", "hi", "ho", "hr",
29− "hu", "hy", "ig", "io", "ii", "iu", "ie", "ia", "id", "ik",
30− "is", "it", "jv", "ja", "kl", "kn", "ks", "ka", "kr", "kk",
31− "km", "ki", "rw", "ky", "kv", "kg", "ko", "kj", "ku", "lo",
32− "la", "lv", "li", "ln", "lt", "lb", "lu", "lg", "mh", "ml",
33− "mr", "mk", "mg", "mt", "mn", "mi", "ms", "my", "na", "nv",
34− "nr", "nd", "ng", "ne", "nl", "nn", "nb", "no", "ny", "oc",
35− "oj", "or", "om", "os", "pa", "pi", "pl", "pt", "ps", "qu",
36− "rm", "ro", "rn", "ru", "sg", "sa", "si", "sk", "sl", "se",
37− "sm", "sn", "sd", "so", "st", "es", "sq", "sc", "sr", "ss",
38− "su", "sw", "sv", "ty", "ta", "tt", "te", "tg", "tl", "th",
39− "ti", "to", "tn", "ts", "tk", "tr", "tw", "ug", "uk", "ur",
40− "uz", "ve", "vi", "vo", "wa", "wo", "xh", "yi", "yo", "za", "zh", "zu"]
4124
4225# search-url
4326# see http://www.dailymotion.com/doc/api/obj-video.html
@@ -45,6 +28,8 @@ search_url = 'https://api.dailymotion.com/videos?fields=created_time,title,descr
4528embedded_url = '<iframe frameborder="0" width="540" height="304" ' +\
4629 'data-src="//www.dailymotion.com/embed/video/{videoid}" allowfullscreen></iframe>'
4730
31+supported_languages_url = 'https://api.dailymotion.com/languages'
32+
4833
4934# do search-request
5035def request(query, params):
@@ -92,3 +77,23 @@ def response(resp):
9277
9378 # return results
9479 return results
80+
81+
82+# get supported languages from their site
83+def fetch_supported_languages():
84+ supported_languages = {}
85+
86+ response = get(supported_languages_url)
87+ response_json = loads(response.text)
88+
89+ for language in response_json['list']:
90+ supported_languages[language['code']] = {}
91+
92+ name = language['native_name']
93+ if name:
94+ supported_languages[language['code']]['name'] = name
95+ english_name = language['name']
96+ if english_name:
97+ supported_languages[language['code']]['english_name'] = english_name
98+
99+ return supported_languages
searx/engines/duckduckgo.py+18−9
@@ -15,19 +15,15 @@
1515
1616from urllib import urlencode
1717from lxml.html import fromstring
18+from requests import get
19+from json import loads
1820from searx.engines.xpath import extract_text
1921
2022# engine dependent config
2123categories = ['general']
2224paging = True
2325language_support = True
24−supported_languages = ["es-AR", "en-AU", "de-AT", "fr-BE", "nl-BE", "pt-BR", "bg-BG", "en-CA", "fr-CA", "ca-CT",
25− "es-CL", "zh-CN", "es-CO", "hr-HR", "cs-CZ", "da-DK", "et-EE", "fi-FI", "fr-FR", "de-DE",
26− "el-GR", "tzh-HK", "hu-HU", "en-IN", "id-ID", "en-ID", "en-IE", "he-IL", "it-IT", "jp-JP",
27− "kr-KR", "es-XL", "lv-LV", "lt-LT", "ms-MY", "en-MY", "es-MX", "nl-NL", "en-NZ", "no-NO",
28− "es-PE", "en-PH", "tl-PH", "pl-PL", "pt-PT", "ro-RO", "ru-RU", "ar-XA", "en-XA", "en-SG",
29− "sk-SK", "sl-SL", "en-ZA", "es-ES", "ca-ES", "sv-SE", "de-CH", "fr-CH", "it-CH", "tzh-TW",
30− "th-TH", "tr-TR", "uk-UA", "en-UK", "en-US", "es-US", "vi-VN"]
26+supported_languages_url = 'https://duckduckgo.com/d2030.js'
3127time_range_support = True
3228
3329# search-url
@@ -65,8 +61,6 @@ def request(query, params):
6561 locale = 'xa' + params['language'].split('-')[0]
6662 elif params['language'][-2:] == 'GB':
6763 locale = 'uk' + params['language'].split('-')[0]
68− elif params['language'] == 'es-419':
69− locale = 'xl-es'
7064 else:
7165 locale = params['language'].split('-')
7266 if len(locale) == 2:
@@ -120,3 +114,18 @@ def response(resp):
120114
121115 # return results
122116 return results
117+
118+
119+# get supported languages from their site
120+def fetch_supported_languages():
121+ response = get(supported_languages_url)
122+
123+ # response is a js file with regions as an embedded object
124+ response_page = response.text
125+ response_page = response_page[response_page.find('regions:{') + 8:]
126+ response_page = response_page[:response_page.find('}') + 1]
127+
128+ regions_json = loads(response_page)
129+ supported_languages = map((lambda x: x[3:] + '-' + x[:2].upper()), regions_json.keys())
130+
131+ return supported_languages
searx/engines/duckduckgo_definitions.py+1−1
@@ -4,7 +4,7 @@ from re import compile, sub
44from lxml import html
55from searx.utils import html_to_text
66from searx.engines.xpath import extract_text
7−from searx.engines.duckduckgo import supported_languages
7+from searx.engines.duckduckgo import fetch_supported_languages
88
99url = 'https://api.duckduckgo.com/'\
1010 + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
searx/engines/gigablast.py+17−5
@@ -14,6 +14,8 @@ from json import loads
1414from random import randint
1515from time import time
1616from urllib import urlencode
17+from requests import get
18+from lxml.html import fromstring
1719
1820# engine dependent config
1921categories = ['general']
@@ -40,11 +42,7 @@ url_xpath = './/url'
4042title_xpath = './/title'
4143content_xpath = './/sum'
4244
43−supported_languages = ["en", "fr", "es", "ru", "tr", "ja", "zh-CN", "zh-TW", "ko", "de",
44− "nl", "it", "fi", "sv", "no", "pt", "vi", "ar", "he", "id", "el",
45− "th", "hi", "bn", "pl", "tl", "la", "eo", "ca", "bg", "tx", "sr",
46− "hu", "da", "lt", "cs", "gl", "ka", "gd", "go", "ro", "ga", "lv",
47− "hy", "is", "ag", "gv", "io", "fa", "te", "vv", "mg", "ku", "lb", "et"]
45+supported_languages_url = 'https://gigablast.com/search?&rxikd=1'
4846
4947
5048# do search-request
@@ -90,3 +88,17 @@ def response(resp):
9088
9189 # return results
9290 return results
91+
92+
93+# get supported languages from their site
94+def fetch_supported_languages():
95+ supported_languages = []
96+ response = get(supported_languages_url)
97+ dom = fromstring(response.text)
98+ links = dom.xpath('//span[@id="menu2"]/a')
99+ for link in links:
100+ code = link.xpath('./@href')[0][-2:]
101+ if code != 'xx' and code not in supported_languages:
102+ supported_languages.append(code)
103+
104+ return supported_languages
searx/engines/google.py+16−14
@@ -12,6 +12,7 @@ import re
1212from urllib import urlencode
1313from urlparse import urlparse, parse_qsl
1414from lxml import html, etree
15+from requests import get
1516from searx.engines.xpath import extract_text, extract_url
1617from searx.search import logger
1718
@@ -23,20 +24,6 @@ categories = ['general']
2324paging = True
2425language_support = True
2526use_locale_domain = True
26−supported_languages = ["ach", "af", "ak", "az", "ms", "ban", "xx-bork", "bs", "br", "ca",
27− "ceb", "ckb", "cs", "sn", "co", "cy", "da", "de", "yo", "et",
28− "xx-elmer", "en", "es", "es-419", "eo", "eu", "ee", "tl", "fo", "fr",
29− "gaa", "ga", "gd", "gl", "gn", "xx-hacker", "ht", "ha", "hr", "haw",
30− "bem", "ig", "rn", "id", "ia", "zu", "is", "it", "jw", "rw", "sw",
31− "tlh", "kg", "mfe", "kri", "la", "lv", "to", "lt", "ln", "loz",
32− "lua", "lg", "hu", "mg", "mt", "mi", "nl", "pcm", "no", "nso",
33− "ny", "nn", "uz", "oc", "om", "xx-pirate", "pl", "pt-BR", "pt-PT",
34− "ro", "rm", "qu", "nyn", "crs", "sq", "sd", "sk", "sl", "so", "st",
35− "sr-ME", "sr-Latn", "su", "fi", "sv", "tg", "tt", "vi", "tn", "tum",
36− "tr", "tk", "tw", "fy", "wo", "xh", "el", "be", "bg", "ky", "kk", "mk",
37− "mn", "ru", "sr", "uk", "ka", "hy", "yi", "iw", "ug", "ur", "ar", "ps",
38− "fa", "ti", "am", "ne", "mr", "hi", "bn", "pa", "gu", "or", "ta", "te",
39− "kn", "ml", "si", "th", "lo", "my", "km", "chr", "ko", "zh-CN", "zh-TW", "ja"]
4027time_range_support = True
4128
4229# based on https://en.wikipedia.org/wiki/List_of_Google_domains and tests
@@ -117,6 +104,7 @@ map_hostname_start = 'maps.google.'
117104maps_path = '/maps'
118105redirect_path = '/url'
119106images_path = '/images'
107+supported_languages_url = 'https://www.google.com/preferences?#languages'
120108
121109# specific xpath variables
122110results_xpath = '//div[@class="g"]'
@@ -373,3 +361,17 @@ def attributes_to_html(attributes):
373361 retval = retval + '<tr><th>' + a.get('label') + '</th><td>' + value + '</td></tr>'
374362 retval = retval + '</table>'
375363 return retval
364+
365+
366+# get supported languages from their site
367+def fetch_supported_languages():
368+ supported_languages = {}
369+ response = get(supported_languages_url)
370+ dom = html.fromstring(response.text)
371+ options = dom.xpath('//select[@name="hl"]/option')
372+ for option in options:
373+ code = option.xpath('./@value')[0].split('-')[0]
374+ name = option.text[:-1].title()
375+ supported_languages[code] = {"name": name}
376+
377+ return supported_languages
searx/engines/google_news.py+1−1
@@ -13,7 +13,7 @@
1313from lxml import html
1414from urllib import urlencode
1515from json import loads
16−from searx.engines.google import supported_languages
16+from searx.engines.google import fetch_supported_languages
1717
1818# search-url
1919categories = ['news']
searx/engines/mediawiki.py−1
@@ -15,7 +15,6 @@
1515from json import loads
1616from string import Formatter
1717from urllib import urlencode, quote
18−from searx.engines.wikipedia import supported_languages
1918
2019# engine dependent config
2120categories = ['general']
searx/engines/qwant.py+1−14
@@ -20,11 +20,6 @@ from searx.utils import html_to_text
2020categories = None
2121paging = True
2222language_support = True
23−supported_languages = ["fr-FR", "de-DE", "en-GB", "it-IT", "es-ES", "pt-PT", "de-CH", "fr-CH", "it-CH", "de-AT",
24− "fr-BE", "nl-BE", "nl-NL", "da-DK", "fi-FI", "sv-SE", "en-IE", "no-NO", "pl-PL", "ru-RU",
25− "el-GR", "bg-BG", "cs-CZ", "et-EE", "hu-HU", "ro-RO", "en-US", "en-CA", "fr-CA", "pt-BR",
26− "es-AR", "es-CL", "es-MX", "ja-JP", "en-SG", "en-IN", "en-MY", "ms-MY", "ko-KR", "tl-PH",
27− "th-TH", "he-IL", "tr-TR", "en-AU", "en-NZ"]
2823
2924category_to_keyword = {'general': 'web',
3025 'images': 'images',
@@ -51,15 +46,7 @@ def request(query, params):
5146
5247 # add language tag if specified
5348 if params['language'] != 'all':
54− locale = params['language'].split('-')
55− if len(locale) == 2 and params['language'] in supported_languages:
56− params['url'] += '&locale=' + params['language'].replace('-', '_').lower()
57− else:
58− # try to get a country code for language
59− for lang in supported_languages:
60− if locale[0] == lang.split('-')[0]:
61− params['url'] += '&locale=' + lang.replace('-', '_').lower()
62− break
49+ params['url'] += '&locale=' + params['language'].replace('-', '_').lower()
6350
6451 return params
6552
searx/engines/startpage.py−5
@@ -24,11 +24,6 @@ categories = ['general']
2424
2525# paging = False
2626language_support = True
27−supported_languages = ["af", "de", "ar", "hy", "be", "bg", "ca", "cs", "zh-CN", "zh-TW",
28− "ko", "hr", "da", "sk", "sl", "es", "eo", "et", "fi", "fr",
29− "el", "iw", "hi", "nl", "hu", "id", "en", "is", "it", "ja",
30− "lv", "lt", "no", "fa", "pl", "pt", "ro", "ru", "sr", "sw",
31− "sv", "tl", "th", "tr", "uk", "vi"]
3227
3328# search-url
3429base_url = 'https://startpage.com/'
searx/engines/subtitleseeker.py+3−2
@@ -22,7 +22,7 @@ language = ""
2222
2323# search-url
2424url = 'http://www.subtitleseeker.com/'
25−search_url = url + 'search/TITLES/{query}&p={pageno}'
25+search_url = url + 'search/TITLES/{query}?p={pageno}'
2626
2727# specific xpath variables
2828results_xpath = '//div[@class="boxRows"]'
@@ -51,7 +51,8 @@ def response(resp):
5151 elif resp.search_params['language'] != 'all':
5252 search_lang = [lc[3]
5353 for lc in language_codes
54− if lc[0][:2] == resp.search_params['language'].split('_')[0]][0]
54+ if lc[0].split('-')[0] == resp.search_params['language'].split('-')[0]]
55+ search_lang = search_lang[0].split(' (')[0]
5556
5657 # parse results
5758 for result in dom.xpath(results_xpath):
searx/engines/swisscows.py+15−6
@@ -13,17 +13,13 @@
1313from json import loads
1414from urllib import urlencode, unquote
1515import re
16+from requests import get
17+from lxml.html import fromstring
1618
1719# engine dependent config
1820categories = ['general', 'images']
1921paging = True
2022language_support = True
21−supported_languages = ["ar-SA", "es-AR", "en-AU", "de-AT", "fr-BE", "nl-BE", "pt-BR", "bg-BG", "en-CA", "fr-CA",
22− "es-CL", "zh-CN", "hr-HR", "cs-CZ", "da-DK", "et-EE", "fi-FI", "fr-FR", "de-DE", "el-GR",
23− "zh-HK", "hu-HU", "en-IN", "en-IE", "he-IL", "it-IT", "ja-JP", "ko-KR", "lv-LV", "lt-LT",
24− "en-MY", "es-MX", "nl-NL", "en-NZ", "nb-NO", "en-PH", "pl-PL", "pt-PT", "ro-RO", "ru-RU",
25− "en-SG", "sk-SK", "sl-SI", "en-ZA", "es-ES", "sv-SE", "de-CH", "fr-CH", "zh-TW", "th-TH",
26− "tr-TR", "uk-UA", "en-GB", "en-US", "es-US"]
2723
2824# search-url
2925base_url = 'https://swisscows.ch/'
@@ -114,3 +110,16 @@ def response(resp):
114110
115111 # return results
116112 return results
113+
114+
115+# get supported languages from their site
116+def fetch_supported_languages():
117+ supported_languages = []
118+ response = get(base_url)
119+ dom = fromstring(response.text)
120+ options = dom.xpath('//div[@id="regions-popup"]//ul/li/a')
121+ for option in options:
122+ code = option.xpath('./@data-val')[0]
123+ supported_languages.append(code)
124+
125+ return supported_languages
searx/engines/wikidata.py+3−3
@@ -15,7 +15,7 @@ from searx import logger
1515from searx.poolrequests import get
1616from searx.engines.xpath import extract_text
1717from searx.utils import format_date_by_locale
18−from searx.engines.wikipedia import supported_languages
18+from searx.engines.wikipedia import fetch_supported_languages
1919
2020from json import loads
2121from lxml.html import fromstring
@@ -57,7 +57,7 @@ calendar_name_xpath = './/sup[contains(@class,"wb-calendar-name")]'
5757
5858
5959def request(query, params):
60− language = params['language'].split('_')[0]
60+ language = params['language'].split('-')[0]
6161 if language == 'all':
6262 language = 'en'
6363
@@ -72,7 +72,7 @@ def response(resp):
7272 html = fromstring(resp.content)
7373 wikidata_ids = html.xpath(wikidata_ids_xpath)
7474
75− language = resp.search_params['language'].split('_')[0]
75+ language = resp.search_params['language'].split('-')[0]
7676 if language == 'all':
7777 language = 'en'
7878
searx/engines/wikipedia.py+24−29
@@ -12,36 +12,9 @@
1212
1313from json import loads
1414from urllib import urlencode, quote
15+from requests import get
16+from lxml.html import fromstring
1517
16−supported_languages = ["en", "sv", "ceb", "de", "nl", "fr", "ru", "it", "es", "war",
17− "pl", "vi", "ja", "pt", "zh", "uk", "ca", "fa", "no", "sh",
18− "ar", "fi", "hu", "id", "ro", "cs", "ko", "sr", "ms", "tr",
19− "eu", "eo", "min", "bg", "da", "kk", "sk", "hy", "he", "zh-min-nan",
20− "lt", "hr", "sl", "et", "ce", "gl", "nn", "uz", "la", "vo",
21− "el", "simple", "be", "az", "th", "ur", "ka", "hi", "oc", "ta",
22− "mk", "mg", "new", "lv", "cy", "bs", "tt", "tl", "te", "pms",
23− "be-tarask", "br", "sq", "ky", "ht", "jv", "tg", "ast", "zh-yue", "lb",
24− "mr", "ml", "bn", "pnb", "is", "af", "sco", "ga", "ba", "fy",
25− "cv", "lmo", "sw", "my", "an", "yo", "ne", "io", "gu", "nds",
26− "scn", "bpy", "pa", "ku", "als", "kn", "bar", "ia", "qu", "su",
27− "ckb", "bat-smg", "mn", "arz", "nap", "wa", "bug", "gd", "yi", "map-bms",
28− "am", "mzn", "fo", "si", "nah", "li", "sah", "vec", "hsb", "or",
29− "os", "mrj", "sa", "hif", "mhr", "roa-tara", "azb", "pam", "ilo",
30− "sd", "ps", "se", "mi", "bh", "eml", "bcl", "xmf", "diq", "hak",
31− "gan", "glk", "vls", "nds-nl", "rue", "bo", "fiu-vro", "co", "sc",
32− "tk", "csb", "lrc", "vep", "wuu", "km", "szl", "gv", "crh", "kv",
33− "zh-classical", "frr", "zea", "as", "so", "kw", "nso", "ay", "stq",
34− "udm", "cdo", "nrm", "ie", "koi", "rm", "pcd", "myv", "mt", "fur",
35− "ace", "lad", "gn", "lij", "dsb", "dv", "cbk-zam", "ext", "gom",
36− "kab", "ksh", "ang", "mai", "mwl", "lez", "gag", "ln", "ug", "pi",
37− "pag", "frp", "sn", "nv", "av", "pfl", "haw", "xal", "krc", "kaa",
38− "rw", "bxr", "pdc", "to", "kl", "nov", "arc", "kbd", "lo", "bjn",
39− "pap", "ha", "tet", "ki", "tyv", "tpi", "na", "lbe", "ig", "jbo",
40− "roa-rup", "ty", "jam", "za", "kg", "mdf", "lg", "wo", "srn", "ab",
41− "ltg", "zu", "sm", "chr", "om", "tn", "chy", "rmy", "cu", "tw", "tum",
42− "xh", "bi", "rn", "pih", "got", "ss", "pnt", "bm", "ch", "mo", "ts",
43− "ady", "iu", "st", "ee", "ny", "fj", "ks", "ak", "ik", "sg", "ve",
44− "dz", "ff", "ti", "cr", "ng", "cho", "kj", "mh", "ho", "ii", "aa", "mus", "hz", "kr"]
4518
4619# search-url
4720base_url = 'https://{language}.wikipedia.org/'
@@ -54,6 +27,7 @@ search_postfix = 'w/api.php?'\
5427 '&explaintext'\
5528 '&pithumbsize=300'\
5629 '&redirects'
30+supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
5731
5832
5933# set language in base_url
@@ -142,3 +116,24 @@ def response(resp):
142116 'urls': [{'title': 'Wikipedia', 'url': wikipedia_link}]})
143117
144118 return results
119+
120+
121+# get supported languages from their site
122+def fetch_supported_languages():
123+ supported_languages = {}
124+ response = get(supported_languages_url)
125+ dom = fromstring(response.text)
126+ tables = dom.xpath('//table[contains(@class,"sortable")]')
127+ for table in tables:
128+ # exclude header row
129+ trs = table.xpath('.//tr')[1:]
130+ for tr in trs:
131+ td = tr.xpath('./td')
132+ code = td[3].xpath('./a')[0].text
133+ name = td[2].xpath('./a')[0].text
134+ english_name = td[1].xpath('./a')[0].text
135+ articles = int(td[4].xpath('./a/b')[0].text.replace(',', ''))
136+ if articles >= 10000:
137+ supported_languages[code] = {"name": name, "english_name": english_name, "articles": articles}
138+
139+ return supported_languages
searx/engines/yahoo.py+16−4
@@ -14,16 +14,13 @@
1414from urllib import urlencode
1515from urlparse import unquote
1616from lxml import html
17+from requests import get
1718from searx.engines.xpath import extract_text, extract_url
1819
1920# engine dependent config
2021categories = ['general']
2122paging = True
2223language_support = True
23−supported_languages = ["ar", "bg", "ca", "szh", "tzh", "hr", "cs", "da", "nl", "en",
24− "et", "fi", "fr", "de", "el", "he", "hu", "is", "id", "it", "ja",
25− "ko", "lv", "lt", "no", "fa", "pl", "pt", "ro", "ru", "sk", "sr",
26− "sl", "es", "sv", "th", "tr"]
2724time_range_support = True
2825
2926# search-url
@@ -31,6 +28,8 @@ base_url = 'https://search.yahoo.com/'
3128search_url = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}'
3229search_url_with_time = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}&age={age}&btf={btf}&fr2=time'
3330
31+supported_languages_url = 'https://search.yahoo.com/web/advanced'
32+
3433# specific xpath variables
3534results_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' Sr ')]"
3635url_xpath = './/h3/a/@href'
@@ -142,3 +141,16 @@ def response(resp):
142141
143142 # return results
144143 return results
144+
145+
146+# get supported languages from their site
147+def fetch_supported_languages():
148+ supported_languages = []
149+ response = get(supported_languages_url)
150+ dom = html.fromstring(response.text)
151+ options = dom.xpath('//div[@id="yschlang"]/span/label/input')
152+ for option in options:
153+ code = option.xpath('./@value')[0][5:]
154+ supported_languages.append(code)
155+
156+ return supported_languages
searx/engines/yahoo_news.py+1−1
@@ -12,7 +12,7 @@
1212from urllib import urlencode
1313from lxml import html
1414from searx.engines.xpath import extract_text, extract_url
15−from searx.engines.yahoo import parse_url, supported_languages
15+from searx.engines.yahoo import parse_url, fetch_supported_languages
1616from datetime import datetime, timedelta
1717import re
1818from dateutil import parser
searx/languages.py+47−76
@@ -4,39 +4,29 @@
44
55language_codes = (
66 (u"ach", u"Acoli", u"", u""),
7− (u"af", u"Afrikaans", u"", u"Afrikaans"),
7+ (u"af", u"Afrikaans", u"", u""),
88 (u"ak", u"Akan", u"", u""),
9− (u"als", u"Alemannisch", u"", u"Alemannic"),
10− (u"am", u"አማርኛ", u"", u"Amharic"),
11− (u"an", u"Aragonés", u"", u"Aragonese"),
9+ (u"am", u"አማርኛ", u"", u""),
1210 (u"ar-SA", u"العربية", u"المملكة العربية السعودية", u"Arabic"),
13− (u"arz", u"مصرى (Maṣri)", u"", u"Egyptian Arabic"),
14− (u"ast", u"Asturianu", u"", u"Asturian"),
1511 (u"az", u"Azərbaycanca", u"", u"Azerbaijani"),
16− (u"azb", u"تۆرکجه", u"", u"South Azerbaijani"),
17− (u"ba", u"Башҡорт", u"", u"Bashkir"),
1812 (u"ban", u"Balinese", u"", u""),
19− (u"bar", u"Boarisch", u"", u"Bavarian"),
2013 (u"be", u"Беларуская", u"", u"Belarusian"),
2114 (u"bem", u"Ichibemba", u"", u""),
2215 (u"bg-BG", u"Български", u"България", u"Bulgarian"),
23− (u"bn", u"বাংলা", u"", u"Bengali"),
24− (u"bpy", u"ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী", u"", u"Bishnupriya Manipuri"),
25− (u"br", u"Brezhoneg", u"", u"Breton"),
26− (u"bs", u"Bosanski", u"", u"Bosnian"),
27− (u"bug", u"Basa Ugi", u"", u"Buginese"),
16+ (u"bn", u"বাংলা", u"", u""),
17+ (u"br", u"Brezhoneg", u"", u""),
18+ (u"bs", u"Bosanski", u"", u""),
2819 (u"ca", u"Català", u"", u"Catalan"),
2920 (u"ca-CT", u"Català", u"", u"Catalan"),
3021 (u"ca-ES", u"Català", u"Espanya", u"Catalan"),
3122 (u"ce", u"Нохчийн", u"", u"Chechen"),
3223 (u"ceb", u"Sinugboanong Binisaya", u"", u"Cebuano"),
3324 (u"chr", u"ᏣᎳᎩ", u"", u""),
34− (u"ckb", u"Soranî / کوردی", u"", u"Sorani"),
25+ (u"ckb", u"Central Kurdish", u"", u""),
3526 (u"co", u"Corsican", u"", u""),
3627 (u"crs", u"Seychellois Creole", u"", u""),
3728 (u"cs-CZ", u"Čeština", u"Česko", u"Czech"),
38− (u"cv", u"Чăваш", u"", u"Chuvash"),
39− (u"cy", u"Cymraeg", u"", u"Welsh"),
29+ (u"cy", u"Cymraeg", u"", u""),
4030 (u"da-DK", u"Dansk", u"Danmark", u"Danish"),
4131 (u"de", u"Deutsch", u"", u"German"),
4232 (u"de-AT", u"Deutsch", u"Österreich", u"German"),
@@ -70,148 +60,129 @@ language_codes = (
7060 (u"eu", u"Euskara", u"", u"Basque"),
7161 (u"fa", u"فارسی", u"", u"Persian"),
7262 (u"fi-FI", u"Suomi", u"Suomi", u"Finnish"),
73− (u"fo", u"Føroyskt", u"", u"Faroese"),
63+ (u"fo", u"Føroyskt", u"", u""),
7464 (u"fr", u"Français", u"", u"French"),
7565 (u"fr-BE", u"Français", u"Belgique", u"French"),
7666 (u"fr-CA", u"Français", u"Canada", u"French"),
7767 (u"fr-CH", u"Français", u"Suisse", u"French"),
7868 (u"fr-FR", u"Français", u"France", u"French"),
79− (u"fy", u"Frysk", u"", u"West Frisian"),
80− (u"ga", u"Gaeilge", u"", u"Irish"),
69+ (u"fy", u"West-Frysk", u"", u""),
70+ (u"ga", u"Gaeilge", u"", u""),
8171 (u"gaa", u"Ga", u"", u""),
82− (u"gd", u"Gàidhlig", u"", u"Scottish Gaelic"),
72+ (u"gd", u"Gàidhlig", u"", u""),
8373 (u"gl", u"Galego", u"", u"Galician"),
8474 (u"gn", u"Guarani", u"", u""),
85− (u"gu", u"ગુજરાતી", u"", u"Gujarati"),
75+ (u"gu", u"ગુજરાતી", u"", u""),
8676 (u"ha", u"Hausa", u"", u""),
8777 (u"haw", u"ʻŌlelo HawaiʻI", u"", u""),
8878 (u"he-IL", u"עברית", u"ישראל", u"Hebrew"),
8979 (u"hi", u"हिन्दी", u"", u"Hindi"),
9080 (u"hr-HR", u"Hrvatski", u"Hrvatska", u"Croatian"),
91− (u"hsb", u"Hornjoserbsce", u"", u"Upper Sorbian"),
92− (u"ht", u"Krèyol ayisyen", u"", u"Haitian"),
81+ (u"ht", u"Haitian Creole", u"", u""),
9382 (u"hu-HU", u"Magyar", u"Magyarország", u"Hungarian"),
9483 (u"hy", u"Հայերեն", u"", u"Armenian"),
95− (u"ia", u"Interlingua", u"", u"Interlingua"),
84+ (u"ia", u"Interlingua", u"", u""),
9685 (u"id-ID", u"Bahasa Indonesia", u"Indonesia", u"Indonesian"),
9786 (u"ig", u"Igbo", u"", u""),
98− (u"io", u"Ido", u"", u"Ido"),
99− (u"is", u"Íslenska", u"", u"Icelandic"),
87+ (u"is", u"Íslenska", u"", u""),
10088 (u"it", u"Italiano", u"", u"Italian"),
10189 (u"it-CH", u"Italiano", u"Svizzera", u"Italian"),
10290 (u"it-IT", u"Italiano", u"Italia", u"Italian"),
10391 (u"iw", u"עברית", u"", u""),
10492 (u"ja-JP", u"日本語", u"日本", u"Japanese"),
105− (u"jv", u"Basa Jawa", u"", u"Javanese"),
10693 (u"ka", u"ქართული", u"", u"Georgian"),
10794 (u"kg", u"Kongo", u"", u""),
10895 (u"kk", u"Қазақша", u"", u"Kazakh"),
10996 (u"km", u"ខ្មែរ", u"", u""),
110− (u"kn", u"ಕನ್ನಡ", u"", u"Kannada"),
97+ (u"kn", u"ಕನ್ನಡ", u"", u""),
11198 (u"ko-KR", u"한국어", u"대한민국", u"Korean"),
112− (u"kri", u"Krio (Sierra Leone)", u"", u""),
113− (u"ku", u"Kurdî / كوردی", u"", u"Kurdish"),
114− (u"ky", u"Кыргызча", u"", u"Kirghiz"),
99+ (u"kri", u"Krio", u"", u""),
100+ (u"ky", u"Кыргызча", u"", u""),
115101 (u"la", u"Latina", u"", u"Latin"),
116− (u"lb", u"Lëtzebuergesch", u"", u"Luxembourgish"),
117102 (u"lg", u"Luganda", u"", u""),
118− (u"li", u"Limburgs", u"", u"Limburgish"),
119− (u"lmo", u"Lumbaart", u"", u"Lombard"),
120103 (u"ln", u"Lingála", u"", u""),
121104 (u"lo", u"ລາວ", u"", u""),
122105 (u"loz", u"Lozi", u"", u""),
123106 (u"lt-LT", u"Lietuvių", u"Lietuva", u"Lithuanian"),
124107 (u"lua", u"Luba-Lulua", u"", u""),
125− (u"lv-LV", u"Latviešu", u"Latvijas Republika", u"Latvian"),
108+ (u"lv-LV", u"Latviešu", u"Latvijas Republika", u""),
126109 (u"mfe", u"Kreol Morisien", u"", u""),
127− (u"mg", u"Malagasy", u"", u"Malagasy"),
110+ (u"mg", u"Malagasy", u"", u""),
128111 (u"mi", u"Maori", u"", u""),
129112 (u"min", u"Minangkabau", u"", u"Minangkabau"),
130− (u"mk", u"Македонски", u"", u"Macedonian"),
131− (u"ml", u"മലയാളം", u"", u"Malayalam"),
132− (u"mn", u"Монгол", u"", u"Mongolian"),
133− (u"mr", u"मराठी", u"", u"Marathi"),
134− (u"mrj", u"Кырык Мары (Kyryk Mary)", u"", u"Hill Mari"),
113+ (u"mk", u"Македонски", u"", u""),
114+ (u"ml", u"മലയാളം", u"", u""),
115+ (u"mn", u"Монгол", u"", u""),
116+ (u"mr", u"मराठी", u"", u""),
135117 (u"ms-MY", u"Bahasa Melayu", u"Malaysia", u"Malay"),
136118 (u"mt", u"Malti", u"", u""),
137− (u"my", u"မြန်မာဘာသာ", u"", u"Burmese"),
138− (u"mzn", u"مَزِروني", u"", u"Mazandarani"),
139− (u"nah", u"Nāhuatl", u"", u"Nahuatl"),
140− (u"nap", u"Nnapulitano", u"", u"Neapolitan"),
141− (u"nds-nl", u"Plattdüütsch", u"Nedderlannen", u"Low Saxon"),
142− (u"ne", u"नेपाली", u"", u"Nepali"),
143− (u"new", u"नेपाल भाषा", u"", u"Newar"),
119+ (u"my", u"ဗမာ", u"", u""),
120+ (u"nb-NO", u"Norwegian Bokmål", u"Norge", u"Norwegian Bokmål"),
121+ (u"ne", u"नेपाली", u"", u""),
144122 (u"nl", u"Nederlands", u"", u"Dutch"),
145123 (u"nl-BE", u"Nederlands", u"België", u"Dutch"),
146124 (u"nl-NL", u"Nederlands", u"Nederland", u"Dutch"),
147− (u"nn", u"Nynorsk", u"", u"Norwegian (Nynorsk)"),
148− (u"no-NO", u"Norsk (Bokmål)", u"Norge", u"Norwegian (Bokmål)"),
125+ (u"nn", u"Nynorsk", u"", u"Norwegian"),
126+ (u"no-NO", u"Norsk", u"Norge", u"Norwegian"),
149127 (u"nso", u"Northern Sotho", u"", u""),
150128 (u"ny", u"Nyanja", u"", u""),
151129 (u"nyn", u"Runyankore", u"", u""),
152− (u"oc", u"Occitan", u"", u"Occitan"),
130+ (u"oc", u"Occitan", u"", u""),
153131 (u"om", u"Oromoo", u"", u""),
154− (u"or", u"ଓଡ଼ିଆ", u"", u"Oriya"),
155− (u"os", u"Иронау", u"", u"Ossetian"),
156− (u"pa", u"ਪੰਜਾਬੀ", u"", u"Punjabi"),
132+ (u"or", u"ଓଡ଼ିଆ", u"", u""),
133+ (u"pa", u"ਪੰਜਾਬੀ", u"", u""),
157134 (u"pcm", u"Nigerian Pidgin", u"", u""),
158135 (u"pl-PL", u"Polski", u"Rzeczpospolita Polska", u"Polish"),
159− (u"pms", u"Piemontèis", u"", u"Piedmontese"),
160− (u"pnb", u"شاہ مکھی پنجابی (Shāhmukhī Pañjābī)", u"", u"Western Punjabi"),
161136 (u"ps", u"پښتو", u"", u""),
162137 (u"pt", u"Português", u"", u"Portuguese"),
163138 (u"pt-BR", u"Português", u"Brasil", u"Portuguese"),
164139 (u"pt-PT", u"Português", u"Portugal", u"Portuguese"),
165− (u"qu", u"Runa Simi", u"", u"Quechua"),
140+ (u"qu", u"Runasimi", u"", u""),
166141 (u"rm", u"Rumantsch", u"", u""),
167142 (u"rn", u"Ikirundi", u"", u""),
168143 (u"ro-RO", u"Română", u"România", u"Romanian"),
169144 (u"ru-RU", u"Русский", u"Россия", u"Russian"),
170145 (u"rw", u"Kinyarwanda", u"", u""),
171− (u"sa", u"संस्कृतम्", u"", u"Sanskrit"),
172− (u"sah", u"Саха тыла (Saxa Tyla)", u"", u"Sakha"),
173− (u"scn", u"Sicilianu", u"", u"Sicilian"),
174− (u"sco", u"Scots", u"", u"Scots"),
175146 (u"sd", u"Sindhi", u"", u""),
176147 (u"sh", u"Srpskohrvatski / Српскохрватски", u"", u"Serbo-Croatian"),
177− (u"si", u"සිංහල", u"", u"Sinhalese"),
148+ (u"si", u"සිංහල", u"", u""),
178149 (u"sk-SK", u"Slovenčina", u"Slovenská republika", u"Slovak"),
179− (u"sl-SI", u"Slovenščina", u"Slovenija", u"Slovenian"),
150+ (u"sl", u"Slovenščina", u"", u"Slovenian"),
180151 (u"sn", u"Chishona", u"", u""),
181152 (u"so", u"Soomaali", u"", u""),
182− (u"sq", u"Shqip", u"", u"Albanian"),
183− (u"sr-ME", u"Српски / Srpski", u"Црна Гора", u"Serbian"),
153+ (u"sq", u"Shqip", u"", u""),
154+ (u"sr", u"Српски / Srpski", u"", u"Serbian"),
184155 (u"st", u"Southern Sotho", u"", u""),
185− (u"su", u"Basa Sunda", u"", u"Sundanese"),
156+ (u"su", u"Sundanese", u"", u""),
186157 (u"sv-SE", u"Svenska", u"Sverige", u"Swedish"),
187− (u"sw", u"Kiswahili", u"", u"Swahili"),
188− (u"ta", u"தமிழ்", u"", u"Tamil"),
189− (u"te", u"తెలుగు", u"", u"Telugu"),
190− (u"tg", u"Тоҷикӣ", u"", u"Tajik"),
158+ (u"sw", u"Kiswahili", u"", u""),
159+ (u"ta", u"தமிழ்", u"", u""),
160+ (u"te", u"తెలుగు", u"", u""),
161+ (u"tg", u"Tajik", u"", u""),
191162 (u"th-TH", u"ไทย", u"ไทย", u"Thai"),
192163 (u"ti", u"ትግርኛ", u"", u""),
193164 (u"tk", u"Turkmen", u"", u""),
194− (u"tl-PH", u"Tagalog", u"Pilipinas", u"Tagalog"),
165+ (u"tl-PH", u"Filipino", u"Pilipinas", u""),
195166 (u"tlh", u"Klingon", u"", u""),
196167 (u"tn", u"Tswana", u"", u""),
197168 (u"to", u"Lea Fakatonga", u"", u""),
198169 (u"tr-TR", u"Türkçe", u"Türkiye", u"Turkish"),
199− (u"tt", u"Tatarça / Татарча", u"", u"Tatar"),
170+ (u"tt", u"Tatar", u"", u""),
200171 (u"tum", u"Tumbuka", u"", u""),
201172 (u"tw", u"Twi", u"", u""),
202173 (u"ug", u"ئۇيغۇرچە", u"", u""),
203174 (u"uk-UA", u"Українська", u"Україна", u"Ukrainian"),
204175 (u"ur", u"اردو", u"", u"Urdu"),
205176 (u"uz", u"O‘zbek", u"", u"Uzbek"),
206− (u"vec", u"Vèneto", u"", u"Venetian"),
177+ (u"ve", u"Venda", u"", u"Venda"),
207178 (u"vi-VN", u"Tiếng Việt", u"Công Hòa Xã Hội Chủ Nghĩa Việt Nam", u"Vietnamese"),
208179 (u"vo", u"Volapük", u"", u"Volapük"),
209180 (u"wa", u"Walon", u"", u"Walloon"),
210181 (u"war", u"Winaray", u"", u"Waray-Waray"),
211182 (u"wo", u"Wolof", u"", u""),
212183 (u"xh", u"Xhosa", u"", u""),
213− (u"yi", u"ייִדיש", u"", u"Yiddish"),
214− (u"yo", u"Yorùbá", u"", u"Yoruba"),
184+ (u"yi", u"ייִדיש", u"", u""),
185+ (u"yo", u"Èdè Yorùbá", u"", u""),
215186 (u"zh", u"中文", u"", u"Chinese"),
216187 (u"zh-CN", u"中文", u"中国", u"Chinese"),
217188 (u"zh-HK", u"中文", u"香港", u"Chinese"),
searx/webapp.py+1−1
@@ -514,7 +514,7 @@ def index():
514514 answers=result_container.answers,
515515 infoboxes=result_container.infoboxes,
516516 paging=result_container.paging,
517− current_language=search.lang,
517+ current_language=search_query.lang,
518518 base_url=get_base_url(),
519519 theme=get_current_theme_name(),
520520 favicons=global_favicons[themes.index(get_current_theme_name())]
tests/unit/engines/test_subtitleseeker.py+1−1
@@ -17,7 +17,7 @@ class TestSubtitleseekerEngine(SearxTestCase):
1717
1818 def test_response(self):
1919 dicto = defaultdict(dict)
20− dicto['language'] = 'fr_FR'
20+ dicto['language'] = 'fr-FR'
2121 response = mock.Mock(search_params=dicto)
2222
2323 self.assertRaises(AttributeError, subtitleseeker.response, None)
tests/unit/engines/test_wikipedia.py+2
@@ -8,6 +8,8 @@ from searx.testing import SearxTestCase
88class TestWikipediaEngine(SearxTestCase):
99
1010 def test_request(self):
11+ wikipedia.supported_languages = ['fr', 'en']
12+
1113 query = 'test_query'
1214 dicto = defaultdict(dict)
1315 dicto['language'] = 'fr-FR'
utils/fetch_languages.pynew file+164
@@ -0,0 +1,164 @@
1+# -*- coding: utf-8 -*-
2+
3+# This script generates languages.py from intersecting each engine's supported languages.
4+#
5+# The country names are obtained from http://api.geonames.org which requires registering as a user.
6+#
7+# Output files (engines_languages.json and languages.py)
8+# are written in current directory to avoid overwriting in case something goes wrong.
9+
10+from requests import get
11+from urllib import urlencode
12+from lxml.html import fromstring
13+from json import loads, dumps
14+import io
15+from sys import path
16+path.append('../searx') # noqa
17+from searx.engines import engines
18+
19+# Geonames API for country names.
20+geonames_user = '' # ADD USER NAME HERE
21+country_names_url = 'http://api.geonames.org/countryInfoJSON?{parameters}'
22+
23+# Output files.
24+engines_languages_file = 'engines_languages.json'
25+languages_file = 'languages.py'
26+
27+engines_languages = {}
28+languages = {}
29+
30+
31+# To filter out invalid codes and dialects.
32+def valid_code(lang_code):
33+ # filter invalid codes
34+ # sl-SL is technically not invalid, but still a mistake
35+ if lang_code[:2] == 'xx'\
36+ or lang_code == 'sl-SL'\
37+ or lang_code == 'wt-WT'\
38+ or lang_code == 'jw'\
39+ or lang_code[-2:] == 'UK'\
40+ or lang_code[-2:] == 'XA'\
41+ or lang_code[-2:] == 'XL':
42+ return False
43+
44+ # filter dialects
45+ lang_code = lang_code.split('-')
46+ if len(lang_code) > 2 or len(lang_code[0]) > 3:
47+ return False
48+ if len(lang_code) == 2 and len(lang_code[1]) > 2:
49+ return False
50+
51+ return True
52+
53+
54+# Get country name in specified language.
55+def get_country_name(locale):
56+ if geonames_user is '':
57+ return ''
58+
59+ locale = locale.split('-')
60+ if len(locale) != 2:
61+ return ''
62+
63+ url = country_names_url.format(parameters=urlencode({'lang': locale[0],
64+ 'country': locale[1],
65+ 'username': geonames_user}))
66+ response = get(url)
67+ json = loads(response.text)
68+ content = json.get('geonames', None)
69+ if content is None or len(content) != 1:
70+ print "No country name found for " + locale[0] + "-" + locale[1]
71+ return ''
72+
73+ return content[0].get('countryName', '')
74+
75+
76+# Fetchs supported languages for each engine and writes json file with those.
77+def fetch_supported_languages():
78+ for engine_name in engines:
79+ if hasattr(engines[engine_name], 'fetch_supported_languages'):
80+ try:
81+ engines_languages[engine_name] = engines[engine_name].fetch_supported_languages()
82+ except Exception as e:
83+ print e
84+
85+ # write json file
86+ f = io.open(engines_languages_file, "w", encoding="utf-8")
87+ f.write(unicode(dumps(engines_languages, indent=4, ensure_ascii=False, encoding="utf-8")))
88+ f.close()
89+
90+
91+# Join all language lists.
92+# Iterate all languages supported by each engine.
93+def join_language_lists():
94+ # include wikipedia first for more accurate language names
95+ # exclude languages with too few articles
96+ languages.update({code: lang for code, lang
97+ in engines_languages['wikipedia'].iteritems()
98+ if valid_code(code) and lang['articles'] >= 100000})
99+
100+ for engine_name in engines_languages:
101+ for locale in engines_languages[engine_name]:
102+ if not valid_code(locale):
103+ continue
104+
105+ # if language is not on list or if it has no name yet
106+ if locale not in languages or not languages[locale].get('name'):
107+ if isinstance(engines_languages[engine_name], dict) \
108+ and engines_languages[engine_name][locale].get('articles', float('inf')) >= 100000:
109+ languages[locale] = engines_languages[engine_name][locale]
110+ else:
111+ languages[locale] = {}
112+
113+ # get locales that have no name yet
114+ for locale in languages.keys():
115+ if not languages[locale].get('name'):
116+ # try to get language and country names
117+ name = languages.get(locale.split('-')[0], {}).get('name', None)
118+ if name:
119+ languages[locale]['name'] = name
120+ languages[locale]['country'] = get_country_name(locale) or ''
121+ languages[locale]['english_name'] = languages.get(locale.split('-')[0], {}).get('english_name', '')
122+ else:
123+ # filter out locales with no name
124+ del languages[locale]
125+
126+
127+# Remove countryless language if language is featured in only one country.
128+def filter_single_country_languages():
129+ prev_lang = None
130+ for code in sorted(languages):
131+ lang = code.split('-')[0]
132+ if lang == prev_lang:
133+ countries += 1
134+ else:
135+ if prev_lang is not None and countries == 1:
136+ del languages[prev_lang]
137+ countries = 0
138+ prev_lang = lang
139+
140+
141+# Write languages.py.
142+def write_languages_file():
143+ new_file = open(languages_file, 'w')
144+ file_content = '# -*- coding: utf-8 -*-\n'
145+ file_content += '# list of language codes\n'
146+ file_content += '# this file is generated automatically by utils/update_search_languages.py\n'
147+ file_content += '\nlanguage_codes = ('
148+ for code in sorted(languages):
149+ file_content += '\n (u"' + code + '"'\
150+ + ', u"' + languages[code]['name'].split(' (')[0] + '"'\
151+ + ', u"' + languages[code].get('country', '') + '"'\
152+ + ', u"' + languages[code].get('english_name', '').split(' (')[0] + '"),'
153+ # remove last comma
154+ file_content = file_content[:-1]
155+ file_content += '\n)\n'
156+ new_file.write(file_content.encode('utf8'))
157+ new_file.close()
158+
159+
160+if __name__ == "__main__":
161+ fetch_supported_languages()
162+ join_language_lists()
163+ filter_single_country_languages()
164+ write_languages_file()
utils/update_languages.pydeleted−169
@@ -1,169 +0,0 @@
1−# -*- coding: utf-8 -*-
2−
3−# This script generates languages.py from
4−# intersecting each engine's supported languages.
5−#
6−# The language's native names are obtained from
7−# Wikipedia and Google's supported languages.
8−#
9−# The country names are obtained from http://api.geonames.org
10−# which requires registering as a user.
11−#
12−# Output file (languages.py) is written in current directory
13−# to avoid overwriting in case something goes wrong.
14−
15−from requests import get
16−from urllib import urlencode
17−from lxml.html import fromstring
18−from json import loads
19−from sys import path
20−path.append('../searx')
21−from searx.engines import engines
22−
23−# list of names
24−wiki_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
25−google_languages_url = 'https://www.google.com/preferences?#languages'
26−country_names_url = 'http://api.geonames.org/countryInfoJSON?{parameters}'
27−
28−geonames_user = '' # add user name here
29−
30−google_json_name = 'google.preferences.langMap'
31−
32−languages = {}
33−
34−
35−# To filter out invalid codes and dialects.
36−def valid_code(lang_code):
37− # filter invalid codes
38− # sl-SL is technically not invalid, but still a mistake
39− if lang_code[:2] == 'xx'\
40− or lang_code == 'sl-SL'\
41− or lang_code == 'jw'\
42− or lang_code[-2:] == 'UK'\
43− or lang_code[-2:] == 'XA'\
44− or lang_code[-2:] == 'XL':
45− return False
46−
47− # filter dialects
48− lang_code = lang_code.split('-')
49− if len(lang_code) > 2 or len(lang_code[0]) > 3:
50− return False
51− if len(lang_code) == 2 and len(lang_code[1]) > 2:
52− return False
53−
54− return True
55−
56−
57−# Get country name in specified language.
58−def get_country_name(locale):
59− if geonames_user is '':
60− return ''
61−
62− locale = locale.split('-')
63− if len(locale) != 2:
64− return ''
65−
66− url = country_names_url.format(parameters=urlencode({'lang': locale[0],
67− 'country': locale[1],
68− 'username': geonames_user}))
69− response = get(url)
70− json = loads(response.text)
71− content = json.get('geonames', None)
72− if content is None or len(content) != 1:
73− print "No country name found for " + locale[0] + "-" + locale[1]
74− print json
75− return ''
76−
77− return content[0].get('countryName', '')
78−
79−
80−# Get language names from Wikipedia.
81−def get_wikipedia_languages():
82− response = get(wiki_languages_url)
83− dom = fromstring(response.text)
84− tables = dom.xpath('//table[contains(@class,"sortable")]')
85− for table in tables:
86− # exclude header row
87− trs = table.xpath('.//tr')[1:]
88− for tr in trs:
89− td = tr.xpath('./td')
90− code = td[3].xpath('./a')[0].text
91− name = td[2].xpath('./a')[0].text
92− english_name = td[1].xpath('./a')[0].text
93− articles = int(td[4].xpath('./a/b')[0].text.replace(',',''))
94−
95− # exclude language variants and languages with few articles
96− if code not in languages and articles >= 10000 and valid_code(code):
97− languages[code] = (name, '', english_name)
98−
99−
100−# Get language names from Google.
101−def get_google_languages():
102− response = get(google_languages_url)
103− dom = fromstring(response.text)
104− options = dom.xpath('//select[@name="hl"]/option')
105− for option in options:
106− code = option.xpath('./@value')[0].split('-')[0]
107− name = option.text[:-1].title()
108−
109− if code not in languages and valid_code(code):
110− languages[code] = (name, '', '')
111−
112−
113−# Join all language lists.
114−# iterate all languages supported by each engine
115−def join_language_lists():
116− for engine_name in engines:
117− for locale in engines[engine_name].supported_languages:
118− locale = locale.replace('_', '-')
119− if locale not in languages and valid_code(locale):
120− # try to get language name
121− language = languages.get(locale.split('-')[0], None)
122− if language == None:
123− print engine_name + ": " + locale
124− continue
125−
126− country = get_country_name(locale)
127− languages[locale] = (language[0], country, language[2])
128−
129−
130−# Remove countryless language if language is featured in only one country.
131−def filter_single_country_languages():
132− prev_lang = None
133− for code in sorted(languages):
134− lang = code.split('-')[0]
135− if lang == prev_lang:
136− countries += 1
137− else:
138− if prev_lang is not None and countries == 1:
139− del languages[prev_lang]
140− countries = 0
141− prev_lang = lang
142−
143−
144−# Write languages.py.
145−def write_languages_file():
146− new_file = open('languages.py', 'w')
147− file_content = '# -*- coding: utf-8 -*-\n'
148− file_content += '# list of language codes\n'
149− file_content += '# this file is generated automatically by utils/update_search_languages.py\n'
150− file_content += '\nlanguage_codes = ('
151− for code in sorted(languages):
152− (name, country, english) = languages[code]
153− file_content += '\n (u"' + code + '"'\
154− + ', u"' + name + '"'\
155− + ', u"' + country + '"'\
156− + ', u"' + english + '"),'
157− # remove last comma
158− file_content = file_content[:-1]
159− file_content += '\n)\n'
160− new_file.write(file_content.encode('utf8'))
161− new_file.close()
162−
163−
164−if __name__ == "__main__":
165− get_wikipedia_languages()
166− get_google_languages()
167− join_language_lists()
168− filter_single_country_languages()
169− write_languages_file()