on master help sign in
[mod] fetch supported languages for several engines
f62ce21marc
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
20import sys
20import sys
21from flask_babel import gettext
21from flask_babel import gettext
22from operator import itemgetter
22from operator import itemgetter
23+from json import loads
23from searx import settings
24from searx import settings
24from searx import logger
25from searx import logger
25from searx.utils import load_module
26from searx.utils import load_module
@@ -78,6 +79,9 @@ def load_engine(engine_data):
78 if not hasattr(engine, arg_name):
79 if not hasattr(engine, arg_name):
79 setattr(engine, arg_name, arg_value)
80 setattr(engine, arg_name, arg_value)
80
81
82+ if engine_data['name'] in languages:
83+ setattr(engine, 'supported_languages', languages[engine_data['name']])
84+
81 # checking required variables
85 # checking required variables
82 for engine_attr in dir(engine):
86 for engine_attr in dir(engine):
83 if engine_attr.startswith('_'):
87 if engine_attr.startswith('_'):
@@ -207,6 +211,8 @@ if 'engines' not in settings or not settings['engines']:
207 logger.error('No engines found. Edit your settings.yml')
211 logger.error('No engines found. Edit your settings.yml')
208 exit(2)
212 exit(2)
209
213
214+languages = loads(open(engine_dir + '/../data/engines_languages.json').read())
215+
210for engine_data in settings['engines']:
216for engine_data in settings['engines']:
211 engine = load_engine(engine_data)
217 engine = load_engine(engine_data)
212 if engine is not None:
218 if engine is not None:
searx/engines/bing.py+15
@@ -15,12 +15,14 @@
15
15
16from urllib import urlencode
16from urllib import urlencode
17from lxml import html
17from lxml import html
18+from requests import get
18from searx.engines.xpath import extract_text
19from searx.engines.xpath import extract_text
19
20
20# engine dependent config
21# engine dependent config
21categories = ['general']
22categories = ['general']
22paging = True
23paging = True
23language_support = True
24language_support = True
25+supported_languages_url = 'https://www.bing.com/account/general'
24
26
25# search-url
27# search-url
26base_url = 'https://www.bing.com/'
28base_url = 'https://www.bing.com/'
@@ -81,3 +83,16 @@ def response(resp):
81
83
82 # return results
84 # return results
83 return results
85 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
19from lxml import html
19from lxml import html
20from json import loads
20from json import loads
21import re
21import re
22−from searx.engines.bing import supported_languages
22+from searx.engines.bing import fetch_supported_languages
23
23
24# engine dependent config
24# engine dependent config
25categories = ['images']
25categories = ['images']
searx/engines/bing_news.py+1−1
@@ -17,7 +17,7 @@ from datetime import datetime
17from dateutil import parser
17from dateutil import parser
18from lxml import etree
18from lxml import etree
19from searx.utils import list_get
19from searx.utils import list_get
20−from searx.engines.bing import supported_languages
20+from searx.engines.bing import fetch_supported_languages
21
21
22# engine dependent config
22# engine dependent config
23categories = ['news']
23categories = ['news']
searx/engines/dailymotion.py+23−18
@@ -15,29 +15,12 @@
15from urllib import urlencode
15from urllib import urlencode
16from json import loads
16from json import loads
17from datetime import datetime
17from datetime import datetime
18+from requests import get
18
19
19# engine dependent config
20# engine dependent config
20categories = ['videos']
21categories = ['videos']
21paging = True
22paging = True
22language_support = True
23language_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"]
41
24
42# search-url
25# search-url
43# see http://www.dailymotion.com/doc/api/obj-video.html
26# 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
45embedded_url = '<iframe frameborder="0" width="540" height="304" ' +\
28embedded_url = '<iframe frameborder="0" width="540" height="304" ' +\
46 'data-src="//www.dailymotion.com/embed/video/{videoid}" allowfullscreen></iframe>'
29 'data-src="//www.dailymotion.com/embed/video/{videoid}" allowfullscreen></iframe>'
47
30
31+supported_languages_url = 'https://api.dailymotion.com/languages'
32+
48
33
49# do search-request
34# do search-request
50def request(query, params):
35def request(query, params):
@@ -92,3 +77,23 @@ def response(resp):
92
77
93 # return results
78 # return results
94 return results
79 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 @@
15
15
16from urllib import urlencode
16from urllib import urlencode
17from lxml.html import fromstring
17from lxml.html import fromstring
18+from requests import get
19+from json import loads
18from searx.engines.xpath import extract_text
20from searx.engines.xpath import extract_text
19
21
20# engine dependent config
22# engine dependent config
21categories = ['general']
23categories = ['general']
22paging = True
24paging = True
23language_support = True
25language_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",
26+supported_languages_url = 'https://duckduckgo.com/d2030.js'
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"]
31time_range_support = True
27time_range_support = True
32
28
33# search-url
29# search-url
@@ -65,8 +61,6 @@ def request(query, params):
65 locale = 'xa' + params['language'].split('-')[0]
61 locale = 'xa' + params['language'].split('-')[0]
66 elif params['language'][-2:] == 'GB':
62 elif params['language'][-2:] == 'GB':
67 locale = 'uk' + params['language'].split('-')[0]
63 locale = 'uk' + params['language'].split('-')[0]
68− elif params['language'] == 'es-419':
69− locale = 'xl-es'
70 else:
64 else:
71 locale = params['language'].split('-')
65 locale = params['language'].split('-')
72 if len(locale) == 2:
66 if len(locale) == 2:
@@ -120,3 +114,18 @@ def response(resp):
120
114
121 # return results
115 # return results
122 return results
116 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
4from lxml import html
4from lxml import html
5from searx.utils import html_to_text
5from searx.utils import html_to_text
6from searx.engines.xpath import extract_text
6from searx.engines.xpath import extract_text
7−from searx.engines.duckduckgo import supported_languages
7+from searx.engines.duckduckgo import fetch_supported_languages
8
8
9url = 'https://api.duckduckgo.com/'\
9url = 'https://api.duckduckgo.com/'\
10 + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
10 + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
searx/engines/gigablast.py+17−5
@@ -14,6 +14,8 @@ from json import loads
14from random import randint
14from random import randint
15from time import time
15from time import time
16from urllib import urlencode
16from urllib import urlencode
17+from requests import get
18+from lxml.html import fromstring
17
19
18# engine dependent config
20# engine dependent config
19categories = ['general']
21categories = ['general']
@@ -40,11 +42,7 @@ url_xpath = './/url'
40title_xpath = './/title'
42title_xpath = './/title'
41content_xpath = './/sum'
43content_xpath = './/sum'
42
44
43−supported_languages = ["en", "fr", "es", "ru", "tr", "ja", "zh-CN", "zh-TW", "ko", "de",
45+supported_languages_url = 'https://gigablast.com/search?&rxikd=1'
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"]
48
46
49
47
50# do search-request
48# do search-request
@@ -90,3 +88,17 @@ def response(resp):
90
88
91 # return results
89 # return results
92 return results
90 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
12from urllib import urlencode
12from urllib import urlencode
13from urlparse import urlparse, parse_qsl
13from urlparse import urlparse, parse_qsl
14from lxml import html, etree
14from lxml import html, etree
15+from requests import get
15from searx.engines.xpath import extract_text, extract_url
16from searx.engines.xpath import extract_text, extract_url
16from searx.search import logger
17from searx.search import logger
17
18
@@ -23,20 +24,6 @@ categories = ['general']
23paging = True
24paging = True
24language_support = True
25language_support = True
25use_locale_domain = True
26use_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"]
40time_range_support = True
27time_range_support = True
41
28
42# based on https://en.wikipedia.org/wiki/List_of_Google_domains and tests
29# based on https://en.wikipedia.org/wiki/List_of_Google_domains and tests
@@ -117,6 +104,7 @@ map_hostname_start = 'maps.google.'
117maps_path = '/maps'
104maps_path = '/maps'
118redirect_path = '/url'
105redirect_path = '/url'
119images_path = '/images'
106images_path = '/images'
107+supported_languages_url = 'https://www.google.com/preferences?#languages'
120
108
121# specific xpath variables
109# specific xpath variables
122results_xpath = '//div[@class="g"]'
110results_xpath = '//div[@class="g"]'
@@ -373,3 +361,17 @@ def attributes_to_html(attributes):
373 retval = retval + '<tr><th>' + a.get('label') + '</th><td>' + value + '</td></tr>'
361 retval = retval + '<tr><th>' + a.get('label') + '</th><td>' + value + '</td></tr>'
374 retval = retval + '</table>'
362 retval = retval + '</table>'
375 return retval
363 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 @@
13from lxml import html
13from lxml import html
14from urllib import urlencode
14from urllib import urlencode
15from json import loads
15from json import loads
16−from searx.engines.google import supported_languages
16+from searx.engines.google import fetch_supported_languages
17
17
18# search-url
18# search-url
19categories = ['news']
19categories = ['news']
searx/engines/mediawiki.py−1
@@ -15,7 +15,6 @@
15from json import loads
15from json import loads
16from string import Formatter
16from string import Formatter
17from urllib import urlencode, quote
17from urllib import urlencode, quote
18−from searx.engines.wikipedia import supported_languages
19
18
20# engine dependent config
19# engine dependent config
21categories = ['general']
20categories = ['general']
searx/engines/qwant.py+1−14
@@ -20,11 +20,6 @@ from searx.utils import html_to_text
20categories = None
20categories = None
21paging = True
21paging = True
22language_support = True
22language_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"]
28
23
29category_to_keyword = {'general': 'web',
24category_to_keyword = {'general': 'web',
30 'images': 'images',
25 'images': 'images',
@@ -51,15 +46,7 @@ def request(query, params):
51
46
52 # add language tag if specified
47 # add language tag if specified
53 if params['language'] != 'all':
48 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()
49+ 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
63
50
64 return params
51 return params
65
52
searx/engines/startpage.py−5
@@ -24,11 +24,6 @@ categories = ['general']
24
24
25# paging = False
25# paging = False
26language_support = True
26language_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"]
32
27
33# search-url
28# search-url
34base_url = 'https://startpage.com/'
29base_url = 'https://startpage.com/'
searx/engines/subtitleseeker.py+3−2
@@ -22,7 +22,7 @@ language = ""
22
22
23# search-url
23# search-url
24url = 'http://www.subtitleseeker.com/'
24url = 'http://www.subtitleseeker.com/'
25−search_url = url + 'search/TITLES/{query}&p={pageno}'
25+search_url = url + 'search/TITLES/{query}?p={pageno}'
26
26
27# specific xpath variables
27# specific xpath variables
28results_xpath = '//div[@class="boxRows"]'
28results_xpath = '//div[@class="boxRows"]'
@@ -51,7 +51,8 @@ def response(resp):
51 elif resp.search_params['language'] != 'all':
51 elif resp.search_params['language'] != 'all':
52 search_lang = [lc[3]
52 search_lang = [lc[3]
53 for lc in language_codes
53 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]
55
56
56 # parse results
57 # parse results
57 for result in dom.xpath(results_xpath):
58 for result in dom.xpath(results_xpath):
searx/engines/swisscows.py+15−6
@@ -13,17 +13,13 @@
13from json import loads
13from json import loads
14from urllib import urlencode, unquote
14from urllib import urlencode, unquote
15import re
15import re
16+from requests import get
17+from lxml.html import fromstring
16
18
17# engine dependent config
19# engine dependent config
18categories = ['general', 'images']
20categories = ['general', 'images']
19paging = True
21paging = True
20language_support = True
22language_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"]
27
23
28# search-url
24# search-url
29base_url = 'https://swisscows.ch/'
25base_url = 'https://swisscows.ch/'
@@ -114,3 +110,16 @@ def response(resp):
114
110
115 # return results
111 # return results
116 return results
112 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
15from searx.poolrequests import get
15from searx.poolrequests import get
16from searx.engines.xpath import extract_text
16from searx.engines.xpath import extract_text
17from searx.utils import format_date_by_locale
17from searx.utils import format_date_by_locale
18−from searx.engines.wikipedia import supported_languages
18+from searx.engines.wikipedia import fetch_supported_languages
19
19
20from json import loads
20from json import loads
21from lxml.html import fromstring
21from lxml.html import fromstring
@@ -57,7 +57,7 @@ calendar_name_xpath = './/sup[contains(@class,"wb-calendar-name")]'
57
57
58
58
59def request(query, params):
59def request(query, params):
60− language = params['language'].split('_')[0]
60+ language = params['language'].split('-')[0]
61 if language == 'all':
61 if language == 'all':
62 language = 'en'
62 language = 'en'
63
63
@@ -72,7 +72,7 @@ def response(resp):
72 html = fromstring(resp.content)
72 html = fromstring(resp.content)
73 wikidata_ids = html.xpath(wikidata_ids_xpath)
73 wikidata_ids = html.xpath(wikidata_ids_xpath)
74
74
75− language = resp.search_params['language'].split('_')[0]
75+ language = resp.search_params['language'].split('-')[0]
76 if language == 'all':
76 if language == 'all':
77 language = 'en'
77 language = 'en'
78
78
searx/engines/wikipedia.py+24−29
@@ -12,36 +12,9 @@
12
12
13from json import loads
13from json import loads
14from urllib import urlencode, quote
14from urllib import urlencode, quote
15+from requests import get
16+from lxml.html import fromstring
15
17
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"]
45
18
46# search-url
19# search-url
47base_url = 'https://{language}.wikipedia.org/'
20base_url = 'https://{language}.wikipedia.org/'
@@ -54,6 +27,7 @@ search_postfix = 'w/api.php?'\
54 '&explaintext'\
27 '&explaintext'\
55 '&pithumbsize=300'\
28 '&pithumbsize=300'\
56 '&redirects'
29 '&redirects'
30+supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
57
31
58
32
59# set language in base_url
33# set language in base_url
@@ -142,3 +116,24 @@ def response(resp):
142 'urls': [{'title': 'Wikipedia', 'url': wikipedia_link}]})
116 'urls': [{'title': 'Wikipedia', 'url': wikipedia_link}]})
143
117
144 return results
118 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 @@
14from urllib import urlencode
14from urllib import urlencode
15from urlparse import unquote
15from urlparse import unquote
16from lxml import html
16from lxml import html
17+from requests import get
17from searx.engines.xpath import extract_text, extract_url
18from searx.engines.xpath import extract_text, extract_url
18
19
19# engine dependent config
20# engine dependent config
20categories = ['general']
21categories = ['general']
21paging = True
22paging = True
22language_support = True
23language_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"]
27time_range_support = True
24time_range_support = True
28
25
29# search-url
26# search-url
@@ -31,6 +28,8 @@ base_url = 'https://search.yahoo.com/'
31search_url = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}'
28search_url = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}'
32search_url_with_time = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}&age={age}&btf={btf}&fr2=time'
29search_url_with_time = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}&age={age}&btf={btf}&fr2=time'
33
30
31+supported_languages_url = 'https://search.yahoo.com/web/advanced'
32+
34# specific xpath variables
33# specific xpath variables
35results_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' Sr ')]"
34results_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' Sr ')]"
36url_xpath = './/h3/a/@href'
35url_xpath = './/h3/a/@href'
@@ -142,3 +141,16 @@ def response(resp):
142
141
143 # return results
142 # return results
144 return results
143 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 @@
12from urllib import urlencode
12from urllib import urlencode
13from lxml import html
13from lxml import html
14from searx.engines.xpath import extract_text, extract_url
14from 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
16from datetime import datetime, timedelta
16from datetime import datetime, timedelta
17import re
17import re
18from dateutil import parser
18from dateutil import parser
searx/languages.py+47−76
@@ -4,39 +4,29 @@
4
4
5language_codes = (
5language_codes = (
6 (u"ach", u"Acoli", u"", u""),
6 (u"ach", u"Acoli", u"", u""),
7− (u"af", u"Afrikaans", u"", u"Afrikaans"),
7+ (u"af", u"Afrikaans", u"", u""),
8 (u"ak", u"Akan", u"", u""),
8 (u"ak", u"Akan", u"", u""),
9− (u"als", u"Alemannisch", u"", u"Alemannic"),
10− (u"am", u"አማርኛ", u"", u"Amharic"),
9+ (u"am", u"አማርኛ", u"", u""),
11− (u"an", u"Aragonés", u"", u"Aragonese"),
12 (u"ar-SA", u"العربية", u"المملكة العربية السعودية", u"Arabic"),
10 (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"),
15 (u"az", u"Azərbaycanca", u"", u"Azerbaijani"),
11 (u"az", u"Azərbaycanca", u"", u"Azerbaijani"),
16− (u"azb", u"تۆرکجه", u"", u"South Azerbaijani"),
17− (u"ba", u"Башҡорт", u"", u"Bashkir"),
18 (u"ban", u"Balinese", u"", u""),
12 (u"ban", u"Balinese", u"", u""),
19− (u"bar", u"Boarisch", u"", u"Bavarian"),
20 (u"be", u"Беларуская", u"", u"Belarusian"),
13 (u"be", u"Беларуская", u"", u"Belarusian"),
21 (u"bem", u"Ichibemba", u"", u""),
14 (u"bem", u"Ichibemba", u"", u""),
22 (u"bg-BG", u"Български", u"България", u"Bulgarian"),
15 (u"bg-BG", u"Български", u"България", u"Bulgarian"),
23− (u"bn", u"বাংলা", u"", u"Bengali"),
16+ (u"bn", u"বাংলা", u"", u""),
24− (u"bpy", u"ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী", u"", u"Bishnupriya Manipuri"),
25− (u"br", u"Brezhoneg", u"", u"Breton"),
17+ (u"br", u"Brezhoneg", u"", u""),
26− (u"bs", u"Bosanski", u"", u"Bosnian"),
18+ (u"bs", u"Bosanski", u"", u""),
27− (u"bug", u"Basa Ugi", u"", u"Buginese"),
28 (u"ca", u"Català", u"", u"Catalan"),
19 (u"ca", u"Català", u"", u"Catalan"),
29 (u"ca-CT", u"Català", u"", u"Catalan"),
20 (u"ca-CT", u"Català", u"", u"Catalan"),
30 (u"ca-ES", u"Català", u"Espanya", u"Catalan"),
21 (u"ca-ES", u"Català", u"Espanya", u"Catalan"),
31 (u"ce", u"Нохчийн", u"", u"Chechen"),
22 (u"ce", u"Нохчийн", u"", u"Chechen"),
32 (u"ceb", u"Sinugboanong Binisaya", u"", u"Cebuano"),
23 (u"ceb", u"Sinugboanong Binisaya", u"", u"Cebuano"),
33 (u"chr", u"ᏣᎳᎩ", u"", u""),
24 (u"chr", u"ᏣᎳᎩ", u"", u""),
34− (u"ckb", u"Soranî / کوردی", u"", u"Sorani"),
25+ (u"ckb", u"Central Kurdish", u"", u""),
35 (u"co", u"Corsican", u"", u""),
26 (u"co", u"Corsican", u"", u""),
36 (u"crs", u"Seychellois Creole", u"", u""),
27 (u"crs", u"Seychellois Creole", u"", u""),
37 (u"cs-CZ", u"Čeština", u"Česko", u"Czech"),
28 (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""),
40 (u"da-DK", u"Dansk", u"Danmark", u"Danish"),
30 (u"da-DK", u"Dansk", u"Danmark", u"Danish"),
41 (u"de", u"Deutsch", u"", u"German"),
31 (u"de", u"Deutsch", u"", u"German"),
42 (u"de-AT", u"Deutsch", u"Österreich", u"German"),
32 (u"de-AT", u"Deutsch", u"Österreich", u"German"),
@@ -70,148 +60,129 @@ language_codes = (
70 (u"eu", u"Euskara", u"", u"Basque"),
60 (u"eu", u"Euskara", u"", u"Basque"),
71 (u"fa", u"فارسی", u"", u"Persian"),
61 (u"fa", u"فارسی", u"", u"Persian"),
72 (u"fi-FI", u"Suomi", u"Suomi", u"Finnish"),
62 (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""),
74 (u"fr", u"Français", u"", u"French"),
64 (u"fr", u"Français", u"", u"French"),
75 (u"fr-BE", u"Français", u"Belgique", u"French"),
65 (u"fr-BE", u"Français", u"Belgique", u"French"),
76 (u"fr-CA", u"Français", u"Canada", u"French"),
66 (u"fr-CA", u"Français", u"Canada", u"French"),
77 (u"fr-CH", u"Français", u"Suisse", u"French"),
67 (u"fr-CH", u"Français", u"Suisse", u"French"),
78 (u"fr-FR", u"Français", u"France", u"French"),
68 (u"fr-FR", u"Français", u"France", u"French"),
79− (u"fy", u"Frysk", u"", u"West Frisian"),
69+ (u"fy", u"West-Frysk", u"", u""),
80− (u"ga", u"Gaeilge", u"", u"Irish"),
70+ (u"ga", u"Gaeilge", u"", u""),
81 (u"gaa", u"Ga", u"", u""),
71 (u"gaa", u"Ga", u"", u""),
82− (u"gd", u"Gàidhlig", u"", u"Scottish Gaelic"),
72+ (u"gd", u"Gàidhlig", u"", u""),
83 (u"gl", u"Galego", u"", u"Galician"),
73 (u"gl", u"Galego", u"", u"Galician"),
84 (u"gn", u"Guarani", u"", u""),
74 (u"gn", u"Guarani", u"", u""),
85− (u"gu", u"ગુજરાતી", u"", u"Gujarati"),
75+ (u"gu", u"ગુજરાતી", u"", u""),
86 (u"ha", u"Hausa", u"", u""),
76 (u"ha", u"Hausa", u"", u""),
87 (u"haw", u"ʻŌlelo HawaiʻI", u"", u""),
77 (u"haw", u"ʻŌlelo HawaiʻI", u"", u""),
88 (u"he-IL", u"עברית", u"ישראל", u"Hebrew"),
78 (u"he-IL", u"עברית", u"ישראל", u"Hebrew"),
89 (u"hi", u"हिन्दी", u"", u"Hindi"),
79 (u"hi", u"हिन्दी", u"", u"Hindi"),
90 (u"hr-HR", u"Hrvatski", u"Hrvatska", u"Croatian"),
80 (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""),
93 (u"hu-HU", u"Magyar", u"Magyarország", u"Hungarian"),
82 (u"hu-HU", u"Magyar", u"Magyarország", u"Hungarian"),
94 (u"hy", u"Հայերեն", u"", u"Armenian"),
83 (u"hy", u"Հայերեն", u"", u"Armenian"),
95− (u"ia", u"Interlingua", u"", u"Interlingua"),
84+ (u"ia", u"Interlingua", u"", u""),
96 (u"id-ID", u"Bahasa Indonesia", u"Indonesia", u"Indonesian"),
85 (u"id-ID", u"Bahasa Indonesia", u"Indonesia", u"Indonesian"),
97 (u"ig", u"Igbo", u"", u""),
86 (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""),
100 (u"it", u"Italiano", u"", u"Italian"),
88 (u"it", u"Italiano", u"", u"Italian"),
101 (u"it-CH", u"Italiano", u"Svizzera", u"Italian"),
89 (u"it-CH", u"Italiano", u"Svizzera", u"Italian"),
102 (u"it-IT", u"Italiano", u"Italia", u"Italian"),
90 (u"it-IT", u"Italiano", u"Italia", u"Italian"),
103 (u"iw", u"עברית", u"", u""),
91 (u"iw", u"עברית", u"", u""),
104 (u"ja-JP", u"日本語", u"日本", u"Japanese"),
92 (u"ja-JP", u"日本語", u"日本", u"Japanese"),
105− (u"jv", u"Basa Jawa", u"", u"Javanese"),
106 (u"ka", u"ქართული", u"", u"Georgian"),
93 (u"ka", u"ქართული", u"", u"Georgian"),
107 (u"kg", u"Kongo", u"", u""),
94 (u"kg", u"Kongo", u"", u""),
108 (u"kk", u"Қазақша", u"", u"Kazakh"),
95 (u"kk", u"Қазақша", u"", u"Kazakh"),
109 (u"km", u"ខ្មែរ", u"", u""),
96 (u"km", u"ខ្មែរ", u"", u""),
110− (u"kn", u"ಕನ್ನಡ", u"", u"Kannada"),
97+ (u"kn", u"ಕನ್ನಡ", u"", u""),
111 (u"ko-KR", u"한국어", u"대한민국", u"Korean"),
98 (u"ko-KR", u"한국어", u"대한민국", u"Korean"),
112− (u"kri", u"Krio (Sierra Leone)", u"", u""),
99+ (u"kri", u"Krio", u"", u""),
113− (u"ku", u"Kurdî / كوردی", u"", u"Kurdish"),
114− (u"ky", u"Кыргызча", u"", u"Kirghiz"),
100+ (u"ky", u"Кыргызча", u"", u""),
115 (u"la", u"Latina", u"", u"Latin"),
101 (u"la", u"Latina", u"", u"Latin"),
116− (u"lb", u"Lëtzebuergesch", u"", u"Luxembourgish"),
117 (u"lg", u"Luganda", u"", u""),
102 (u"lg", u"Luganda", u"", u""),
118− (u"li", u"Limburgs", u"", u"Limburgish"),
119− (u"lmo", u"Lumbaart", u"", u"Lombard"),
120 (u"ln", u"Lingála", u"", u""),
103 (u"ln", u"Lingála", u"", u""),
121 (u"lo", u"ລາວ", u"", u""),
104 (u"lo", u"ລາວ", u"", u""),
122 (u"loz", u"Lozi", u"", u""),
105 (u"loz", u"Lozi", u"", u""),
123 (u"lt-LT", u"Lietuvių", u"Lietuva", u"Lithuanian"),
106 (u"lt-LT", u"Lietuvių", u"Lietuva", u"Lithuanian"),
124 (u"lua", u"Luba-Lulua", u"", u""),
107 (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""),
126 (u"mfe", u"Kreol Morisien", u"", u""),
109 (u"mfe", u"Kreol Morisien", u"", u""),
127− (u"mg", u"Malagasy", u"", u"Malagasy"),
110+ (u"mg", u"Malagasy", u"", u""),
128 (u"mi", u"Maori", u"", u""),
111 (u"mi", u"Maori", u"", u""),
129 (u"min", u"Minangkabau", u"", u"Minangkabau"),
112 (u"min", u"Minangkabau", u"", u"Minangkabau"),
130− (u"mk", u"Македонски", u"", u"Macedonian"),
113+ (u"mk", u"Македонски", u"", u""),
131− (u"ml", u"മലയാളം", u"", u"Malayalam"),
114+ (u"ml", u"മലയാളം", u"", u""),
132− (u"mn", u"Монгол", u"", u"Mongolian"),
115+ (u"mn", u"Монгол", u"", u""),
133− (u"mr", u"मराठी", u"", u"Marathi"),
116+ (u"mr", u"मराठी", u"", u""),
134− (u"mrj", u"Кырык Мары (Kyryk Mary)", u"", u"Hill Mari"),
135 (u"ms-MY", u"Bahasa Melayu", u"Malaysia", u"Malay"),
117 (u"ms-MY", u"Bahasa Melayu", u"Malaysia", u"Malay"),
136 (u"mt", u"Malti", u"", u""),
118 (u"mt", u"Malti", u"", u""),
137− (u"my", u"မြန်မာဘာသာ", u"", u"Burmese"),
119+ (u"my", u"ဗမာ", u"", u""),
138− (u"mzn", u"مَزِروني", u"", u"Mazandarani"),
120+ (u"nb-NO", u"Norwegian Bokmål", u"Norge", u"Norwegian Bokmål"),
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"),
121+ (u"ne", u"नेपाली", u"", u""),
143− (u"new", u"नेपाल भाषा", u"", u"Newar"),
144 (u"nl", u"Nederlands", u"", u"Dutch"),
122 (u"nl", u"Nederlands", u"", u"Dutch"),
145 (u"nl-BE", u"Nederlands", u"België", u"Dutch"),
123 (u"nl-BE", u"Nederlands", u"België", u"Dutch"),
146 (u"nl-NL", u"Nederlands", u"Nederland", u"Dutch"),
124 (u"nl-NL", u"Nederlands", u"Nederland", u"Dutch"),
147− (u"nn", u"Nynorsk", u"", u"Norwegian (Nynorsk)"),
125+ (u"nn", u"Nynorsk", u"", u"Norwegian"),
148− (u"no-NO", u"Norsk (Bokmål)", u"Norge", u"Norwegian (Bokmål)"),
126+ (u"no-NO", u"Norsk", u"Norge", u"Norwegian"),
149 (u"nso", u"Northern Sotho", u"", u""),
127 (u"nso", u"Northern Sotho", u"", u""),
150 (u"ny", u"Nyanja", u"", u""),
128 (u"ny", u"Nyanja", u"", u""),
151 (u"nyn", u"Runyankore", u"", u""),
129 (u"nyn", u"Runyankore", u"", u""),
152− (u"oc", u"Occitan", u"", u"Occitan"),
130+ (u"oc", u"Occitan", u"", u""),
153 (u"om", u"Oromoo", u"", u""),
131 (u"om", u"Oromoo", u"", u""),
154− (u"or", u"ଓଡ଼ିଆ", u"", u"Oriya"),
132+ (u"or", u"ଓଡ଼ିଆ", u"", u""),
155− (u"os", u"Иронау", u"", u"Ossetian"),
156− (u"pa", u"ਪੰਜਾਬੀ", u"", u"Punjabi"),
133+ (u"pa", u"ਪੰਜਾਬੀ", u"", u""),
157 (u"pcm", u"Nigerian Pidgin", u"", u""),
134 (u"pcm", u"Nigerian Pidgin", u"", u""),
158 (u"pl-PL", u"Polski", u"Rzeczpospolita Polska", u"Polish"),
135 (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"),
161 (u"ps", u"پښتو", u"", u""),
136 (u"ps", u"پښتو", u"", u""),
162 (u"pt", u"Português", u"", u"Portuguese"),
137 (u"pt", u"Português", u"", u"Portuguese"),
163 (u"pt-BR", u"Português", u"Brasil", u"Portuguese"),
138 (u"pt-BR", u"Português", u"Brasil", u"Portuguese"),
164 (u"pt-PT", u"Português", u"Portugal", u"Portuguese"),
139 (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""),
166 (u"rm", u"Rumantsch", u"", u""),
141 (u"rm", u"Rumantsch", u"", u""),
167 (u"rn", u"Ikirundi", u"", u""),
142 (u"rn", u"Ikirundi", u"", u""),
168 (u"ro-RO", u"Română", u"România", u"Romanian"),
143 (u"ro-RO", u"Română", u"România", u"Romanian"),
169 (u"ru-RU", u"Русский", u"Россия", u"Russian"),
144 (u"ru-RU", u"Русский", u"Россия", u"Russian"),
170 (u"rw", u"Kinyarwanda", u"", u""),
145 (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"),
175 (u"sd", u"Sindhi", u"", u""),
146 (u"sd", u"Sindhi", u"", u""),
176 (u"sh", u"Srpskohrvatski / Српскохрватски", u"", u"Serbo-Croatian"),
147 (u"sh", u"Srpskohrvatski / Српскохрватски", u"", u"Serbo-Croatian"),
177− (u"si", u"සිංහල", u"", u"Sinhalese"),
148+ (u"si", u"සිංහල", u"", u""),
178 (u"sk-SK", u"Slovenčina", u"Slovenská republika", u"Slovak"),
149 (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"),
180 (u"sn", u"Chishona", u"", u""),
151 (u"sn", u"Chishona", u"", u""),
181 (u"so", u"Soomaali", u"", u""),
152 (u"so", u"Soomaali", u"", u""),
182− (u"sq", u"Shqip", u"", u"Albanian"),
153+ (u"sq", u"Shqip", u"", u""),
183− (u"sr-ME", u"Српски / Srpski", u"Црна Гора", u"Serbian"),
154+ (u"sr", u"Српски / Srpski", u"", u"Serbian"),
184 (u"st", u"Southern Sotho", u"", u""),
155 (u"st", u"Southern Sotho", u"", u""),
185− (u"su", u"Basa Sunda", u"", u"Sundanese"),
156+ (u"su", u"Sundanese", u"", u""),
186 (u"sv-SE", u"Svenska", u"Sverige", u"Swedish"),
157 (u"sv-SE", u"Svenska", u"Sverige", u"Swedish"),
187− (u"sw", u"Kiswahili", u"", u"Swahili"),
158+ (u"sw", u"Kiswahili", u"", u""),
188− (u"ta", u"தமிழ்", u"", u"Tamil"),
159+ (u"ta", u"தமிழ்", u"", u""),
189− (u"te", u"తెలుగు", u"", u"Telugu"),
160+ (u"te", u"తెలుగు", u"", u""),
190− (u"tg", u"Тоҷикӣ", u"", u"Tajik"),
161+ (u"tg", u"Tajik", u"", u""),
191 (u"th-TH", u"ไทย", u"ไทย", u"Thai"),
162 (u"th-TH", u"ไทย", u"ไทย", u"Thai"),
192 (u"ti", u"ትግርኛ", u"", u""),
163 (u"ti", u"ትግርኛ", u"", u""),
193 (u"tk", u"Turkmen", u"", u""),
164 (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""),
195 (u"tlh", u"Klingon", u"", u""),
166 (u"tlh", u"Klingon", u"", u""),
196 (u"tn", u"Tswana", u"", u""),
167 (u"tn", u"Tswana", u"", u""),
197 (u"to", u"Lea Fakatonga", u"", u""),
168 (u"to", u"Lea Fakatonga", u"", u""),
198 (u"tr-TR", u"Türkçe", u"Türkiye", u"Turkish"),
169 (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""),
200 (u"tum", u"Tumbuka", u"", u""),
171 (u"tum", u"Tumbuka", u"", u""),
201 (u"tw", u"Twi", u"", u""),
172 (u"tw", u"Twi", u"", u""),
202 (u"ug", u"ئۇيغۇرچە", u"", u""),
173 (u"ug", u"ئۇيغۇرچە", u"", u""),
203 (u"uk-UA", u"Українська", u"Україна", u"Ukrainian"),
174 (u"uk-UA", u"Українська", u"Україна", u"Ukrainian"),
204 (u"ur", u"اردو", u"", u"Urdu"),
175 (u"ur", u"اردو", u"", u"Urdu"),
205 (u"uz", u"O‘zbek", u"", u"Uzbek"),
176 (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"),
207 (u"vi-VN", u"Tiếng Việt", u"Công Hòa Xã Hội Chủ Nghĩa Việt Nam", u"Vietnamese"),
178 (u"vi-VN", u"Tiếng Việt", u"Công Hòa Xã Hội Chủ Nghĩa Việt Nam", u"Vietnamese"),
208 (u"vo", u"Volapük", u"", u"Volapük"),
179 (u"vo", u"Volapük", u"", u"Volapük"),
209 (u"wa", u"Walon", u"", u"Walloon"),
180 (u"wa", u"Walon", u"", u"Walloon"),
210 (u"war", u"Winaray", u"", u"Waray-Waray"),
181 (u"war", u"Winaray", u"", u"Waray-Waray"),
211 (u"wo", u"Wolof", u"", u""),
182 (u"wo", u"Wolof", u"", u""),
212 (u"xh", u"Xhosa", u"", u""),
183 (u"xh", u"Xhosa", u"", u""),
213− (u"yi", u"ייִדיש", u"", u"Yiddish"),
184+ (u"yi", u"ייִדיש", u"", u""),
214− (u"yo", u"Yorùbá", u"", u"Yoruba"),
185+ (u"yo", u"Èdè Yorùbá", u"", u""),
215 (u"zh", u"中文", u"", u"Chinese"),
186 (u"zh", u"中文", u"", u"Chinese"),
216 (u"zh-CN", u"中文", u"中国", u"Chinese"),
187 (u"zh-CN", u"中文", u"中国", u"Chinese"),
217 (u"zh-HK", u"中文", u"香港", u"Chinese"),
188 (u"zh-HK", u"中文", u"香港", u"Chinese"),
searx/webapp.py+1−1
@@ -514,7 +514,7 @@ def index():
514 answers=result_container.answers,
514 answers=result_container.answers,
515 infoboxes=result_container.infoboxes,
515 infoboxes=result_container.infoboxes,
516 paging=result_container.paging,
516 paging=result_container.paging,
517− current_language=search.lang,
517+ current_language=search_query.lang,
518 base_url=get_base_url(),
518 base_url=get_base_url(),
519 theme=get_current_theme_name(),
519 theme=get_current_theme_name(),
520 favicons=global_favicons[themes.index(get_current_theme_name())]
520 favicons=global_favicons[themes.index(get_current_theme_name())]
tests/unit/engines/test_subtitleseeker.py+1−1
@@ -17,7 +17,7 @@ class TestSubtitleseekerEngine(SearxTestCase):
17
17
18 def test_response(self):
18 def test_response(self):
19 dicto = defaultdict(dict)
19 dicto = defaultdict(dict)
20− dicto['language'] = 'fr_FR'
20+ dicto['language'] = 'fr-FR'
21 response = mock.Mock(search_params=dicto)
21 response = mock.Mock(search_params=dicto)
22
22
23 self.assertRaises(AttributeError, subtitleseeker.response, None)
23 self.assertRaises(AttributeError, subtitleseeker.response, None)
tests/unit/engines/test_wikipedia.py+2
@@ -8,6 +8,8 @@ from searx.testing import SearxTestCase
8class TestWikipediaEngine(SearxTestCase):
8class TestWikipediaEngine(SearxTestCase):
9
9
10 def test_request(self):
10 def test_request(self):
11+ wikipedia.supported_languages = ['fr', 'en']
12+
11 query = 'test_query'
13 query = 'test_query'
12 dicto = defaultdict(dict)
14 dicto = defaultdict(dict)
13 dicto['language'] = 'fr-FR'
15 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()