mirror of
https://github.com/searxng/searxng.git
synced 2026-07-26 01:41:23 +00:00
Compare commits
16 Commits
6cc4350a34
...
c51cce9384
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c51cce9384 | ||
|
|
33729439c5 | ||
|
|
20ce88a274 | ||
|
|
8595e467ce | ||
|
|
3392beb914 | ||
|
|
c6c6d3027c | ||
|
|
d19eb3903e | ||
|
|
f45d4145e6 | ||
|
|
937eb907d3 | ||
|
|
851c0e5cc0 | ||
|
|
07a94d4d2e | ||
|
|
e9157b3c1a | ||
|
|
5ae3b3f17e | ||
|
|
50ac76ce94 | ||
|
|
5aea044eb5 | ||
|
|
808dcaf1e2 |
230
client/simple/package-lock.json
generated
230
client/simple/package-lock.json
generated
@@ -31,8 +31,8 @@
|
||||
"stylelint-prettier": "^5.0.3",
|
||||
"svgo": "^3.3.2",
|
||||
"swiped-events": "^1.2.0",
|
||||
"vite": "^6.2.6",
|
||||
"vite-plugin-static-copy": "^2.3.0",
|
||||
"vite": "^6.3.2",
|
||||
"vite-plugin-static-copy": "^2.3.1",
|
||||
"vite-plugin-stylelint": "^6.0.0",
|
||||
"webpack": "^5.99.5",
|
||||
"webpack-cli": "^6.0.1"
|
||||
@@ -1486,9 +1486,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.7.tgz",
|
||||
"integrity": "sha512-l6CtzHYo8D2TQ3J7qJNpp3Q1Iye56ssIAtqbM2H8axxCEEwvN7o8Ze9PuIapbxFL3OHrJU2JBX6FIIVnP/rYyw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz",
|
||||
"integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -1500,9 +1500,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm64": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.7.tgz",
|
||||
"integrity": "sha512-KvyJpFUueUnSp53zhAa293QBYqwm94TgYTIfXyOTtidhm5V0LbLCJQRGkQClYiX3FXDQGSvPxOTD/6rPStMMDg==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz",
|
||||
"integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1514,9 +1514,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.7.tgz",
|
||||
"integrity": "sha512-jq87CjmgL9YIKvs8ybtIC98s/M3HdbqXhllcy9EdLV0yMg1DpxES2gr65nNy7ObNo/vZ/MrOTxt0bE5LinL6mA==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz",
|
||||
"integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1528,9 +1528,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-darwin-x64": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.7.tgz",
|
||||
"integrity": "sha512-rSI/m8OxBjsdnMMg0WEetu/w+LhLAcCDEiL66lmMX4R3oaml3eXz3Dxfvrxs1FbzPbJMaItQiksyMfv1hoIxnA==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz",
|
||||
"integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1542,9 +1542,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.7.tgz",
|
||||
"integrity": "sha512-oIoJRy3ZrdsXpFuWDtzsOOa/E/RbRWXVokpVrNnkS7npz8GEG++E1gYbzhYxhxHbO2om1T26BZjVmdIoyN2WtA==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz",
|
||||
"integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1556,9 +1556,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.7.tgz",
|
||||
"integrity": "sha512-X++QSLm4NZfZ3VXGVwyHdRf58IBbCu9ammgJxuWZYLX0du6kZvdNqPwrjvDfwmi6wFdvfZ/s6K7ia0E5kI7m8Q==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz",
|
||||
"integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1570,9 +1570,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.7.tgz",
|
||||
"integrity": "sha512-Z0TzhrsNqukTz3ISzrvyshQpFnFRfLunYiXxlCRvcrb3nvC5rVKI+ZXPFG/Aa4jhQa1gHgH3A0exHaRRN4VmdQ==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz",
|
||||
"integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -1584,9 +1584,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.7.tgz",
|
||||
"integrity": "sha512-nkznpyXekFAbvFBKBy4nNppSgneB1wwG1yx/hujN3wRnhnkrYVugMTCBXED4+Ni6thoWfQuHNYbFjgGH0MBXtw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz",
|
||||
"integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -1598,9 +1598,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.7.tgz",
|
||||
"integrity": "sha512-KCjlUkcKs6PjOcxolqrXglBDcfCuUCTVlX5BgzgoJHw+1rWH1MCkETLkLe5iLLS9dP5gKC7mp3y6x8c1oGBUtA==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz",
|
||||
"integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1612,9 +1612,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.7.tgz",
|
||||
"integrity": "sha512-uFLJFz6+utmpbR313TTx+NpPuAXbPz4BhTQzgaP0tozlLnGnQ6rCo6tLwaSa6b7l6gRErjLicXQ1iPiXzYotjw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz",
|
||||
"integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1626,9 +1626,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.7.tgz",
|
||||
"integrity": "sha512-ws8pc68UcJJqCpneDFepnwlsMUFoWvPbWXT/XUrJ7rWUL9vLoIN3GAasgG+nCvq8xrE3pIrd+qLX/jotcLy0Qw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz",
|
||||
"integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
@@ -1640,9 +1640,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.7.tgz",
|
||||
"integrity": "sha512-vrDk9JDa/BFkxcS2PbWpr0C/LiiSLxFbNOBgfbW6P8TBe9PPHx9Wqbvx2xgNi1TOAyQHQJ7RZFqBiEohm79r0w==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz",
|
||||
"integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@@ -1654,9 +1654,23 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.7.tgz",
|
||||
"integrity": "sha512-rB+ejFyjtmSo+g/a4eovDD1lHWHVqizN8P0Hm0RElkINpS0XOdpaXloqM4FBkF9ZWEzg6bezymbpLmeMldfLTw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz",
|
||||
"integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-riscv64-musl": {
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz",
|
||||
"integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@@ -1668,9 +1682,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.7.tgz",
|
||||
"integrity": "sha512-nNXNjo4As6dNqRn7OrsnHzwTgtypfRA3u3AKr0B3sOOo+HkedIbn8ZtFnB+4XyKJojIfqDKmbIzO1QydQ8c+Pw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz",
|
||||
"integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@@ -1682,9 +1696,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.7.tgz",
|
||||
"integrity": "sha512-9kPVf9ahnpOMSGlCxXGv980wXD0zRR3wyk8+33/MXQIpQEOpaNe7dEHm5LMfyRZRNt9lMEQuH0jUKj15MkM7QA==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz",
|
||||
"integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1696,9 +1710,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.7.tgz",
|
||||
"integrity": "sha512-7wJPXRWTTPtTFDFezA8sle/1sdgxDjuMoRXEKtx97ViRxGGkVQYovem+Q8Pr/2HxiHp74SSRG+o6R0Yq0shPwQ==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz",
|
||||
"integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1710,9 +1724,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.7.tgz",
|
||||
"integrity": "sha512-MN7aaBC7mAjsiMEZcsJvwNsQVNZShgES/9SzWp1HC9Yjqb5OpexYnRjF7RmE4itbeesHMYYQiAtUAQaSKs2Rfw==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz",
|
||||
"integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1724,9 +1738,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.7.tgz",
|
||||
"integrity": "sha512-aeawEKYswsFu1LhDM9RIgToobquzdtSc4jSVqHV8uApz4FVvhFl/mKh92wc8WpFc6aYCothV/03UjY6y7yLgbg==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz",
|
||||
"integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -1738,9 +1752,9 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.7.tgz",
|
||||
"integrity": "sha512-4ZedScpxxIrVO7otcZ8kCX1mZArtH2Wfj3uFCxRJ9NO80gg1XV0U/b2f/MKaGwj2X3QopHfoWiDQ917FRpwY3w==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz",
|
||||
"integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1815,9 +1829,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/estree": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
|
||||
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
|
||||
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -5623,13 +5637,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/rollup": {
|
||||
"version": "4.34.7",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.7.tgz",
|
||||
"integrity": "sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ==",
|
||||
"version": "4.40.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz",
|
||||
"integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/estree": "1.0.6"
|
||||
"@types/estree": "1.0.7"
|
||||
},
|
||||
"bin": {
|
||||
"rollup": "dist/bin/rollup"
|
||||
@@ -5639,25 +5653,26 @@
|
||||
"npm": ">=8.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rollup/rollup-android-arm-eabi": "4.34.7",
|
||||
"@rollup/rollup-android-arm64": "4.34.7",
|
||||
"@rollup/rollup-darwin-arm64": "4.34.7",
|
||||
"@rollup/rollup-darwin-x64": "4.34.7",
|
||||
"@rollup/rollup-freebsd-arm64": "4.34.7",
|
||||
"@rollup/rollup-freebsd-x64": "4.34.7",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.34.7",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.34.7",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.34.7",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.34.7",
|
||||
"@rollup/rollup-linux-loongarch64-gnu": "4.34.7",
|
||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.34.7",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.34.7",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.34.7",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.34.7",
|
||||
"@rollup/rollup-linux-x64-musl": "4.34.7",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.34.7",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.34.7",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.34.7",
|
||||
"@rollup/rollup-android-arm-eabi": "4.40.0",
|
||||
"@rollup/rollup-android-arm64": "4.40.0",
|
||||
"@rollup/rollup-darwin-arm64": "4.40.0",
|
||||
"@rollup/rollup-darwin-x64": "4.40.0",
|
||||
"@rollup/rollup-freebsd-arm64": "4.40.0",
|
||||
"@rollup/rollup-freebsd-x64": "4.40.0",
|
||||
"@rollup/rollup-linux-arm-gnueabihf": "4.40.0",
|
||||
"@rollup/rollup-linux-arm-musleabihf": "4.40.0",
|
||||
"@rollup/rollup-linux-arm64-gnu": "4.40.0",
|
||||
"@rollup/rollup-linux-arm64-musl": "4.40.0",
|
||||
"@rollup/rollup-linux-loongarch64-gnu": "4.40.0",
|
||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.40.0",
|
||||
"@rollup/rollup-linux-riscv64-gnu": "4.40.0",
|
||||
"@rollup/rollup-linux-riscv64-musl": "4.40.0",
|
||||
"@rollup/rollup-linux-s390x-gnu": "4.40.0",
|
||||
"@rollup/rollup-linux-x64-gnu": "4.40.0",
|
||||
"@rollup/rollup-linux-x64-musl": "4.40.0",
|
||||
"@rollup/rollup-win32-arm64-msvc": "4.40.0",
|
||||
"@rollup/rollup-win32-ia32-msvc": "4.40.0",
|
||||
"@rollup/rollup-win32-x64-msvc": "4.40.0",
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
@@ -6792,15 +6807,18 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "6.2.6",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz",
|
||||
"integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==",
|
||||
"version": "6.3.2",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz",
|
||||
"integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.4.3",
|
||||
"picomatch": "^4.0.2",
|
||||
"postcss": "^8.5.3",
|
||||
"rollup": "^4.30.1"
|
||||
"rollup": "^4.34.9",
|
||||
"tinyglobby": "^0.2.12"
|
||||
},
|
||||
"bin": {
|
||||
"vite": "bin/vite.js"
|
||||
@@ -6864,9 +6882,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite-plugin-static-copy": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.0.tgz",
|
||||
"integrity": "sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==",
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.1.tgz",
|
||||
"integrity": "sha512-EfsPcBm3ewg3UMG8RJaC0ADq6/qnUZnokXx4By4+2cAcipjT9i0Y0owIJGqmZI7d6nxk4qB1q5aXOwNuSyPdyA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -6943,6 +6961,34 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/fdir": {
|
||||
"version": "6.4.3",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
|
||||
"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"picomatch": "^3 || ^4"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"picomatch": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/picomatch": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
|
||||
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/watchpack": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
"stylelint-prettier": "^5.0.3",
|
||||
"svgo": "^3.3.2",
|
||||
"swiped-events": "^1.2.0",
|
||||
"vite": "^6.2.6",
|
||||
"vite-plugin-static-copy": "^2.3.0",
|
||||
"vite": "^6.3.2",
|
||||
"vite-plugin-static-copy": "^2.3.1",
|
||||
"vite-plugin-stylelint": "^6.0.0",
|
||||
"webpack": "^5.99.5",
|
||||
"webpack-cli": "^6.0.1"
|
||||
|
||||
@@ -16,8 +16,14 @@
|
||||
open_metrics: ''
|
||||
|
||||
``debug`` : ``$SEARXNG_DEBUG``
|
||||
Allow a more detailed log if you run SearXNG directly. Display *detailed* error
|
||||
messages in the browser too, so this must be deactivated in production.
|
||||
In debug mode, the server provides an interactive debugger, will reload when
|
||||
code is changed and activates a verbose logging.
|
||||
|
||||
.. attention::
|
||||
|
||||
The debug setting is intended for local development server. Don't
|
||||
activate debug (don't use a development server) when deploying to
|
||||
production.
|
||||
|
||||
``donation_url`` :
|
||||
Set value to ``true`` to use your own donation page written in the
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
limiter: false
|
||||
public_instance: false
|
||||
image_proxy: false
|
||||
method: "POST"
|
||||
default_http_headers:
|
||||
X-Content-Type-Options : nosniff
|
||||
X-Download-Options : noopen
|
||||
@@ -50,6 +51,11 @@
|
||||
``image_proxy`` : ``$SEARXNG_IMAGE_PROXY``
|
||||
Allow your instance of SearXNG of being able to proxy images. Uses memory space.
|
||||
|
||||
.. _method:
|
||||
|
||||
``method`` : ``$SEARXNG_METHOD``
|
||||
Whether to use ``GET`` or ``POST`` HTTP method when searching.
|
||||
|
||||
.. _HTTP headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
|
||||
|
||||
``default_http_headers`` :
|
||||
|
||||
@@ -4,10 +4,5 @@
|
||||
Mullvad-Leta
|
||||
============
|
||||
|
||||
.. contents:: Contents
|
||||
:depth: 2
|
||||
:local:
|
||||
:backlinks: entry
|
||||
|
||||
.. automodule:: searx.engines.mullvad_leta
|
||||
:members:
|
||||
|
||||
@@ -22,18 +22,18 @@ searx_dir = abspath(dirname(__file__))
|
||||
searx_parent_dir = abspath(dirname(dirname(__file__)))
|
||||
|
||||
settings = {}
|
||||
searx_debug = False
|
||||
sxng_debug = False
|
||||
logger = logging.getLogger('searx')
|
||||
|
||||
_unset = object()
|
||||
|
||||
|
||||
def init_settings():
|
||||
"""Initialize global ``settings`` and ``searx_debug`` variables and
|
||||
"""Initialize global ``settings`` and ``sxng_debug`` variables and
|
||||
``logger`` from ``SEARXNG_SETTINGS_PATH``.
|
||||
"""
|
||||
|
||||
global settings, searx_debug # pylint: disable=global-variable-not-assigned
|
||||
global settings, sxng_debug # pylint: disable=global-variable-not-assigned
|
||||
|
||||
cfg, msg = searx.settings_loader.load_settings(load_user_settings=True)
|
||||
cfg = cfg or {}
|
||||
@@ -42,8 +42,8 @@ def init_settings():
|
||||
settings.clear()
|
||||
settings.update(cfg)
|
||||
|
||||
searx_debug = settings['general']['debug']
|
||||
if searx_debug:
|
||||
sxng_debug = get_setting("general.debug")
|
||||
if sxng_debug:
|
||||
_logging_config_debug()
|
||||
else:
|
||||
logging.basicConfig(level=LOG_LEVEL_PROD, format=LOG_FORMAT_PROD)
|
||||
|
||||
@@ -6628,6 +6628,172 @@
|
||||
"to-TO": "to"
|
||||
}
|
||||
},
|
||||
"mullvadleta": {
|
||||
"all_locale": null,
|
||||
"custom": {},
|
||||
"data_type": "traits_v1",
|
||||
"languages": {
|
||||
"ar": "ar",
|
||||
"bg": "bg",
|
||||
"ca": "ca",
|
||||
"cs": "cs",
|
||||
"da": "da",
|
||||
"de": "de",
|
||||
"en": "en",
|
||||
"es": "es",
|
||||
"et": "et",
|
||||
"fi": "fi",
|
||||
"fr": "fr",
|
||||
"he": "he",
|
||||
"hr": "hr",
|
||||
"hu": "hu",
|
||||
"is": "is",
|
||||
"it": "it",
|
||||
"ja": "jp",
|
||||
"ko": "ko",
|
||||
"lt": "lt",
|
||||
"lv": "lv",
|
||||
"nb": "nb",
|
||||
"nl": "nl",
|
||||
"pl": "pl",
|
||||
"pt": "pt",
|
||||
"ro": "ro",
|
||||
"ru": "ru",
|
||||
"sk": "sk",
|
||||
"sl": "sl",
|
||||
"sr": "sr",
|
||||
"sv": "sv",
|
||||
"tr": "tr",
|
||||
"zh_Hans": "zh-hant",
|
||||
"zh_Hant": "zh-hans"
|
||||
},
|
||||
"regions": {
|
||||
"ar-SA": "sa",
|
||||
"da-DK": "dk",
|
||||
"de-AT": "at",
|
||||
"de-BE": "be",
|
||||
"de-CH": "ch",
|
||||
"de-DE": "de",
|
||||
"en-AU": "au",
|
||||
"en-CA": "ca",
|
||||
"en-GB": "uk",
|
||||
"en-IN": "in",
|
||||
"en-NZ": "nz",
|
||||
"en-PH": "ph",
|
||||
"en-US": "us",
|
||||
"en-ZA": "za",
|
||||
"es-AR": "ar",
|
||||
"es-CL": "cl",
|
||||
"es-ES": "es",
|
||||
"es-MX": "mx",
|
||||
"fi-FI": "fi",
|
||||
"fr-BE": "be",
|
||||
"fr-CA": "ca",
|
||||
"fr-CH": "ch",
|
||||
"fr-FR": "fr",
|
||||
"id-ID": "id",
|
||||
"it-CH": "ch",
|
||||
"it-IT": "it",
|
||||
"ja-JP": "jp",
|
||||
"ko-KR": "kr",
|
||||
"ms-MY": "my",
|
||||
"nb-NO": "no",
|
||||
"nl-BE": "be",
|
||||
"nl-NL": "nl",
|
||||
"pl-PL": "pl",
|
||||
"pt-BR": "br",
|
||||
"pt-PT": "pt",
|
||||
"ru-RU": "ru",
|
||||
"se-SE": "se",
|
||||
"tr-TR": "tr",
|
||||
"zh-CN": "cn",
|
||||
"zh-HK": "hk",
|
||||
"zh-TW": "tw"
|
||||
}
|
||||
},
|
||||
"mullvadleta brave": {
|
||||
"all_locale": null,
|
||||
"custom": {},
|
||||
"data_type": "traits_v1",
|
||||
"languages": {
|
||||
"ar": "ar",
|
||||
"bg": "bg",
|
||||
"ca": "ca",
|
||||
"cs": "cs",
|
||||
"da": "da",
|
||||
"de": "de",
|
||||
"en": "en",
|
||||
"es": "es",
|
||||
"et": "et",
|
||||
"fi": "fi",
|
||||
"fr": "fr",
|
||||
"he": "he",
|
||||
"hr": "hr",
|
||||
"hu": "hu",
|
||||
"is": "is",
|
||||
"it": "it",
|
||||
"ja": "jp",
|
||||
"ko": "ko",
|
||||
"lt": "lt",
|
||||
"lv": "lv",
|
||||
"nb": "nb",
|
||||
"nl": "nl",
|
||||
"pl": "pl",
|
||||
"pt": "pt",
|
||||
"ro": "ro",
|
||||
"ru": "ru",
|
||||
"sk": "sk",
|
||||
"sl": "sl",
|
||||
"sr": "sr",
|
||||
"sv": "sv",
|
||||
"tr": "tr",
|
||||
"zh_Hans": "zh-hant",
|
||||
"zh_Hant": "zh-hans"
|
||||
},
|
||||
"regions": {
|
||||
"ar-SA": "sa",
|
||||
"da-DK": "dk",
|
||||
"de-AT": "at",
|
||||
"de-BE": "be",
|
||||
"de-CH": "ch",
|
||||
"de-DE": "de",
|
||||
"en-AU": "au",
|
||||
"en-CA": "ca",
|
||||
"en-GB": "uk",
|
||||
"en-IN": "in",
|
||||
"en-NZ": "nz",
|
||||
"en-PH": "ph",
|
||||
"en-US": "us",
|
||||
"en-ZA": "za",
|
||||
"es-AR": "ar",
|
||||
"es-CL": "cl",
|
||||
"es-ES": "es",
|
||||
"es-MX": "mx",
|
||||
"fi-FI": "fi",
|
||||
"fr-BE": "be",
|
||||
"fr-CA": "ca",
|
||||
"fr-CH": "ch",
|
||||
"fr-FR": "fr",
|
||||
"id-ID": "id",
|
||||
"it-CH": "ch",
|
||||
"it-IT": "it",
|
||||
"ja-JP": "jp",
|
||||
"ko-KR": "kr",
|
||||
"ms-MY": "my",
|
||||
"nb-NO": "no",
|
||||
"nl-BE": "be",
|
||||
"nl-NL": "nl",
|
||||
"pl-PL": "pl",
|
||||
"pt-BR": "br",
|
||||
"pt-PT": "pt",
|
||||
"ru-RU": "ru",
|
||||
"se-SE": "se",
|
||||
"tr-TR": "tr",
|
||||
"zh-CN": "cn",
|
||||
"zh-HK": "hk",
|
||||
"zh-TW": "tw"
|
||||
}
|
||||
},
|
||||
"odysee": {
|
||||
"all_locale": null,
|
||||
"custom": {},
|
||||
|
||||
@@ -1,46 +1,61 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
"""This is the implementation of the Mullvad-Leta meta-search engine.
|
||||
|
||||
This engine **REQUIRES** that searxng operate within a Mullvad VPN
|
||||
|
||||
If using docker, consider using gluetun for easily connecting to the Mullvad
|
||||
|
||||
- https://github.com/qdm12/gluetun
|
||||
|
||||
Otherwise, follow instructions provided by Mullvad for enabling the VPN on Linux
|
||||
|
||||
- https://mullvad.net/en/help/install-mullvad-app-linux
|
||||
"""Mullvad Leta is a search engine proxy. Currently Leta only offers text
|
||||
search results not image, news or any other types of search result. Leta acts
|
||||
as a proxy to Google and Brave search results. You can select which backend
|
||||
search engine you wish to use, see (:py:obj:`leta_engine`).
|
||||
|
||||
.. hint::
|
||||
|
||||
The :py:obj:`EngineTraits` is empty by default. Maintainers have to run
|
||||
``make data.traits`` (in the Mullvad VPN / :py:obj:`fetch_traits`) and rebase
|
||||
the modified JSON file ``searx/data/engine_traits.json`` on every single
|
||||
update of SearXNG!
|
||||
Leta caches each search for up to 30 days. For example, if you use search
|
||||
terms like ``news``, contrary to your intention you'll get very old results!
|
||||
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The engine has the following additional settings:
|
||||
|
||||
- :py:obj:`leta_engine` (:py:obj:`LetaEnginesType`)
|
||||
|
||||
You can configure one Leta engine for Google and one for Brave:
|
||||
|
||||
.. code:: yaml
|
||||
|
||||
- name: mullvadleta
|
||||
engine: mullvad_leta
|
||||
leta_engine: google
|
||||
shortcut: ml
|
||||
|
||||
- name: mullvadleta brave
|
||||
engine: mullvad_leta
|
||||
network: mullvadleta # use network from engine "mullvadleta" configured above
|
||||
leta_engine: brave
|
||||
shortcut: mlb
|
||||
|
||||
Implementations
|
||||
===============
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
import typing
|
||||
from urllib.parse import urlencode
|
||||
import babel
|
||||
from httpx import Response
|
||||
from lxml import html
|
||||
from searx.enginelib.traits import EngineTraits
|
||||
from searx.locales import region_tag, get_official_locales
|
||||
from searx.utils import eval_xpath, extract_text, eval_xpath_list
|
||||
from searx.exceptions import SearxEngineResponseException
|
||||
from searx.locales import get_official_locales, language_tag, region_tag
|
||||
from searx.utils import eval_xpath_list
|
||||
from searx.result_types import EngineResults, MainResult
|
||||
|
||||
if TYPE_CHECKING:
|
||||
if typing.TYPE_CHECKING:
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
traits: EngineTraits
|
||||
|
||||
use_cache: bool = True # non-cache use only has 100 searches per day!
|
||||
|
||||
leta_engine: str = 'google'
|
||||
|
||||
search_url = "https://leta.mullvad.net"
|
||||
|
||||
# about
|
||||
@@ -54,154 +69,205 @@ about = {
|
||||
}
|
||||
|
||||
# engine dependent config
|
||||
categories = ['general', 'web']
|
||||
categories = ["general", "web"]
|
||||
paging = True
|
||||
max_page = 50
|
||||
max_page = 10
|
||||
time_range_support = True
|
||||
time_range_dict = {
|
||||
"day": "d1",
|
||||
"week": "w1",
|
||||
"month": "m1",
|
||||
"year": "y1",
|
||||
"day": "d",
|
||||
"week": "w",
|
||||
"month": "m",
|
||||
"year": "y",
|
||||
}
|
||||
|
||||
available_leta_engines = [
|
||||
'google', # first will be default if provided engine is invalid
|
||||
'brave',
|
||||
]
|
||||
LetaEnginesType = typing.Literal["google", "brave"]
|
||||
"""Engine types supported by mullvadleta."""
|
||||
|
||||
leta_engine: LetaEnginesType = "google"
|
||||
"""Select Leta's engine type from :py:obj:`LetaEnginesType`."""
|
||||
|
||||
|
||||
def is_vpn_connected(dom: html.HtmlElement) -> bool:
|
||||
"""Returns true if the VPN is connected, False otherwise"""
|
||||
connected_text = extract_text(eval_xpath(dom, '//main/div/p[1]'))
|
||||
return connected_text != 'You are not connected to Mullvad VPN.'
|
||||
def init(_):
|
||||
l = typing.get_args(LetaEnginesType)
|
||||
if leta_engine not in l:
|
||||
raise ValueError(f"leta_engine '{leta_engine}' is invalid, use one of {', '.join(l)}")
|
||||
|
||||
|
||||
def assign_headers(headers: dict) -> dict:
|
||||
"""Assigns the headers to make a request to Mullvad Leta"""
|
||||
headers['Accept'] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
|
||||
headers['Content-Type'] = "application/x-www-form-urlencoded"
|
||||
headers['Host'] = "leta.mullvad.net"
|
||||
headers['Origin'] = "https://leta.mullvad.net"
|
||||
return headers
|
||||
class DataNodeQueryMetaDataIndices(typing.TypedDict):
|
||||
"""Indices into query metadata."""
|
||||
|
||||
success: int
|
||||
q: int # pylint: disable=invalid-name
|
||||
country: int
|
||||
language: int
|
||||
lastUpdated: int
|
||||
engine: int
|
||||
items: int
|
||||
infobox: int
|
||||
news: int
|
||||
timestamp: int
|
||||
altered: int
|
||||
page: int
|
||||
next: int # if -1, there no more results are available
|
||||
previous: int
|
||||
|
||||
|
||||
class DataNodeResultIndices(typing.TypedDict):
|
||||
"""Indices into query resultsdata."""
|
||||
|
||||
link: int
|
||||
snippet: int
|
||||
title: int
|
||||
favicon: int
|
||||
|
||||
|
||||
def request(query: str, params: dict):
|
||||
country = traits.get_region(params.get('searxng_locale', 'all'), traits.all_locale) # type: ignore
|
||||
|
||||
result_engine = leta_engine
|
||||
if leta_engine not in available_leta_engines:
|
||||
result_engine = available_leta_engines[0]
|
||||
logger.warning(
|
||||
'Configured engine "%s" not one of the available engines %s, defaulting to "%s"',
|
||||
leta_engine,
|
||||
available_leta_engines,
|
||||
result_engine,
|
||||
)
|
||||
|
||||
params['url'] = search_url
|
||||
params['method'] = 'POST'
|
||||
params['data'] = {
|
||||
params["method"] = "GET"
|
||||
args = {
|
||||
"q": query,
|
||||
"gl": country if country is str else '',
|
||||
'engine': result_engine,
|
||||
"engine": leta_engine,
|
||||
"x-sveltekit-invalidated": "001", # hardcoded from all requests seen
|
||||
}
|
||||
# pylint: disable=undefined-variable
|
||||
if use_cache:
|
||||
params['data']['oc'] = "on"
|
||||
# pylint: enable=undefined-variable
|
||||
|
||||
if params['time_range'] in time_range_dict:
|
||||
params['dateRestrict'] = time_range_dict[params['time_range']]
|
||||
else:
|
||||
params['dateRestrict'] = ''
|
||||
country = traits.get_region(params.get("searxng_locale"), traits.all_locale) # type: ignore
|
||||
if country:
|
||||
args["country"] = country
|
||||
|
||||
if params['pageno'] > 1:
|
||||
# Page 1 is n/a, Page 2 is 11, page 3 is 21, ...
|
||||
params['data']['start'] = ''.join([str(params['pageno'] - 1), "1"])
|
||||
language = traits.get_language(params.get("searxng_locale"), traits.all_locale) # type: ignore
|
||||
if language:
|
||||
args["language"] = language
|
||||
|
||||
if params['headers'] is None:
|
||||
params['headers'] = {}
|
||||
if params["time_range"] in time_range_dict:
|
||||
args["lastUpdated"] = time_range_dict[params["time_range"]]
|
||||
|
||||
if params["pageno"] > 1:
|
||||
args["page"] = params["pageno"]
|
||||
|
||||
params["url"] = f"{search_url}/search/__data.json?{urlencode(args)}"
|
||||
|
||||
assign_headers(params['headers'])
|
||||
return params
|
||||
|
||||
|
||||
def extract_result(dom_result: list[html.HtmlElement]):
|
||||
# Infoboxes sometimes appear in the beginning and will have a length of 0
|
||||
if len(dom_result) == 3:
|
||||
[a_elem, h3_elem, p_elem] = dom_result
|
||||
elif len(dom_result) == 4:
|
||||
[_, a_elem, h3_elem, p_elem] = dom_result
|
||||
else:
|
||||
return None
|
||||
def response(resp: Response) -> EngineResults:
|
||||
json_response = resp.json()
|
||||
|
||||
return {
|
||||
'url': extract_text(a_elem.text),
|
||||
'title': extract_text(h3_elem),
|
||||
'content': extract_text(p_elem),
|
||||
}
|
||||
nodes = json_response["nodes"]
|
||||
# 0: is None
|
||||
# 1: has "connected=True", not useful
|
||||
# 2: query results within "data"
|
||||
|
||||
data_nodes = nodes[2]["data"]
|
||||
# Instead of nested object structure, all objects are flattened into a
|
||||
# list. Rather, the first object in data_node provides indices into the
|
||||
# "data_nodes" to access each searchresult (which is an object of more
|
||||
# indices)
|
||||
#
|
||||
# Read the relative TypedDict definitions for details
|
||||
|
||||
query_meta_data: DataNodeQueryMetaDataIndices = data_nodes[0]
|
||||
|
||||
query_items_indices = query_meta_data["items"]
|
||||
|
||||
results = EngineResults()
|
||||
for idx in data_nodes[query_items_indices]:
|
||||
query_item_indices: DataNodeResultIndices = data_nodes[idx]
|
||||
results.add(
|
||||
MainResult(
|
||||
url=data_nodes[query_item_indices["link"]],
|
||||
title=data_nodes[query_item_indices["title"]],
|
||||
content=data_nodes[query_item_indices["snippet"]],
|
||||
)
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def extract_results(search_results: html.HtmlElement):
|
||||
for search_result in search_results:
|
||||
dom_result = eval_xpath_list(search_result, 'div/div/*')
|
||||
result = extract_result(dom_result)
|
||||
if result is not None:
|
||||
yield result
|
||||
def fetch_traits(engine_traits: EngineTraits) -> None:
|
||||
"""Fetch languages and regions from Mullvad-Leta"""
|
||||
|
||||
def extract_table_data(table):
|
||||
for row in table.xpath(".//tr")[2:]:
|
||||
cells = row.xpath(".//td | .//th") # includes headers and data
|
||||
if len(cells) > 1: # ensure the column exists
|
||||
cell0 = cells[0].text_content().strip()
|
||||
cell1 = cells[1].text_content().strip()
|
||||
yield [cell0, cell1]
|
||||
|
||||
def response(resp: Response):
|
||||
"""Checks if connected to Mullvad VPN, then extracts the search results from
|
||||
the DOM resp: requests response object"""
|
||||
|
||||
dom = html.fromstring(resp.text)
|
||||
if not is_vpn_connected(dom):
|
||||
raise SearxEngineResponseException('Not connected to Mullvad VPN')
|
||||
search_results = eval_xpath(dom.body, '//main/div[2]/div')
|
||||
return list(extract_results(search_results))
|
||||
|
||||
|
||||
def fetch_traits(engine_traits: EngineTraits):
|
||||
"""Fetch languages and regions from Mullvad-Leta
|
||||
|
||||
.. warning::
|
||||
|
||||
Fetching the engine traits also requires a Mullvad VPN connection. If
|
||||
not connected, then an error message will print and no traits will be
|
||||
updated.
|
||||
"""
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# see https://github.com/searxng/searxng/issues/762
|
||||
from searx.network import post as http_post
|
||||
from searx.network import get as http_get
|
||||
|
||||
# pylint: enable=import-outside-toplevel
|
||||
resp = http_post(search_url, headers=assign_headers({}))
|
||||
|
||||
resp = http_get(f"{search_url}/documentation")
|
||||
if not isinstance(resp, Response):
|
||||
print("ERROR: failed to get response from mullvad-leta. Are you connected to the VPN?")
|
||||
return
|
||||
if not resp.ok:
|
||||
print("ERROR: response from mullvad-leta is not OK. Are you connected to the VPN?")
|
||||
return
|
||||
|
||||
dom = html.fromstring(resp.text)
|
||||
if not is_vpn_connected(dom):
|
||||
print('ERROR: Not connected to Mullvad VPN')
|
||||
return
|
||||
# supported region codes
|
||||
options = eval_xpath_list(dom.body, '//main/div/form/div[2]/div/select[1]/option')
|
||||
if options is None or len(options) <= 0:
|
||||
print('ERROR: could not find any results. Are you connected to the VPN?')
|
||||
for x in options:
|
||||
eng_country = x.get("value")
|
||||
|
||||
sxng_locales = get_official_locales(eng_country, engine_traits.languages.keys(), regional=True)
|
||||
# There are 4 HTML tables on the documentation page for extracting information:
|
||||
# 0. Keyboard Shortcuts
|
||||
# 1. Query Parameters (shoutout to Mullvad for accessible docs for integration)
|
||||
# 2. Country Codes [Country, Code]
|
||||
# 3. Language Codes [Language, Code]
|
||||
tables = eval_xpath_list(dom.body, "//table")
|
||||
if tables is None or len(tables) <= 0:
|
||||
print("ERROR: could not find any tables. Was the page updated?")
|
||||
|
||||
if not sxng_locales:
|
||||
print(
|
||||
"ERROR: can't map from Mullvad-Leta country %s (%s) to a babel region."
|
||||
% (x.get('data-name'), eng_country)
|
||||
)
|
||||
language_table = tables[3]
|
||||
lang_map = {
|
||||
"zh-hant": "zh_Hans",
|
||||
"zh-hans": "zh_Hant",
|
||||
"jp": "ja",
|
||||
}
|
||||
|
||||
for language, code in extract_table_data(language_table):
|
||||
|
||||
locale_tag = lang_map.get(code, code).replace("-", "_") # type: ignore
|
||||
try:
|
||||
locale = babel.Locale.parse(locale_tag)
|
||||
except babel.UnknownLocaleError:
|
||||
print(f"ERROR: Mullvad-Leta language {language} ({code}) is unknown by babel")
|
||||
continue
|
||||
|
||||
for sxng_locale in sxng_locales:
|
||||
engine_traits.regions[region_tag(sxng_locale)] = eng_country
|
||||
sxng_tag = language_tag(locale)
|
||||
engine_traits.languages[sxng_tag] = code
|
||||
|
||||
country_table = tables[2]
|
||||
country_map = {
|
||||
"cn": "zh-CN",
|
||||
"hk": "zh-HK",
|
||||
"jp": "ja-JP",
|
||||
"my": "ms-MY",
|
||||
"tw": "zh-TW",
|
||||
"uk": "en-GB",
|
||||
"us": "en-US",
|
||||
}
|
||||
|
||||
for country, code in extract_table_data(country_table):
|
||||
|
||||
sxng_tag = country_map.get(code)
|
||||
if sxng_tag:
|
||||
engine_traits.regions[sxng_tag] = code
|
||||
continue
|
||||
|
||||
try:
|
||||
locale = babel.Locale.parse(f"{code.lower()}_{code.upper()}")
|
||||
except babel.UnknownLocaleError:
|
||||
locale = None
|
||||
|
||||
if locale:
|
||||
engine_traits.regions[region_tag(locale)] = code
|
||||
continue
|
||||
|
||||
official_locales = get_official_locales(code, engine_traits.languages.keys(), regional=True)
|
||||
if not official_locales:
|
||||
print(f"ERROR: Mullvad-Leta country '{code}' ({country}) could not be mapped as expected.")
|
||||
continue
|
||||
|
||||
for locale in official_locales:
|
||||
engine_traits.regions[region_tag(locale)] = code
|
||||
|
||||
@@ -11,7 +11,7 @@ from searx.exceptions import SearxEngineAPIException, SearxEngineCaptchaExceptio
|
||||
|
||||
# Metadata
|
||||
about = {
|
||||
"website": "https://m.quark.cn/",
|
||||
"website": "https://quark.sm.cn/",
|
||||
"wikidata_id": "Q48816502",
|
||||
"use_official_api": False,
|
||||
"require_api_key": False,
|
||||
@@ -53,7 +53,7 @@ def request(query, params):
|
||||
|
||||
category_config = {
|
||||
'general': {
|
||||
'endpoint': 'https://m.quark.cn/s',
|
||||
'endpoint': 'https://quark.sm.cn/s',
|
||||
'params': {
|
||||
"q": query,
|
||||
"layout": "html",
|
||||
|
||||
@@ -11,7 +11,7 @@ from lxml import html
|
||||
from searx.network import get as http_get
|
||||
|
||||
about = {
|
||||
"website": "ttps://soundcloud.com",
|
||||
"website": "https://soundcloud.com",
|
||||
"wikidata_id": "Q568769",
|
||||
"official_api_documentation": "https://developers.soundcloud.com/docs/api/guide",
|
||||
"use_official_api": False,
|
||||
|
||||
51
searx/engines/steam.py
Normal file
51
searx/engines/steam.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
"""Steam (store) for SearXNG."""
|
||||
|
||||
from urllib.parse import urlencode
|
||||
|
||||
from searx.utils import html_to_text
|
||||
from searx.result_types import EngineResults, MainResult
|
||||
|
||||
about = {
|
||||
"website": 'https://store.steampowered.com/',
|
||||
"wikidata_id": 'Q337535',
|
||||
"use_official_api": False,
|
||||
"require_api_key": False,
|
||||
"results": 'JSON',
|
||||
}
|
||||
|
||||
categories = []
|
||||
|
||||
base_url = "https://store.steampowered.com"
|
||||
|
||||
|
||||
def request(query, params):
|
||||
query_params = {"term": query, "cc": "us", "l": "en"}
|
||||
params['url'] = f'{base_url}/api/storesearch/?{urlencode(query_params)}'
|
||||
return params
|
||||
|
||||
|
||||
def response(resp) -> EngineResults:
|
||||
results = EngineResults()
|
||||
search_results = resp.json()
|
||||
|
||||
for item in search_results.get('items', []):
|
||||
app_id = item.get('id')
|
||||
|
||||
currency = item.get('price', {}).get('currency', 'USD')
|
||||
price = item.get('price', {}).get('final', 0) / 100
|
||||
|
||||
platforms = ', '.join([platform for platform, supported in item.get('platforms', {}).items() if supported])
|
||||
|
||||
content = [f'Price: {price:.2f} {currency}', f'Platforms: {platforms}']
|
||||
|
||||
results.add(
|
||||
MainResult(
|
||||
title=item.get('name'),
|
||||
content=html_to_text(' | '.join(content)),
|
||||
url=f'{base_url}/app/{app_id}',
|
||||
thumbnail=item.get('tiny_image', ''),
|
||||
)
|
||||
)
|
||||
|
||||
return results
|
||||
@@ -12,7 +12,7 @@ from typing import Dict
|
||||
|
||||
import httpx
|
||||
|
||||
from searx import logger, searx_debug
|
||||
from searx import logger, sxng_debug
|
||||
from searx.extended_types import SXNG_Response
|
||||
from .client import new_client, get_loop, AsyncHTTPTransportNoHttp
|
||||
from .raise_for_httperror import raise_for_httperror
|
||||
@@ -186,7 +186,7 @@ class Network:
|
||||
local_address = next(self._local_addresses_cycle)
|
||||
proxies = next(self._proxies_cycle) # is a tuple so it can be part of the key
|
||||
key = (verify, max_redirects, local_address, proxies)
|
||||
hook_log_response = self.log_response if searx_debug else None
|
||||
hook_log_response = self.log_response if sxng_debug else None
|
||||
if key not in self._clients or self._clients[key].is_closed:
|
||||
client = new_client(
|
||||
self.enable_http,
|
||||
|
||||
@@ -155,7 +155,7 @@ class ExternalBangParser(QueryPartParser):
|
||||
return raw_value.startswith('!!') and len(raw_value) > 2
|
||||
|
||||
def __call__(self, raw_value):
|
||||
value = raw_value[2:]
|
||||
value = raw_value[2:].lower()
|
||||
found, bang_ac_list = self._parse(value) if len(value) > 0 else (False, [])
|
||||
if self.enable_autocomplete:
|
||||
self._autocomplete(bang_ac_list)
|
||||
@@ -183,7 +183,7 @@ class BangParser(QueryPartParser):
|
||||
return raw_value[0] == '!' and (len(raw_value) < 2 or raw_value[1] != '!')
|
||||
|
||||
def __call__(self, raw_value):
|
||||
value = raw_value[1:].replace('-', ' ').replace('_', ' ')
|
||||
value = raw_value[1:].replace('-', ' ').replace('_', ' ').lower()
|
||||
found = self._parse(value) if len(value) > 0 else False
|
||||
if found and raw_value[0] == '!':
|
||||
self.raw_text_query.specific = True
|
||||
|
||||
@@ -10,7 +10,7 @@ from typing import Any, Dict, List, Literal, Optional, Tuple, TypedDict, Union
|
||||
|
||||
import redis.exceptions
|
||||
|
||||
from searx import logger, settings, searx_debug
|
||||
from searx import logger, settings, sxng_debug
|
||||
from searx.redisdb import client as get_redis_client
|
||||
from searx.exceptions import SearxSettingsException
|
||||
from searx.search.processors import PROCESSORS
|
||||
@@ -139,7 +139,7 @@ def initialize():
|
||||
signal.signal(signal.SIGUSR1, _signal_handler)
|
||||
|
||||
# special case when debug is activate
|
||||
if searx_debug and settings['checker']['off_when_debug']:
|
||||
if sxng_debug and settings['checker']['off_when_debug']:
|
||||
logger.info('debug mode: checker is disabled')
|
||||
return
|
||||
|
||||
|
||||
@@ -101,7 +101,8 @@ server:
|
||||
# 1.0 and 1.1 are supported
|
||||
http_protocol_version: "1.0"
|
||||
# POST queries are more secure as they don't show up in history but may cause
|
||||
# problems when using Firefox containers
|
||||
# problems when using Firefox containers.
|
||||
# Is overwritten by ${SEARXNG_METHOD}
|
||||
method: "POST"
|
||||
default_http_headers:
|
||||
X-Content-Type-Options: nosniff
|
||||
@@ -710,26 +711,6 @@ engines:
|
||||
search_type: news
|
||||
disabled: true
|
||||
|
||||
- name: curlie
|
||||
engine: xpath
|
||||
shortcut: cl
|
||||
categories: general
|
||||
disabled: true
|
||||
paging: true
|
||||
lang_all: ''
|
||||
search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189
|
||||
page_size: 20
|
||||
results_xpath: //div[@id="site-list-content"]/div[@class="site-item"]
|
||||
url_xpath: ./div[@class="title-and-desc"]/a/@href
|
||||
title_xpath: ./div[@class="title-and-desc"]/a/div
|
||||
content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"]
|
||||
about:
|
||||
website: https://curlie.org/
|
||||
wikidata_id: Q60715723
|
||||
use_official_api: false
|
||||
require_api_key: false
|
||||
results: HTML
|
||||
|
||||
- name: currency
|
||||
engine: currency_convert
|
||||
categories: general
|
||||
@@ -1419,14 +1400,21 @@ engines:
|
||||
require_api_key: false
|
||||
results: JSON
|
||||
|
||||
# read https://docs.searxng.org/dev/engines/online/mullvad_leta.html
|
||||
# - name: mullvadleta
|
||||
# engine: mullvad_leta
|
||||
# leta_engine: google # choose one of the following: google, brave
|
||||
# use_cache: true # Only 100 non-cache searches per day, suggested only for private instances
|
||||
# search_url: https://leta.mullvad.net
|
||||
# categories: [general, web]
|
||||
# shortcut: ml
|
||||
# https://docs.searxng.org/dev/engines/online/mullvad_leta.html
|
||||
- name: mullvadleta
|
||||
engine: mullvad_leta
|
||||
disabled: true
|
||||
leta_engine: google
|
||||
categories: [general, web]
|
||||
shortcut: ml
|
||||
|
||||
- name: mullvadleta brave
|
||||
engine: mullvad_leta
|
||||
network: mullvadleta
|
||||
disabled: true
|
||||
leta_engine: brave
|
||||
categories: [general, web]
|
||||
shortcut: mlb
|
||||
|
||||
- name: odysee
|
||||
engine: odysee
|
||||
@@ -1971,6 +1959,11 @@ engines:
|
||||
categories: [images, web]
|
||||
shortcut: spi
|
||||
|
||||
- name: steam
|
||||
engine: steam
|
||||
shortcut: stm
|
||||
disabled: true
|
||||
|
||||
- name: tokyotoshokan
|
||||
engine: tokyotoshokan
|
||||
shortcut: tt
|
||||
|
||||
@@ -182,7 +182,7 @@ SCHEMA = {
|
||||
'base_url': SettingsValue((False, str), False, 'SEARXNG_BASE_URL'),
|
||||
'image_proxy': SettingsValue(bool, False, 'SEARXNG_IMAGE_PROXY'),
|
||||
'http_protocol_version': SettingsValue(('1.0', '1.1'), '1.0'),
|
||||
'method': SettingsValue(('POST', 'GET'), 'POST'),
|
||||
'method': SettingsValue(('POST', 'GET'), 'POST', 'SEARXNG_METHOD'),
|
||||
'default_http_headers': SettingsValue(dict, {}),
|
||||
},
|
||||
'redis': {
|
||||
|
||||
@@ -23,6 +23,7 @@ sxng_locales = (
|
||||
('da-DK', 'Dansk', 'Danmark', 'Danish', '\U0001f1e9\U0001f1f0'),
|
||||
('de', 'Deutsch', '', 'German', '\U0001f310'),
|
||||
('de-AT', 'Deutsch', 'Österreich', 'German', '\U0001f1e6\U0001f1f9'),
|
||||
('de-BE', 'Deutsch', 'Belgien', 'German', '\U0001f1e7\U0001f1ea'),
|
||||
('de-CH', 'Deutsch', 'Schweiz', 'German', '\U0001f1e8\U0001f1ed'),
|
||||
('de-DE', 'Deutsch', 'Deutschland', 'German', '\U0001f1e9\U0001f1ea'),
|
||||
('el', 'Ελληνικά', '', 'Greek', '\U0001f310'),
|
||||
|
||||
Binary file not shown.
@@ -25,13 +25,14 @@
|
||||
# Yahya-Lando <yahya-lando@users.noreply.translate.codeberg.org>, 2025.
|
||||
# curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>, 2025.
|
||||
# return42 <return42@noreply.codeberg.org>, 2025.
|
||||
# DZDevelopers <dzdevelopers@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-03-31 18:08+0000\n"
|
||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2025-04-15 10:37+0000\n"
|
||||
"Last-Translator: DZDevelopers <dzdevelopers@noreply.codeberg.org>\n"
|
||||
"Language-Team: Arabic <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ar/>\n"
|
||||
"Language: ar\n"
|
||||
@@ -535,15 +536,15 @@ msgstr "جودة الملف"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:32
|
||||
msgid "Ahmia blacklist"
|
||||
msgstr ""
|
||||
msgstr "{دالة}"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
msgstr ""
|
||||
msgstr "قم بتصفية نتائج .onion التي تظهر في القائمة السوداء الخاصة بـ Ahmia."
|
||||
|
||||
#: searx/plugins/calculator.py:38
|
||||
msgid "Basic Calculator"
|
||||
msgstr ""
|
||||
msgstr "آلة حاسبة بسيطة"
|
||||
|
||||
#: searx/plugins/calculator.py:39
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
@@ -639,7 +640,7 @@ msgstr ""
|
||||
|
||||
#: searx/plugins/unit_converter.py:49
|
||||
msgid "Unit converter plugin"
|
||||
msgstr ""
|
||||
msgstr "إضافة محول الوحدات"
|
||||
|
||||
#: searx/plugins/unit_converter.py:50
|
||||
msgid "Convert between units"
|
||||
@@ -1190,6 +1191,8 @@ msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
"رابط يحتوي على تفضيلاتك. يمكن استخدام هذا الرابط لاستعادة إعداداتك على جهاز "
|
||||
"مختلف."
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
|
||||
Binary file not shown.
@@ -43,13 +43,14 @@
|
||||
# pxrb <pxrb@users.noreply.translate.codeberg.org>, 2025.
|
||||
# curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>, 2025.
|
||||
# return42 <return42@noreply.codeberg.org>, 2025.
|
||||
# Atul_Eterno <atul_eterno@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-04-08 11:34+0000\n"
|
||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2025-04-24 14:06+0000\n"
|
||||
"Last-Translator: Atul_Eterno <atul_eterno@noreply.codeberg.org>\n"
|
||||
"Language-Team: Spanish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/es/>\n"
|
||||
"Language: es\n"
|
||||
@@ -553,7 +554,7 @@ msgstr "Calidad del archivo"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:32
|
||||
msgid "Ahmia blacklist"
|
||||
msgstr ""
|
||||
msgstr "Lista negra de Ahmia"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
@@ -1210,6 +1211,8 @@ msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
"Una URL conteniendo sus preferencias. Esta URL puede ser usada para "
|
||||
"restaurar sus ajustes en un dispositivo diferente."
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
|
||||
Binary file not shown.
@@ -3,22 +3,23 @@
|
||||
# This file is distributed under the same license as the PROJECT project.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
|
||||
# return42 <return42@users.noreply.translate.codeberg.org>, 2025.
|
||||
# aindriu80 <aindriu80@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-01-21 19:34+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2025-04-14 09:17+0000\n"
|
||||
"Last-Translator: aindriu80 <aindriu80@noreply.codeberg.org>\n"
|
||||
"Language-Team: Irish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ga/>\n"
|
||||
"Language: ga\n"
|
||||
"Language-Team: Irish "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ga/>\n"
|
||||
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 "
|
||||
":(n>6 && n<11) ? 3 : 4;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :("
|
||||
"n>6 && n<11) ? 3 : 4;\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"Generated-By: Babel 2.17.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
@@ -437,11 +438,11 @@ msgstr "Cruthaigh luachanna randamacha éag"
|
||||
#: searx/answerers/statistics.py:36
|
||||
#, python-brace-format
|
||||
msgid "Compute {func} of the arguments"
|
||||
msgstr ""
|
||||
msgstr "Ríomh {func} na n-argóintí"
|
||||
|
||||
#: searx/engines/openstreetmap.py:158
|
||||
msgid "Show route in map .."
|
||||
msgstr ""
|
||||
msgstr "Taispeáin an bealach ar an léarscáil .."
|
||||
|
||||
#: searx/engines/pdbe.py:96
|
||||
#, python-brace-format
|
||||
@@ -514,15 +515,15 @@ msgstr "Cáilíocht comhad"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:32
|
||||
msgid "Ahmia blacklist"
|
||||
msgstr ""
|
||||
msgstr "Liosta dubh Ahmia"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
msgstr ""
|
||||
msgstr "Scag amach torthaí oinniún atá le feiceáil ar liosta dubh Ahmia."
|
||||
|
||||
#: searx/plugins/calculator.py:38
|
||||
msgid "Basic Calculator"
|
||||
msgstr ""
|
||||
msgstr "Áireamhán Bunúsach"
|
||||
|
||||
#: searx/plugins/calculator.py:39
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
@@ -530,7 +531,7 @@ msgstr "Ríomh nathanna matamaiticiúla tríd an mbarra cu"
|
||||
|
||||
#: searx/plugins/hash_plugin.py:34
|
||||
msgid "Hash plugin"
|
||||
msgstr ""
|
||||
msgstr "Breiseán hais"
|
||||
|
||||
#: searx/plugins/hash_plugin.py:35
|
||||
msgid "Converts strings to different hash digests."
|
||||
@@ -571,6 +572,8 @@ msgid ""
|
||||
"Displays your IP if the query is \"ip\" and your user agent if the query "
|
||||
"is \"user-agent\"."
|
||||
msgstr ""
|
||||
"Taispeáin do IP más \"ip\" an cheist agus do ghníomhaire úsáideora más "
|
||||
"\"úsáideoir-gníomhaire\" an cheist."
|
||||
|
||||
#: searx/plugins/self_info.py:52
|
||||
msgid "Your IP is: "
|
||||
@@ -595,15 +598,17 @@ msgstr ""
|
||||
|
||||
#: searx/plugins/tor_check.py:65
|
||||
msgid "Could not download the list of Tor exit-nodes from"
|
||||
msgstr ""
|
||||
msgstr "Níorbh fhéidir liosta na nóid scoir Tor a íoslódáil ó"
|
||||
|
||||
#: searx/plugins/tor_check.py:72
|
||||
msgid "You are using Tor and it looks like you have the external IP address"
|
||||
msgstr ""
|
||||
"Tá tú ag úsáid Tor agus tá an chuma ar an scéal go bhfuil an seoladh IP "
|
||||
"seachtrach agat"
|
||||
|
||||
#: searx/plugins/tor_check.py:76
|
||||
msgid "You are not using Tor and you have the external IP address"
|
||||
msgstr ""
|
||||
msgstr "Níl tú ag úsáid Tor agus tá an seoladh IP seachtrach agat"
|
||||
|
||||
#: searx/plugins/tracker_url_remover.py:37
|
||||
msgid "Tracker URL remover"
|
||||
@@ -615,7 +620,7 @@ msgstr "Bain argóintí rianaithe ón URL ar ais"
|
||||
|
||||
#: searx/plugins/unit_converter.py:49
|
||||
msgid "Unit converter plugin"
|
||||
msgstr ""
|
||||
msgstr "Breiseán tiontaire aonad"
|
||||
|
||||
#: searx/plugins/unit_converter.py:50
|
||||
msgid "Convert between units"
|
||||
@@ -933,7 +938,7 @@ msgstr "Samplaí"
|
||||
|
||||
#: searx/templates/simple/answer/translations.html:21
|
||||
msgid "Definitions"
|
||||
msgstr ""
|
||||
msgstr "Sainmhínithe"
|
||||
|
||||
#: searx/templates/simple/answer/translations.html:30
|
||||
msgid "Synonyms"
|
||||
@@ -1094,7 +1099,7 @@ msgstr "Ceadaigh"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:5
|
||||
msgid "Keywords (first word in query)"
|
||||
msgstr ""
|
||||
msgstr "Eochairfhocail (an chéad fhocal sa cheist)"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:6
|
||||
#: searx/templates/simple/result_templates/packages.html:7
|
||||
@@ -1171,6 +1176,8 @@ msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
"URL ina bhfuil do shainroghanna. Is féidir an URL seo a úsáid chun do "
|
||||
"shocruithe a chur ar ais ar ghléas eile."
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
@@ -1186,7 +1193,7 @@ msgstr "Roghanna hais"
|
||||
|
||||
#: searx/templates/simple/preferences/doi_resolver.html:1
|
||||
msgid "Digital Object Identifier (DOI)"
|
||||
msgstr ""
|
||||
msgstr "Aitheantóir Oibiachta Digiteach (DOI)"
|
||||
|
||||
#: searx/templates/simple/preferences/doi_resolver.html:6
|
||||
msgid "Open Access DOI resolver"
|
||||
@@ -1631,4 +1638,3 @@ msgstr "físeán a cheilt"
|
||||
#~ "shonrú sna roghanna URL a úsáid "
|
||||
#~ "chun roghanna a shioncronú ar fud "
|
||||
#~ "feistí."
|
||||
|
||||
|
||||
Binary file not shown.
@@ -26,20 +26,22 @@
|
||||
# nogb <nogb@users.noreply.translate.codeberg.org>, 2025.
|
||||
# syobon <syobon@users.noreply.translate.codeberg.org>, 2025.
|
||||
# cc5efd7b0 <cc5efd7b0@noreply.codeberg.org>, 2025.
|
||||
# ayame30 <ayame30@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-03-15 14:07+0000\n"
|
||||
"Last-Translator: cc5efd7b0 <cc5efd7b0@noreply.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2025-04-11 15:12+0000\n"
|
||||
"Last-Translator: ayame30 <ayame30@noreply.codeberg.org>\n"
|
||||
"Language-Team: Japanese <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ja/>\n"
|
||||
"Language: ja\n"
|
||||
"Language-Team: Japanese "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ja/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"Generated-By: Babel 2.17.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
@@ -530,15 +532,15 @@ msgstr "ファイル品質"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:32
|
||||
msgid "Ahmia blacklist"
|
||||
msgstr ""
|
||||
msgstr "Ahmiaのブラックリスト"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
msgstr ""
|
||||
msgstr "Ahmiaのブラックリストに表示されるオニオン結果を除外します。"
|
||||
|
||||
#: searx/plugins/calculator.py:38
|
||||
msgid "Basic Calculator"
|
||||
msgstr ""
|
||||
msgstr "基本的な計算機"
|
||||
|
||||
#: searx/plugins/calculator.py:39
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
@@ -624,7 +626,7 @@ msgstr "返された URL からトラッカー引数を消去する"
|
||||
|
||||
#: searx/plugins/unit_converter.py:49
|
||||
msgid "Unit converter plugin"
|
||||
msgstr ""
|
||||
msgstr "単位変換プラグイン"
|
||||
|
||||
#: searx/plugins/unit_converter.py:50
|
||||
msgid "Convert between units"
|
||||
@@ -1170,7 +1172,8 @@ msgstr "このURLで違うブラウザに設定を復活"
|
||||
msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
msgstr "設定内容が保存されたURLです。このURLを使用すると、別のデバイスで設定を復元で"
|
||||
"きます。"
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
@@ -2019,4 +2022,3 @@ msgstr "動画を隠す"
|
||||
#~ "preferences URL can be used to "
|
||||
#~ "sync preferences across devices."
|
||||
#~ msgstr "初期設定URLを使うことで、特別な設定をデバイスをまたいで同期できる。"
|
||||
|
||||
|
||||
Binary file not shown.
@@ -16,20 +16,21 @@
|
||||
# return42 <return42@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-03-27 13:44+0000\n"
|
||||
"PO-Revision-Date: 2025-04-20 12:41+0000\n"
|
||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
||||
"Language-Team: Lithuanian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/lt/>\n"
|
||||
"Language: lt\n"
|
||||
"Language-Team: Lithuanian "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/lt/>\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100"
|
||||
" < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < "
|
||||
"11) ? 1 : n % 1 != 0 ? 2: 3);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < "
|
||||
"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 :"
|
||||
" n % 1 != 0 ? 2: 3);\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"Generated-By: Babel 2.17.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
@@ -525,15 +526,15 @@ msgstr "Failo kokybė"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:32
|
||||
msgid "Ahmia blacklist"
|
||||
msgstr ""
|
||||
msgstr "Ahmia juodasis sąrašas"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
msgstr ""
|
||||
msgstr "Išfiltruoti onion rezultatus esančius Ahmia juodajame sąraše."
|
||||
|
||||
#: searx/plugins/calculator.py:38
|
||||
msgid "Basic Calculator"
|
||||
msgstr ""
|
||||
msgstr "Bazinis skaičiuotuvas"
|
||||
|
||||
#: searx/plugins/calculator.py:39
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
@@ -582,6 +583,8 @@ msgid ""
|
||||
"Displays your IP if the query is \"ip\" and your user agent if the query "
|
||||
"is \"user-agent\"."
|
||||
msgstr ""
|
||||
"Rodo tavo IP jei užklausa yra „ip“ ir tavo naudotojo agentą jei užklausa yra "
|
||||
"„user-agent“."
|
||||
|
||||
#: searx/plugins/self_info.py:52
|
||||
msgid "Your IP is: "
|
||||
@@ -589,7 +592,7 @@ msgstr "Jūsų IP adresas: "
|
||||
|
||||
#: searx/plugins/self_info.py:55
|
||||
msgid "Your user-agent is: "
|
||||
msgstr ""
|
||||
msgstr "Tavo naudotojo agentas (user-agent) yra: "
|
||||
|
||||
#: searx/plugins/tor_check.py:42
|
||||
msgid "Tor check plugin"
|
||||
@@ -606,15 +609,15 @@ msgstr ""
|
||||
|
||||
#: searx/plugins/tor_check.py:65
|
||||
msgid "Could not download the list of Tor exit-nodes from"
|
||||
msgstr ""
|
||||
msgstr "Nepavyko atsisiųsti Tor išėjimo mazgų iš"
|
||||
|
||||
#: searx/plugins/tor_check.py:72
|
||||
msgid "You are using Tor and it looks like you have the external IP address"
|
||||
msgstr ""
|
||||
msgstr "Jūs naudojate Tor ir atrodo, kad turite išorinį IP adresą"
|
||||
|
||||
#: searx/plugins/tor_check.py:76
|
||||
msgid "You are not using Tor and you have the external IP address"
|
||||
msgstr ""
|
||||
msgstr "Jūs nenaudojate Tor, tačiau atrodo, kad turite išorinį IP adresą"
|
||||
|
||||
#: searx/plugins/tracker_url_remover.py:37
|
||||
msgid "Tracker URL remover"
|
||||
@@ -626,11 +629,11 @@ msgstr "Šalinti seklių argumentus iš grąžinamų URL"
|
||||
|
||||
#: searx/plugins/unit_converter.py:49
|
||||
msgid "Unit converter plugin"
|
||||
msgstr ""
|
||||
msgstr "Matavimo vienetų konvertavimo papildinys"
|
||||
|
||||
#: searx/plugins/unit_converter.py:50
|
||||
msgid "Convert between units"
|
||||
msgstr ""
|
||||
msgstr "Konvertuoti tarp matavimo vienetų"
|
||||
|
||||
#: searx/templates/simple/404.html:4
|
||||
msgid "Page not found"
|
||||
@@ -942,7 +945,7 @@ msgstr "Pavyzdžiai"
|
||||
|
||||
#: searx/templates/simple/answer/translations.html:21
|
||||
msgid "Definitions"
|
||||
msgstr ""
|
||||
msgstr "Apibrėžimai"
|
||||
|
||||
#: searx/templates/simple/answer/translations.html:30
|
||||
msgid "Synonyms"
|
||||
@@ -966,7 +969,7 @@ msgstr "Pranešimai iš paieškos sistemų"
|
||||
|
||||
#: searx/templates/simple/elements/engines_msg.html:7
|
||||
msgid "seconds"
|
||||
msgstr ""
|
||||
msgstr "sekundės"
|
||||
|
||||
#: searx/templates/simple/elements/search_url.html:3
|
||||
msgid "Search URL"
|
||||
@@ -1084,11 +1087,11 @@ msgstr "Pakeiskite nuostatose naudojamą paieškos variklį:"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:22
|
||||
msgid "Switch to another instance:"
|
||||
msgstr ""
|
||||
msgstr "Pakeisti instanciją:"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:24
|
||||
msgid "Search for another query or select another category."
|
||||
msgstr ""
|
||||
msgstr "Ieškoti kitos užklausos arba pasirinkti kitą kategoriją."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:25
|
||||
msgid "Go back to the previous page using the previous page button."
|
||||
@@ -1101,7 +1104,7 @@ msgstr "Leisti"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:5
|
||||
msgid "Keywords (first word in query)"
|
||||
msgstr ""
|
||||
msgstr "Raktažodžiai (pirmasis užklausos žodis)"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:6
|
||||
#: searx/templates/simple/result_templates/packages.html:7
|
||||
@@ -1178,6 +1181,8 @@ msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
"URL adresas su jūsų nustatymais. Šis URL adresas gali būti panaudotas "
|
||||
"atstatyti jūsų nustatymus kitame įrenginyje."
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
@@ -1193,7 +1198,7 @@ msgstr ""
|
||||
|
||||
#: searx/templates/simple/preferences/doi_resolver.html:1
|
||||
msgid "Digital Object Identifier (DOI)"
|
||||
msgstr ""
|
||||
msgstr "Skaitmeninis objekto identifikatorius (DOI)"
|
||||
|
||||
#: searx/templates/simple/preferences/doi_resolver.html:6
|
||||
msgid "Open Access DOI resolver"
|
||||
@@ -2058,4 +2063,3 @@ msgstr "slėpti vaizdo įrašą"
|
||||
#~ "Nurodant tinkintus nustatymus nuostatų URL,"
|
||||
#~ " jūs galite susinchronizuoti nuostatas tarp"
|
||||
#~ " prietaisų."
|
||||
|
||||
|
||||
Binary file not shown.
@@ -14,21 +14,23 @@
|
||||
# Vision <vision@users.noreply.translate.codeberg.org>, 2025.
|
||||
# curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>, 2025.
|
||||
# return42 <return42@noreply.codeberg.org>, 2025.
|
||||
# whytf <whytf@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-03-27 13:44+0000\n"
|
||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2025-04-23 19:16+0000\n"
|
||||
"Last-Translator: whytf <whytf@noreply.codeberg.org>\n"
|
||||
"Language-Team: Slovak <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/sk/>\n"
|
||||
"Language: sk\n"
|
||||
"Language-Team: Slovak "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/sk/>\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 "
|
||||
"&& n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n "
|
||||
">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"Generated-By: Babel 2.17.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
@@ -433,12 +435,12 @@ msgstr "Pozastavené"
|
||||
#: searx/webutils.py:314
|
||||
#, python-brace-format
|
||||
msgid "{minutes} minute(s) ago"
|
||||
msgstr "pred {minutes} min."
|
||||
msgstr "pred {minutes} minútami"
|
||||
|
||||
#: searx/webutils.py:315
|
||||
#, python-brace-format
|
||||
msgid "{hours} hour(s), {minutes} minute(s) ago"
|
||||
msgstr "pred {hours} hod., {minutes} min."
|
||||
msgstr "pred {hours} hodinami, {minutes} minútami"
|
||||
|
||||
#: searx/answerers/random.py:69
|
||||
msgid "Generate different random values"
|
||||
@@ -524,15 +526,15 @@ msgstr "Kvalita súboru"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:32
|
||||
msgid "Ahmia blacklist"
|
||||
msgstr ""
|
||||
msgstr "Čierna listina Ahmia"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
msgstr ""
|
||||
msgstr "Odfiltruj výsledky onion, ktoré sa zobrazujú na čiernej listine Ahmia."
|
||||
|
||||
#: searx/plugins/calculator.py:38
|
||||
msgid "Basic Calculator"
|
||||
msgstr ""
|
||||
msgstr "Základná Kalkulačka"
|
||||
|
||||
#: searx/plugins/calculator.py:39
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
@@ -626,7 +628,7 @@ msgstr "Odstrániť sledovacie argumenty z vrátenej URL"
|
||||
|
||||
#: searx/plugins/unit_converter.py:49
|
||||
msgid "Unit converter plugin"
|
||||
msgstr ""
|
||||
msgstr "Modul konvertora jednotiek"
|
||||
|
||||
#: searx/plugins/unit_converter.py:50
|
||||
msgid "Convert between units"
|
||||
@@ -1182,6 +1184,8 @@ msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
"Adresa URL obsahujúca vaše preferencie. Túto adresu URL môžete použiť na "
|
||||
"obnovenie nastavení v inom zariadení."
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
@@ -2079,4 +2083,3 @@ msgstr "skryť video"
|
||||
#~ "Zadaním osobitých nastavení v adrese "
|
||||
#~ "(URL) nastavení je možné synchronizovať "
|
||||
#~ "nastavenia do iných zariadení."
|
||||
|
||||
|
||||
Binary file not shown.
@@ -24,21 +24,22 @@
|
||||
# return42 <return42@users.noreply.translate.codeberg.org>, 2025.
|
||||
# Eshan-K-I <eshan-k-i@users.noreply.translate.codeberg.org>, 2025.
|
||||
# rajeeban <rajeeban@users.noreply.translate.codeberg.org>, 2025.
|
||||
# prashere <prashere@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-01-20 03:36+0000\n"
|
||||
"Last-Translator: rajeeban <rajeeban@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2025-04-22 10:45+0000\n"
|
||||
"Last-Translator: prashere <prashere@noreply.codeberg.org>\n"
|
||||
"Language-Team: Tamil <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ta/>\n"
|
||||
"Language: ta\n"
|
||||
"Language-Team: Tamil "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ta/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"Generated-By: Babel 2.17.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
@@ -149,7 +150,7 @@ msgstr "கிடங்கு"
|
||||
#. CATEGORY_GROUPS['SOFTWARE_WIKIS']
|
||||
#: searx/searxng.msg
|
||||
msgid "software wikis"
|
||||
msgstr "மென்பொருள் விகி"
|
||||
msgstr "மென்பொருள் விக்கி"
|
||||
|
||||
#. CATEGORY_GROUPS['WEB']
|
||||
#: searx/searxng.msg
|
||||
@@ -2064,4 +2065,3 @@ msgstr "காணொளிகளை மறை"
|
||||
#~ "preferences URL can be used to "
|
||||
#~ "sync preferences across devices."
|
||||
#~ msgstr ""
|
||||
|
||||
|
||||
Binary file not shown.
@@ -12,21 +12,22 @@
|
||||
# saledai <saledai@users.noreply.translate.codeberg.org>, 2024, 2025.
|
||||
# Anonymous <anonymous@users.noreply.translate.codeberg.org>, 2025.
|
||||
# yuttct <yuttct@users.noreply.translate.codeberg.org>, 2025.
|
||||
# return42 <return42@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-01-06 15:53+0000\n"
|
||||
"Last-Translator: sahussawud "
|
||||
"<sahussawud@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2025-04-15 10:37+0000\n"
|
||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
||||
"Language-Team: Thai <https://translate.codeberg.org/projects/searxng/searxng/"
|
||||
"th/>\n"
|
||||
"Language: th\n"
|
||||
"Language-Team: Thai "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/th/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
"Generated-By: Babel 2.17.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
@@ -382,7 +383,7 @@ msgstr "ข้อผิดพลาดระหว่างแจงโครง
|
||||
|
||||
#: searx/webutils.py:38
|
||||
msgid "HTTP protocol error"
|
||||
msgstr "โปรโตคอล HTTP เกิดข้อผิดพลาดของ"
|
||||
msgstr "เกิดข้อผิดพลาดของโปรโตคอล HTTP"
|
||||
|
||||
#: searx/webutils.py:39
|
||||
msgid "network error"
|
||||
@@ -1788,4 +1789,3 @@ msgstr "ซ่อนวิดีโอ"
|
||||
#~ msgstr ""
|
||||
#~ "การระบุการตั้งค่าแบบกำหนดเองใน URL "
|
||||
#~ "ค่ากำหนดสามารถใช้เพื่อซิงค์กับค่ากำหนดในอุปกรณ์ต่างๆได้"
|
||||
|
||||
|
||||
Binary file not shown.
@@ -36,13 +36,14 @@
|
||||
# nonepork <nonepork@users.noreply.translate.codeberg.org>, 2025.
|
||||
# Shihfu Juan <xlion@xlion.tw>, 2025.
|
||||
# return42 <return42@noreply.codeberg.org>, 2025.
|
||||
# ayame30 <ayame30@noreply.codeberg.org>, 2025.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-03-29 09:21+0000\n"
|
||||
"PO-Revision-Date: 2025-04-08 11:34+0000\n"
|
||||
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2025-04-11 15:12+0000\n"
|
||||
"Last-Translator: ayame30 <ayame30@noreply.codeberg.org>\n"
|
||||
"Language-Team: Chinese (Traditional Han script) <https://"
|
||||
"translate.codeberg.org/projects/searxng/searxng/zh_Hant/>\n"
|
||||
"Language: zh_Hant_TW\n"
|
||||
@@ -545,11 +546,11 @@ msgstr "Ahmia 黑名單"
|
||||
|
||||
#: searx/plugins/ahmia_filter.py:33
|
||||
msgid "Filter out onion results that appear in Ahmia's blacklist."
|
||||
msgstr ""
|
||||
msgstr "過濾掉 Ahmia 黑名單中出現的洋蔥結果。"
|
||||
|
||||
#: searx/plugins/calculator.py:38
|
||||
msgid "Basic Calculator"
|
||||
msgstr ""
|
||||
msgstr "基本計算機"
|
||||
|
||||
#: searx/plugins/calculator.py:39
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
@@ -635,7 +636,7 @@ msgstr "從傳回的 URL 中移除追蹤器參數"
|
||||
|
||||
#: searx/plugins/unit_converter.py:49
|
||||
msgid "Unit converter plugin"
|
||||
msgstr ""
|
||||
msgstr "單位轉換外掛"
|
||||
|
||||
#: searx/plugins/unit_converter.py:50
|
||||
msgid "Convert between units"
|
||||
@@ -1181,7 +1182,7 @@ msgstr "用於在其他瀏覽器上還原您的偏好設定的網址"
|
||||
msgid ""
|
||||
"A URL containing your preferences. This URL can be used to restore your "
|
||||
"settings on a different device."
|
||||
msgstr ""
|
||||
msgstr "包含您的偏好設定的 URL。此 URL 可用於在其他裝置上恢復您的設定。"
|
||||
|
||||
#: searx/templates/simple/preferences/cookies.html:46
|
||||
msgid "Copy preferences hash"
|
||||
|
||||
134
searx/webapp.py
134
searx/webapp.py
@@ -6,6 +6,7 @@
|
||||
# pylint: disable=use-dict-literal
|
||||
from __future__ import annotations
|
||||
|
||||
import inspect
|
||||
import hashlib
|
||||
import hmac
|
||||
import json
|
||||
@@ -29,6 +30,8 @@ from pygments import highlight
|
||||
from pygments.lexers import get_lexer_by_name
|
||||
from pygments.formatters import HtmlFormatter # pylint: disable=no-name-in-module
|
||||
|
||||
from werkzeug.serving import is_running_from_reloader
|
||||
|
||||
import flask
|
||||
|
||||
from flask import (
|
||||
@@ -48,12 +51,12 @@ from flask_babel import (
|
||||
format_decimal,
|
||||
)
|
||||
|
||||
import searx
|
||||
from searx.extended_types import sxng_request
|
||||
from searx import (
|
||||
logger,
|
||||
get_setting,
|
||||
settings,
|
||||
searx_debug,
|
||||
)
|
||||
|
||||
from searx import infopage
|
||||
@@ -81,7 +84,6 @@ from searx.webutils import (
|
||||
exception_classname_to_text,
|
||||
new_hmac,
|
||||
is_hmac_of,
|
||||
is_flask_run_cmdline,
|
||||
group_engines_in_tab,
|
||||
)
|
||||
from searx.webadapter import (
|
||||
@@ -128,11 +130,6 @@ logger = logger.getChild('webapp')
|
||||
|
||||
warnings.simplefilter("always")
|
||||
|
||||
# check secret_key
|
||||
if not searx_debug and settings['server']['secret_key'] == 'ultrasecretkey':
|
||||
logger.error('server.secret_key is not changed. Please use something else instead of ultrasecretkey.')
|
||||
sys.exit(1)
|
||||
|
||||
# about static
|
||||
logger.debug('static directory is %s', settings['ui']['static_path'])
|
||||
static_files = get_static_files(settings['ui']['static_path'])
|
||||
@@ -1329,45 +1326,112 @@ def page_not_found(_e):
|
||||
return render('404.html'), 404
|
||||
|
||||
|
||||
# see https://flask.palletsprojects.com/en/1.1.x/cli/
|
||||
# True if "FLASK_APP=searx/webapp.py FLASK_ENV=development flask run"
|
||||
flask_run_development = (
|
||||
os.environ.get("FLASK_APP") is not None and os.environ.get("FLASK_ENV") == 'development' and is_flask_run_cmdline()
|
||||
)
|
||||
def run():
|
||||
"""Runs the application on a local development server.
|
||||
|
||||
# True if reload feature is activated of werkzeug, False otherwise (including uwsgi, etc..)
|
||||
# __name__ != "__main__" if searx.webapp is imported (make test, make docs, uwsgi...)
|
||||
# see run() at the end of this file : searx_debug activates the reload feature.
|
||||
werkzeug_reloader = flask_run_development or (searx_debug and __name__ == "__main__")
|
||||
This run method is only called when SearXNG is started via ``__main__``::
|
||||
|
||||
python -m searx.webapp
|
||||
|
||||
Do not use :ref:`run() <flask.Flask.run>` in a production setting. It is
|
||||
not intended to meet security and performance requirements for a production
|
||||
server.
|
||||
|
||||
It is not recommended to use this function for development with automatic
|
||||
reloading as this is badly supported. Instead you should be using the flask
|
||||
command line script’s run support::
|
||||
|
||||
flask --app searx.webapp run --debug --reload --host 127.0.0.1 --port 8888
|
||||
|
||||
.. _Flask.run: https://flask.palletsprojects.com/en/stable/api/#flask.Flask.run
|
||||
"""
|
||||
|
||||
host: str = get_setting("server.bind_address") # type: ignore
|
||||
port: int = get_setting("server.port") # type: ignore
|
||||
|
||||
if searx.sxng_debug:
|
||||
logger.debug("run local development server (DEBUG) on %s:%s", host, port)
|
||||
app.run(
|
||||
debug=True,
|
||||
port=port,
|
||||
host=host,
|
||||
threaded=True,
|
||||
extra_files=[DEFAULT_SETTINGS_FILE],
|
||||
)
|
||||
else:
|
||||
logger.debug("run local development server on %s:%s", host, port)
|
||||
app.run(port=port, host=host, threaded=True)
|
||||
|
||||
|
||||
def is_werkzeug_reload_active() -> bool:
|
||||
"""Returns ``True`` if server is is launched by :ref:`werkzeug.serving` and
|
||||
the ``use_reload`` argument was set to ``True``. If this is the case, it
|
||||
should be avoided that the server is initialized twice (:py:obj:`init`,
|
||||
:py:obj:`run`).
|
||||
|
||||
.. _werkzeug.serving:
|
||||
https://werkzeug.palletsprojects.com/en/stable/serving/#werkzeug.serving.run_simple
|
||||
"""
|
||||
|
||||
if "uwsgi" in sys.argv:
|
||||
# server was launched by uWSGI
|
||||
return False
|
||||
|
||||
# https://github.com/searxng/searxng/pull/1656#issuecomment-1214198941
|
||||
# https://github.com/searxng/searxng/pull/1616#issuecomment-1206137468
|
||||
|
||||
frames = inspect.stack()
|
||||
|
||||
if len(frames) > 1 and frames[-2].filename.endswith('flask/cli.py'):
|
||||
# server was launched by "flask run", is argument "--reload" set?
|
||||
if "--reload" in sys.argv or "--debug" in sys.argv:
|
||||
return True
|
||||
|
||||
elif frames[0].filename.endswith('searx/webapp.py'):
|
||||
# server was launched by "python -m searx.webapp" / see run()
|
||||
if searx.sxng_debug:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def init():
|
||||
|
||||
if searx.sxng_debug or app.debug:
|
||||
app.debug = True
|
||||
searx.sxng_debug = True
|
||||
|
||||
# check secret_key in production
|
||||
|
||||
if not app.debug and get_setting("server.secret_key") == 'ultrasecretkey':
|
||||
logger.error("server.secret_key is not changed. Please use something else instead of ultrasecretkey.")
|
||||
sys.exit(1)
|
||||
|
||||
# When automatic reloading is activated stop Flask from initialising twice.
|
||||
# - https://github.com/pallets/flask/issues/5307#issuecomment-1774646119
|
||||
# - https://stackoverflow.com/a/25504196
|
||||
|
||||
reloader_active = is_werkzeug_reload_active()
|
||||
werkzeug_run_main = is_running_from_reloader()
|
||||
|
||||
if reloader_active and not werkzeug_run_main:
|
||||
logger.info("in reloading mode and not in main loop, cancel the initialization")
|
||||
return
|
||||
|
||||
# initialize the engines except on the first run of the werkzeug server.
|
||||
if not werkzeug_reloader or (werkzeug_reloader and os.environ.get("WERKZEUG_RUN_MAIN") == "true"):
|
||||
locales_initialize()
|
||||
redis_initialize()
|
||||
searx.plugins.initialize(app)
|
||||
searx.search.initialize(
|
||||
enable_checker=True,
|
||||
check_network=True,
|
||||
enable_metrics=get_setting("general.enable_metrics"),
|
||||
)
|
||||
|
||||
metrics: bool = get_setting("general.enable_metrics") # type: ignore
|
||||
searx.search.initialize(enable_checker=True, check_network=True, enable_metrics=metrics)
|
||||
|
||||
limiter.initialize(app, settings)
|
||||
favicons.init()
|
||||
|
||||
|
||||
def run():
|
||||
logger.debug('starting webserver on %s:%s', settings['server']['bind_address'], settings['server']['port'])
|
||||
app.run(
|
||||
debug=searx_debug,
|
||||
use_debugger=searx_debug,
|
||||
port=settings['server']['port'],
|
||||
host=settings['server']['bind_address'],
|
||||
threaded=True,
|
||||
extra_files=[DEFAULT_SETTINGS_FILE],
|
||||
)
|
||||
|
||||
|
||||
application = app
|
||||
patch_application(app)
|
||||
init()
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
|
||||
@@ -9,7 +9,6 @@ import csv
|
||||
import hashlib
|
||||
import hmac
|
||||
import re
|
||||
import inspect
|
||||
import itertools
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
@@ -316,21 +315,6 @@ def searxng_l10n_timespan(dt: datetime) -> str: # pylint: disable=invalid-name
|
||||
return format_date(dt)
|
||||
|
||||
|
||||
def is_flask_run_cmdline():
|
||||
"""Check if the application was started using "flask run" command line
|
||||
|
||||
Inspect the callstack.
|
||||
See https://github.com/pallets/flask/blob/master/src/flask/__main__.py
|
||||
|
||||
Returns:
|
||||
bool: True if the application was started using "flask run".
|
||||
"""
|
||||
frames = inspect.stack()
|
||||
if len(frames) < 2:
|
||||
return False
|
||||
return frames[-2].filename.endswith('flask/cli.py')
|
||||
|
||||
|
||||
NO_SUBGROUPING = 'without further subgrouping'
|
||||
|
||||
|
||||
|
||||
@@ -5,13 +5,8 @@ import pathlib
|
||||
import os
|
||||
import aiounittest
|
||||
|
||||
# Before import from the searx package, we need to set up the (debug)
|
||||
# environment. The import of the searx package initialize the searx.settings
|
||||
# and this in turn takes the defaults from the environment!
|
||||
|
||||
os.environ.pop('SEARXNG_SETTINGS_PATH', None)
|
||||
os.environ['SEARXNG_DEBUG'] = '1'
|
||||
os.environ['SEARXNG_DEBUG_LOG_LEVEL'] = 'WARNING'
|
||||
os.environ['SEARXNG_DISABLE_ETC_SETTINGS'] = '1'
|
||||
|
||||
|
||||
|
||||
@@ -27,15 +27,6 @@ class SearxRobotLayer:
|
||||
webapp = str(tests_path.parent / 'searx' / 'webapp.py')
|
||||
exe = 'python'
|
||||
|
||||
# The Flask app is started by Flask.run(...), don't enable Flask's debug
|
||||
# mode, the debugger from Flask will cause wired process model, where
|
||||
# the server never dies. Further read:
|
||||
#
|
||||
# - debug mode: https://flask.palletsprojects.com/quickstart/#debug-mode
|
||||
# - Flask.run(..): https://flask.palletsprojects.com/api/#flask.Flask.run
|
||||
|
||||
os.environ['SEARXNG_DEBUG'] = '0'
|
||||
|
||||
# set robot settings path
|
||||
os.environ['SEARXNG_SETTINGS_PATH'] = str(tests_path / 'robot' / 'settings_robot.yml')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user