commit: c11c1a8f35b0ee89df956029f2a77d55d5a28c42
parent: 8c0525b56e6ad402eeff18af58eb1ce4d9e8be47
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Fri, 26 Apr 2019 14:48:42 +0200
Merge branch 'features/localization' into develop
Diffstat:
| M | Makefile | 39 | +++++++++++++++++++++++++++------------ | 
| M | badwolf.c | 31 | +++++++++++++++++++------------ | 
| A | mo/.keep | 0 |  | 
| A | po/fr.po | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| A | po/messages.pot | 66 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
5 files changed, 182 insertions(+), 24 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,30 +1,45 @@
 .POSIX:
 
-PREFIX = /usr/local
-BINDIR = $(PREFIX)/bin
-MANDIR = $(PREFIX)/share/man
+PREFIX  = /usr/local
+BINDIR  = $(PREFIX)/bin
+MANDIR  = $(PREFIX)/share/man
+DATADIR = $(PREFIX)/share/badwolf
+PACKAGE = Badwolf
 
-DEPS = gtk+-3.0 webkit2gtk-4.0
-OBJS = badwolf
+DEPS  = gtk+-3.0 webkit2gtk-4.0
+OBJS  = badwolf
+TRANS = fr.mo
 
-CC      = cc
-CFLAGS  = -g -Wall -Wextra
-CDEPS   = `pkg-config --cflags $(DEPS)`
-LIBS    = `pkg-config --libs $(DEPS)`
+CC     = cc
+CFLAGS = -g -Wall -Wextra
+CDEPS  = `pkg-config --cflags $(DEPS)` -DDATADIR=\"$(DATADIR)\" -DPACKAGE=\"$(PACKAGE)\"
+LIBS   = `pkg-config --libs $(DEPS)`
 
-all: $(OBJS)
+all: $(OBJS) $(TRANS)
+
+%.mo:
+	mkdir -p locale/$*/LC_MESSAGES
+	msgfmt -o locale/$*/LC_MESSAGES/$(PACKAGE).mo po/$*.po
+
+po/messages.pot:
+	xgettext --keyword=_ --language=C -o $@ --add-comments --sort-output -j badwolf.c
+
+po/%.po: po/messages.pot
+	msgmerge --update $@ $<
 
 .c:
 	$(CC) -std=c11 $(CFLAGS) $(CDEPS) -o $@ $< $(LDFLAGS) $(LIBS)
 
-install: badwolf
+install: all
 	mkdir -p $(DESTDIR)$(BINDIR)
 	cp -p badwolf $(DESTDIR)$(BINDIR)/badwolf
 	mkdir -p $(DESTDIR)$(MANDIR)/man1
 	cp -p badwolf.1 $(DESTDIR)$(MANDIR)/man1
+	mkdir -p $(DESTDIR)$(DATADIR)/locale
+	cp -r locale/ $(DESTDIR)$(DATADIR)
 
 clean:
-	rm $(OBJS)
+	rm -fr locale $(OBJS)
 
 format: *.c *.h
 	clang-format -style=file -assume-filename=.clang-format -i *.c *.h
diff --git a/badwolf.c b/badwolf.c
@@ -4,8 +4,10 @@
 
 #include "config.h"
 
+#include <glib/gi18n.h>   /* _() and other internationalization/localization helpers */
 #include <glib/gprintf.h> /* g_fprintf() */
 #include <gtk/gtk.h>
+#include <locale.h> /* LC_* */
 #include <webkit2/webkit2.h>
 
 struct Window
@@ -95,16 +97,16 @@ WebViewCb_web_process_terminated(WebKitWebView *webView,
 	switch(reason)
 	{
 	case WEBKIT_WEB_PROCESS_CRASHED:
-		g_fprintf(stderr, "the web process crashed.");
-		webView_tab_label_change(browser, "Crashed");
+		g_fprintf(stderr, _("the web process crashed.\n"));
+		webView_tab_label_change(browser, _("title|Crashed"));
 		break;
 	case WEBKIT_WEB_PROCESS_EXCEEDED_MEMORY_LIMIT:
-		g_fprintf(stderr, "the web process exceeded the memory limit.");
-		webView_tab_label_change(browser, "Out of Memory");
+		g_fprintf(stderr, _("the web process exceeded the memory limit.\n"));
+		webView_tab_label_change(browser, _("title|Out of Memory"));
 		break;
 	default:
-		g_fprintf(stderr, "the web process terminated for an unknown reason.");
-		webView_tab_label_change(browser, "Unknown Crash");
+		g_fprintf(stderr, _("the web process terminated for an unknown reason.\n"));
+		webView_tab_label_change(browser, _("title|Unknown Crash"));
 	}
 
 	return FALSE;
@@ -368,7 +370,7 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
 	                                                settings,
 	                                                NULL));
 
-	gtk_widget_set_tooltip_text(browser->javascript, "Toggle javascript");
+	gtk_widget_set_tooltip_text(browser->javascript, _("Toggle javascript"));
 
 	gtk_box_pack_start(GTK_BOX(browser->toolbar),
 	                   GTK_WIDGET(browser->javascript),
@@ -408,7 +410,7 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
 	gtk_entry_set_has_frame(GTK_ENTRY(browser->location), FALSE);
 	gtk_entry_set_input_purpose(GTK_ENTRY(browser->location), GTK_INPUT_PURPOSE_URL);
 
-	gtk_entry_set_placeholder_text(GTK_ENTRY(browser->search), "search in current page");
+	gtk_entry_set_placeholder_text(GTK_ENTRY(browser->search), _("search in current page"));
 	gtk_entry_set_has_frame(GTK_ENTRY(browser->search), FALSE);
 
 	g_signal_connect(browser->location, "activate", G_CALLBACK(locationCb_activate), browser);
@@ -452,7 +454,7 @@ int
 badwolf_new_tab(GtkNotebook *notebook, struct Client *browser)
 {
 	gint current_page = gtk_notebook_get_current_page(notebook);
-	gchar *title      = "New tab";
+	gchar *title      = _("New tab");
 
 	gtk_widget_show_all(browser->box);
 
@@ -516,13 +518,18 @@ main(int argc, char *argv[])
 	struct Window *window = g_malloc(sizeof(struct Client));
 	gchar *target_url     = NULL;
 
+	setlocale(LC_ALL, "");
+	bindtextdomain(PACKAGE, DATADIR "/locale");
+	bind_textdomain_codeset(PACKAGE, "UTF-8");
+	textdomain(PACKAGE);
+
 	g_fprintf(stderr,
-	          "Buildtime WebKit version: %d.%d.%d\n",
+	          _("Buildtime WebKit version: %d.%d.%d\n"),
 	          WEBKIT_MAJOR_VERSION,
 	          WEBKIT_MINOR_VERSION,
 	          WEBKIT_MICRO_VERSION);
 	g_fprintf(stderr,
-	          "Runtime WebKit version: %d.%d.%d\n",
+	          _("Runtime WebKit version: %d.%d.%d\n"),
 	          webkit_get_major_version(),
 	          webkit_get_minor_version(),
 	          webkit_get_micro_version());
@@ -539,7 +546,7 @@ main(int argc, char *argv[])
 	    GTK_WINDOW(window->main_window), BADWOLF_DEFAULT_WIDTH, BADWOLF_DEFAULT_HEIGHT);
 	gtk_window_set_role(GTK_WINDOW(window->main_window), "browser");
 
-	gtk_widget_set_tooltip_text(window->new_tab, "Open new tab");
+	gtk_widget_set_tooltip_text(window->new_tab, _("Open new tab"));
 
 	gtk_notebook_set_action_widget(GTK_NOTEBOOK(window->notebook), window->new_tab, GTK_PACK_END);
 	gtk_notebook_set_scrollable(GTK_NOTEBOOK(window->notebook), TRUE);
diff --git a/mo/.keep b/mo/.keep
diff --git a/po/fr.po b/po/fr.po
@@ -0,0 +1,70 @@
+# BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
+# Copyright (C) 2019 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
+# This file is distributed under the same license as the Badwolf package.
+# Haelwenn (lanodan) Monnier <contact@hacktivis.me>, 2019
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Badwolf 0.1.0\n"
+"POT-Creation-Date: 2019-04-18 13:16+0200\n"
+"PO-Revision-Date: 2019-04-11 09:28+0200\n"
+"Last-Translator:  <contact@hacktivis.me>\n"
+"Language-Team: French\n"
+"Language: fr\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"
+
+#: badwolf.c:527
+#, c-format
+msgid "Buildtime WebKit version: %d.%d.%d\n"
+msgstr "Version WebKit à la compilation: %d.%d.%d\n"
+
+#: badwolf.c:457
+msgid "New tab"
+msgstr "Nouvel onglet"
+
+#: badwolf.c:549
+msgid "Open new tab"
+msgstr "Ouvrir un nouvel onglet"
+
+#: badwolf.c:532
+#, c-format
+msgid "Runtime WebKit version: %d.%d.%d\n"
+msgstr "Version WebKit au lancement: %d.%d.%d\n"
+
+#: badwolf.c:373
+msgid "Toggle javascript"
+msgstr "Activer/Désactiver javascript"
+
+#: badwolf.c:413
+msgid "search in current page"
+msgstr "recherche dans la page courante"
+
+#: badwolf.c:100
+#, fuzzy
+msgid "the web process crashed.\n"
+msgstr "le processus web à cessé de fonctionner.\n"
+
+#: badwolf.c:104
+#, fuzzy
+msgid "the web process exceeded the memory limit.\n"
+msgstr "le processus web à dépassé la limitation de mémoire.\n"
+
+#: badwolf.c:108
+#, fuzzy
+msgid "the web process terminated for an unknown reason.\n"
+msgstr "le processus web s’est interrompu pour une raison inconnue.\n"
+
+#: badwolf.c:101
+msgid "title|Crashed"
+msgstr "title|Crash"
+
+#: badwolf.c:105
+msgid "title|Out of Memory"
+msgstr "title|Dépassement Mémoire"
+
+#: badwolf.c:109
+msgid "title|Unknown Crash"
+msgstr "title|Crash inconnu"
diff --git a/po/messages.pot b/po/messages.pot
@@ -0,0 +1,66 @@
+# BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
+# Copyright (C) 2019 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
+# This file is distributed under the same license as the Badwolf package.
+# Haelwenn (lanodan) Monnier <contact@hacktivis.me>, 2019
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Badwolf 0.1.0\n"
+"POT-Creation-Date: 2019-04-18 13:16+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \"Haelwenn (lanodan) Monnier <contact@hacktivis.me>\"\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: badwolf.c:527
+#, c-format
+msgid "Buildtime WebKit version: %d.%d.%d\n"
+msgstr ""
+
+#: badwolf.c:457
+msgid "New tab"
+msgstr ""
+
+#: badwolf.c:549
+msgid "Open new tab"
+msgstr ""
+
+#: badwolf.c:532
+#, c-format
+msgid "Runtime WebKit version: %d.%d.%d\n"
+msgstr ""
+
+#: badwolf.c:373
+msgid "Toggle javascript"
+msgstr ""
+
+#: badwolf.c:413
+msgid "search in current page"
+msgstr ""
+
+#: badwolf.c:100
+msgid "the web process crashed.\n"
+msgstr ""
+
+#: badwolf.c:104
+msgid "the web process exceeded the memory limit.\n"
+msgstr ""
+
+#: badwolf.c:108
+msgid "the web process terminated for an unknown reason.\n"
+msgstr ""
+
+#: badwolf.c:101
+msgid "title|Crashed"
+msgstr ""
+
+#: badwolf.c:105
+msgid "title|Out of Memory"
+msgstr ""
+
+#: badwolf.c:109
+msgid "title|Unknown Crash"
+msgstr ""