diff options
author | Wolfgang Müller | 2021-06-26 15:32:40 +0200 |
---|---|---|
committer | Wolfgang Müller | 2021-06-27 18:31:06 +0200 |
commit | e03fdccc4e191e0e7cd60b4fef9e6f603ccc112b (patch) | |
tree | aede7a26eb41b0a8066016f471448289391d85c8 | |
parent | b70083a5f4404e2422ff0a0aadd023a661164fae (diff) | |
download | weltschmerz-e03fdccc4e191e0e7cd60b4fef9e6f603ccc112b.tar.gz |
Prepare for internationalization
weltschmerz currently does not allow for translation and exists in
English only. This is a serious defect for people who do not speak that
language. The following series of commits aims to remedy this by adding
the necessary infrastructure and build steps to enable easy translation.
To do this we use GNU gettext[1]; its tooling is widely supported and a
de-facto standard. Since we need to tell gettext where to find the
compiled .mo translation files, have both the Makefile and meson pass
the locale directory to weltschmerz in form of a LOCALEDIR macro. The
translation domain will be "weltschmerz".
Not only will any strings in the Vala code have to be translated, we
need to make sure to translate terminal.ui and weltschmerz.desktop as
well. The former will be taken care of through POTFILES only, but for
the latter we have to define an intermediary build step. To ensure
compatibility with the Makefile, we suffix the desktop file with '.in'.
For now, LINGUAS and POTFILES remain empty. A future commit will
document all files needing translation. LINGUAS will be updated as
translations are completed.
[1] https://www.gnu.org/software/gettext
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile | 22 | ||||
-rw-r--r-- | meson.build | 12 | ||||
-rw-r--r-- | po/LINGUAS | 0 | ||||
-rw-r--r-- | po/POTFILES | 0 | ||||
-rw-r--r-- | po/meson.build | 7 | ||||
-rw-r--r-- | weltschmerz.desktop.in (renamed from weltschmerz.desktop) | 0 | ||||
-rw-r--r-- | weltschmerz.vala | 5 |
8 files changed, 44 insertions, 4 deletions
@@ -1,3 +1,5 @@ build/* *.c +*.mo weltschmerz +weltschmerz.desktop @@ -2,22 +2,38 @@ PREFIX ?= /usr/local EXEC_PREFIX ?= ${PREFIX} BINDIR ?= ${EXEC_PREFIX}/bin DATAROOTDIR ?= ${PREFIX}/share +LOCALEDIR ?= ${DATAROOTDIR}/locale MANDIR ?= ${DATAROOTDIR}/man VALAC ?= valac +POFILES := $(wildcard po/*.po) +MOFILES := $(POFILES:.po=.mo) + weltschmerz: weltschmerz.vala terminal.vala config.vala configreader.vala utils.vala resources.c - ${VALAC} -X -lm --pkg posix --pkg gtk+-3.0 --pkg vte-2.91 --gresources resources.xml \ + ${VALAC} -X -DGETTEXT_PACKAGE=\"weltschmerz\" -X -DLOCALEDIR="\"${LOCALEDIR}\"" \ + -X -lm --pkg posix --pkg gtk+-3.0 --pkg vte-2.91 --gresources resources.xml \ weltschmerz.vala terminal.vala config.vala configreader.vala utils.vala resources.c resources.c: resources.xml terminal.ui terminal.css glib-compile-resources $< --target=$@ --generate-source -install: weltschmerz weltschmerz.1 weltschmerz.desktop +%.mo: %.po + msgfmt $< -o $@ + +weltschmerz.desktop: weltschmerz.desktop.in + msgfmt --desktop -d po --template $< -o $@ + +install: weltschmerz weltschmerz.1 weltschmerz.desktop $(MOFILES) install -D -m 755 -t '${DESTDIR}${BINDIR}' weltschmerz install -D -m 644 -t '${DESTDIR}${MANDIR}/man1' weltschmerz.1 install -D -m 644 -t '${DESTDIR}${DATAROOTDIR}/applications' weltschmerz.desktop + for mo in $(MOFILES); do \ + lang=$$(basename "$$mo" .mo); \ + install -D -m 644 "$$mo" "${DESTDIR}${LOCALEDIR}/$$lang/LC_MESSAGES/weltschmerz.mo"; \ + done clean: - rm -f weltschmerz resources.c + rm -f weltschmerz weltschmerz.desktop resources.c + rm -f po/*.mo .PHONY: install clean diff --git a/meson.build b/meson.build index dc83f80..4bae2de 100644 --- a/meson.build +++ b/meson.build @@ -11,10 +11,20 @@ dependencies = [ dependency('vte-2.91'), ] +subdir('po') + sources = files('weltschmerz.vala', 'terminal.vala', 'config.vala', 'configreader.vala', 'utils.vala') sources += gnome.compile_resources('resources', 'resources.xml') executable('weltschmerz', sources, dependencies: dependencies, install: true) install_man('weltschmerz.1') -install_data('weltschmerz.desktop', install_dir: join_paths(get_option('datadir'), 'applications')) + +i18n.merge_file( + input: 'weltschmerz.desktop.in', + output: 'weltschmerz.desktop', + po_dir: 'po', + type: 'desktop', + install: true, + install_dir: get_option('datadir') / 'applications', +) diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/po/LINGUAS diff --git a/po/POTFILES b/po/POTFILES new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/po/POTFILES diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..6870f58 --- /dev/null +++ b/po/meson.build @@ -0,0 +1,7 @@ +i18n = import('i18n') + +localedir = join_paths(get_option('prefix'), get_option('localedir')) +add_project_arguments('-DGETTEXT_PACKAGE="weltschmerz"', language: 'c') +add_project_arguments('-DLOCALEDIR="@0@"'.format(localedir), language: 'c') + +i18n.gettext(meson.project_name(), args: '--directory=' + meson.source_root()) diff --git a/weltschmerz.desktop b/weltschmerz.desktop.in index 2b61982..2b61982 100644 --- a/weltschmerz.desktop +++ b/weltschmerz.desktop.in diff --git a/weltschmerz.vala b/weltschmerz.vala index dac2291..42349d9 100644 --- a/weltschmerz.vala +++ b/weltschmerz.vala @@ -1,3 +1,4 @@ +[CCode(cname="LOCALEDIR")] extern const string LOCALEDIR; const string PROGRAM_NAME = "weltschmerz"; void warning(string message) { @@ -5,6 +6,10 @@ void warning(string message) { } static int main(string[] args) { + Intl.bindtextdomain(PROGRAM_NAME, LOCALEDIR); + Intl.bind_textdomain_codeset(PROGRAM_NAME, "UTF-8"); + Intl.textdomain(PROGRAM_NAME); + unowned string[]? nullargs = null; Gtk.init(ref nullargs); |