The arm/v7 builds have caused lots of problems due to the lack of
support from the cryptography library, and now issues related to
installing the latest version of cffi. As a result, this build variant
has been removed for now. It may or may not come back later, since the
amount of work just to figure out which library is broken and how to fix
it doesn't feel worth it anymore.
The redirects portion of the error page is only needed in scenarios
where the instance is rate limited, in which case the user's query is
provided to the error template. If this isn't provided, it should just
display the error and allow the user to redirect to the home page.
Fixes#1122
* Bump cryptography to 42.0.4
* Bump pyopenssl to 24.0.0
* Squashed commit of the following:
commit 2395bb7a6a
Author: Ben Busby <contact@benbusby.com>
Date: Wed Mar 6 09:35:48 2024 -0700
Remove version from DDG bangs url
Including the version portion of the URL now redirects to search results
for the name of the bang file, rather than returning the bang file
itself. Removing the version from the URL returns the correct bang file.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Busby <contact@benbusby.com>
Including the version portion of the URL now redirects to search results
for the name of the bang file, rather than returning the bang file
itself. Removing the version from the URL returns the correct bang file.
The error template previously only included the option to continue a
user's search via Farside (whoogle or searxng), and would only appear
when an instance was ratelimited. This has been updated to display
anytime an exception has occurred, and now includes other options for
continuing a search, such as Kagi, DDG, Brave, Ecosia, etc.
Closes#1099
- WHOOGLE_SHOW_FAVICONS: Default on, can be set to 0 to hide favicons
and skip the request for fetching them
- WHOOGLE_UPDATE_CHECK: Default on, can be set to 0 to disable the
daily check for new versions released on github
Closes#1098Closes#1059
The default unix socket permissions of 600 is too restrictive for many use
cases.
Added a new argument --unix-socket-perms which is passed to waitress to allow
for user configurable socket permissions
There are certain links (such as the age verification link mentioned in
issue #1083) that should trigger removal of the entire container div on
the results page, rather than just hiding the link itself.
This introduces a new `unsupported_g_divs` list that holds links that
will trigger a removal of the result div on the result page.
Fixes#1083
Since POST requests are now redirected to GET requests (with an
encrypted query string), POST searches are no longer the correct
approach to use for testing purposes.
This should fix the annoyance with browsers like Firefox not caching
POST request responses. By redirecting a POST search to be a GET request
instead (with an encrypted query string), the page can be cached and
successfully navigated back to after visiting a result.
DDG provides favicons using the url format
icons.duckduckgo.com/ip2/{site}.ico
This can be used to fetch favicons in the event that the default
"/favicon.ico" path does not work.
Scroller results (like the "latest from ___" or "top stories" results)
shouldn't have a site icon associated with them. This extracts the class
that those types of results have and skips over the process of inserting
an icon.
Audio controls are now always shown by default (mostly found in searches
that contain word pronunciation guides).
Site icons were moved to the left side of the results.
This improves the search result icon feature by "hiding" the site's icon
if one was not found. This happens in scenarios where a site doesn't
have a /favicon.ico due to having a unique path or using javascript to
load the icon.
This appends an icon element to each search result, using the result
domain's "/favicon.ico" path.
Note that some sites do not have a standard /favicon.ico, but have a
unique path to a specifically sized favicon instead. Worse still, some
sites use javascript to load their favicon, which would make it even
more difficult for Whoogle to figure out.
For now this approach is fine, but can be expanded upon in the future
if desired.
Domains were previously not validated before being handled, leading to a
potential scenario where someone could pass something like
"element_url=127.0.0.1:<port>/<resource>" to access other resources on a
machine running Whoogle. This change ensures that the resource used in
both endpoints is a valid domain.
This also includes validation of config names to prevent names from
including path values such as "../../(etc)".
When starting whoogle from another directory, the path to the calculator
widget was previously invalid. It now specifies the path relative to the widget
loader file.
The calculator was previously triggered for partial matches with words
like "calc", which meant searches containing the word "calcium" would
cause the calculator widget to appear.
Redirects to alternative frontends can now be defined using the
WHOOGLE_REDIRECTS environment variable. Usage is documented in the
readme, but is basically defined as <parent>:<new>.
Closes#988
This relates to an issue with an unknown cause (unable to reproduce on
my end) where the preferences string does not contain the correct amount
of padding on a base64 encoded value. This is mediated by appending
padding to the end of the encoded value, since any extra padding is
removed anyways.
Fixes#987
Defines separate environment variables for setting mobile vs desktop user
agents
Defines an environment variable for using the client's User-Agent
Co-authored-by: Ben Busby <contact@benbusby.com>
The .replit file gets autofilled with a ton of garbage when Whoogle is
imported, including a required "entrypoint" field that defaults to
"main.py" (even though the run and onBoot fields were already included
and should negate the need to specify an entrypoint, but whatever).
I'm not going to restructure Whoogle to fit what Replit wants, so I've
moved the startup commands to their own script (misc/replit.py) and
updated the "entrypoint" field in .replit.
More MarkupResemblesLocatorWarning warnings have been appearing. This
seems to be caused by parsing HTML content that contains a URL.
This new change suppresses the warning at the root level of the app
before any content has been parsed, so this error shouldn't appear
again.
Fixes#968
* Add translation for new strings from 7041b43db9
Use same terms as Google's zh-tw interface.
* Fix missing period
* Sync string order with en (easier for future updates)
Fix the exception `AttributeError: 'Filter' object has no attribute 'block_url'`
introduced in this commit [1].
`self.block_title` and `self.block_url` were members of the Filter
object[2], but not anymore after commit [1].
This bug can be reproduced with setting WHOOGLE_CONFIG_BLOCK_URL to a
non-empty string.
[1] 10a15e06e1
[2] 284a8102c8
An invalid parsing warning was being thrown by the latest version of the
bs4 library. This suppresses that warning from being shown in the
console.
A 404 handler was added to move logging from the console to the error
template, since a lot of users assumed that 404 errors from the result
page were problems with Whoogle itself.
Fixes#967
When a browser adds a search engine using the opensearch template, it
does not have the correct context necessary to autofill the
`preferences` arg with the user's session prefs. As a result, queries
made using the browser bar will have the instance's default preferences
filled into the template.
Removing this shouldn't have any side effects, since queries made on the
same machine will have the correct session associated with the user.
Fixes#929
Some distributions require manually installing Python 3.10, which makes
it less convenient than just using whatever version of Python3.X the
package manager supports. Since the only 3.10 feature being used was
"match", and it was a very small change, it's been replaced with an
if/else statement to ensure compatibility with older versions of Python
3.
Since including rust in the builder stage of the image didn't address
the issues with building the cryptography library on armv7, that
architecture will just use the last supported version of the affected
libraries. May want to revisit this later.
The python cryptography library isn't able to be built without the rust
compiler for some stages the cross-platform buildx workflow. This hasn't
been the case in the past, but for some reason since upgrading to the
latest cryptography version there are now errors with installing that
package. Since dependencies in the builder stage are not included in the
final build, we can safely include rust as a fallback to ensure this
doesn't happen without bloating the size of the final build.
Navigating between pages of results now includes the user's preferences
string, which allows them to retain their config for a particular
instance between result pages.
Fixes#960
This adds a simple calculator widget, somewhat similar to the one presented
when searching calculator on Google.
Also, it adds somewhat of a template for making the addition of new widgets
easier via the app/utils/widgets.py file. My eventual plan is to use this to
create more widgets that appear in Google, such as a color picker, timer, etc.
---------
Co-authored-by: Ben Busby <contact@benbusby.com>
Medium redirects needed further cleanup to account for instances where a
link contains a subdomain that would not make sense in a Farside
redirect link.
Fixes#947
The url prefix was not included when reconstructing the root url using
X-Forwarded-* headers, causing some elements to fail to load properly.
Fixes#937
Add a function to check if target_word contains CJK characters
If a search term contains Chinese, Japanese, or Korean characters,
the term is bolded in search results regardless of whitespace.
CJK characters: Chinese, Japanese (hiragana, katakana, kanji),
and Korean (hangul syllables, hangul jamo)
Co-authored-by: Ben Busby <contact@benbusby.com>
The whoogle.env file previously needed to be created and enabled using
the WHOOGLE_DOTENV var. This removes the second step and loads the env
file if it's found during app init.
The Dockerfile has also been updated to copy in whoogle.env if it
exists.
Fixes#909
Setting `WHOOGLE_TOR_FF` will attempt to modify the existing torrc file
with the "FascistFirewall 1" config, which restricts outbound ports to
reachable values.
Fixes#907
Moved the cleaner functions to app/utils/escaper.py
Removed unused import 're'
Moved the cleaner functionalities to the "search.py" and "routes.py"
Making sure escaped chars stay escaped during process
Replaced "<" and ">" with "andlt;" and "andgt;", respectively. This way,
when the 'response' object get loaded to bsoup (which happens several times
throughout the process between search.py and routes.py), bsoup will not
unescape them.
Introduces the ability to refine searches by time period:
- Past hour
- Past 24 hours
- Past week
- Past month
- Past year
Co-authored-by: Ben Busby <contact@benbusby.com>
Still a manual process, but better than updating the json line by line.
I'm undecided on automating this anytime the translation json gets
updated, since it could possibly ratelimit lingva instances.
Proxies that only support HTTP were causing request timeouts due to an
invalid upgrade to HTTPS when creating the request. This update restores
the ability to have an HTTP-only proxy for all requests.
Fixes#906
Parent sites using a 'www' subdomain or something similar were not
redirecting properly. This updates the hostname check to only validate
against the primary domain, except for Wikipedia since the subdomain is
used for interface translation in that case.
Fixes#901
Replacing result links and text when site alts are enabled is now part
of its own function, and handles replacement of link location and link
description separately.
Fixes#880
This can be updated later to allow users with cookies enabled to use a
key that is unique to their session (if they want, not mandatory), but
for now it makes more sense to just use a single key for all queries
from all users. This should eliminate a lot of issues that users have
reported where they are unable to decrypt queries or page elements due
to an expired/renewed session key.
The change made to whoogle-contrast-text in #873 wasn't the right
decision, since whoogle-contrast-text is meant to contrast with darker
UI elements. whoogle-text already contrasts with the default white
background.
* Sync setup.cfg with requirements.txt
* Include tests in PyPI tarballs
And exclude them from setuptools
* Set version number only once
Switch to PEP517 standard (pyproject.toml) for builds
New changes to google search now include ads prefixed with the keyword
"sponsored". This update should remove these from appearing in search
results.
Fixes#871
Heroku is no longer free, readme updated to reflect this change.
Removed whoogle.lunar.icu instance.
Co-authored-by: files18 <107342491+files18@users.noreply.github.com>
Changed the implementation to work if the bang is at anyplace in the query.
Added a check to not spend time looking for an operator if a "!" is not present
in the query.
No longer allowed to have the bang at the "!" char at the end, since this may
cause some conflicts like the issue cited before, where the ! is after a word
in the query, which is natural in most languages.
Adds support for encoding (and optionally encrypting) user config values as
a single string that can be passed to any endpoint with the "preferences" url
param.
Co-authored-by: Ben Busby <contact@benbusby.com>
Sessions are no longer validated using the "/session/..." route. This
created a lot of problems due to buggy/unexpected behavior coming from
the Flask-Session dependency, which is (more or less) no longer
maintained.
Sessions are also no longer strictly server-side-only. The majority of
information that was being stored in user sessions was aesthetic only,
aside from the session specific key used to encrypt URLs. This key is
still unique per user, but is not (or shouldn't be) in anyone's threat
model to keep absolutely 100% private from everyone. Especially paranoid
users of Whoogle can easily modify the code to use a randomly generated
encryption key that is reset on session invalidation (and set
invalidation time to a short enough period for their liking).
Ultimately, this should result in much more stable sessions per client.
There shouldn't be decryption issues with element URLs or queries
during result page navigation.
The Tor service logs often confuse Whoogle users, since they're a lot
more verbose than anything Whoogle ever reports. The bulk of these logs
use "notice" level logging and are not helpful for the average user, so
everything between debug and notice is now directed to /dev/null.
Fixes#825
Adds a new advanced search icon alongside the result tabs for switching
to a different country from the result page.
This will obviously get populated with other methods of filtering
results, but for now it's just the country selector.
Session validation includes a method for determining the proxy host url,
but previously did not include the path for the initial request. This
caused a situation where users with a new session would not be able to
complete their first search, since the session validation follow-through
url did not include the actual path for their search query.
The method now includes a flag for only extracting the root url, which
is needed for creating full urls in the content filter.
Fixes#708
This adds a new "temporary" config section of the results view, where a
user can now change the country that their results come from without
changing their default config settings.
Closes#322
PEP-8 enforcements in the project are more of an annoyance than
anything. It doesn't really seem to add much value, and adds a lot of
friction to pull requests from developers who aren't familiar with the
style guide. Stylistic enforcements should just be done during PRs if
necessary (or a different style guide should be enforced).
Queries performed in a different language than what is configured
contain a result div that prompts the user to configure their language
preferences using google's preferences page.
Since we want all language configuration to occur on Whoogle only, we
can safely remove this result div.
Fixes#444Fixes#386
Farside can now redirect quora links to querte instances and imdb links
to libremdb instances. This updates Whoogle to perform link replacements
for both services when site alts are configured.
Allows skipping the Tor startup script if WHOOGLE_TOR_SERVICE is set to
0. This is separate from WHOOGLE_CONFIG_TOR, which only allows
enabling/disabling user configuration of passing searches through
Tor.
Closes#631
For users running local instances of service alternatives such as
invidious, the alt replacement procedure broke if the scheme of the
original service (almost always https) didn't match the scheme of their
defined local service (likely http).
This adds a small check to see if the alt has a defined scheme, and if
so, removes the original scheme for that result.
Fixes#806
Wikipedia -> Wikiless redirects always result in an english language
result, even if the Wikipedia result would've been in a non-english
language. This is due to Wikipedia using language specific subdomains
(i.e. de.wikipedia.org, en.wikipedia.org, etc) whereas Wikiless uses a
"lang" url param.
This has been fixed by inspecting the subdomain of the wikipedia link
and passing that value to Wikiless as the lang param if it's determined
to be a language specific value (currently just looking for a 2-char
subdomain).
See #805
If Whoogle is accessed on a non-standard port _and_ proxied,
this port is lost to the application and `element['src']`s are
incorrectly formed (omitting port).
HTTP x-Forwarded-Host will contain this front port number in
a typical Nginx reverse proxy configuration.
The majority of image links and links that are not handle by whoogle are not
opening in new tabs, this allow links that are not related to the application
to open in new tabs.
Due to how instances installed with pip seem to have issues storing
unrelated files in the same directory as sessions, exception handling
during session validation has been expanded to blindly ignore all
exceptions. This portion of the code is more for maintainers of large
public instances with a bunch of users who block cookies anyways, so
having basic app functionality break down as a result shouldn't be the
default.
Country config value should be checked against the valid value when
updating the home page config, not the other way around. This can lead
to a state where a user sets up an invalid country value, but can still
be matched against a correct value that is part of the invalid value
(i.e. "countryUK" is invalid, but would match against the correct value,
"UK")
Also minor refactor of where the session file size validation occurs.
For pip installed instances of Whoogle, there seems to be an issue where
files other than sessions are being stored in the same directory as the
sessions. From a brief investigation, this does not seem to be caused by
Whoogle, since Flask-Session objects are the only files stored in that
directory. It could be an issue with the library that is being used for
sessions, however.
Regardless, the app shouldn't crash when trying to validate and remove
invalid sessions, so a file size limit of 4KB was imposed during
validation. Any file found in the session directory that exceeds this
size limit will be ignored.
Fixes#777Fixes#793
Added password authentication for tor control port.
For user configuration of access to tor control port. This file should be
heavily restricted in file system.
Co-authored-by: MadcowOG <madcowog@Arch-Main.localdomain>
Similar issue to #629, but the result page uses a different script for
handling user input, so the fix was not applied appropriately.
It has been fixed for this view now.
Google updated their styling of the result page, which broke some
components of Whoogle's result page styling (namely the result div
backgrounds for dark mode).
The GClasses class has been updated to keep track of what class names
have been updated to, and roll them back to a value that works for
Whoogle. A function was added that loops through new class names and
replaces them with their older counterparts.
The previous implementation of autocomplete/suggestions on the front end
resulted in a situation where input and keydown events were constantly
being added to the search input bar. This was refactored to set up the
events only once and process suggestion navigation and appending
suggestions separately with different functions.
This has been tested on both an Android simulator, as well as an Android
tablet and seems to work as expected.
Fixes#370Fixes#629
Tagged builds seem to erroneously fail the on-success check due to the
tests not having finished when the build begins. Since tagged builds are
only ever submitted once the tagged commit is confirmed to pass all
tests, this check will now be skipped.
This seems to be caused by an odd behavior related to Flask sessions and
instances of Whoogle installed via pip. I didn't investigate it too
much, since catching and ignoring the result doesn't impact Whoogle
functionality at all (configuration and session values persist as
normal). Since this doesn't affect non-pip instances, I don't believe it
to be a fault within Whoogle itself.
Fixes#765
A user reported a bug where searches with a leading slash (in this case:
"/e/OS apps" were interpreted as a Google specific link when clicking
the next page of results.
This was due to the behavior that Google's search results exhibit, where
internal links for pages like support.google.com are delivered with
params like "?q=/support" rather than a direct link. This fixes that
scenario by checking the "q" param value against the user's original
query to ensure they don't match before assuming that the result is
intended as a redirect.
Fixes#776
It appears that result links beginning with '/url' were mistakenly
commited with an inefficient filtering process in its place. With the
way the code is structured, this less effective '/url' link filter took
precedence over the previous link filter, and also caused users with the
"open link in new tab" config enabled to no longer have access to that
feature.
Fixes#769
The leading slash was previously removed without noticing it was part of a
string replacement in #734. This caused the href of "View Image" contain a
leading "/" which is wrong.
Pages in the Whoogle footer that by default route to Google pages were
previously being removed, but caused results that also routed to similar
pages to no longer be accessible. This was due to the removal of the
'/url' endpoint that Google uses for each result.
To fix this, the result link is now parsed so that the domain of the
result can be checked against the disallowed G page list. Since results
are delivered in a "/url?q=<domain>" format -- even for pages to
Google's own products -- and the footer links are formatted as
"<product>.google.com", footer links are removed and result links are
parsed correctly.
Fixes#747
SESSION_COOKIE_SAMESITE must be set to 'lax' to allow the user's
previous session to persist when accessing the instance from an external
link. Setting this value to 'strict' causes Whoogle to revalidate a new
session, and fail, resulting in cookies being disabled.
This could be re-evaluated if Whoogle ever switches to client side
configuration instead.
Fixes#749
Get Google search results, but without any ads, javascript, AMP links, cookies, or IP address tracking. Easily deployable in one click as a Docker app, and customizable with a single config file. Quick and simple to implement as a primary search engine replacement on both desktop and mobile.
Get Google search results, but without any ads, JavaScript, AMP links, cookies, or IP address tracking. Easily deployable in one click as a Docker app, and customizable with a single config file. Quick and simple to implement as a primary search engine replacement on both desktop and mobile.
- Downtime after periods of inactivity \([solution](https://github.com/benbusby/whoogle-search#prevent-downtime-heroku-only)\)
- Easy Deployment of App
- A HTTPS url (https://\<your app name\>.herokuapp.com)
Notes:
- Requires a (free) Heroku account
- Requires a **PAID** Heroku Account.
- Sometimes has issues with auto-redirecting to `https`. Make sure to navigate to the `https` version of your app before adding as a default search engine.
### B) [Repl.it](https://repl.it)
___
### [Render](https://render.com)
Create an account on [render.com](https://render.com) and import the Whoogle repo with the following settings:
- Downtime after periods of inactivity \([solution 1](https://repl.it/talk/ask/use-this-pingmat1replco-just-enter/28821/101298), [solution 2](https://repl.it/talk/learn/How-to-use-and-setup-UptimeRobot/9003)\)
- Downtime after periods of inactivity ([solution](https://repl.it/talk/learn/How-to-use-and-setup-UptimeRobot/9003)\)
### C) [Fly.io](https://fly.io)
___
You will need a [Fly.io](https://fly.io) account to do this. Fly requires a credit card to deploy anything, but you can have up to 3 shared-CPU VMs running full-time each month for free.
### [Fly.io](https://fly.io)
#### Install the CLI:
You will need a [Fly.io](https://fly.io) account to deploy Whoogle. The [free allowances](https://fly.io/docs/about/pricing/#free-allowances) are enough for personal use.
```bash
curl -L https://fly.io/install.sh | sh
```
#### Install the CLI: https://fly.io/docs/hands-on/installing/
#### Deploy your app
#### Deploy the app
```bash
fly apps create --org personal --port 5000
# Choose a name and the Image builder
# Enter `benbusby/whoogle-search:latest` as the image name
4. Set the Tor environment variable to 1, `WHOOGLE_CONFIG_TOR`. Refer to the [Environment Variables](#environment-variables) section for more details.
- This may be added in the systemd unit file or env file `WHOOGLE_CONFIG_TOR=1`
* Password
1. Run this command:
- `tor --hash-password {Your Password Here}`; put your password in place of `{Your Password Here}`.
- Keep the output of this command, you will be placing it in your torrc.
- Keep the password input of this command, you will be using it later.
2. Uncomment or add the following lines in your torrc:
- `ControlPort 9051`
- `HashedControlPassword {Place output here}`; put the output of the previous command in place of `{Place output here}`.
3. Now take the password from the first step and place it in the control.conf file within the whoogle working directory, ie. [misc/tor/control.conf](misc/tor/control.conf)
- If you want to place your password file in a different location set this location with the `WHOOGLE_TOR_CONF` environment variable. Refer to the [Environment Variables](#environment-variables) section for more details.
4. Heavily restrict access to control.conf to only be readable by the user running whoogle:
- `chmod 400 control.conf`
5. Finally set the Tor environment variable and use password variable to 1, `WHOOGLE_CONFIG_TOR` and `WHOOGLE_TOR_USE_PASS`. Refer to the [Environment Variables](#environment-variables) section for more details.
- These may be added to the systemd unit file or env file:
- `WHOOGLE_CONFIG_TOR=1`
- `WHOOGLE_TOR_USE_PASS=1`
___
### Manual (Docker)
1. Ensure the Docker daemon is running, and is accessible by your user account
- To add user permissions, you can execute `sudo usermod -aG docker yourusername`
- Running `docker ps` should return something besides an error. If you encounter an error saying the daemon isn't running, try `sudo systemctl start docker` (Linux) or ensure the docker tool is running (Windows/macOS).
@ -293,16 +371,22 @@ heroku open
This series of commands can take a while, but once you run it once, you shouldn't have to run it again. The final command, `heroku open` will launch a tab in your web browser, where you can test out Whoogle and even [set it as your primary search engine](https://github.com/benbusby/whoogle#set-whoogle-as-your-primary-search-engine).
You may also edit environment variables from your app’s Settings tab in the Heroku Dashboard.
#### Arch Linux & Arch-based Distributions
___
### Arch Linux & Arch-based Distributions
There is an [AUR package available](https://aur.archlinux.org/packages/whoogle-git/), as well as a pre-built and daily updated package available at [Chaotic-AUR](https://chaotic.cx).
#### Helm chart for Kubernetes
___
### Helm chart for Kubernetes
To use the Kubernetes Helm Chart:
1. Ensure you have [Helm](https://helm.sh/docs/intro/install/) `>=3.0.0` installed
2. Clone this repository
3. Update [charts/whoogle/values.yaml](./charts/whoogle/values.yaml) as desired
4. Run `helm install whoogle ./charts/whoogle`
___
#### Using your own server, or alternative container deployment
There are other methods for deploying docker containers that are well outlined in [this article](https://rollout.io/blog/the-shortlist-of-docker-hosting/), but there are too many to describe set up for each here. Generally it should be about the same amount of effort as the Heroku deployment.
@ -329,41 +413,56 @@ There are a few optional environment variables available for customizing a Whoog
| WHOOGLE_PROXY_PASS | The password of the proxy server. |
| WHOOGLE_PROXY_TYPE | The type of the proxy server. Can be "socks5", "socks4", or "http". |
| WHOOGLE_PROXY_LOC | The location of the proxy server (host or ip). |
| WHOOGLE_USER_AGENT | The desktop user agent to use. Defaults to a randomly generated one. |
| WHOOGLE_USER_AGENT_MOBILE | The mobile user agent to use. Defaults to a randomly generated one. |
| WHOOGLE_USE_CLIENT_USER_AGENT | Enable to use your own user agent for all requests. Defaults to false. |
| WHOOGLE_REDIRECTS | Specify sites that should be redirected elsewhere. See [custom redirecting](#custom-redirecting). |
| EXPOSE_PORT | The port where Whoogle will be exposed. |
| HTTPS_ONLY | Enforce HTTPS. (See [here](https://github.com/benbusby/whoogle-search#https-enforcement)) |
| WHOOGLE_ALT_TW | The twitter.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_ALT_YT | The youtube.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_ALT_IG | The instagram.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_ALT_RD | The reddit.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_ALT_TL | The Google Translate alternative to use. This is used for all "translate ____" searches. |
| WHOOGLE_ALT_MD | The medium.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_ALT_IMG | The imgur.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_ALT_WIKI | The wikipedia.com alternative to use when site alternatives are enabled in the config. |
| WHOOGLE_AUTOCOMPLETE | Controls visibility of autocomplete/search suggestions. Default on -- use '0' to disable |
| WHOOGLE_ALT_TW | The twitter.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_YT | The youtube.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_RD | The reddit.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_TL | The Google Translate alternative to use. This is used for all "translate ____" searches. Set to "" to disable. |
| WHOOGLE_ALT_MD | The medium.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_IMG | The imgur.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_WIKI | The wikipedia.org alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_IMDB | The imdb.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_ALT_QUORA | The quora.com alternative to use when site alternatives are enabled in the config. Set to "" to disable. |
| WHOOGLE_AUTOCOMPLETE | Controls visibility of autocomplete/search suggestions. Default on -- use '0' to disable. |
| WHOOGLE_MINIMAL | Remove everything except basic result cards from all search queries. |
| WHOOGLE_CSP | Sets a default set of 'Content-Security-Policy' headers |
| WHOOGLE_RESULTS_PER_PAGE | Set the number of results per page |
| WHOOGLE_RESULTS_PER_PAGE | Set the number of results per page |
| WHOOGLE_TOR_SERVICE | Enable/disable the Tor service on startup. Default on -- use '0' to disable. |
| WHOOGLE_TOR_USE_PASS | Use password authentication for tor control port. |
| WHOOGLE_TOR_CONF | The absolute path to the config file containing the password for the tor control port. Default: ./misc/tor/control.conf WHOOGLE_TOR_PASS must be 1 for this to work.|
| WHOOGLE_SHOW_FAVICONS | Show/hide favicons next to search result URLs. Default on. |
| WHOOGLE_UPDATE_CHECK | Enable/disable the automatic daily check for new versions of Whoogle. Default on. |
### Config Environment Variables
These environment variables allow setting default config values, but can be overwritten manually by using the home page config menu. These allow a shortcut for destroying/rebuilding an instance to the same config state every time.
| WHOOGLE_CONFIG_PREFERENCES_KEY | Key to encrypt preferences in URL (REQUIRED to show url) |
| WHOOGLE_CONFIG_ANON_VIEW | Include the "anonymous view" option for each search result |
## Usage
Same as most search engines, with the exception of filtering by time range.
@ -371,6 +470,7 @@ Same as most search engines, with the exception of filtering by time range.
To filter by a range of time, append ":past <time>" to the end of your search, where <time> can be `hour`, `day`, `month`, or `year`. Example: `coronavirus updates :past hour`
## Extra Steps
### Set Whoogle as your primary search engine
*Note: If you're using a reverse proxy to run Whoogle Search, make sure the "Root URL" config option on the home page is set to your URL before going through these steps.*
@ -415,6 +515,40 @@ Browser settings:
- Manual
- Under search engines > manage search engines > add, manually enter your Whoogle instance details with a `<whoogle url>/search?q=%s` formatted search URL.
### Custom Redirecting
You can set custom site redirects using the `WHOOGLE_REDIRECTS` environment
variable. A lot of sites, such as Twitter, Reddit, etc, have built-in redirects
to [Farside links](https://sr.ht/~benbusby/farside), but you may want to define
your own.
To do this, you can use the following syntax:
```
WHOOGLE_REDIRECTS="<parent_domain>:<new_domain>"
```
For example, if you want to redirect from "badsite.com" to "goodsite.com":
```
WHOOGLE_REDIRECTS="badsite.com:goodsite.com"
```
This can be used for multiple sites as well, with comma separation:
NOTE: Do not include "http(s)://" when defining your redirect.
### Custom Bangs
You can create your own custom bangs. By default, bangs are stored in
`app/static/bangs`. See [`00-whoogle.json`](https://github.com/benbusby/whoogle-search/blob/main/app/static/bangs/00-whoogle.json)
for an example. These are parsed in alphabetical order with later files
overriding bangs set in earlier files, with the exception that DDG bangs
(downloaded to `app/static/bangs/bangs.json`) are always parsed first. Thus,
any custom bangs will always override the DDG ones.
### Prevent Downtime (Heroku only)
Part of the deal with Heroku's free tier is that you're allocated 550 hours/month (meaning it can't stay active 24/7), and the app is temporarily shut down after 30 minutes of inactivity. Once it becomes inactive, any Whoogle searches will still work, but it'll take an extra 10-15 seconds for the app to come back online before displaying the result, which can be frustrating if you're in a hurry.
@ -444,6 +578,31 @@ Unfortunately, Firefox Containers do not currently pass through `POST` requests
4. Restart Firefox
5. Navigate to Whoogle instance and [re-add the engine](#set-whoogle-as-your-primary-search-engine)
You can then add SSL support using LetsEncrypt by following a guide such as [this one](https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/).
## Contributing
Under the hood, Whoogle is a basic Flask app with the following structure:
@ -464,9 +623,9 @@ Under the hood, Whoogle is a basic Flask app with the following structure:
- `search.html`: An iframe-able search page
- `logo.html`: A template consisting mostly of the Whoogle logo as an SVG (separated to help keep `index.html` a bit cleaner)
- `opensearch.xml`: A template used for supporting [OpenSearch](https://developer.mozilla.org/en-US/docs/Web/OpenSearch).
- `imageresults.html`: An "exprimental" template used for supporting the "Full Size" image feature on desktop.
- `imageresults.html`: An "experimental" template used for supporting the "Full Size" image feature on desktop.
- `static/<css|js>`
- CSS/Javascript files, should be self-explanatory
- CSS/JavaScript files, should be self-explanatory
- `static/settings`
- Key-value JSON files for establishing valid configuration values
@ -505,7 +664,7 @@ I'm a huge fan of Searx though and encourage anyone to use that instead if they
**Why does the image results page look different?**
A lot of the app currently piggybacks on Google's existing support for fetching results pages with Javascript disabled. To their credit, they've done an excellent job with styling pages, but it seems that the image results page - particularly on mobile - is a little rough. Moving forward, with enough interest, I'd like to transition to fetching the results and parsing them into a unique Whoogle-fied interface that I can style myself.
A lot of the app currently piggybacks on Google's existing support for fetching results pages with JavaScript disabled. To their credit, they've done an excellent job with styling pages, but it seems that the image results page - particularly on mobile - is a little rough. Moving forward, with enough interest, I'd like to transition to fetching the results and parsing them into a unique Whoogle-fied interface that I can style myself.
## Public Instances
@ -514,16 +673,26 @@ A lot of the app currently piggybacks on Google's existing support for fetching
| Website | Country | Language | Cloudflare |
|-|-|-|-|
| [https://search.albony.xyz](https://search.albony.xyz/) | 🇮🇳 IN | Multi-choice | |
| [https://search.garudalinux.org](https://search.garudalinux.org) | 🇩🇪 DE | Multi-choice | |
| [https://whooglesearch.net](https://whooglesearch.net) | 🇩🇪 DE | Spanish | |
| [https://s.alefvanoon.xyz](https://s.alefvanoon.xyz) | 🇺🇸 US | Multi-choice | ✅ |
| [https://www.whooglesearch.ml](https://www.whooglesearch.ml) | 🇺🇸 US | English | |
| [https://search.garudalinux.org](https://search.garudalinux.org) | 🇫🇮 FI | Multi-choice | ✅ |
| [https://search.dr460nf1r3.org](https://search.dr460nf1r3.org) | 🇩🇪 DE | Multi-choice | ✅ |
| [https://s.tokhmi.xyz](https://s.tokhmi.xyz) | 🇺🇸 US | Multi-choice | ✅ |
| [https://search.sethforprivacy.com](https://search.sethforprivacy.com) | 🇩🇪 DE | English | |
| [https://whoogle.dcs0.hu](https://whoogle.dcs0.hu) | 🇭🇺 HU | Multi-choice | |
| [https://whoogle.esmailelbob.xyz](https://whoogle.esmailelbob.xyz) | 🇨🇦 CA | Multi-choice | |
| [https://gowogle.voring.me](https://gowogle.voring.me) | 🇺🇸 US | Multi-choice | |
| [https://whoogle.privacydev.net](https://whoogle.privacydev.net) | 🇫🇷 FR | English | |
| [https://wg.vern.cc](https://wg.vern.cc) | 🇺🇸 US | English | |
| [https://whoogle.hxvy0.gq](https://whoogle.hxvy0.gq) | 🇨🇦 CA | Turkish Only | ✅ |
* A checkmark in the "Cloudflare" category here refers to the use of the reverse proxy, [Cloudflare](https://cloudflare.com). The checkmark will not be listed for a site which uses Cloudflare DNS but rather the proxying service which grants Cloudflare the ability to monitor traffic to the website.
@ -534,6 +703,15 @@ A lot of the app currently piggybacks on Google's existing support for fetching
|-|-|-|
| [http://whoglqjdkgt2an4tdepberwqz3hk7tjo4kqgdnuj77rt7nshw2xqhqad.onion](http://whoglqjdkgt2an4tdepberwqz3hk7tjo4kqgdnuj77rt7nshw2xqhqad.onion) | 🇺🇸 US | Multi-choice
| [http://nuifgsnbb2mcyza74o7illtqmuaqbwu4flam3cdmsrnudwcmkqur37qd.onion](http://nuifgsnbb2mcyza74o7illtqmuaqbwu4flam3cdmsrnudwcmkqur37qd.onion) | 🇩🇪 DE | English
| [http://whoogle.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion](http://whoogle.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion/) | 🇺🇸 US | English |
| [http://whoogle.g4c3eya4clenolymqbpgwz3q3tawoxw56yhzk4vugqrl6dtu3ejvhjid.onion](http://whoogle.g4c3eya4clenolymqbpgwz3q3tawoxw56yhzk4vugqrl6dtu3ejvhjid.onion/) | 🇫🇷 FR | English |
| [http://whoogle.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion](http://whoogle.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion/) | 🇩🇪 DE | Multi-choice | |
#### I2P Instances
| Website | Country | Language |
|-|-|-|
| [http://verneks7rfjptpz5fpii7n7nrxilsidi2qxepeuuf66c3tsf4nhq.b32.i2p](http://verneks7rfjptpz5fpii7n7nrxilsidi2qxepeuuf66c3tsf4nhq.b32.i2p) | 🇺🇸 US | English |
"description":"The URL prefix to use for the whoogle instance (i.e. \"/whoogle\")",
"value":"",
"required":false
},
"WHOOGLE_USER":{
"description":"The username for basic auth. WHOOGLE_PASS must also be set if used. Leave empty to disable.",
"value":"",
@ -55,11 +60,6 @@
"value":"farside.link/invidious",
"required":false
},
"WHOOGLE_ALT_IG":{
"description":"The site to use as a replacement for instagram.com when site alternatives are enabled in the config.",
"value":"farside.link/bibliogram/u",
"required":false
},
"WHOOGLE_ALT_RD":{
"description":"The site to use as a replacement for reddit.com when site alternatives are enabled in the config.",
"value":"farside.link/libreddit",
@ -76,15 +76,25 @@
"required":false
},
"WHOOGLE_ALT_IMG":{
"description":"The site to use as a replacement for imgur.com when site alternatives are enabled in the config.",
"value":"farside.link/rimgo",
"required":false
},
"description":"The site to use as a replacement for imgur.com when site alternatives are enabled in the config.",
"value":"farside.link/rimgo",
"required":false
},
"WHOOGLE_ALT_WIKI":{
"description":"The site to use as a replacement for wikipedia.com when site alternatives are enabled in the config.",
"value":"farside.link/wikiless",
"required":false
},
"description":"The site to use as a replacement for wikipedia.com when site alternatives are enabled in the config.",
"value":"farside.link/wikiless",
"required":false
},
"WHOOGLE_ALT_IMDB":{
"description":"The site to use as a replacement for imdb.com when site alternatives are enabled in the config.",
"value":"farside.link/libremdb",
"required":false
},
"WHOOGLE_ALT_QUORA":{
"description":"The site to use as a replacement for quora.com when site alternatives are enabled in the config.",
"value":"farside.link/quetre",
"required":false
},
"WHOOGLE_MINIMAL":{
"description":"Remove everything except basic result cards from all search queries (set to 1 or leave blank)",
"value":"",
@ -95,6 +105,11 @@
"value":"",
"required":false
},
"WHOOGLE_CONFIG_TIME_PERIOD":{
"description":"[CONFIG] The time period to use for restricting search results",
"value":"",
"required":false
},
"WHOOGLE_CONFIG_LANGUAGE":{
"description":"[CONFIG] The language to use for the interface (use values from https://raw.githubusercontent.com/benbusby/whoogle-search/develop/app/static/settings/languages.json)",
"value":"",
@ -159,6 +174,16 @@
"description":"[CONFIG] Custom CSS styling (paste in CSS or leave blank)",
"config-alts-help":"Replaces Twitter/YouTube/Instagram/etc links with privacy respecting alternatives.",
"config-alts-help":"Replaces Twitter/YouTube/etc links with privacy respecting alternatives.",
"config-new-tab":"Open Links in New Tab",
"config-images":"Full Size Image Search",
"config-images-help":"(Experimental) Adds the 'View Image' option to desktop image searches. This will cause image result thumbnails to be lower resolution.",
"config-tor":"Use Tor",
"config-get-only":"GET Requests Only",
"config-url":"Root URL",
"config-pref-url":"Preferences URL",
"config-pref-encryption":"Encrypt Preferences",
"config-pref-help":"Requires WHOOGLE_CONFIG_PREFERENCES_KEY, otherwise this will be ignored.",
"config-css":"Custom CSS",
"config-time-period":"Time Period",
"load":"Load",
"apply":"Apply",
"save-as":"Save As...",
@ -43,7 +48,12 @@
"videos":"Videos",
"news":"News",
"books":"Books",
"anon-view":"Anonymous View"
"anon-view":"Anonymous View",
"qdr:h":"Past hour",
"qdr:d":"Past 24 hours",
"qdr:w":"Past week",
"qdr:m":"Past month",
"qdr:y":"Past year"
},
"lang_nl":{
"search":"Zoeken",
@ -65,13 +75,16 @@
"config-dark":"Donkere Modus",
"config-safe":"Veilig zoeken",
"config-alts":"Social Media Links Vervangen",
"config-alts-help":"Vervang Twitter/YouTube/Instagram/etc links met privacy gerespecteerde alternatieve.",
"config-alts-help":"Vervang Twitter/YouTube/etc links met privacy gerespecteerde alternatieve.",
"config-new-tab":"Open Links in New Tab",
"config-images":"Volledige Grote Afbeelding Zoeken",
"config-images-help":"(Expirimenteel) Voegt de optie 'View Image' toe aan desktop afbeeldingen zoeken. Dit zorgt ervoor dat de voorbeeld foto's kleiner zijn.",
"config-tor":"Gebruik Tor",
"config-get-only":"Alleen GET Requests",
"config-url":"Root URL",
"config-pref-url":"Voorkeurs URL",
"config-pref-encryption":"Versleutel voorkeuren",
"config-pref-help":"Vereist WHOOGLE_CONFIG_PREFERENCES_KEY, anders wordt dit genegeerd.",
"config-css":"Eigen CSS",
"load":"Laden",
"apply":"Opslaan",
@ -89,7 +102,14 @@
"videos":"Videos",
"news":"Nieuws",
"books":"Boeken",
"anon-view":"Anonieme Weergave"
"anon-view":"Anonieme Weergave",
"":"--",
"qdr:h":"Afgelopen uur",
"qdr:d":"Afgelopen 24 uur",
"qdr:w":"Vorige week",
"qdr:m":"Afgelopen maand",
"qdr:y":"Afgelopen jaar",
"config-time-period":"Tijdsperiode"
},
"lang_de":{
"search":"Suchen",
@ -111,13 +131,16 @@
"config-dark":"Dark Mode",
"config-safe":"Sicheres Suchen",
"config-alts":"Social-Media-Links ersetzen",
"config-alts-help":"Ersetzt Twitter/YouTube/Instagram/etc Links mit Alternativen, welche die Privatsphäre respektieren.",
"config-alts-help":"Ersetzt Twitter/YouTube/etc Links mit Alternativen, welche die Privatsphäre respektieren.",
"config-new-tab":"Links in neuen Tabs öffnen",
"config-images":"Bilder-Suche in Vollbild",
"config-images-help":"(Experimentell) Fügt 'View Image'-Einstellung zu Dekstop Bilder-Suchen hinzu. Dadurch werden Thumbnails in niedrigerer Auflösung angezeigt.",
"config-pref-help":"Erfordert WHOOGLE_CONFIG_PREFERENCES_KEY, sonst wird dies ignoriert.",
"config-css":"Custom CSS",
"load":"Laden",
"apply":"Übernehmen",
@ -133,9 +156,16 @@
"images":"Bilder",
"maps":"Maps",
"videos":"Videos",
"news":"Nieuws",
"news":"Nachrichten",
"books":"Bücher",
"anon-view":"Anonyme Ansicht"
"anon-view":"Anonyme Ansicht",
"":"--",
"qdr:h":"Letzte Stunde",
"qdr:d":"Vergangene 24 Stunden",
"qdr:w":"Letzte Woche",
"qdr:m":"Letzten Monat",
"qdr:y":"Vergangenes Jahr",
"config-time-period":"Zeitraum"
},
"lang_es":{
"search":"Buscar",
@ -157,13 +187,16 @@
"config-dark":"Modo Oscuro",
"config-safe":"Búsqueda Segura",
"config-alts":"Reemplazar Enlaces de Redes Sociales",
"config-alts-help":"Reemplaza los enlaces de Twitter/YouTube/Instagram/etc con alternativas que respetan la privacidad.",
"config-alts-help":"Reemplaza los enlaces de Twitter/YouTube/etc con alternativas que respetan la privacidad.",
"config-new-tab":"Abrir enlaces en una pestaña nueva",
"config-images":"Búsqueda de imágenes a tamaño completo",
"config-images-help":"(Experimental) Agrega la opción 'Ver imagen' a las búsquedas de imágenes de escritorio. Esto hará que las miniaturas de los resultados de la imagen aparezcan con una resolución más baja.",
"config-tor":"Usa Tor",
"config-get-only":"GET solo solicitudes",
"config-url":"URL raíz",
"config-pref-url":"URL de preferencias",
"config-pref-encryption":"Cifrar preferencias",
"config-pref-help":"Requiere WHOOGLE_CONFIG_PREFERENCES_KEY; de lo contrario, se ignorará.",
"config-css":"CSS personalizado",
"load":"Cargar",
"apply":"Aplicar",
@ -181,7 +214,70 @@
"videos":"Vídeos",
"news":"Noticias",
"books":"Libros",
"anon-view":"Vista Anónima"
"anon-view":"Vista Anónima",
"":"--",
"qdr:h":"Hora pasada",
"qdr:d":"últimas 24 horas",
"qdr:w":"Semana pasada",
"qdr:m":"El mes pasado",
"qdr:y":"Año pasado",
"config-time-period":"Periodo de tiempo"
},
"lang_id":{
"":"--",
"search":"Telusuri",
"config":"Konfigurasi",
"config-country":"Negara",
"config-lang":"Bahasa Antarmuka",
"config-lang-search":"Bahasa Penelusuran",
"config-near":"Dekat",
"config-near-help":"Nama Kota",
"config-block":"Blokir",
"config-block-help":"Daftar situs yang dipisahkan dengan koma",
"config-block-title":"Blokir berdasarkan Judul",
"config-block-title-help":"Gunakan regex",
"config-block-url":"Blokir berdasarkan URL",
"config-block-url-help":"Gunakan regex",
"config-theme":"Tema",
"config-nojs":"Hapus Javascript dalam Tampilan Anonim",
"config-alts-help":"Mengganti tautan Twitter/YouTube/dll dengan alternatif yang lebih menjaga privasi.",
"config-new-tab":"Buka Tautan dalam Tab Baru",
"config-images":"Pencarian Gambar Ukuran Penuh",
"config-images-help":"(Eksperimental) Menambahkan opsi 'Lihat Gambar' ke pencarian gambar desktop. Ini akan menyebabkan resolusi thumbnail hasil gambar menjadi lebih rendah.",
"config-tor":"Gunakan Tor",
"config-get-only":"Hanya Gunakan GET",
"config-url":"URL Dasar",
"config-pref-url":"URL Preferensi",
"config-pref-encryption":"Enkripsi Preferensi",
"config-pref-help":"Memerlukan WHOOGLE_CONFIG_PREFERENCES_KEY, jika tidak akan diabaikan.",
"config-css":"CSS Kustom",
"config-time-period":"Periode Waktu",
"load":"Muat",
"apply":"Terapkan",
"save-as":"Simpan Sebagai...",
"github-link":"Lihat di GitHub",
"translate":"terjemahkan",
"light":"terang",
"dark":"gelap",
"system":"sistem",
"ratelimit":"Instansi telah ratelimited",
"continue-search":"Lanjutkan penelusuran Anda dengan Farside",
"all":"Semua",
"images":"Gambar",
"maps":"Peta",
"videos":"Video",
"news":"Berita",
"books":"Buku",
"anon-view":"Tampilan Anonim",
"qdr:h":"1 jam yang lalu",
"qdr:d":"24 jam yang lalu",
"qdr:w":"1 minggu yang lalu",
"qdr:m":"1 bulan yang lalu",
"qdr:y":"1 tahun yang lalu"
},
"lang_it":{
"search":"Cerca",
@ -203,13 +299,16 @@
"config-dark":"Modalità Notte",
"config-safe":"Ricerca Sicura",
"config-alts":"Sostituisci link dei social",
"config-alts-help":"Sostituisci link di Twitter/YouTube/Instagram/etc con alternative che rispettano la privacy.",
"config-alts-help":"Sostituisci link di Twitter/YouTube/etc con alternative che rispettano la privacy.",
"config-new-tab":"Apri i link in una nuova scheda",
"config-images":"Ricerca Immagini",
"config-images-help":"(Sperimentale) Aggiunge la modalità 'Ricerca Immagini'. Questo ridurrà drasticamente la qualità delle miniature durante la ricerca.",
"config-tor":"Usa Tor",
"config-get-only":"Utilizza solo richieste GET",
"config-url":"Root URL",
"config-pref-url":"URL delle preferenze",
"config-pref-encryption":"Crittografa le preferenze",
"config-alts":"Substituir Links de Redes Sociais",
"config-alts-help":"Substitui os links do Twitter/YouTube/Instagram/etc. por alternativas que respeitam sua privacidade.",
"config-alts-help":"Substitui os links do Twitter/YouTube/etc. por alternativas que respeitam sua privacidade.",
"config-new-tab":"Abrir Links em Nova Aba",
"config-images":"Pesquisa de Imagem em Tamanho Real",
"config-images-help":"(Experimental) Adiciona a opção 'Mostrar Imagem' às pesquisas de imagens no modo 'para computador'. Isso fará com que as miniaturas do resultado da imagem sejam de menor resolução.",
"config-images-help":"(Эксперимент) Добавляет опцию 'Просмотр изображения' к поиску изображений в ПК-режиме. Это приведет к тому, что миниатюры изображений будут иметь более низкое разрешение.",
"config-tor":"Использовать Tor",
"config-get-only":"Только GET-запросы",
"config-url":"Корневой URL-адрес",
"config-pref-url":"URL-адрес настроек",
"config-pref-encryption":"Зашифровать настройки",
"config-pref-help":"Требуется WHOOGLE_CONFIG_PREFERENCES_KEY, иначе это будет проигнорировано.",
"config-alts":"Remplacer les liens des réseaux sociaux",
"config-alts-help":"Remplacer les liens Twitter/YouTube/Instagram/etc avec leurs alternatives respectueuses de la vie privée.",
"config-alts-help":"Remplacer les liens Twitter/YouTube/etc avec leurs alternatives respectueuses de la vie privée.",
"config-new-tab":"Ouvrir les Liens dans un Nouveau Onglet",
"config-images":"Recherche d'image en plein écran",
"config-images-help":"(Expérimental) Ajouter l'option 'Voir Image' aux recherches d'images sur ordinateur. Les vignettes des résultats d'image seront de plus faible résolution.",
"config-tor":"Utiliser Tor",
"config-get-only":"Requêtes GET seulement",
"config-url":"URL de la racine",
"config-pref-url":"URL des préférences",
"config-pref-encryption":"Chiffrer les préférences",
"config-pref-help":"Nécessite WHOOGLE_CONFIG_PREFERENCES_KEY, sinon cela sera ignoré.",
"config-pref-help":"به WHOOGLE_CONFIG_PREFERENCES_KEY نیاز دارد، در غیر این صورت نادیده گرفته خواهد شد.",
"config-css":"CSS دلخواه",
"load":"بارگذاری",
"apply":"تایید",
@ -503,7 +662,14 @@
"videos":"ویدئوها",
"news":"اخبار",
"books":"کتابها",
"anon-view":"نمای ناشناس"
"anon-view":"نمای ناشناس",
"":"--",
"qdr:h":"ساعت گذشته",
"qdr:d":"24 ساعت گذشته",
"qdr:w":"هفته گذشته",
"qdr:m":"ماه گذشته",
"qdr:y":"سال گذشته",
"config-time-period":"بازه زمانی"
},
"lang_cs":{
"search":"Hledat",
@ -525,13 +691,16 @@
"config-dark":"Tmavý motiv",
"config-safe":"Bezpečné vyhledávání",
"config-alts":"Nahradit odkazy na sociální média",
"config-alts-help":"Nahradí odkazy na Twitter, YouTube, Instagram atd. alternativami respektujícími soukromí.",
"config-alts-help":"Nahradí odkazy na Twitter, YouTube, atd. alternativami respektujícími soukromí.",
"config-new-tab":"Otevírat odkazy na novém listu",
"config-images":"Vyhledávání obrázků v plné velikosti",
"config-images-help":"(Experimentální) Přidá volbu ‚Zobrazit obrázek‘ do vyhledávání obrázků na ploše. Způsobí to, že náhledy výsledků vyhledávání obrázků budou mít nižší rozlišení.",
"config-tor":"Používat Tor",
"config-get-only":"Pouze požadavky GET",
"config-url":"Kořenová adresa URL",
"config-pref-url":"Adresa URL předvoleb",
"config-pref-encryption":"Předvolby šifrování",
"config-pref-help":"Vyžaduje WHOOGLE_CONFIG_PREFERENCES_KEY, jinak bude ignorována.",
"config-alts":"Заменете връзките към социалните медии",
"config-alts-help":"Заменя връзките на Twitter/YouTube/Instagram и т.н. с защитени алтернативни поверителни връзки.",
"config-alts-help":"Заменя връзките на Twitter/YouTube и т.н. с защитени алтернативни поверителни връзки.",
"config-new-tab":"Отваряне на връзките в нов раздел",
"config-images":"Търсене на изображения в пълен размер",
"config-images-help":"(Експериментално) Добавя опцията „Преглед на изображение“ към резултатите от търсене на изображения през работния плот на компютъра. Това ще доведе до по-ниска разделителна способност на миниатюрите, в резултатите от търсене на изображения.",
"config-tor":"Използвайте Tor",
"config-get-only":"Само GET заявки",
"config-url":"Основен URL адрес",
"config-pref-url":"URL адрес на предпочитанията",
"config-pref-encryption":"Шифроване на предпочитанията",
"config-pref-help":"Изисква WHOOGLE_CONFIG_PREFERENCES_KEY, в противен случай това ще бъде игнорирано.",
"config-alts-help":"Twitter/YouTube/Instagram 등의 링크를 프라이버시를 존중하는 링크로 대체합니다",
"config-alts-help":"Twitter/YouTube 등의 링크를 프라이버시를 존중하는 링크로 대체합니다",
"config-new-tab":"새 탭에서 열기",
"config-images":"최대 크기 이미지 검색",
"config-images-help":"(실험적) 데스크톱 이미지 검색에 '이미지 보기' 옵션을 추가합니다. 이미지 결과 미리보기 썸네일이 낮은 해상도로 표시됩니다.",
"config-tor":"Tor 사용",
"config-get-only":"GET 요청만",
"config-url":"루트 URL",
"config-pref-url":"환경설정 URL",
"config-pref-encryption":"암호화 환경 설정",
"config-pref-help":"WHOOGLE_CONFIG_PREFERENCES_KEY이 필요합니다. 그렇지 않으면 무시됩니다.",
"config-css":"커스텀 CSS",
"load":"불러오기",
"apply":"적용",
@ -779,6 +998,293 @@
"videos":"동영상",
"news":"뉴스",
"books":"도서",
"anon-view":"익명 보기"
"anon-view":"익명 보기",
"":"--",
"qdr:h":"지난 시간",
"qdr:d":"지난 24시간",
"qdr:w":"지난 주",
"qdr:m":"지난달",
"qdr:y":"지난 해",
"config-time-period":"기간"
},
"lang_ku":{
"search":"Bigere",
"config":"Sazkarî",
"config-country":"Welat",
"config-lang":"Zimanê Navrûyê",
"config-lang-search":"Zimanê Lêgerînê",
"config-near":"Nêzîk",
"config-near-help":"Navê Bajêr",
"config-block":"Astengkirin",
"config-block-help":"Rêzoka malperê ya ji hev veqetandî bi riya bêhnok",
"config-block-title":"Bi ya Sernavê Asteng bike",
"config-block-title-help":"regex bi kar bîne",
"config-block-url":"Bi ya Girêdanê asteng bike",
"config-block-url-help":"regex bi kar bîne",
"config-theme":"Rûkar",
"config-nojs":"Javascript Rake di Nîşandanên Nenenas de",
"config-anon-view":"Girêdanên Nenas Nîşan bide",
"config-dark":"Awaya Tarî",
"config-safe":"Lêgerîna Parastî",
"config-alts":"Girêdanên Tora Civakî Biguherîne",
"config-alts-help":"Girêdanên Twitter/YouTube/hwd biguherîne bi alternatîvên ku ji taybetiyê re rêzê digrin.",
"config-new-tab":"Girêdanan di Rûgereke Nû de Veke",
"config-images":"Lêgerîna Wêne bi Mezinahiya Tevahî",
"config-images-help":"(Ezmûnî) Vebijêrka 'Wêneyê Nîşan bide' tevlî lêgerînên wêneyê yê sermaseyê bike. Ev ê bibe sedem ku çareseriya encamê wêneyên nîşanê kêmtir bibe.",
"config-tor":"Tor bi kar bîne",
"config-get-only":"Daxwazan bi Dest Bixe",
"config-url":"Rêgeha girêdanê",
"config-pref-url":"Vebijêrkên girêdanê",
"config-pref-encryption":"Vebijêrkan şîfre bike",
"config-pref-help":"Pêdivî bi WHOOGLE_CONFIG_PREFERENCES_KEY dike, wekî din ev ê were paşguhkirin.",
"config-css":"CSS kesane bike",
"load":"Bar bike",
"apply":"Bisepîne",
"save-as":"Biparêze wekî...",
"github-link":"Li ser GitHub Nîşan bide",
"translate":"werger",
"light":"ronî",
"dark":"tarî",
"system":"pergal",
"ratelimit":"Mînak bi rêjeya sînorkirî ye",
"continue-search":"Lêgerîna xwe bi Farside re bidomîne",
"config-alts":"Sosial Media Linklərini dəyişdirin",
"config-alts-help":"Twitter/YouTube/s. linkləri alternativlərə uyğun məxfiliklə əvəz edir.",
"config-new-tab":"Linkləri Yeni Tabda açın",
"config-images":"Tam ölçülü Şəkil Axtarışı",
"config-images-help":"(Eksperimental) Masaüstü şəkil axtarışlarına 'Şəkilə Bax' seçimini əlavə edir. Bu, şəkil nəticəsi miniatürlərinin daha aşağı ayırdetmə keyfiyyətinə səbəb olacaq.",
"config-tor":"Tor-dan istifadə edin",
"config-get-only":"Yalnız GET Sorğuları",
"config-url":"Kök URL",
"config-pref-url":"URL Tərcihləri",
"config-pref-encryption":"Encrypt Tərcihləri",
"config-pref-help":"WHOOGLE_CONFIG_PREFERENCES_KEY tələb edir, əks halda bu nəzərə alınmayacaq.",
"config-css":"Fərdi CSS",
"config-time-period":"Müddət",
"load":"Yüklə",
"apply":"Tətbiq edin",
"save-as":"Fərqli Saxla...",
"github-link":"GitHub-da baxın",
"translate":"tərcümə",
"light":"işıqlı",
"dark":"qaranlıq",
"system":"sistem",
"ratelimit":"Nümunə dərəcəsi məhdudlaşdırılıb",
"continue-search":"Axtarışınızı Farside ilə davam etdirin",
"all":"Hamısı",
"images":"Şəkillər",
"maps":"Xəritələr",
"videos":"Videolar",
"news":"Xəbərlər",
"books":"Kitablar",
"anon-view":"Anonim Baxış",
"qdr:h":"Keçən saat",
"qdr:d":"Keçən 24 saat",
"qdr:w":"Keçən həftə",
"qdr:m":"Keçən ay",
"qdr:y":"Keçən il"
},
"lang_el":{
"":"--",
"search":"Αναζήτηση",
"config":"Ρυθμήσεις",
"config-country":"Χώρα",
"config-lang":"Γλώσσα Περιβάλλοντος",
"config-lang-search":"Γλώσσα Αναζήτησης",
"config-near":"Κοντά",
"config-near-help":"Όνομα Πόλης",
"config-block":"Block",
"config-block-help":"Comma-separated site list",
"config-block-title":"Block by Title",
"config-block-title-help":"Use regex",
"config-block-url":"Block by URL",
"config-block-url-help":"Use regex",
"config-theme":"Θέμα",
"config-nojs":"Αφαίρεση Javascript σε ανώνυμη προβολή",
"config-anon-view":"Show Anonymous View Links",
"config-dark":"Dark Mode",
"config-safe":"Ασφαλής Αναζήτηση",
"config-alts":"Replace Social Media Links",
"config-alts-help":"Replaces Twitter/YouTube/etc links with privacy respecting alternatives.",
"config-new-tab":"Άνοιγμα συνδέσμου σε νέα καρτέλα",
"config-images":"Full Size Image Search",
"config-images-help":"(Experimental) Adds the 'View Image' option to desktop image searches. This will cause image result thumbnails to be lower resolution.",
"config-tor":"Χρήση Tor",
"config-get-only":"GET Requests Only",
"config-url":"Root URL",
"config-pref-url":"Preferences URL",
"config-pref-encryption":"Encrypt Preferences",
"config-pref-help":"Requires WHOOGLE_CONFIG_PREFERENCES_KEY, otherwise this will be ignored.",
"config-css":"Custom CSS",
"config-time-period":"Time Period",
"load":"Load",
"apply":"Apply",
"save-as":"Save As...",
"github-link":"View on GitHub",
"translate":"translate",
"light":"light",
"dark":"dark",
"system":"system",
"ratelimit":"Instance has been ratelimited",
"continue-search":"Continue your search with Farside",