Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit762114dcc99d4e70a0472813ff41f77e44277bb8 (patch)
Author
 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
2021-04-19 22:31:58 +0200
Committer
 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
2021-04-19 22:31:58 +0200
Files57387ef745ab5022bb34c74d304e9c32dbd7331d
goodwolf-1.1.0.tar
goodwolf-1.1.0.tar.gz
goodwolf-1.1.0.zip
Parent680ca3102df72264022babbea5003fb98d8e5189 (diff)
Parent4abd7044fda92b4d3dcb4774ff8d5f7772987b6a (diff)
Merge branch 'release-1.1' into missy for 1.1.0 v1.1.0
23 files changed, 1017 insertions, 202 deletions
-rw-r--r--.gitignore2
-rw-r--r--COPYING2
-rw-r--r--KnowledgeBase.md26
-rw-r--r--Makefile12
-rw-r--r--README.md6
-rw-r--r--badwolf.135
-rw-r--r--badwolf.c214
-rw-r--r--badwolf.h6
-rw-r--r--bookmarks.c119
-rw-r--r--bookmarks.h3
-rw-r--r--config.h3
-rw-r--r--decisions.md9
-rw-r--r--interface.css2
-rw-r--r--interface.txt1
-rw-r--r--keybindings.c6
-rw-r--r--po/de.po250
-rw-r--r--po/fr.po132
-rw-r--r--po/messages.pot117
-rw-r--r--po/pt_BR.po137
-rw-r--r--po/tr.po131
-rw-r--r--uri.c2
-rw-r--r--uri_test.c2
-rw-r--r--usr.bin.badwolf2
diff --git a/.gitignore b/.gitignore
index 0f3b962..fba98ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
/badwolf
/locale
+*.o
+*.mo
diff --git a/COPYING b/COPYING
index 6ba3f5f..ff830e0 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (c) 2019-2020, Badwolf Authors <https://hacktivis.me/projects/badwolf>
+Copyright (c) 2019-2021, Badwolf Authors <https://hacktivis.me/projects/badwolf>
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/KnowledgeBase.md b/KnowledgeBase.md
index f5f9f9a..7916732 100644
--- a/KnowledgeBase.md
+++ b/KnowledgeBase.md
@@ -2,3 +2,29 @@
- WebKit2 Extensions Tutorial: https://blogs.igalia.com/carlosgc/2013/09/10/webkit2gtk-web-process-extensions/
- https://trac.torproject.org/projects/tor/wiki/doc/ImportantGoogleChromeBugs / https://trac.torproject.org/projects/tor/ticket/1925
- https://webkit.org/blog/3476/content-blockers-first-look/
+
+# GObject Reference counting
+- `GOBJECT_DEBUG=instance-count GTK_DEBUG=interactive %command%`
+- Switch to the Statistics tab
+- Press record (top-left)
+- Do a bunch of actions, specially reversible ones
+- Stop recording
+
+Tiling window manager tip for WebKitGTK: Put the application and it's debugger on floating, leaving WebKitWebProcess ones in the back
+
+# Bookmark formats
+The different plain-text formats used by web browsers found in the wild, done
+in Augmented Backus–Naur Form (ABNF).
+
+url = *CHAR
+title = *CHAR
+
+## uzbl
+bookmark = URL TAB title [TAB tags]
+tags = *(*CHAR SP)
+
+Documenter comment: How does it manages when the separator (TAB here) is
+present in the title?
+
+## qutebrowser
+bookmark = URL SP title
diff --git a/Makefile b/Makefile
index 212ff00..2ec3a80 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# - Usage of += for appending to a variable
PACKAGE = Badwolf
-VERSION = 1.0.3
+VERSION = 1.1.0
VERSION_FULL = $(VERSION)`./version.sh`
PREFIX ?= /usr/local
@@ -15,7 +15,7 @@ DATADIR ?= $(PREFIX)/share/badwolf
APPSDIR ?= $(PREFIX)/share/applications
CC ?= cc
-CFLAGS ?= -g -Wall -Wextra -Wconversion -Wsign-conversion -O2
+CFLAGS ?= -g -O2 -pie -fPIE -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wconversion -Wsign-conversion -O2 -Werror=implicit-function-declaration -Werror=implicit-int -Werror=vla
DBG ?=
PKGCONFIG ?= pkg-config
MSGFMT ?= msgfmt
@@ -24,13 +24,13 @@ INKSCAPE ?= inkscape
# for i in 24 32 48 64 128 256; do echo icons/hicolor/${i}x${i}/apps/badwolf.png; done | tr '\n' ' '
ICON_SIZES = icons/hicolor/24x24/apps/badwolf.png icons/hicolor/32x32/apps/badwolf.png icons/hicolor/48x48/apps/badwolf.png icons/hicolor/64x64/apps/badwolf.png icons/hicolor/128x128/apps/badwolf.png icons/hicolor/256x256/apps/badwolf.png
-DEPS = gtk+-3.0 webkit2gtk-4.0 libsoup-2.4
-SRCS = uri.c uri_test.c keybindings.c downloads.c badwolf.c
-OBJS = uri.o keybindings.o downloads.o badwolf.o
+DEPS = gtk+-3.0 webkit2gtk-4.0 libsoup-2.4 libxml-2.0
+SRCS = bookmarks.c uri.c uri_test.c keybindings.c downloads.c badwolf.c
+OBJS = bookmarks.o uri.o keybindings.o downloads.o badwolf.o
OBJS_test = uri_test.o
EXE = badwolf
EXE_test = uri_test
-TRANS = fr.mo pt_BR.mo tr.mo
+TRANS = fr.mo pt_BR.mo tr.mo de.mo
DOCS = usr.bin.badwolf README.md KnowledgeBase.md interface.txt
CDEPS = -DDATADIR=\"$(DATADIR)\" -DPACKAGE=\"$(PACKAGE)\" -D_XOPEN_SOURCE=500 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION_FULL)\"
diff --git a/README.md b/README.md
index 8e868eb..d2f194b 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ Minimalist and privacy-oriented WebKitGTK+ browser.
Homepage: <https://hacktivis.me/projects/badwolf>
```
-Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
SPDX-License-Identifier: BSD-3-Clause
```
@@ -48,12 +48,14 @@ You need to have gettext installed. If you want a GUI, poedit exists and Weblate
- `*.tar.*` files are tarballs archives to be extracted with a program like `tar(1)`, GNU tar and LibArchive bsdtar are known to work.
- `*.sig` files are OpenPGP signatures done with my [key](https://hacktivis.me/key.asc)(`DDC9 237C 14CF 6F4D D847 F6B3 90D9 3ACC FEFF 61AE`).
-- `*.sign` files are minisign (OpenBSD `signify(1)` compatible) signatures, they key used for it can be found at <https://hacktivis.me/release/signify/> as well as other places (feel free to ping me to get it)
+- `*.sign` files are minisign (OpenBSD `signify(1)` compatible) signatures, they key used for it can be found at <https://hacktivis.me/releases/signify/> as well as other places (feel free to ping me to get it)
## Manual Installation
Dependencies are:
+
- C11 Compiler (such as clang or gcc)
- [WebKitGTK](https://webkitgtk.org/), only the latest stable is supported
+- [libxml-2.0](http://www.xmlsoft.org/), no known version limitation
- POSIX make with extension for shell in variables (works with GNU, {Net,Free,Open}BSD)
- A pkg-config implementation (pkgconf is recommended)
- (optionnal) gettext implementation (such as GNU Gettext)
diff --git a/badwolf.1 b/badwolf.1
index 1ee4a83..111c0cc 100644
--- a/badwolf.1
+++ b/badwolf.1
@@ -1,11 +1,11 @@
-./" BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-./" Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
-./" SPDX-License-Identifier: BSD-3-Clause
+.\" BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
+.\" Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+.\" SPDX-License-Identifier: BSD-3-Clause
.Dd 2019-10-31
.Dt BADWOLF 1
.Sh NAME
.Nm badwolf
-.Nd minimalist, privacy-oriented web browser based on WebKitGTK
+.Nd minimalist and privacy-oriented web browser based on WebKitGTK
.Sh SYNOPSIS
.Nm
.Op Ar webkit/gtk options
@@ -75,6 +75,30 @@ A more generic variable name is also intended to be used in the future.
.El
.Sh FILES
.Bl -tag -width Ds -compact
+.It Pa ${XDG_CONFIG_HOME:-$HOME/.config}/badwolf/content-filters.json
+WebKit-specific content-filter file, this allows to block unwanted content (ads, nagware, ...).
+For some introductory information about the format see:
+.Bl -compact
+.Lk https://webkit.org/blog/3476/content-blockers-first-look/
+.Lk https://webkit.org/blog/4062/targeting-domains-with-content-blockers/
+.Lk https://developer.apple.com/documentation/safariservices/creating_a_content_blocker
+.El
+.Pp
+For a converter using AblockPlus-style filters, try:
+.Lk https://gitlab.com/eyeo/adblockplus/abp2blocklist
+.Pp
+For a ready-to-use file (that you should update periodically), try:
+.Lk https://easylist-downloads.adblockplus.org/easylist_min_content_blocker.json
+.It Pa ${XDG_CACHE_HOME:-$HOME/.cache}/badwolf/filters
+This is where the compiled filters are stored, the file(s) in it are automatically generated and so shouldn't be edited.
+.It Pa ${XDG_DATA_HOME:-$HOME/.local/share}/badwolf/bookmarks.xbel
+XBEL (XML Bookmark Exchange Language) file, known to be currently supported by:
+.Xr elinks 1 ,
+.Xr konqueror 1 ,
+.Xr kbookmarkeditor 1 . Doing a symbolic link from their path works fine but you might also want to use XInclude to merge multiple XBEL files.
+.Pp
+For more information about this format see:
+.Lk http://pyxml.sourceforge.net/topics/xbel/
.It Pa ${XDG_DATA_HOME:-$HOME/.local/share}/badwolf/webkit-web-extensions/
Directory containing the
.Lk https://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebExtension.html WebKitWebExtensions
@@ -82,10 +106,7 @@ to be loaded into
.Nm . Note: They aren't the JavaScript-based Web-Extensions supported by Firefox or Chrome, but native code in shared objects using the WebKitGTK API.
.Pp
Examples of useful extensions may be found at:
-.Bl -item -compact
.Lk https://hacktivis.me/git/badwolf-extensions
-.Lk https://github.com/jun7/wyebadblock
-.El
.It Pa ${DATADIR:-/usr/local/share}/badwolf/interface.css
.It Pa ${XDG_DATA_HOME:-$HOME/.local/share}/badwolf/interface.css
CSS files (respectively system and user-level) for styling badwolf interface.
diff --git a/badwolf.c b/badwolf.c
index 5bac0a6..aea2bbc 100644
--- a/badwolf.c
+++ b/badwolf.c
@@ -1,25 +1,30 @@
// BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-// Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+// Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
// SPDX-License-Identifier: BSD-3-Clause
#include "badwolf.h"
+#include "bookmarks.h"
#include "config.h"
#include "downloads.h"
#include "keybindings.h"
#include "uri.h"
+#include <assert.h>
#include <glib/gi18n.h> /* _() and other internationalization/localization helpers */
#include <libsoup/soup.h> /* soup* */
#include <locale.h> /* LC_* */
-#include <stdio.h> /* perror(), fprintf() */
+#include <stdio.h> /* perror(), fprintf(), snprintf() */
#include <stdlib.h> /* malloc() */
#include <unistd.h> /* access() */
-gchar *web_extensions_directory;
const gchar *homepage = "https://hacktivis.me/projects/badwolf";
const gchar *version = VERSION;
+static gchar *web_extensions_directory;
+static uint64_t context_id_counter = 0;
+GtkTreeModel *bookmarks_completion_model;
+
static gboolean WebViewCb_close(WebKitWebView *webView, gpointer user_data);
static gboolean WebViewCb_web_process_terminated(WebKitWebView *webView,
WebKitWebProcessTerminationReason reason,
@@ -66,6 +71,7 @@ static void new_tabCb_clicked(GtkButton *new_tab, gpointer user_data);
static void closeCb_clicked(GtkButton *close, gpointer user_data);
static void
notebookCb_switch__page(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data);
+void content_managerCb_ready(GObject *store, GAsyncResult *result, gpointer user_data);
static gboolean
WebViewCb_close(WebKitWebView *webView, gpointer user_data)
@@ -126,10 +132,37 @@ WebViewCb_notify__uri(WebKitWebView *webView, GParamSpec *pspec, gpointer user_d
return TRUE;
}
+static char *
+fmt_context_id(uint64_t num, char *out)
+{
+ const char alpha_digits[27] = {" ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
+ char buf[66] = {'\0'};
+ int i, len = 0;
+
+ // Get 0 = 'A' instead of 0 = '' and 1 = 'A'
+ num++;
+
+ buf[len++] = ' ';
+ buf[len++] = ':';
+ do
+ {
+ buf[len++] = alpha_digits[num % 26];
+ } while(num /= 26);
+
+ for(i = 0; len > 0; i++)
+ out[i] = buf[--len];
+
+ return out;
+}
+
GtkWidget *
badwolf_new_tab_box(const gchar *title, struct Client *browser)
{
(void)browser;
+ char context_id_str[7] = "";
+
+ fmt_context_id(browser->context_id, context_id_str);
+
GtkWidget *tab_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_name(tab_box, "browser__tabbox");
GtkWidget *close =
@@ -137,6 +170,8 @@ badwolf_new_tab_box(const gchar *title, struct Client *browser)
gtk_widget_set_name(close, "browser__tabbox__close");
GtkWidget *label = gtk_label_new(title);
gtk_widget_set_name(label, "browser__tabbox__label");
+ GtkWidget *context_label = gtk_label_new(context_id_str);
+ gtk_widget_set_name(context_label, "browser__tabbox__context_label");
GtkWidget *playing =
gtk_image_new_from_icon_name("audio-volume-high-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_widget_set_name(playing, "browser__tabbox__playing");
@@ -151,7 +186,9 @@ badwolf_new_tab_box(const gchar *title, struct Client *browser)
gtk_label_set_ellipsize(GTK_LABEL(label), BADWOLF_TAB_LABEL_ELLIPSIZE);
gtk_label_set_single_line_mode(GTK_LABEL(label), TRUE);
+ gtk_label_set_single_line_mode(GTK_LABEL(context_label), TRUE);
+ gtk_box_pack_start(GTK_BOX(tab_box), context_label, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(tab_box), playing, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tab_box), label, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(tab_box), close, FALSE, FALSE, 0);
@@ -280,10 +317,15 @@ WebViewCb_create(WebKitWebView *related_web_view,
gpointer user_data)
{
(void)navigation_action;
- struct Window *window = (struct Window *)user_data;
- struct Client *browser = new_browser(window, NULL, related_web_view);
+ struct Client *old_browser = (struct Client *)user_data;
+ struct Client *browser = NULL;
+
+ // shouldn't be needed but better be safe
+ old_browser->webView = related_web_view;
- if(badwolf_new_tab(GTK_NOTEBOOK(window->notebook), browser, FALSE) < 0)
+ browser = new_browser(old_browser->window, NULL, old_browser);
+
+ if(badwolf_new_tab(GTK_NOTEBOOK(old_browser->window->notebook), browser, FALSE) < 0)
return NULL;
else
return browser->webView;
@@ -423,7 +465,9 @@ web_contextCb_download_started(WebKitWebContext *web_context,
{
(void)web_context;
struct Client *browser = (struct Client *)user_data;
- struct Download *download = malloc(sizeof(struct Client));
+ struct Download *download = malloc(sizeof(struct Download));
+
+ assert(webkit_download);
if(download != NULL)
{
@@ -515,7 +559,7 @@ printCb_clicked(GtkButton *print, gpointer user_data)
WebKitPrintOperation *print_operation = webkit_print_operation_new(browser->webView);
- webkit_print_operation_run_dialog(print_operation, GTK_WINDOW(browser->window));
+ webkit_print_operation_run_dialog(print_operation, GTK_WINDOW(browser->window->main_window));
}
static gboolean
@@ -577,16 +621,19 @@ widgetCb_drop_button3_event(GtkWidget *widget, GdkEvent *event, gpointer user_da
}
struct Client *
-new_browser(struct Window *window, const gchar *target_url, WebKitWebView *related_web_view)
+new_browser(struct Window *window, const gchar *target_url, struct Client *old_browser)
{
struct Client *browser = malloc(sizeof(struct Client));
- target_url = badwolf_ensure_uri_scheme(target_url, (related_web_view == NULL));
+ target_url = badwolf_ensure_uri_scheme(target_url, (old_browser == NULL));
char *badwolf_l10n = NULL;
+ WebKitWebContext *web_context;
+
if(browser == NULL) return NULL;
- browser->window = window;
- browser->box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ browser->window = window;
+ browser->context_id = old_browser == NULL ? context_id_counter++ : old_browser->context_id;
+ browser->box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_name(browser->box, "browser__box");
browser->toolbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
@@ -625,14 +672,27 @@ new_browser(struct Window *window, const gchar *target_url, WebKitWebView *relat
browser->statuslabel = gtk_label_new(NULL);
gtk_widget_set_name(browser->statuslabel, "browser__statuslabel");
- setenv("GTK_THEME", ":light", 0);
+ if(old_browser == NULL)
+ {
+ WebKitWebsiteDataManager *website_data_manager = webkit_website_data_manager_new_ephemeral();
+ webkit_website_data_manager_set_itp_enabled(website_data_manager, TRUE);
- WebKitWebContext *web_context = webkit_web_context_new_ephemeral();
- webkit_web_context_set_sandbox_enabled(web_context, TRUE);
- webkit_web_context_set_process_model(web_context,
- WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
+ web_context = webkit_web_context_new_with_website_data_manager(website_data_manager);
+ g_object_unref(website_data_manager);
+ webkit_web_context_set_sandbox_enabled(web_context, TRUE);
+ webkit_web_context_set_process_model(web_context,
+ WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
+ webkit_web_context_set_web_extensions_directory(web_context, web_extensions_directory);
- webkit_web_context_set_web_extensions_directory(web_context, web_extensions_directory);
+ g_signal_connect(G_OBJECT(web_context),
+ "download-started",
+ G_CALLBACK(web_contextCb_download_started),
+ browser);
+ }
+ else
+ {
+ web_context = webkit_web_view_get_context(old_browser->webView);
+ }
badwolf_l10n = getenv("BADWOLF_L10N");
@@ -656,12 +716,17 @@ new_browser(struct Window *window, const gchar *target_url, WebKitWebView *relat
"web-context",
web_context,
"related-view",
- related_web_view,
+ old_browser == NULL ? NULL : old_browser->webView,
"settings",
settings,
+ "user-content-manager",
+ window->content_manager,
NULL));
gtk_widget_set_name(GTK_WIDGET(browser->webView), "browser__webView");
- g_object_unref(web_context);
+ if(old_browser == NULL)
+ {
+ g_object_unref(web_context);
+ }
g_object_unref(settings);
gtk_box_pack_start(
@@ -720,6 +785,15 @@ new_browser(struct Window *window, const gchar *target_url, WebKitWebView *relat
gtk_label_set_single_line_mode(GTK_LABEL(browser->statuslabel), TRUE);
gtk_label_set_ellipsize(GTK_LABEL(browser->statuslabel), BADWOLF_STATUSLABEL_ELLIPSIZE);
+ if(bookmarks_completion_model != NULL)
+ {
+ GtkEntryCompletion *location_completion = gtk_entry_completion_new();
+ GtkTreeModel *location_completion_model = bookmarks_completion_model;
+
+ bookmarks_completion_setup(location_completion, location_completion_model);
+ gtk_entry_set_completion(GTK_ENTRY(browser->location), location_completion);
+ }
+
gtk_entry_set_text(GTK_ENTRY(browser->location), target_url);
gtk_entry_set_input_purpose(GTK_ENTRY(browser->location), GTK_INPUT_PURPOSE_URL);
@@ -787,7 +861,7 @@ new_browser(struct Window *window, const gchar *target_url, WebKitWebView *relat
"notify::estimated-load-progress",
G_CALLBACK(WebViewCb_notify__estimated_load_progress),
browser);
- g_signal_connect(browser->webView, "create", G_CALLBACK(WebViewCb_create), window);
+ g_signal_connect(browser->webView, "create", G_CALLBACK(WebViewCb_create), browser);
g_signal_connect(browser->webView, "close", G_CALLBACK(WebViewCb_close), browser);
g_signal_connect(
browser->webView, "key-press-event", G_CALLBACK(WebViewCb_key_press_event), browser);
@@ -801,12 +875,6 @@ new_browser(struct Window *window, const gchar *target_url, WebKitWebView *relat
browser);
g_signal_connect(browser->webView, "load-changed", G_CALLBACK(WebViewCb_load_changed), browser);
- /* signals for WebView's WebContext */
- g_signal_connect(G_OBJECT(web_context),
- "download-started",
- G_CALLBACK(web_contextCb_download_started),
- browser);
-
/* signals for search widget */
g_signal_connect(browser->search, "next-match", G_CALLBACK(SearchEntryCb_next__match), browser);
g_signal_connect(
@@ -818,7 +886,7 @@ new_browser(struct Window *window, const gchar *target_url, WebKitWebView *relat
/* signals for box container */
g_signal_connect(browser->box, "key-press-event", G_CALLBACK(boxCb_key_press_event), browser);
- if(related_web_view == NULL) webkit_web_view_load_uri(browser->webView, target_url);
+ if(old_browser == NULL) webkit_web_view_load_uri(browser->webView, target_url);
return browser;
}
@@ -887,10 +955,75 @@ notebookCb_switch__page(GtkNotebook *notebook, GtkWidget *page, guint page_num,
gtk_window_set_title(GTK_WINDOW(window->main_window), gtk_widget_get_tooltip_text(label));
}
+void
+content_managerCb_ready(GObject *store, GAsyncResult *result, gpointer user_data)
+{
+ (void)store;
+ struct Window *window = (struct Window *)user_data;
+ GError *err = NULL;
+
+ WebKitUserContentFilter *filter =
+ webkit_user_content_filter_store_load_finish(window->content_store, result, &err);
+
+ if(filter == NULL)
+ {
+ if(err == NULL)
+ {
+ fprintf(stderr, _("badwolf: failed to load content-filter, err: [%d] %s\n"), -1, "unknown");
+ }
+ else
+ {
+ fprintf(stderr,
+ _("badwolf: failed to load content-filter, err: [%d] %s\n"),
+ err->code,
+ err->message);
+ }
+ }
+ else
+ {
+ fprintf(stderr, _("badwolf: content-filter loaded, adding to content-manager…\n"));
+ webkit_user_content_manager_add_filter(window->content_manager, filter);
+ }
+}
+
+static void
+storeCb_finish(WebKitUserContentFilterStore *store, GAsyncResult *result, gpointer user_data)
+{
+ (void)store;
+ struct Window *window = (struct Window *)user_data;
+ GError *err = NULL;
+
+ WebKitUserContentFilter *filter =
+ webkit_user_content_filter_store_save_finish(window->content_store, result, &err);
+
+ if(filter == NULL)
+ {
+ if(err == NULL)
+ {
+ fprintf(stderr,
+ _("badwolf: failed to compile content-filters.json, err: [%d] %s\n"),
+ -1,
+ "unknown");
+ }
+ else
+ {
+ fprintf(stderr,
+ _("badwolf: failed to compile content-filters.json, err: [%d] %s\n"),
+ err->code,
+ err->message);
+ }
+ }
+ else
+ {
+ webkit_user_content_filter_store_load(
+ window->content_store, "a", NULL, content_managerCb_ready, window);
+ }
+}
+
int
main(int argc, char *argv[])
{
- struct Window *window = &(struct Window){NULL, NULL, NULL, NULL};
+ struct Window *window = &(struct Window){NULL, NULL, NULL, NULL, NULL, NULL};
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, DATADIR "/locale");
bind_textdomain_codeset(PACKAGE, "UTF-8");
@@ -914,10 +1047,29 @@ main(int argc, char *argv[])
g_build_filename(g_get_user_data_dir(), "badwolf", "webkit-web-extension", NULL);
fprintf(stderr, _("webkit-web-extension directory set to: %s\n"), web_extensions_directory);
+ bookmarks_completion_model = bookmarks_completion_init();
+ g_object_ref(bookmarks_completion_model);
+
window->main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window->notebook = gtk_notebook_new();
window->new_tab = gtk_button_new_from_icon_name("tab-new-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
- window->downloads_tab = badwolf_downloads_tab_new();
+ window->downloads_tab = badwolf_downloads_tab_new();
+ window->content_manager = webkit_user_content_manager_new();
+
+ gchar *contentFilterPath =
+ g_build_filename(g_get_user_config_dir(), g_get_prgname(), "content-filters.json", NULL);
+ GFile *contentFilterFile = g_file_new_for_path(contentFilterPath);
+ fprintf(stderr, _("content-filters file set to: %s\n"), contentFilterPath);
+
+ gchar *filtersPath = g_build_filename(g_get_user_cache_dir(), g_get_prgname(), "filters", NULL);
+ window->content_store = webkit_user_content_filter_store_new(filtersPath);
+
+ webkit_user_content_filter_store_save_from_file(window->content_store,
+ "a",
+ contentFilterFile,
+ NULL,
+ (GAsyncReadyCallback)storeCb_finish,
+ window);
gtk_window_set_default_size(
GTK_WINDOW(window->main_window), BADWOLF_DEFAULT_WIDTH, BADWOLF_DEFAULT_HEIGHT);
@@ -981,6 +1133,8 @@ main(int argc, char *argv[])
gtk_main();
+ g_object_unref(bookmarks_completion_model);
+
#if 0
/* TRANSLATOR Ignore this entry. Done for forcing Unicode in xgettext. */
_("ø");
diff --git a/badwolf.h b/badwolf.h
index 3d9b7f4..7919be8 100644
--- a/badwolf.h
+++ b/badwolf.h
@@ -2,6 +2,7 @@
#define BADWOLF_H_INCLUDED
#include <gtk/gtk.h>
+#include <inttypes.h> /* uint64_t */
#include <webkit2/webkit2.h>
extern const gchar *homepage;
@@ -13,6 +14,8 @@ struct Window
GtkWidget *notebook;
GtkWidget *new_tab;
GtkWidget *downloads_tab;
+ WebKitUserContentManager *content_manager;
+ WebKitUserContentFilterStore *content_store;
};
struct Client
@@ -26,6 +29,7 @@ struct Client
GtkWidget *auto_load_images;
GtkWidget *location;
+ uint64_t context_id;
WebKitWebView *webView;
struct Window *window;
@@ -37,7 +41,7 @@ struct Client
GtkWidget *badwolf_new_tab_box(const gchar *title, struct Client *browser);
void webView_tab_label_change(struct Client *browser, const gchar *title);
struct Client *
-new_browser(struct Window *window, const gchar *target_url, WebKitWebView *related_web_view);
+new_browser(struct Window *window, const gchar *target_url, struct Client *old_browser);
int badwolf_new_tab(GtkNotebook *notebook, struct Client *browser, bool auto_switch);
gint badwolf_get_tab_position(GtkContainer *notebook, GtkWidget *child);
#endif /* BADWOLF_H_INCLUDED */
diff --git a/bookmarks.c b/bookmarks.c
new file mode 100644
index 0000000..2a6df22
--- /dev/null
+++ b/bookmarks.c
@@ -0,0 +1,119 @@
+#include "bookmarks.h"
+
+#include "badwolf.h"
+#include "config.h"
+
+#include <glib/gi18n.h> /* _() and other internationalization/localization helpers */
+#include <glib/gprintf.h> /* g_fprintf() */
+#include <gtk/gtk.h>
+#include <libxml/xinclude.h>
+#include <libxml/xpath.h>
+#include <unistd.h> /* access() */
+
+static gboolean
+location_completion_matches(GtkEntryCompletion *completion,
+ const gchar *key,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ (void)user_data;
+ gchar *buffer;
+ gchar *pattern;
+ gboolean result;
+
+ pattern = g_strdup_printf("*%s*", key);
+
+ gtk_tree_model_get(gtk_entry_completion_get_model(completion), iter, 0, &buffer, -1);
+ result = g_pattern_match_simple(pattern, buffer);
+
+ g_free(buffer);
+ g_free(pattern);
+ return result;
+}
+
+void
+bookmarks_completion_setup(GtkEntryCompletion *location_completion, GtkTreeModel *tree_model)
+{
+ gtk_entry_completion_set_model(location_completion, tree_model);
+ gtk_entry_completion_set_text_column(location_completion, 0);
+ gtk_entry_completion_set_match_func(location_completion, location_completion_matches, NULL, NULL);
+ gtk_entry_completion_set_inline_selection(location_completion, BADWOLF_LOCATION_INLINE_SELECTION);
+}
+
+static void
+location_completion_cleanup(xmlXPathObjectPtr xpathObj, xmlXPathContextPtr xpathCtx, xmlDocPtr doc)
+{
+ if(xpathObj != NULL) xmlXPathFreeObject(xpathObj);
+ if(xpathCtx != NULL) xmlXPathFreeContext(xpathCtx);
+ if(doc != NULL) xmlFreeDoc(doc);
+}
+
+static void
+load_xpath_results(GtkListStore *list_store, xmlNodeSetPtr nodes)
+{
+ GtkTreeIter iter;
+ int size;
+
+ size = (nodes) ? nodes->nodeNr : 0;
+
+ g_fprintf(stderr, _("Bookmarks: Found %d bookmarks.\n"), size);
+ for(int i = 0; i < size; i++)
+ if(nodes->nodeTab[i])
+ {
+ gtk_list_store_append(list_store, &iter);
+ gtk_list_store_set(
+ list_store, &iter, 0, (char *)xmlXPathCastNodeToString(nodes->nodeTab[i]), -1);
+ }
+}
+
+GtkTreeModel *
+bookmarks_completion_init()
+{
+ const xmlChar *xpathExpr = (const xmlChar *)"//bookmark/@href";
+ char *filename = g_build_filename(g_get_user_data_dir(), "badwolf", "bookmarks.xbel", NULL);
+ xmlDocPtr doc = NULL;
+ xmlXPathContextPtr xpathCtx = NULL;
+ xmlXPathObjectPtr xpathObj = NULL;
+ GtkListStore *list_store = gtk_list_store_new(1, G_TYPE_STRING);
+
+ if(access(filename, R_OK) != 0)
+ {
+ g_fprintf(stderr, _("Bookmarks: No loadable file found at %s\n"), filename);
+ return NULL;
+ }
+
+ g_fprintf(stderr, _("Bookmarks: loading at %s\n"), filename);
+ doc = xmlParseFile(filename);
+ if(doc == NULL)
+ {
+ g_fprintf(stderr, _("Bookmarks: unable to parse file \"%s\"\n"), filename);
+ location_completion_cleanup(xpathObj, xpathCtx, doc);
+ return NULL;
+ }
+
+ xmlXIncludeProcess(doc);
+
+ xpathCtx = xmlXPathNewContext(doc);
+ if(xpathCtx == NULL)
+ {
+ g_fprintf(stderr, _("Bookmarks: unable to create new XPath context\n"));
+ location_completion_cleanup(xpathObj, xpathCtx, doc);
+ return NULL;
+ }
+
+ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
+ if(xpathObj == NULL)
+ {
+ g_fprintf(stderr, _("Bookmarks: unable to evaluate XPath expression \"%s\"\n"), xpathExpr);
+ location_completion_cleanup(xpathObj, xpathCtx, doc);
+ return NULL;
+ }
+
+ load_xpath_results(list_store, xpathObj->nodesetval);
+
+ location_completion_cleanup(xpathObj, xpathCtx, doc);
+
+ g_fprintf(stderr, _("Bookmarks: Done.\n"));
+
+ return GTK_TREE_MODEL(list_store);
+}
diff --git a/bookmarks.h b/bookmarks.h
new file mode 100644
index 0000000..29bd553
--- /dev/null
+++ b/bookmarks.h
@@ -0,0 +1,3 @@
+#include <gtk/gtk.h>
+GtkTreeModel *bookmarks_completion_init();
+void bookmarks_completion_setup(GtkEntryCompletion *location_completion, GtkTreeModel *tree_model);
diff --git a/config.h b/config.h
index 8426ce3..6bd76df 100644
--- a/config.h
+++ b/config.h
@@ -104,4 +104,7 @@
*/
#define BADWOLF_DOWNLOAD_FILE_PATH_ELLIPSIZE PANGO_ELLIPSIZE_MIDDLE
+// BADWOLF_LOCATION_INLINE_SELECTION: show selected completion as a selection in location entry
+#define BADWOLF_LOCATION_INLINE_SELECTION TRUE
+
#endif /* CONFIG_H_INCLUDED */
diff --git a/decisions.md b/decisions.md
index cc8ab5c..7e254ad 100644
--- a/decisions.md
+++ b/decisions.md
@@ -5,6 +5,15 @@ Bascially, the idea is to have a file in your projects repo, where you record
the decisions you make over the course of the project's lifetime.
Rewriting history will not be done but Post-Scriptum notices will.
+## 2020-10-22 : Mark the context_id as A-Z instead of Hex
+The way I did it at first was to use the hexadecimal representation, but as it starts from 0 there could be confusions with a shortcut hint for alt-n, there could still be confusion with some kind of tab numbering but with a bit of usage it's hopefully going to be obvious.
+
+## 2020-07-04 : Automatically switch to a user-created tab / Breaking the UI
+I got pointed out that when creating a new tab the user has to needlessly switch to it while it could be done when they request it.
+I also decided to still release it in a point release, so without bump of Major because while it does changes the behavior it doesn't break the associated meaning, while this would be a breaking change for an API I could take it as a minor adjustment in a user-interface.
+
+Note: This would be an API if user-interface interactions could be scripted (like in HaikuOS) but I'm not aware of people actually doing this one with GTK programs.
+
## 2020-02-04 & 2020-02-09 : Use BSD extensions in the Makefile
The BSD extensions += and ?= for variable extension is used to avoid having to explicitely pass a list of variables to make, thus making build recipies simpler.
They are also compatible with GNU make so portability shouldn't have significantly dropped.
diff --git a/interface.css b/interface.css
index d7272bf..170097e 100644
--- a/interface.css
+++ b/interface.css
@@ -1,2 +1,2 @@
-#browser__location, #browser__statuslabel { font-family: monospace; }
+#browser__location, #browser__statuslabel, #browser__tabbox__context_label { font-family: monospace; }
button:checked label { font-weight: bold; }
diff --git a/interface.txt b/interface.txt
index 76d9526..42f7f5c 100644
--- a/interface.txt
+++ b/interface.txt
@@ -3,6 +3,7 @@
- Each tab contains a Browser View or the Downloads View
## Tab Labels
+- An A-Z represented number identifying the webkit process context
- An icon to indicate if a media is playing
- The title of the web view
- A close button
diff --git a/keybindings.c b/keybindings.c
index ef33aaa..bfc8f7a 100644
--- a/keybindings.c
+++ b/keybindings.c
@@ -1,5 +1,5 @@
// BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-// Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+// Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
// SPDX-License-Identifier: BSD-3-Clause
#include "keybindings.h"
@@ -29,7 +29,7 @@ badwolf_about_dialog(GtkWindow *main_window, gpointer user_data)
char *comments = NULL;
- comments = g_strdup_printf(_("Minimalist and privacy-oriented WebKitGTK+ browser\n"
+ comments = g_strdup_printf(_("Minimalist and privacy-oriented web browser based on WebKitGTK\n"
"Runtime WebKit version: %d.%d.%d"),
webkit_get_major_version(),
webkit_get_minor_version(),
@@ -42,7 +42,7 @@ badwolf_about_dialog(GtkWindow *main_window, gpointer user_data)
"SPDX-License-Identifier: BSD-3-Clause");
gtk_about_dialog_set_copyright(
GTK_ABOUT_DIALOG(about_dialog),
- "2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>");
+ "2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>");
gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog), homepage);
gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about_dialog), comments);
gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about_dialog), version);
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..9660b70
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,250 @@
+# German translations for Badwolf package.
+# Copyright (C) 2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+# This file is distributed under the same license as the Badwolf package.
+# Ben K. <ben-k@tutanota.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Badwolf 1.0.3+g1b10b33.develop\n"
+"Report-Msgid-Bugs-To: contact+badwolf-msgid@hacktivis.me\n"
+"POT-Creation-Date: 2021-04-11 14:10+0200\n"
+"PO-Revision-Date: 2021-04-11 14:32+0200\n"
+"Last-Translator: Ben K. <ben-k@tutanota.com>\n"
+"Language-Team: German\n"
+"Language: de\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: Poedit 2.4.2\n"
+
+#: downloads.c:117
+#, c-format
+msgid "%02i:%02i:%02i Download cancelled"
+msgstr "%02i:%02i:%02i Herunterladen abgebrochen"
+
+#: downloads.c:119
+#, c-format
+msgid "%02i:%02i:%02i Download error"
+msgstr "%02i:%02i:%02i Herunterladen fehlgeschlagen"
+
+#: downloads.c:141
+#, c-format
+msgid "%02i:%02i:%02i Download finished"
+msgstr "%02i:%02i:%02i Fertig Heruntergeladen"
+
+#: downloads.c:167
+#, c-format
+msgid "%02i:%02i:%02i Downloading…"
+msgstr "%02i:%02i:%02i Lade herunter…"
+
+#: downloads.c:199 downloads.c:216 downloads.c:219
+msgid "Badwolf Downloads"
+msgstr "Heruntergeladene Dateien"
+
+#: bookmarks.c:116
+msgid "Bookmarks: Done.\n"
+msgstr "Lesezeichen: Erledigt. \n"
+
+#: bookmarks.c:59
+#, c-format
+msgid "Bookmarks: Found %d bookmarks.\n"
+msgstr "Lesezeichen: %d Lesezeichen gefunden. \n"
+
+#: bookmarks.c:81
+#, c-format
+msgid "Bookmarks: No loadable file found at %s\n"
+msgstr "Lesezeichen: Keine ladbare Datei unter %s gefunden\n"
+
+#: bookmarks.c:85
+#, c-format
+msgid "Bookmarks: loading at %s\n"
+msgstr "Lesezeichen: %s geladen\n"
+
+#: bookmarks.c:99
+#, fuzzy
+msgid "Bookmarks: unable to create new XPath context\n"
+msgstr "Lesezeichen: Kein neuer XPath-Kontext konnte erstellen werden\n"
+
+#: bookmarks.c:107
+#, fuzzy, c-format
+msgid "Bookmarks: unable to evaluate XPath expression \"%s\"\n"
+msgstr ""
+"Leisezeichen: Der XPath-Ausdruck \"%s\" konnte nicht ausgewertet werden\n"
+
+#: bookmarks.c:89
+#, c-format
+msgid "Bookmarks: unable to parse file \"%s\"\n"
+msgstr "Lesezeichen: Die Datei \"%s\" konnte nicht geparst werden\n"
+
+#: badwolf.c:1036
+#, fuzzy, c-format
+msgid "Buildtime WebKit version: %d.%d.%d\n"
+msgstr "Buildtime WebKit version: %d.%d.%d\n"
+
+#: badwolf.c:441
+msgid "Continue"
+msgstr "Weiter"
+
+#: badwolf.c:391
+msgid ""
+"Couldn't verify the TLS certificate to ensure a better security of the "
+"connection. You might want to verify your machine and network.\n"
+"\n"
+msgstr ""
+"Das TLS-Zertifikat konnte nicht verifiziert werden, um eine bessere "
+"Sicherheit der Verbindung sicherzustellen. Sie möchten vielleicht ihr Gerät "
+"und ihr Netzwerk überprüfen. \n"
+
+#: badwolf.c:101
+msgid "Crashed"
+msgstr "Abgestürtzt"
+
+#: downloads.c:39
+msgid "Download starting…"
+msgstr "Download startet…"
+
+#: badwolf.c:414
+msgid "Error: Some unknown error occurred validating the certificate.\n"
+msgstr ""
+"Fehler: Es ist ein unbekannter Fehler beim überprüfen des Zertifikats "
+"aufgetreten.\n"
+
+#: badwolf.c:395
+#, fuzzy
+msgid "Error: The X509 Certificate Authority is unknown.\n"
+msgstr "Fehler: Die X509 Zertifikatsautorität ist unbekannt.\n"
+
+#: badwolf.c:408
+#, fuzzy
+msgid "Error: The certificate has been revoked.\n"
+msgstr "Fehler: Das Zertifikat wurde widerrufen.\n"
+
+#: badwolf.c:405
+msgid "Error: The certificate has expired. Check your system's clock.\n"
+msgstr ""
+"Fehler: Das Zertifikat ist abgelaufen. Bitte überprüfen Sie, ob die Uhr "
+"ihres Systems richtig eingestellt ist.\n"
+
+#: badwolf.c:411
+msgid "Error: The certificate is considered to be insecure.\n"
+msgstr "Fehler: Das Zertifikat wird als unsicher angesehen.\n"
+
+#: badwolf.c:402
+msgid "Error: The certificate isn't valid yet. Check your system's clock.\n"
+msgstr ""
+"Fehler: Das Zertifikat ist noch nicht gültig. Bitte überprüfen Sie, ob die "
+"Uhr ihres Systems richtig eingestellt ist.\n"
+
+#: badwolf.c:398
+msgid "Error: The given identity doesn't match the expected one.\n"
+msgstr ""
+"Fehler: Die gegebene Identität passt nicht mit der Erwarteten zusammen.\n"
+
+#: keybindings.c:32
+#, c-format
+msgid ""
+"Minimalist and privacy-oriented web browser based on WebKitGTK\n"
+"Runtime WebKit version: %d.%d.%d"
+msgstr ""
+"Minimalistischer und Privatsphäre-orientierter Internetbrowser basierend of "
+"WebKitGTK\n"
+"Runtime WebKit version: %d.%d.%d"
+
+#: badwolf.c:906
+msgid "New tab"
+msgstr "Neuer Reiter"
+
+#: badwolf.c:1104
+msgid "Open new tab"
+msgstr "Neuen Reiter öffnen"
+
+#: badwolf.c:105
+msgid "Out of Memory"
+msgstr "Ihnen scheint der Arbeitsspeicher ausgegangen zu sein! (Out of Memory)"
+
+#: badwolf.c:1034
+#, c-format
+msgid "Running Badwolf version: %s\n"
+msgstr "Ausführende Badwolf-Version: %s\n"
+
+#: badwolf.c:1041
+#, c-format
+msgid "Runtime WebKit version: %d.%d.%d\n"
+msgstr "Ausführende WebKit-Version: %d.%d.%d\n"
+
+#: badwolf.c:438
+#, c-format
+msgid "TLS Error for %s."
+msgstr "TLS-Fehler für %s."
+
+#: badwolf.c:441
+msgid "Temporarily Add Exception"
+msgstr "Eine Ausnahme machen"
+
+#: badwolf.c:653
+msgid "Toggle javascript"
+msgstr "JavaScript ein-/ausschalten"
+
+#: badwolf.c:658
+msgid "Toggle loading images automatically"
+msgstr "Das automatische Laden von Bildern ein-/ausschalten"
+
+#: badwolf.c:109
+msgid "Unknown Crash"
+msgstr "Unbekannter Absturz"
+
+#: badwolf.c:656
+msgid "_IMG"
+msgstr "_IMG"
+
+#: badwolf.c:651
+msgid "_JS"
+msgstr "_JS"
+
+#: badwolf.c:984
+#, fuzzy, c-format
+msgid "badwolf: content-filter loaded, adding to content-manager…\n"
+msgstr "badwolf: Inhaltsfilter wurde geladen, füge zum Inhaltsmanager hinzu…\n"
+
+#: badwolf.c:1004 badwolf.c:1011
+#, c-format
+msgid "badwolf: failed to compile content-filters.json, err: [%d] %s\n"
+msgstr ""
+"badwolf: kompilieren von content-filters.json fehlgeschlagen, err: [%d] %s\n"
+
+#: badwolf.c:972 badwolf.c:977
+#, fuzzy, c-format
+msgid "badwolf: failed to load content-filter, err: [%d] %s\n"
+msgstr "badwolf: konnte Inhaltsfilter nicht laden, err: [%d] %s\n"
+
+#: badwolf.c:1062
+#, c-format
+msgid "content-filters file set to: %s\n"
+msgstr "Inhaltsfilter-Datei wurde gesetzt auf: %s\n"
+
+#: badwolf.c:800
+msgid "search in current page"
+msgstr "Die aktuelle Seite durchsuchen"
+
+#: badwolf.c:100
+msgid "the web process crashed.\n"
+msgstr "Der Webprozess ist abgestürzt.\n"
+
+#: badwolf.c:104
+msgid "the web process exceeded the memory limit.\n"
+msgstr "Der Webprozess hat das Arbeitsspeicherlimit überschritten.\n"
+
+#: badwolf.c:108
+msgid "the web process terminated for an unknown reason.\n"
+msgstr "Der Webprozess wurde aus unbekannten Gründen beendet.\n"
+
+#: badwolf.c:1048
+#, fuzzy, c-format
+msgid "webkit-web-extension directory set to: %s\n"
+msgstr "Das WebKit-Web-Erweiterungs-Verzeichnis wurde gesetzt auf: %s\n"
+
+#. TRANSLATOR Ignore this entry. Done for forcing Unicode in xgettext.
+#: badwolf.c:1140
+msgid "ø"
+msgstr "ø"
diff --git a/po/fr.po b/po/fr.po
index d41f044..58d386a 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,5 +1,5 @@
# BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-# Copyright (C) 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+# Copyright (C) 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
# This file is distributed under the same license as the Badwolf package.
# Haelwenn (lanodan) Monnier <contact@hacktivis.me>, 2019
#
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Badwolf 0.3.0+gd88f2e7\n"
"Report-Msgid-Bugs-To: contact+badwolf-msgid@hacktivis.me\n"
-"POT-Creation-Date: 2020-05-15 06:00+0200\n"
-"PO-Revision-Date: 2019-12-22 00:57+0100\n"
+"POT-Creation-Date: 2021-04-10 18:43+0200\n"
+"PO-Revision-Date: 2021-04-10 18:43+0200\n"
"Last-Translator: Haelwenn (lanodan) Monnier <contact@hacktivis.me>\n"
"Language-Team: French\n"
"Language: fr\n"
@@ -18,17 +18,17 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: downloads.c:117
-#, fuzzy, c-format
+#, c-format
msgid "%02i:%02i:%02i Download cancelled"
msgstr "%02i:%02i:%02i Téléchargement annulé"
#: downloads.c:119
-#, fuzzy, c-format
+#, c-format
msgid "%02i:%02i:%02i Download error"
msgstr "%02i:%02i:%02i Erreur du téléchargement"
#: downloads.c:141
-#, fuzzy, c-format
+#, c-format
msgid "%02i:%02i:%02i Download finished"
msgstr "%02i:%02i:%02i Téléchargement finit"
@@ -37,20 +37,53 @@ msgstr "%02i:%02i:%02i Téléchargement finit"
msgid "%02i:%02i:%02i Downloading…"
msgstr "%02i:%02i:%02i Téléchargement en cours…"
-#: downloads.c:195 downloads.c:212 downloads.c:215
+#: downloads.c:199 downloads.c:216 downloads.c:219
msgid "Badwolf Downloads"
msgstr "Téléchargements Badwolf"
-#: badwolf.c:861
+#: bookmarks.c:116
+msgid "Bookmarks: Done.\n"
+msgstr "Marque-Pages: Terminé.\n"
+
+#: bookmarks.c:59
+#, c-format
+msgid "Bookmarks: Found %d bookmarks.\n"
+msgstr "Marque-Pages: %d marque-pages trouvés.\n"
+
+#: bookmarks.c:81
+#, c-format
+msgid "Bookmarks: No loadable file found at %s\n"
+msgstr "Marques-Pages: Aucun fichier chargeable trouvé à %s\n"
+
+#: bookmarks.c:85
+#, c-format
+msgid "Bookmarks: loading at %s\n"
+msgstr "Marques-Pages: chargement à %s\n"
+
+#: bookmarks.c:99
+msgid "Bookmarks: unable to create new XPath context\n"
+msgstr "Marques-Pages: Échec à la création du contexte XPath\n"
+
+#: bookmarks.c:107
+#, c-format
+msgid "Bookmarks: unable to evaluate XPath expression \"%s\"\n"
+msgstr "Marques-Pages: Échec à l'évaluation de l'expression XPath « %s »\n"
+
+#: bookmarks.c:89
+#, c-format
+msgid "Bookmarks: unable to parse file \"%s\"\n"
+msgstr "Marques-Pages: Ëchec au parsage du fichier « %s »\n"
+
+#: badwolf.c:1036
#, c-format
msgid "Buildtime WebKit version: %d.%d.%d\n"
msgstr "Version WebKit à la compilation: %d.%d.%d\n"
-#: badwolf.c:391
+#: badwolf.c:441
msgid "Continue"
msgstr "Continuer"
-#: badwolf.c:341
+#: badwolf.c:391
msgid ""
"Couldn't verify the TLS certificate to ensure a better security of the "
"connection. You might want to verify your machine and network.\n"
@@ -61,7 +94,7 @@ msgstr ""
"et son réseau.\n"
"\n"
-#: badwolf.c:98
+#: badwolf.c:101
msgid "Crashed"
msgstr "Crash"
@@ -69,119 +102,138 @@ msgstr "Crash"
msgid "Download starting…"
msgstr "Démarrage du téléchargement"
-#: badwolf.c:364
+#: badwolf.c:414
msgid "Error: Some unknown error occurred validating the certificate.\n"
msgstr ""
"Erreur : Une erreur inconnue est apparue pendant la validation du "
"certificat.\n"
-#: badwolf.c:345
+#: badwolf.c:395
msgid "Error: The X509 Certificate Authority is unknown.\n"
msgstr "Erreur : L'autorité de certification (CA X509) est inconnue.\n"
-#: badwolf.c:358
+#: badwolf.c:408
msgid "Error: The certificate has been revoked.\n"
msgstr "Erreur : Le certificat à été révoqué.\n"
-#: badwolf.c:355
+#: badwolf.c:405
msgid "Error: The certificate has expired. Check your system's clock.\n"
msgstr "Erreur : Le certificat a expiré.\n"
-#: badwolf.c:361
+#: badwolf.c:411
msgid "Error: The certificate is considered to be insecure.\n"
msgstr "Erreur : Le certificat est considéré comme non-sécurisé.\n"
-#: badwolf.c:352
+#: badwolf.c:402
msgid "Error: The certificate isn't valid yet. Check your system's clock.\n"
msgstr "Erreur : Le certificat n'est pas encore valide.\n"
-#: badwolf.c:348
+#: badwolf.c:398
msgid "Error: The given identity doesn't match the expected one.\n"
msgstr "Erreur : L'identité ne correspond pas à celle attendue.\n"
#: keybindings.c:32
#, c-format
msgid ""
-"Minimalist and privacy-oriented WebKitGTK+ browser\n"
+"Minimalist and privacy-oriented web browser based on WebKitGTK\n"
"Runtime WebKit version: %d.%d.%d"
msgstr ""
"Navigateur WebKitGTK+ minimaliste et orienté vie privée\n"
"Version WebKit au lancement: %d.%d.%d"
-#: badwolf.c:790
+#: badwolf.c:906
msgid "New tab"
msgstr "Nouvel onglet"
-#: badwolf.c:910
+#: badwolf.c:1104
msgid "Open new tab"
msgstr "Ouvrir un nouvel onglet"
-#: badwolf.c:102
+#: badwolf.c:105
msgid "Out of Memory"
msgstr "Dépassement Mémoire"
-#: badwolf.c:859
+#: badwolf.c:1034
#, c-format
msgid "Running Badwolf version: %s\n"
msgstr "Version de Badwolf: %s\n"
-#: badwolf.c:866
+#: badwolf.c:1041
#, c-format
msgid "Runtime WebKit version: %d.%d.%d\n"
msgstr "Version WebKit au lancement: %d.%d.%d\n"
-#: badwolf.c:388
+#: badwolf.c:438
#, c-format
msgid "TLS Error for %s."
msgstr "Erreur TLS pour %s."
-#: badwolf.c:391
-#, fuzzy
+#: badwolf.c:441
msgid "Temporarily Add Exception"
msgstr "Ajouter Temporairement une Exception"
-#: badwolf.c:588
+#: badwolf.c:653
msgid "Toggle javascript"
-msgstr "Activer/Désactiver javascript"
+msgstr "(Dés)activer javascript"
-#: badwolf.c:593
+#: badwolf.c:658
msgid "Toggle loading images automatically"
-msgstr ""
+msgstr "(Dés)activer le chargement automatique des images"
-#: badwolf.c:106
+#: badwolf.c:109
msgid "Unknown Crash"
msgstr "Crash inconnu"
-#: badwolf.c:591
+#: badwolf.c:656
msgid "_IMG"
msgstr "_IMG"
-#: badwolf.c:586
+#: badwolf.c:651
msgid "_JS"
msgstr "_JS"
-#: badwolf.c:706
+#: badwolf.c:984
+#, c-format
+msgid "badwolf: content-filter loaded, adding to content-manager…\n"
+msgstr "badwolf: content-filter chargé, ajout à content-manager…\n"
+
+#: badwolf.c:1004 badwolf.c:1011
+#, c-format
+msgid "badwolf: failed to compile content-filters.json, err: [%d] %s\n"
+msgstr "badwolf: échec de compilation de content-filters.json, err: [%d] %s\n"
+
+#: badwolf.c:972 badwolf.c:977
+#, c-format
+msgid "badwolf: failed to load content-filter, err: [%d] %s\n"
+msgstr "badwolf: échec de chargement de content-filter, err: [%d] %s\n"
+
+#: badwolf.c:1062
+#, c-format
+msgid "content-filters file set to: %s\n"
+msgstr "Fichier content-filters configuré à: %s\n"
+
+#: badwolf.c:800
msgid "search in current page"
msgstr "recherche dans la page courante"
-#: badwolf.c:97
+#: badwolf.c:100
msgid "the web process crashed.\n"
msgstr "le processus web a cessé de fonctionner.\n"
-#: badwolf.c:101
+#: badwolf.c:104
msgid "the web process exceeded the memory limit.\n"
msgstr "le processus web a dépassé la limitation de mémoire.\n"
-#: badwolf.c:105
+#: badwolf.c:108
msgid "the web process terminated for an unknown reason.\n"
msgstr "le processus web s’est interrompu pour une raison inconnue.\n"
-#: badwolf.c:873
+#: badwolf.c:1048
#, c-format
msgid "webkit-web-extension directory set to: %s\n"
msgstr "Répertoire webkit-web-extension configuré à %s\n"
#. TRANSLATOR Ignore this entry. Done for forcing Unicode in xgettext.
-#: badwolf.c:944
+#: badwolf.c:1140
msgid "ø"
msgstr ""
diff --git a/po/messages.pot b/po/messages.pot
index ced4831..e4fbe56 100644
--- a/po/messages.pot
+++ b/po/messages.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: Badwolf 1.0.0+g1d4e9c3.0\n"
+"Project-Id-Version: Badwolf 1.0.3+gedbbb27.develop\n"
"Report-Msgid-Bugs-To: contact+badwolf-msgid@hacktivis.me\n"
-"POT-Creation-Date: 2020-07-08 07:20+0200\n"
+"POT-Creation-Date: 2021-04-09 08:48+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -41,23 +41,56 @@ msgstr ""
msgid "Badwolf Downloads"
msgstr ""
-#: badwolf.c:904
+#: bookmarks.c:116
+msgid "Bookmarks: Done.\n"
+msgstr ""
+
+#: bookmarks.c:59
+#, c-format
+msgid "Bookmarks: Found %d bookmarks.\n"
+msgstr ""
+
+#: bookmarks.c:81
+#, c-format
+msgid "Bookmarks: No loadable file found at %s\n"
+msgstr ""
+
+#: bookmarks.c:85
+#, c-format
+msgid "Bookmarks: loading at %s\n"
+msgstr ""
+
+#: bookmarks.c:99
+msgid "Bookmarks: unable to create new XPath context\n"
+msgstr ""
+
+#: bookmarks.c:107
+#, c-format
+msgid "Bookmarks: unable to evaluate XPath expression \"%s\"\n"
+msgstr ""
+
+#: bookmarks.c:89
+#, c-format
+msgid "Bookmarks: unable to parse file \"%s\"\n"
+msgstr ""
+
+#: badwolf.c:1034
#, c-format
msgid "Buildtime WebKit version: %d.%d.%d\n"
msgstr ""
-#: badwolf.c:402
+#: badwolf.c:440
msgid "Continue"
msgstr ""
-#: badwolf.c:352
+#: badwolf.c:390
msgid ""
"Couldn't verify the TLS certificate to ensure a better security of the "
"connection. You might want to verify your machine and network.\n"
"\n"
msgstr ""
-#: badwolf.c:98
+#: badwolf.c:100
msgid "Crashed"
msgstr ""
@@ -65,114 +98,134 @@ msgstr ""
msgid "Download starting…"
msgstr ""
-#: badwolf.c:375
+#: badwolf.c:413
msgid "Error: Some unknown error occurred validating the certificate.\n"
msgstr ""
-#: badwolf.c:356
+#: badwolf.c:394
msgid "Error: The X509 Certificate Authority is unknown.\n"
msgstr ""
-#: badwolf.c:369
+#: badwolf.c:407
msgid "Error: The certificate has been revoked.\n"
msgstr ""
-#: badwolf.c:366
+#: badwolf.c:404
msgid "Error: The certificate has expired. Check your system's clock.\n"
msgstr ""
-#: badwolf.c:372
+#: badwolf.c:410
msgid "Error: The certificate is considered to be insecure.\n"
msgstr ""
-#: badwolf.c:363
+#: badwolf.c:401
msgid "Error: The certificate isn't valid yet. Check your system's clock.\n"
msgstr ""
-#: badwolf.c:359
+#: badwolf.c:397
msgid "Error: The given identity doesn't match the expected one.\n"
msgstr ""
#: keybindings.c:32
#, c-format
msgid ""
-"Minimalist and privacy-oriented WebKitGTK+ browser\n"
+"Minimalist and privacy-oriented web browser based on WebKitGTK\n"
"Runtime WebKit version: %d.%d.%d"
msgstr ""
-#: badwolf.c:839
+#: badwolf.c:904
msgid "New tab"
msgstr ""
-#: badwolf.c:953
+#: badwolf.c:1102
msgid "Open new tab"
msgstr ""
-#: badwolf.c:102
+#: badwolf.c:104
msgid "Out of Memory"
msgstr ""
-#: badwolf.c:902
+#: badwolf.c:1032
#, c-format
msgid "Running Badwolf version: %s\n"
msgstr ""
-#: badwolf.c:909
+#: badwolf.c:1039
#, c-format
msgid "Runtime WebKit version: %d.%d.%d\n"
msgstr ""
-#: badwolf.c:399
+#: badwolf.c:437
#, c-format
msgid "TLS Error for %s."
msgstr ""
-#: badwolf.c:402
+#: badwolf.c:440
msgid "Temporarily Add Exception"
msgstr ""
-#: badwolf.c:609
+#: badwolf.c:650
msgid "Toggle javascript"
msgstr ""
-#: badwolf.c:614
+#: badwolf.c:655
msgid "Toggle loading images automatically"
msgstr ""
-#: badwolf.c:106
+#: badwolf.c:108
msgid "Unknown Crash"
msgstr ""
-#: badwolf.c:612
+#: badwolf.c:653
msgid "_IMG"
msgstr ""
-#: badwolf.c:607
+#: badwolf.c:648
msgid "_JS"
msgstr ""
-#: badwolf.c:727
+#: badwolf.c:982
+#, c-format
+msgid "badwolf: content-filter loaded, adding to content-manager…\n"
+msgstr ""
+
+#: badwolf.c:1002 badwolf.c:1009
+#, c-format
+msgid "badwolf: failed to compile content-filters.json, err: [%d] %s\n"
+msgstr ""
+
+#: badwolf.c:970 badwolf.c:975
+#, c-format
+msgid "badwolf: failed to load content-filter, err: [%d] %s\n"
+msgstr ""
+
+#: badwolf.c:1060
+#, c-format
+msgid "content-filters file set to: %s\n"
+msgstr ""
+
+#: badwolf.c:792
msgid "search in current page"
msgstr ""
-#: badwolf.c:97
+#: badwolf.c:99
msgid "the web process crashed.\n"
msgstr ""
-#: badwolf.c:101
+#: badwolf.c:103
msgid "the web process exceeded the memory limit.\n"
msgstr ""
-#: badwolf.c:105
+#: badwolf.c:107
msgid "the web process terminated for an unknown reason.\n"
msgstr ""
-#: badwolf.c:916
+#: badwolf.c:1046
#, c-format
msgid "webkit-web-extension directory set to: %s\n"
msgstr ""
#. TRANSLATOR Ignore this entry. Done for forcing Unicode in xgettext.
-#: badwolf.c:987
+#: badwolf.c:1138
msgid "ø"
msgstr ""
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 9f54980..61b5c5b 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Badwolf 0.4.0+g607300e\n"
"Report-Msgid-Bugs-To: contact+badwolf-msgid@hacktivis.me\n"
-"POT-Creation-Date: 2020-05-18 03:06+0200\n"
-"PO-Revision-Date: 2020-05-17 20:18-0300\n"
+"POT-Creation-Date: 2021-04-14 18:24-0300\n"
+"PO-Revision-Date: 2021-04-14 19:31-0300\n"
"Last-Translator: Pedro Lucas Porcellis <porcellis@eletrotupi.com>\n"
"Language-Team: Brazilian Portuguese\n"
"Language: pt_BR\n"
@@ -15,6 +15,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 2.4.1\n"
#: downloads.c:117
#, c-format
@@ -36,30 +37,65 @@ msgstr "%02i:%02i:%02i Transferência Concluída"
msgid "%02i:%02i:%02i Downloading…"
msgstr "%02i:%02i:%02i Baixando…"
-#: downloads.c:195 downloads.c:212 downloads.c:215
+#: downloads.c:199 downloads.c:216 downloads.c:219
msgid "Badwolf Downloads"
msgstr "Transferências do Badwolf"
-#: badwolf.c:874
+#: bookmarks.c:116
+msgid "Bookmarks: Done.\n"
+msgstr "Favoritos: Feito.\n"
+
+#: bookmarks.c:59
+#, c-format
+msgid "Bookmarks: Found %d bookmarks.\n"
+msgstr "Favoritos: Encontrado %d favoritos.\n"
+
+#: bookmarks.c:81
+#, c-format
+msgid "Bookmarks: No loadable file found at %s\n"
+msgstr "Favoritos: Nenhum arquivo carregável encontrado em %s\n"
+
+#: bookmarks.c:85
+#, c-format
+msgid "Bookmarks: loading at %s\n"
+msgstr "Favoritos: carregando em %s\n"
+
+#: bookmarks.c:99
+msgid "Bookmarks: unable to create new XPath context\n"
+msgstr "Favoritos: não foi possível criar um novo contexto do XPath\n"
+
+#: bookmarks.c:107
+#, c-format
+msgid "Bookmarks: unable to evaluate XPath expression \"%s\"\n"
+msgstr ""
+"Favoritos: não foi possivel compreender a expressão do XPath \"%s\"\n"
+
+#: bookmarks.c:89
+#, c-format
+msgid "Bookmarks: unable to parse file \"%s\"\n"
+msgstr "Favoritos: não foi possível ler o arquivo \"%s\"\n"
+
+#: badwolf.c:1036
#, c-format
msgid "Buildtime WebKit version: %d.%d.%d\n"
msgstr "Versão do WebKit %d.%d.%d\n"
-#: badwolf.c:403
+#: badwolf.c:441
msgid "Continue"
msgstr "Continuar"
-#: badwolf.c:353
+#: badwolf.c:391
msgid ""
"Couldn't verify the TLS certificate to ensure a better security of the "
"connection. You might want to verify your machine and network.\n"
"\n"
msgstr ""
"Não foi possível verificar o certificado TLS para garantir uma melhor "
-"segurança da conexão. Talvez você deva verificar a sua máquina e rede.\n"
+"segurança da conexão. Talvez você deva verificar a sua máquina e "
+"rede.\n"
"\n"
-#: badwolf.c:99
+#: badwolf.c:101
msgid "Crashed"
msgstr "Erro"
@@ -67,119 +103,144 @@ msgstr "Erro"
msgid "Download starting…"
msgstr "Transferência Iniciada…"
-#: badwolf.c:376
+#: badwolf.c:414
msgid "Error: Some unknown error occurred validating the certificate.\n"
msgstr ""
-"Erro: Algum erro desconhecido ocorreu enquanto validava o certificado.\n"
+"Erro: Algum erro desconhecido ocorreu enquanto validava o "
+"certificado.\n"
-#: badwolf.c:357
+#: badwolf.c:395
msgid "Error: The X509 Certificate Authority is unknown.\n"
msgstr "Erro: A Autoridade de Certificados X509 é desconhecida.\n"
-#: badwolf.c:370
+#: badwolf.c:408
msgid "Error: The certificate has been revoked.\n"
msgstr "Erro: O certificado foi revogado.\n"
-#: badwolf.c:367
+#: badwolf.c:405
msgid "Error: The certificate has expired. Check your system's clock.\n"
msgstr ""
"Erro: O certificado foi expirado. Verifique o relógio do seu sistema.\n"
-#: badwolf.c:373
+#: badwolf.c:411
msgid "Error: The certificate is considered to be insecure.\n"
msgstr "Erro: O certificado é considerado inseguro.\n"
-#: badwolf.c:364
-msgid "Error: The certificate isn't valid yet. Check your system's clock.\n"
+#: badwolf.c:402
+msgid ""
+"Error: The certificate isn't valid yet. Check your system's clock.\n"
msgstr ""
-"Erro: O certificado não é válido ainda. Verifique o relógio do seu sistema.\n"
+"Erro: O certificado não é válido ainda. Verifique o relógio do seu "
+"sistema.\n"
-#: badwolf.c:360
+#: badwolf.c:398
msgid "Error: The given identity doesn't match the expected one.\n"
msgstr "Erro: A identidade não confere com a esperada.\n"
#: keybindings.c:32
-#, c-format
+#, fuzzy, c-format
msgid ""
-"Minimalist and privacy-oriented WebKitGTK+ browser\n"
+"Minimalist and privacy-oriented web browser based on WebKitGTK\n"
"Runtime WebKit version: %d.%d.%d"
msgstr ""
"Navegador orientado pela privacidade e minimalismo\n"
"Versão do WebKit: %d.%d.%d"
-#: badwolf.c:803
+#: badwolf.c:906
msgid "New tab"
msgstr "Nova aba"
-#: badwolf.c:923
+#: badwolf.c:1104
msgid "Open new tab"
msgstr "Abrir uma Nova aba"
-#: badwolf.c:103
+#: badwolf.c:105
msgid "Out of Memory"
msgstr "Sem memória"
-#: badwolf.c:872
+#: badwolf.c:1034
#, c-format
msgid "Running Badwolf version: %s\n"
msgstr "Rodando versão %s do Badwolf\n"
-#: badwolf.c:879
+#: badwolf.c:1041
#, c-format
msgid "Runtime WebKit version: %d.%d.%d\n"
msgstr "Versão do WebKit: %d.%d.%d\n"
-#: badwolf.c:400
+#: badwolf.c:438
#, c-format
msgid "TLS Error for %s."
msgstr "Erro TLS para %s."
-#: badwolf.c:403
+#: badwolf.c:441
msgid "Temporarily Add Exception"
msgstr "Adicionar exceção temporária"
-#: badwolf.c:600
+#: badwolf.c:653
msgid "Toggle javascript"
msgstr "Habilitar Javascript"
-#: badwolf.c:605
+#: badwolf.c:658
msgid "Toggle loading images automatically"
msgstr "Habilitar carregamento de imagens automático"
-#: badwolf.c:107
+#: badwolf.c:109
msgid "Unknown Crash"
msgstr "Erro desconhecido"
-#: badwolf.c:603
+#: badwolf.c:656
msgid "_IMG"
msgstr "_IMG"
-#: badwolf.c:598
+#: badwolf.c:651
msgid "_JS"
msgstr "_JS"
-#: badwolf.c:718
+#: badwolf.c:984
+#, c-format
+msgid "badwolf: content-filter loaded, adding to content-manager…\n"
+msgstr ""
+"badwolf: carregado content-filter, adicionando ao content-manager...\n"
+
+#: badwolf.c:1004 badwolf.c:1011
+#, c-format
+msgid "badwolf: failed to compile content-filters.json, err: [%d] %s\n"
+msgstr ""
+"badwolf: falha ao compilar 'content-filters.json', erro: [%d] %s\n"
+
+#: badwolf.c:972 badwolf.c:977
+#, c-format
+msgid "badwolf: failed to load content-filter, err: [%d] %s\n"
+msgstr "badwolf: falha ao carregar content-filter, erro: [%d] %s\n"
+
+#: badwolf.c:1062
+#, c-format
+msgid "content-filters file set to: %s\n"
+msgstr "arquivo de content-filters configurado para: %s\n"
+
+#: badwolf.c:800
msgid "search in current page"
msgstr "buscar na página atual"
-#: badwolf.c:98
+#: badwolf.c:100
msgid "the web process crashed.\n"
msgstr "o processo web travou.\n"
-#: badwolf.c:102
+#: badwolf.c:104
msgid "the web process exceeded the memory limit.\n"
msgstr "o processo web excedeu o limite de memória.\n"
-#: badwolf.c:106
+#: badwolf.c:108
msgid "the web process terminated for an unknown reason.\n"
msgstr "o processo web terminou por uma razão desconhecida.\n"
-#: badwolf.c:886
+#: badwolf.c:1048
#, c-format
msgid "webkit-web-extension directory set to: %s\n"
msgstr "diretório de extensões configurado para: %s\n"
#. TRANSLATOR Ignore this entry. Done for forcing Unicode in xgettext.
-#: badwolf.c:957
+#: badwolf.c:1140
msgid "ø"
msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 040c48c..2ce7fde 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -1,14 +1,14 @@
# Turkish translations for Badwolf package.
# Copyright (C) 2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
# This file is distributed under the same license as the Badwolf package.
-# Oğuz Ersen <oguzersen@protonmail.com>, 2020.
+# Oğuz Ersen <oguzersen@protonmail.com>, 2020, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: Badwolf 1.0.2+g17b9802.develop\n"
"Report-Msgid-Bugs-To: contact+badwolf-msgid@hacktivis.me\n"
-"POT-Creation-Date: 2020-07-11 11:35+0200\n"
-"PO-Revision-Date: 2020-07-17 23:50+0300\n"
+"POT-Creation-Date: 2021-04-10 20:38+0300\n"
+"PO-Revision-Date: 2021-04-10 20:38+0300\n"
"Last-Translator: Oğuz Ersen <oguzersen@protonmail.com>\n"
"Language-Team: Turkish\n"
"Language: tr\n"
@@ -41,16 +41,49 @@ msgstr "%02i:%02i:%02i İndiriliyor…"
msgid "Badwolf Downloads"
msgstr "Badwolf İndirmeleri"
-#: badwolf.c:919
+#: bookmarks.c:116
+msgid "Bookmarks: Done.\n"
+msgstr "Yer imleri: Bitti.\n"
+
+#: bookmarks.c:59
+#, c-format
+msgid "Bookmarks: Found %d bookmarks.\n"
+msgstr "Yer imleri: %d yer imi bulundu.\n"
+
+#: bookmarks.c:81
+#, c-format
+msgid "Bookmarks: No loadable file found at %s\n"
+msgstr "Yer imleri: %s konumunda yüklenebilir dosya bulunamadı\n"
+
+#: bookmarks.c:85
+#, c-format
+msgid "Bookmarks: loading at %s\n"
+msgstr "Yer imleri: %s konumunda yükleniyor\n"
+
+#: bookmarks.c:99
+msgid "Bookmarks: unable to create new XPath context\n"
+msgstr "Yer imleri: yeni XPath içeriği oluşturulamadı\n"
+
+#: bookmarks.c:107
+#, c-format
+msgid "Bookmarks: unable to evaluate XPath expression \"%s\"\n"
+msgstr "Yer imleri: \"%s\" XPath ifadesi değerlendirilemedi\n"
+
+#: bookmarks.c:89
+#, c-format
+msgid "Bookmarks: unable to parse file \"%s\"\n"
+msgstr "Yer imleri: \"%s\" dosyası ayrıştırılamadı\n"
+
+#: badwolf.c:1036
#, c-format
msgid "Buildtime WebKit version: %d.%d.%d\n"
-msgstr "Oluşturma zamanı WebKit sürümü: %d.%d.%d\n"
+msgstr "Derleme zamanı WebKit sürümü: %d.%d.%d\n"
-#: badwolf.c:416
+#: badwolf.c:441
msgid "Continue"
-msgstr "Devam Et"
+msgstr "Devam et"
-#: badwolf.c:366
+#: badwolf.c:391
msgid ""
"Couldn't verify the TLS certificate to ensure a better security of the "
"connection. You might want to verify your machine and network.\n"
@@ -60,7 +93,7 @@ msgstr ""
"doğrulanamadı. Makinenizi ve ağınızı doğrulamak isteyebilirsiniz.\n"
"\n"
-#: badwolf.c:99
+#: badwolf.c:101
msgid "Crashed"
msgstr "Çöktü"
@@ -68,116 +101,138 @@ msgstr "Çöktü"
msgid "Download starting…"
msgstr "İndirme başlatılıyor…"
-#: badwolf.c:389
+#: badwolf.c:414
msgid "Error: Some unknown error occurred validating the certificate.\n"
msgstr "Hata: Sertifika doğrulanırken bilinmeyen bir hata oluştu.\n"
-#: badwolf.c:370
+#: badwolf.c:395
msgid "Error: The X509 Certificate Authority is unknown.\n"
msgstr "Hata: X509 Sertifika Yetkilisi bilinmiyor.\n"
-#: badwolf.c:383
+#: badwolf.c:408
msgid "Error: The certificate has been revoked.\n"
msgstr "Hata: Sertifika yürürlükten kaldırıldı.\n"
-#: badwolf.c:380
+#: badwolf.c:405
msgid "Error: The certificate has expired. Check your system's clock.\n"
-msgstr "Hata: Sertifikanın süresi doldu. Sisteminizin saatini gözden geçirin.\n"
+msgstr ""
+"Hata: Sertifikanın süresi doldu. Sisteminizin saatini gözden geçirin.\n"
-#: badwolf.c:386
+#: badwolf.c:411
msgid "Error: The certificate is considered to be insecure.\n"
msgstr "Hata: Sertifikanın güvensiz olduğu kabul ediliyor.\n"
-#: badwolf.c:377
+#: badwolf.c:402
msgid "Error: The certificate isn't valid yet. Check your system's clock.\n"
-msgstr "Hata: Sertifika henüz geçerli değil. Sisteminizin saatini gözden geçirin.\n"
+msgstr ""
+"Hata: Sertifika henüz geçerli değil. Sisteminizin saatini gözden geçirin.\n"
-#: badwolf.c:373
+#: badwolf.c:398
msgid "Error: The given identity doesn't match the expected one.\n"
msgstr "Hata: Verilen kimlik beklenen ile eşleşmiyor.\n"
#: keybindings.c:32
#, c-format
msgid ""
-"Minimalist and privacy-oriented WebKitGTK+ browser\n"
+"Minimalist and privacy-oriented web browser based on WebKitGTK\n"
"Runtime WebKit version: %d.%d.%d"
msgstr ""
-"Sadelik ve gizlilik odaklı WebKitGTK+ tarayıcısı\n"
+"WebKitGTK tabanlı sadelik ve gizlilik odaklı web tarayıcısı\n"
"Çalışma zamanı WebKit sürümü: %d.%d.%d"
-#: badwolf.c:854
+#: badwolf.c:906
msgid "New tab"
msgstr "Yeni sekme"
-#: badwolf.c:968
+#: badwolf.c:1104
msgid "Open new tab"
msgstr "Yeni sekme aç"
-#: badwolf.c:103
+#: badwolf.c:105
msgid "Out of Memory"
msgstr "Yetersiz Bellek"
-#: badwolf.c:917
+#: badwolf.c:1034
#, c-format
msgid "Running Badwolf version: %s\n"
msgstr "Çalışan Badwolf sürümü: %s\n"
-#: badwolf.c:924
+#: badwolf.c:1041
#, c-format
msgid "Runtime WebKit version: %d.%d.%d\n"
msgstr "Çalışma zamanı WebKit sürümü: %d.%d.%d\n"
-#: badwolf.c:413
+#: badwolf.c:438
#, c-format
msgid "TLS Error for %s."
msgstr "%s için TLS Hatası."
-#: badwolf.c:416
+#: badwolf.c:441
msgid "Temporarily Add Exception"
msgstr "Geçici Olarak İstisna Ekle"
-#: badwolf.c:624
+#: badwolf.c:653
msgid "Toggle javascript"
msgstr "Javascript'i aç/kapat"
-#: badwolf.c:629
+#: badwolf.c:658
msgid "Toggle loading images automatically"
msgstr "Resimleri otomatik yüklemeyi aç/kapat"
-#: badwolf.c:107
+#: badwolf.c:109
msgid "Unknown Crash"
msgstr "Bilinmeyen Çökme"
-#: badwolf.c:627
+#: badwolf.c:656
msgid "_IMG"
msgstr "_RSM"
-#: badwolf.c:622
+#: badwolf.c:651
msgid "_JS"
msgstr "_JS"
-#: badwolf.c:742
+#: badwolf.c:984
+#, c-format
+msgid "badwolf: content-filter loaded, adding to content-manager…\n"
+msgstr "badwolf: content-filter yüklendi, content-manager'e ekleniyor…\n"
+
+#: badwolf.c:1004 badwolf.c:1011
+#, c-format
+msgid "badwolf: failed to compile content-filters.json, err: [%d] %s\n"
+msgstr "badwolf: content-filters.json derlenemedi, hata: [%d] %s\n"
+
+#: badwolf.c:972 badwolf.c:977
+#, c-format
+msgid "badwolf: failed to load content-filter, err: [%d] %s\n"
+msgstr "badwolf: content-filter yüklenemedi, hata: [%d] %s\n"
+
+#: badwolf.c:1062
+#, c-format
+msgid "content-filters file set to: %s\n"
+msgstr "content-filters dosyası şuna ayarlandı: %s\n"
+
+#: badwolf.c:800
msgid "search in current page"
msgstr "geçerli sayfada ara"
-#: badwolf.c:98
+#: badwolf.c:100
msgid "the web process crashed.\n"
msgstr "web işlemi çöktü.\n"
-#: badwolf.c:102
+#: badwolf.c:104
msgid "the web process exceeded the memory limit.\n"
msgstr "web işlemi bellek sınırını aştı.\n"
-#: badwolf.c:106
+#: badwolf.c:108
msgid "the web process terminated for an unknown reason.\n"
msgstr "web işlemi bilinmeyen bir nedenle sona erdi.\n"
-#: badwolf.c:931
+#: badwolf.c:1048
#, c-format
msgid "webkit-web-extension directory set to: %s\n"
msgstr "webkit-web-extension dizini şuna ayarlandı: %s\n"
#. TRANSLATOR Ignore this entry. Done for forcing Unicode in xgettext.
-#: badwolf.c:1002
+#: badwolf.c:1140
msgid "ø"
msgstr ""
diff --git a/uri.c b/uri.c
index 912bf86..3cbc1d6 100644
--- a/uri.c
+++ b/uri.c
@@ -1,5 +1,5 @@
// BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-// Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+// Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
// SPDX-License-Identifier: BSD-3-Clause
#include "uri.h"
diff --git a/uri_test.c b/uri_test.c
index a153817..28bdde9 100644
--- a/uri_test.c
+++ b/uri_test.c
@@ -1,5 +1,5 @@
// BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-// Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+// Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
// SPDX-License-Identifier: BSD-3-Clause
#include "uri.h"
diff --git a/usr.bin.badwolf b/usr.bin.badwolf
index 0ebce5d..861ee9f 100644
--- a/usr.bin.badwolf
+++ b/usr.bin.badwolf
@@ -1,5 +1,5 @@
# BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
-# Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
+# Copyright © 2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>
# SPDX-License-Identifier: BSD-3-Clause
#
# Made on Gentoo Linux with PREFIX=/usr