[gimp/nielsdg/die-intltool-die: 2/2] Migrate from intltool to gettext




commit 3f800cf6574e351d605e31e192004efcaba0b17a
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Wed Jun 8 20:35:45 2022 +0200

    Migrate from intltool to gettext
    
    intltool has long been dead upstream. Let's not poke the dead corpse,
    please.
    
    This commit is quite large, but that's mostly since trying to support a
    hybrid of both gettext and intltool with both Meson and Autotools was
    really hard, so I stopped trying.
    
    Due to gettext relying on quite some things being at the exactly right
    place in the autotools build (like `ABOUT-NLS` and `config.rpath`) we
    really needed to cleanup the `autogen.sh` to only call `aclocal` and
    `autoreconf`. No more strange magic; I tried to do it without changing
    too much in the file, and things just broke. If people want to do
    something more custom, they can just change the script directly. This
    change also uncovered some problems in our `configure.ac`, like using
    deprecated macros.
    
    The following major changes happened:
    
    * meson: Changed `custom_target()` to `i18n.merge_file()` for all
      supported file types
    * Added `.its` and `.loc`  files for the GIMP-specific XML formats, so
      that gettext understands them
    * For the `.isl` (Window installer stuff) file, there's no easy way to
      do this in gettext, so instead we start from an XML file (again with
      its own ITS rules etc), translate that with gettext, and then use
      `xsltproc` with a bit of magic to output the .isl file for each
      language
    * the `po*/Makefile.in.in` files are migrated to `Makevars` files,
      which gettext natively understands.
    
    Fixes: https://gitlab.gnome.org/GNOME/gimp/-/issues/8028

 .gitignore                                         |   7 -
 .gitlab-ci.yml                                     |   6 +-
 INSTALL.in                                         |   7 +-
 autogen.sh                                         | 247 +-----
 build/docker/gimpbuilder-base/Dockerfile           |   4 +-
 build/flatpak/org.gimp.GIMP-nightly.json           |  20 -
 build/windows/gitlab-ci/build-gimp-msys2.sh        |   1 -
 build/windows/installer/lang/Makefile.am           | 112 ++-
 build/windows/installer/lang/extractlang.sh        |  11 -
 .../installer/lang/gimp-ms-installer-config.xsl.in |  37 +
 .../lang/its/gimp-ms-installer-config.its          |   6 +
 .../lang/its/gimp-ms-installer-config.loc          |   6 +
 build/windows/installer/lang/meson.build           |  64 +-
 build/windows/installer/lang/setup.isl.ini         | 163 ----
 build/windows/installer/lang/setup.isl.xml.in      | 326 ++++++++
 build/windows/jhbuild/README.md                    |   2 +-
 configure.ac                                       |  86 +--
 data/tags/Makefile.am                              |   8 +-
 data/tags/gimp-tags-default.xml.in                 |   6 +-
 data/tags/its/gimp-tags.its                        |   5 +
 data/tags/its/gimp-tags.loc                        |   6 +
 data/tags/meson.build                              |  26 +-
 data/tips/Makefile.am                              |   7 +-
 data/tips/gimp-tips.xml.in                         | 112 +--
 data/tips/its/gimp-tips.its                        |   5 +
 data/tips/its/gimp-tips.loc                        |   6 +
 data/tips/meson.build                              |  28 +-
 desktop/Makefile.am                                |   7 +-
 desktop/gimp.desktop.in.in                         |   8 +-
 desktop/meson.build                                |  33 +-
 desktop/org.gimp.GIMP.appdata.xml.in.in            | 834 ++++++++++-----------
 devel-docs/HACKING.md                              |   9 +-
 extensions/goat-exercises/Makefile.am              |   2 +-
 extensions/goat-exercises/meson.build              |  13 +-
 ...imp.extension.goat-exercises.metainfo.xml.in.in |   8 +-
 m4macros/.gitignore                                |   1 -
 meson.build                                        |   2 -
 po-libgimp/.gitignore                              |   1 -
 po-libgimp/Makefile.in.in                          | 220 ------
 po-libgimp/Makevars                                |  78 ++
 po-libgimp/POTFILES.in                             |   2 -
 po-plug-ins/.gitignore                             |   1 -
 po-plug-ins/Makefile.in.in                         | 225 ------
 po-plug-ins/Makevars                               |  78 ++
 po-plug-ins/POTFILES.in                            |   6 +-
 po-python/.gitignore                               |   1 -
 po-python/Makefile.in.in                           | 229 ------
 po-python/Makevars                                 |  78 ++
 po-python/POTFILES.in                              |   2 -
 po-script-fu/.gitignore                            |   1 -
 po-script-fu/Makefile.in.in                        | 220 ------
 po-script-fu/Makevars                              |  78 ++
 po-script-fu/POTFILES.in                           |   2 -
 po-tags/.gitignore                                 |   1 -
 po-tags/Makevars                                   |  78 ++
 po-tags/POTFILES.in                                |   2 -
 po-tips/.gitignore                                 |   1 -
 po-tips/Makefile.in.in                             | 188 -----
 po-tips/Makevars                                   |  78 ++
 po-tips/POTFILES.in                                |   2 -
 po-windows-installer/.gitignore                    |   2 -
 po-windows-installer/Makefile.in.in                | 234 ------
 po-windows-installer/Makevars                      |  78 ++
 po-windows-installer/POTFILES.in                   |   4 +-
 po/.gitignore                                      |   1 -
 po/Makefile.in.in                                  | 234 ------
 po/Makevars                                        |  78 ++
 po/POTFILES.in                                     |   2 -
 po/README.tools                                    |   1 -
 69 files changed, 1666 insertions(+), 2771 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index f4abf21e7a..4822b58f65 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,13 +44,6 @@
 /git-version.h
 /gtk-doc.make
 /install-sh
-/intltool-extract
-/intltool-extract.in
-/intltool-merge
-/intltool-merge.in
-/intltool-modules
-/intltool-update
-/intltool-update.in
 /libtool
 /ltmain.sh
 /missing
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4213026b91..e493e4f971 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -73,7 +73,7 @@ build-image:
     - echo "FROM debian:testing" > Dockerfile
     - echo "RUN apt-get update" >> Dockerfile
     - echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
-    - echo "appstream at-spi2-core build-essential desktop-file-utils ffmpeg ghostscript git glib-networking 
gobject-introspection graphviz graphviz-dev hicolor-icon-theme intltool iso-codes libappstream-glib-dev 
libbz2-dev libdbus-glib-1-dev libexif-dev libgexiv2-dev libgirepository1.0-dev libgtk-3-bin libgtk-3-dev 
libgudev-1.0-dev libjson-glib-dev liblcms2-dev liblzma-dev libmng-dev libmypaint-dev libopenexr-dev 
libpoppler-glib-dev libraw-dev libraw20 librsvg2-dev libspiro-dev libsuitesparse-dev libtiff-dev libtiff5-dev 
libtool libumfpack5 libwebp-dev libwmf-dev libxmu-dev libxpm-dev luajit meson mypaint-brushes poppler-data 
python3 python3-pip valac xauth xsltproc xvfb yelp-tools" >> Dockerfile
+    - echo "appstream at-spi2-core automake autopoint build-essential desktop-file-utils ffmpeg gettext 
ghostscript git glib-networking gobject-introspection graphviz graphviz-dev hicolor-icon-theme iso-codes 
libappstream-glib-dev libbz2-dev libdbus-glib-1-dev libexif-dev libgexiv2-dev libgirepository1.0-dev 
libgtk-3-bin libgtk-3-dev libgudev-1.0-dev libjson-glib-dev liblcms2-dev liblzma-dev libmng-dev 
libmypaint-dev libopenexr-dev libpoppler-glib-dev libraw-dev libraw20 librsvg2-dev libspiro-dev 
libsuitesparse-dev libtiff-dev libtiff5-dev libtool libumfpack5 libwebp-dev libwmf-dev libxmu-dev libxpm-dev 
luajit meson mypaint-brushes poppler-data python3 python3-pip valac xauth xsltproc xvfb yelp-tools" >> 
Dockerfile
     - echo "RUN pip3 install --no-cache-dir gi-docgen jinja2 Markdown markupsafe pygments toml typogrify" >> 
Dockerfile
 
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination 
$CI_REGISTRY_IMAGE:build-debian-latest --cache=true --cache-ttl=120h
@@ -101,7 +101,7 @@ build-image-win64:
     - echo "FROM debian:testing" > Dockerfile
     - echo "RUN apt-get update" >> Dockerfile
     - echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
-    - echo "build-essential cmake cpio g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 git intltool 
libgdk-pixbuf2.0-dev libglib2.0-bin librsvg2-dev meson pkg-config python3 python3-distutils python3-docutils 
python3-pip rpm xsltproc" >> Dockerfile
+    - echo "automake autopoint build-essential cmake cpio g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 gettext 
git libgdk-pixbuf2.0-dev libglib2.0-bin librsvg2-dev meson pkg-config python3 python3-distutils 
python3-docutils python3-pip rpm xsltproc" >> Dockerfile
 
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination 
$CI_REGISTRY_IMAGE:build-win64-latest --cache=true --cache-ttl=120h
 
@@ -124,7 +124,7 @@ build-image-win32:
     - echo "FROM debian:testing" > Dockerfile
     - echo "RUN apt-get update" >> Dockerfile
     - echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
-    - echo "build-essential cpio g++-mingw-w64-i686 gcc-mingw-w64-i686 git intltool libgdk-pixbuf2.0-dev 
libglib2.0-bin librsvg2-dev meson pkg-config python3 python3-distutils python3-docutils python3-pip rpm 
xsltproc" >> Dockerfile
+    - echo "automake autopoint build-essential cpio g++-mingw-w64-i686 gcc-mingw-w64-i686 gettext git 
libgdk-pixbuf2.0-dev libglib2.0-bin librsvg2-dev meson pkg-config python3 python3-distutils python3-docutils 
python3-pip rpm xsltproc" >> Dockerfile
 
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination 
$CI_REGISTRY_IMAGE:build-win32-latest --cache=true --cache-ttl=120h
 
diff --git a/INSTALL.in b/INSTALL.in
index 5e32bb2c0e..fbb53a47ff 100644
--- a/INSTALL.in
+++ b/INSTALL.in
@@ -32,11 +32,8 @@ header files installed.
   1. You need to have installed a recent version of pkg-config (>= @GIMP_PKGCONFIG_VERSION@) available
      from https://www.freedesktop.org/software/pkgconfig/.
 
-  2. You need intltool (at least @INTLTOOL_REQUIRED_VERSION@, but preferably a newer version).
-     Intltool can be downloaded from
-     https://ftp.gnome.org/pub/gnome/sources/intltool/
-     You also need gettext version @XGETTEXT_REQUIRED_VERSION@ or over. Earlier gettext had
-     issues with script-fu localization, ending up in incomplete GIMP localization.
+  2. You need gettext version 0.19.8 or newer. Older versions did not have support yet
+     for certain file formats.
 
   3. You need to have GEGL version @GEGL_REQUIRED_VERSION@ or newer and babl version
      @BABL_REQUIRED_VERSION@ or newer. You can get them from https://gegl.org/ or clone
diff --git a/autogen.sh b/autogen.sh
index a7d21d1c9f..965c9de56f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -9,255 +9,22 @@
 # tools and you shouldn't use this script.  Just call ./configure
 # directly.
 
-AUTOMAKE_RECOMMENDED_VERSION=1.16
-
-AUTOCONF_REQUIRED_VERSION=2.54
-AUTOMAKE_REQUIRED_VERSION=1.13.0
-INTLTOOL_REQUIRED_VERSION=0.40.1
-LIBTOOL_REQUIRED_VERSION=1.5
-LIBTOOL_WIN32_REQUIRED_VERSION=2.2
-
-ACLOCAL=${ACLOCAL-aclocal-${AUTOMAKE_RECOMMENDED_VERSION}}
-AUTOCONF=${AUTOCONF-autoconf}
-AUTOHEADER=${AUTOHEADER-autoheader}
-AUTOMAKE=${AUTOMAKE-automake-${AUTOMAKE_RECOMMENDED_VERSION}}
-LIBTOOLIZE=${LIBTOOLIZE-libtoolize}
+# Run this to generate all the initial makefiles, etc.
+test -n "$srcdir" || srcdir=`dirname "$0"`
+test -n "$srcdir" || srcdir=.
 
 PROJECT="GNU Image Manipulation Program"
-TEST_TYPE=-d
-FILE=plug-ins
-
 
 srcdir=`dirname $0`
-test -z "$srcdir" && srcdir=.
 ORIGDIR=`pwd`
 cd $srcdir
 
-
-check_version ()
-{
-    VERSION_A=$1
-    VERSION_B=$2
-
-    save_ifs="$IFS"
-    IFS=.
-    set dummy $VERSION_A 0 0 0
-    MAJOR_A=$2
-    MINOR_A=$3
-    MICRO_A=$4
-    set dummy $VERSION_B 0 0 0
-    MAJOR_B=$2
-    MINOR_B=$3
-    MICRO_B=$4
-    IFS="$save_ifs"
-
-    if expr "$MAJOR_A" = "$MAJOR_B" > /dev/null; then
-        if expr "$MINOR_A" \> "$MINOR_B" > /dev/null; then
-           echo "yes (version $VERSION_A)"
-        elif expr "$MINOR_A" = "$MINOR_B" > /dev/null; then
-            if expr "$MICRO_A" \>= "$MICRO_B" > /dev/null; then
-               echo "yes (version $VERSION_A)"
-            else
-                echo "Too old (version $VERSION_A)"
-                DIE=1
-            fi
-        else
-            echo "Too old (version $VERSION_A)"
-            DIE=1
-        fi
-    elif expr "$MAJOR_A" \> "$MAJOR_B" > /dev/null; then
-       echo "Major version might be too new ($VERSION_A)"
-    else
-       echo "Too old (version $VERSION_A)"
-       DIE=1
-    fi
-}
-
-echo
-echo "I am testing that you have the tools required to build the"
-echo "$PROJECT from git. This test is not foolproof,"
-echo "so if anything goes wrong, see the file HACKING for more information..."
-echo
-
-DIE=0
-
-OS=`uname -s`
-case $OS in
-    *YGWIN* | *INGW*)
-       echo "Looks like Win32, you will need libtool $LIBTOOL_WIN32_REQUIRED_VERSION or newer."
-       echo
-       LIBTOOL_REQUIRED_VERSION=$LIBTOOL_WIN32_REQUIRED_VERSION
-       ;;
-esac
-
-printf "checking for libtool >= $LIBTOOL_REQUIRED_VERSION ... "
-if ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1; then
-   LIBTOOLIZE=$LIBTOOLIZE
-elif (glibtoolize --version) < /dev/null > /dev/null 2>&1; then
-   LIBTOOLIZE=glibtoolize
-else
-    echo
-    echo "  You must have libtool installed to compile $PROJECT."
-    echo "  Install the appropriate package for your distribution,"
-    echo "  or get the source tarball at ftp://ftp.gnu.org/pub/gnu/";
-    echo
-    DIE=1
-fi
-
-if test x$LIBTOOLIZE != x; then
-    VER=`$LIBTOOLIZE --version \
-         | grep libtool | sed "s/.* \([0-9.]*\)[-a-z0-9]*$/\1/"`
-    check_version $VER $LIBTOOL_REQUIRED_VERSION
-fi
-
-printf "checking for autoconf >= $AUTOCONF_REQUIRED_VERSION ... "
-if ($AUTOCONF --version) < /dev/null > /dev/null 2>&1; then
-    VER=`$AUTOCONF --version | head -n 1 \
-         | grep -iw autoconf | sed "s/.* \([0-9.]*\)[-a-z0-9]*$/\1/"`
-    check_version $VER $AUTOCONF_REQUIRED_VERSION
-else
-    echo
-    echo "  You must have autoconf installed to compile $PROJECT."
-    echo "  Download the appropriate package for your distribution,"
-    echo "  or get the source tarball at ftp://ftp.gnu.org/pub/gnu/autoconf/";
-    echo
-    DIE=1;
-fi
-
-
-printf "checking for automake >= $AUTOMAKE_REQUIRED_VERSION ... "
-if ($AUTOMAKE --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=$AUTOMAKE
-   ACLOCAL=$ACLOCAL
-elif (automake-1.16 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.16
-   ACLOCAL=aclocal-1.16
-elif (automake-1.15 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.15
-   ACLOCAL=aclocal-1.15
-elif (automake-1.14 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.14
-   ACLOCAL=aclocal-1.14
-elif (automake-1.13 --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake-1.13
-   ACLOCAL=aclocal-1.13
-elif (automake --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake
-   ACLOCAL=aclocal
-else
-    echo
-    echo "  You must have automake $AUTOMAKE_REQUIRED_VERSION or newer installed to compile $PROJECT."
-    echo "  Download the appropriate package for your distribution,"
-    echo "  or get the source tarball at ftp://ftp.gnu.org/pub/gnu/automake/";
-    echo
-    DIE=1
-fi
-
-if test x$AUTOMAKE != x; then
-    VER=`$AUTOMAKE --version \
-         | grep automake | sed "s/.* \([0-9.]*\)[-a-z0-9]*$/\1/"`
-    check_version $VER $AUTOMAKE_REQUIRED_VERSION
-fi
-
-
-printf "checking for intltool >= $INTLTOOL_REQUIRED_VERSION ... "
-if (intltoolize --version) < /dev/null > /dev/null 2>&1; then
-    VER=`intltoolize --version \
-         | grep intltoolize | sed "s/.* \([0-9.]*\)/\1/"`
-    check_version $VER $INTLTOOL_REQUIRED_VERSION
-else
-    echo
-    echo "  You must have intltool installed to compile $PROJECT."
-    echo "  Get the latest version from"
-    echo "  ftp://ftp.gnome.org/pub/GNOME/sources/intltool/";
-    echo
-    DIE=1
-fi
-
-
-printf "checking for xsltproc ... "
-if (xsltproc --version) < /dev/null > /dev/null 2>&1; then
-    echo "yes"
-else
-    echo
-    echo "  You must have xsltproc installed to compile $PROJECT."
-    echo "  Get the latest version from"
-    echo "  ftp://ftp.gnome.org/pub/GNOME/sources/libxslt/";
-    echo
-    DIE=1
-fi
-
-if test "$DIE" -eq 1; then
-    echo
-    echo "Please install/upgrade the missing tools and call me again."
-    echo       
-    exit 1
-fi
-
-
-test $TEST_TYPE $FILE || {
-    echo
-    echo "You must run this script in the top-level $PROJECT directory."
-    echo
-    exit 1
+(test -f configure.ac) || {
+        echo "*** ERROR: Directory "\`$srcdir\'" does not look like the top-level project directory ***"
+        exit 1
 }
 
-
-if test -z "$NOCONFIGURE"; then
-    echo
-    echo "I am going to run ./configure with the following arguments:"
-    echo
-    echo "  $AUTOGEN_CONFIGURE_ARGS $@"
-    echo
-
-    if test -z "$*"; then
-        echo "If you wish to pass additional arguments, please specify them "
-        echo "on the $0 command line or set the AUTOGEN_CONFIGURE_ARGS "
-        echo "environment variable."
-        echo
-    fi
-fi
-
-
-if test -z "$ACLOCAL_FLAGS"; then
-
-    acdir=`$ACLOCAL --print-ac-dir`
-    m4list="glib-2.0.m4 glib-gettext.m4 gtk-3.0.m4 intltool.m4 pkg.m4"
-
-    for file in $m4list
-    do
-       if [ ! -f "$acdir/$file" ]; then
-           echo
-           echo "WARNING: aclocal's directory is $acdir, but..."
-            echo "         no file $acdir/$file"
-            echo "         You may see fatal macro warnings below."
-            echo "         If these files are installed in /some/dir, set the "
-            echo "         ACLOCAL_FLAGS environment variable to \"-I /some/dir\""
-            echo "         or install $acdir/$file."
-            echo
-        fi
-    done
-fi
-
-rm -rf autom4te.cache
-
-$ACLOCAL $ACLOCAL_FLAGS
-RC=$?
-if test $RC -ne 0; then
-   echo "$ACLOCAL gave errors. Please fix the error conditions and try again."
-   exit $RC
-fi
-
-$LIBTOOLIZE --force || exit $?
-
-# optionally feature autoheader
-($AUTOHEADER --version)  < /dev/null > /dev/null 2>&1 && $AUTOHEADER || exit 1
-
-$AUTOMAKE --add-missing || exit $?
-$AUTOCONF || exit $?
-
-intltoolize --automake || exit $?
-
+autoreconf --verbose --force --install -Wno-portability || exit $?
 
 cd $ORIGDIR
 
diff --git a/build/docker/gimpbuilder-base/Dockerfile b/build/docker/gimpbuilder-base/Dockerfile
index 7452dcfeb4..3a8e803503 100644
--- a/build/docker/gimpbuilder-base/Dockerfile
+++ b/build/docker/gimpbuilder-base/Dockerfile
@@ -18,7 +18,7 @@ RUN apt-get install $APT_GET_OPTIONS build-essential devscripts fakeroot quilt d
 # none needed
 
 # Installing additional dependencies for GEGL
-RUN apt-get install $APT_GET_OPTIONS intltool libglib2.0-dev libjson-c-dev libjson-glib-dev libgexiv2-dev 
libcairo2-dev libpango1.0-dev libjpeg62-turbo-dev libsuitesparse-dev libspiro-dev libopenexr-dev libwebp-dev
+RUN apt-get install $APT_GET_OPTIONS libglib2.0-dev libjson-c-dev libjson-glib-dev libgexiv2-dev 
libcairo2-dev libpango1.0-dev libjpeg62-turbo-dev libsuitesparse-dev libspiro-dev libopenexr-dev libwebp-dev
 
 # Installing additional dependencies for GIMP 
-RUN apt-get install $APT_GET_OPTIONS xsltproc gtk-doc-tools libgtk2.0-dev libtiff5-dev libbz2-dev 
liblzma-dev librsvg2-dev liblcms2-dev python-cairo-dev python-gtk2-dev glib-networking libaa1-dev libgs-dev 
libpoppler-glib-dev libmng-dev libwmf-dev libxpm-dev libasound2-dev
\ No newline at end of file
+RUN apt-get install $APT_GET_OPTIONS xsltproc gtk-doc-tools libgtk2.0-dev libtiff5-dev libbz2-dev 
liblzma-dev librsvg2-dev liblcms2-dev python-cairo-dev python-gtk2-dev glib-networking libaa1-dev libgs-dev 
libpoppler-glib-dev libmng-dev libwmf-dev libxpm-dev libasound2-dev
diff --git a/build/flatpak/org.gimp.GIMP-nightly.json b/build/flatpak/org.gimp.GIMP-nightly.json
index 6bfa314aad..0c6fa755bd 100644
--- a/build/flatpak/org.gimp.GIMP-nightly.json
+++ b/build/flatpak/org.gimp.GIMP-nightly.json
@@ -354,26 +354,6 @@
                 }
             ]
         },
-        {
-            "//": "Copy from shared-modules to avoid submodules on dev repo.",
-            "name": "intltool",
-            "cleanup": [
-                "*"
-            ],
-            "sources": [
-                {
-                    "type": "archive",
-                    "url": "https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz";,
-                    "sha256": "67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd",
-                    "x-checker-data": {
-                        "type": "anitya",
-                        "project-id": 1385,
-                        "stable-only": true,
-                        "url-template": 
"https://launchpad.net/intltool/trunk/$version/+download/intltool-$version.tar.gz";
-                    }
-                }
-            ]
-        },
         {
             "name": "libmypaint",
             "config-opts": [
diff --git a/build/windows/gitlab-ci/build-gimp-msys2.sh b/build/windows/gitlab-ci/build-gimp-msys2.sh
index f787799539..e5e9d7ed7c 100644
--- a/build/windows/gitlab-ci/build-gimp-msys2.sh
+++ b/build/windows/gitlab-ci/build-gimp-msys2.sh
@@ -23,7 +23,6 @@ pacman --noconfirm -Suy
 # Install the required packages
 pacman --noconfirm -S --needed \
     base-devel \
-    intltool \
     mingw-w64-$MSYS2_ARCH-toolchain \
     mingw-w64-$MSYS2_ARCH-autotools \
     mingw-w64-$MSYS2_ARCH-ccache \
diff --git a/build/windows/installer/lang/Makefile.am b/build/windows/installer/lang/Makefile.am
index e5eaf36adf..da603b9393 100644
--- a/build/windows/installer/lang/Makefile.am
+++ b/build/windows/installer/lang/Makefile.am
@@ -1,78 +1,72 @@
-isl_in_files = \
-       setup.isl.in
-isl_files = $(isl_in_files:.isl.in=.isl)
+isl_xml_in_files = setup.isl.xml.in
+isl_xml_files = $(isl_xml_in_files:.isl.xml.in=.isl.xml)
 
 stamp_files = \
        stamp-isl
 
-CLEANFILES = $(isl_files) $(stamp_files)
+CLEANFILES = $(isl_xml_files) $(stamp_files)
 
+# First we use the XML file to be able to do gettext translation
+$(isl_xml_files): $(is_xml_in_files) $(wildcard $(top_srcdir)/po-windows-installer/*.po) Makefile.am
+       $(AM_V_GEN) GETTEXT_DATA_DIRS=$(abs_srcdir) $(MSGFMT) --xml --template $< -d 
$(top_srcdir)/po-windows-installer -o $@
+
+# Then, we generate the .isl file for each language using some xsltproc magic
 languages = \
-       ca:[ca]         \
-       cs:[cs]         \
-       da:[da]         \
-       de:[de]         \
-       el:[el]         \
+       ca:ca           \
+       cs:cs           \
+       da:da           \
+       de:de           \
+       el:el           \
        en:             \
-       en_GB:[en_GB]   \
-       eo:[eo]         \
-       es:[es]         \
-       eu:[eu]         \
-       fi:[fi]         \
-       fr:[fr]         \
-       gl:[gl]         \
-       he:[he]         \
-       hu:[hu]         \
-       id:[id]         \
-       is:[is]         \
-       it:[it]         \
-       ja:[ja]         \
-       ka:[ka]         \
-       kab:[kab]       \
-       ko:[ko]         \
-       lt:[lt]         \
-       lv:[lv]         \
-       mr:[mr]         \
-       ms:[ms]         \
-       nl:[nl]         \
-       pl:[pl]         \
-       pt:[pt]         \
-       pt_BR:[pt_BR]   \
-       ro:[ro]         \
-       ru:[ru]         \
-       sk:[sk]         \
-       sl:[sl]         \
-       sv:[sv]         \
-       tr:[tr]         \
-       uk:[uk]         \
-       vi:[vi]         \
-       zh_CN:[zh_CN]   \
-       zh_TW:[zh_TW]
+       en_GB:en_GB     \
+       eo:eo           \
+       es:es           \
+       eu:eu           \
+       fi:fi           \
+       fr:fr           \
+       gl:gl           \
+       he:he           \
+       hu:hu           \
+       id:id           \
+       is:is           \
+       it:it           \
+       ja:ja           \
+       ka:ka           \
+       kab:kab \
+       ko:ko           \
+       lt:lt           \
+       lv:lv           \
+       mr:mr           \
+       ms:ms           \
+       nl:nl           \
+       pl:pl           \
+       pt:pt           \
+       pt_BR:pt_BR     \
+       ro:ro           \
+       ru:ru           \
+       sk:sk           \
+       sl:sl           \
+       sv:sv           \
+       tr:tr           \
+       uk:uk           \
+       vi:vi           \
+       zh_CN:zh_CN     \
+       zh_TW:zh_TW
 
-stamp-isl: setup.isl Makefile.am
+stamp-isl: setup.isl gimp-ms-installer-config.xsl.in Makefile.am
        @                                                                               \
        for lang in $(languages); do                                                    \
                code=`echo $$lang | cut -d: -f1`;                                       \
-               prefix=`echo $$lang | cut -d: -f2 | sed 's/[][]/\\\\\\0/g'`;            \
+               prefix=`echo $$lang | cut -d: -f2`;             \
+               lang_check=`[ "$$prefix" ] && echo "value[lang('$$code')]" || echo "value"`;            \
+               xsl="$(builddir)/gimp-ms-installer-config.xsl";                                 \
                isl="$(builddir)/$$code.setup.isl";                                     \
                echo "  GEN      $$isl";                                                \
-               echo -ne "\\xEF\\xBB\\xBF" > "$$isl";                                   \
-               sed '/^\w\+'"$$prefix"'=/{s/\(.\)'"$$prefix"'/\1/;n};/^\w.*=/d' $<  >> "$$isl"; \
+               sed 's/@LANG_CHECK@/$$lang_check/' "$$xsl"  > "$$xsl.in";       \
+               $(XSLTPROC) --xinclude "$$xsl" $< --output "$$isl" || rm -f "$$isl"; \
        done &&                                                                         \
        echo timestamp > stamp-isl
 
-# * setup.isl.ini is used by intltool-extract to extract the localizable
-#   strings. We needed to use the ini syntax for leaving comments to
-#   translators (with '#' instead of ';').
-# * setup.isl.in is in the actual .isl format except for the gettext
-#   underscoring.
-# * setup.isl is in the .isl format but mixing all languages.
-setup.isl: setup.isl.in $(wildcard $(top_srcdir)/po-windows-installer/*.po) Makefile.am
-       $(AM_V_GEN) $(INTLTOOL_MERGE) $(top_srcdir)/po-windows-installer $< $(@) -d -u -c 
$(top_builddir)/po-windows-installer/.intltool-merge-cache
-
-setup.isl.in: setup.isl.ini Makefile.am
-       $(AM_V_GEN) sed 's/^#/;/' $< > $@
-
 all-local: $(stamp_files)
 
 clean-local:
diff --git a/build/windows/installer/lang/gimp-ms-installer-config.xsl.in 
b/build/windows/installer/lang/gimp-ms-installer-config.xsl.in
new file mode 100644
index 0000000000..0fc8d9ae08
--- /dev/null
+++ b/build/windows/installer/lang/gimp-ms-installer-config.xsl.in
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
+
+<xsl:output method="text" omit-xml-declaration="yes" />
+
+<xsl:template match="/">
+<xsl:apply-templates select="gimp-ms-installer-config" />
+</xsl:template>
+
+<xsl:template match="gimp-ms-installer-config">
+<xsl:apply-templates select="section" />
+</xsl:template>
+
+<xsl:template match="section">[<xsl:value-of select="@name"/>]
+<xsl:apply-templates select="config" />
+<xsl:text>&#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="config">
+<xsl:value-of select="@name"/>=<xsl:value-of select="."/>
+<xsl:apply-templates select="@LANG_CHECK@" />
+<xsl:text>&#xA;</xsl:text>
+</xsl:template>
+<xsl:template match="config">
+<xsl:choose>
+  <xsl:when test="@LANG_CHECK@">
+    <xsl:value-of select="@name"/>=<xsl:apply-templates select="@LANG_CHECK@" />
+  </xsl:when>
+  <xsl:otherwise>
+    <xsl:value-of select="@name"/>=<xsl:apply-templates select="value[not(xml:lang)]" />
+  </xsl:otherwise>
+</xsl:choose>
+<xsl:text>&#xA;</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/build/windows/installer/lang/its/gimp-ms-installer-config.its 
b/build/windows/installer/lang/its/gimp-ms-installer-config.its
new file mode 100644
index 0000000000..ffd15e76f5
--- /dev/null
+++ b/build/windows/installer/lang/its/gimp-ms-installer-config.its
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<its:rules xmlns:its="http://www.w3.org/2005/11/its"; version="2.0"
+           xmlns:gt="https://www.gnu.org/s/gettext/ns/its/extensions/1.0";>
+  <its:translateRule selector="/gimp-ms-installer-config" translate="no"/>
+  <its:translateRule selector="//value" translate="yes"/>
+</its:rules>
diff --git a/build/windows/installer/lang/its/gimp-ms-installer-config.loc 
b/build/windows/installer/lang/its/gimp-ms-installer-config.loc
new file mode 100644
index 0000000000..f2d812e143
--- /dev/null
+++ b/build/windows/installer/lang/its/gimp-ms-installer-config.loc
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<locatingRules>
+  <locatingRule name="GimpMsInstallerConfig" pattern="*.xml">
+    <documentRule localName="gimp-ms-installer-config" target="gimp-ms-installer-config.its"/>
+  </locatingRule>
+</locatingRules>
diff --git a/build/windows/installer/lang/meson.build b/build/windows/installer/lang/meson.build
index e25a2cce20..a65474d48d 100644
--- a/build/windows/installer/lang/meson.build
+++ b/build/windows/installer/lang/meson.build
@@ -1,25 +1,11 @@
-isl_in_input = custom_target('setup.isl.in',
-  input : 'setup.isl.ini',
-  output: 'setup.isl.in',
-  capture: true,
-  command: [
-    'sed', 's/^#/;/', '@INPUT@',
-  ]
-)
-
-isl_input = custom_target('setup.isl',
-  input : isl_in_input,
-  output: 'setup.isl',
-  command: [
-    intltool_merge,
-    '--desktop-style',
-    '--utf8',
-    '--multiple-output',
-    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
-    po_windows_installer_dir,
-    '@INPUT@',
-    '@OUTPUT@',
-  ]
+# First we use the XML file to be able to do gettext translation
+ms_installer_config_xml = i18n.merge_file(
+  input : 'setup.isl.xml.in',
+  output: '@BASENAME@',
+  data_dirs: meson.current_source_dir(),
+  po_dir: po_windows_installer_dir,
+  install: true,
+  install_dir: gimpdatadir / 'tags',
 )
 
 languages = [
@@ -65,20 +51,34 @@ languages = [
   { 'code': 'zh_TW', },
 ]
 
-extractlang = find_program('extractlang.sh')
-
+# Then, we generate the .isl file for each language using some xsltproc magic
 all_isl = []
 foreach language : languages
-  lang_code    = language.get('code')
-  lang_prefix  = language.get('prefix', '[@0@]'.format(lang_code))
+  lang_code = language.get('code')
 
-  islfile = '@0  setup isl'.format(lang_code)
+  if 'prefix' in language
+    lang_check = 'value[lang(\'@0@\')]'.format(lang_code)
+  else
+    lang_check = 'value'.format(lang_code)
+  endif
+
+  gimp_ms_installer_lang_xsl = configure_file(
+    input: 'gimp-ms-installer-config.xsl.in',
+    output: '@BASENAME@',
+    configuration: { 'LANG_CHECK': lang_check },
+  )
 
-  all_isl += custom_target(islfile,
-    input : isl_input,
-    output: islfile,
-    command: [ extractlang, lang_prefix, '@INPUT@' ],
-    capture: true,
+  setup_isl = '@0  setup isl'.format(lang_code)
+  all_isl += custom_target(setup_isl,
+    input : [ ms_installer_config_xml, gimp_ms_installer_lang_xsl  ],
+    output: setup_isl,
+    command: [
+      xsltproc,
+      '--xinclude',
+      '--output', '@OUTPUT@',
+      '@INPUT1@',
+      '@INPUT0@',
+    ],
     build_by_default: true,
   )
 endforeach
diff --git a/build/windows/installer/lang/setup.isl.xml.in b/build/windows/installer/lang/setup.isl.xml.in
new file mode 100644
index 0000000000..db5c7c02e3
--- /dev/null
+++ b/build/windows/installer/lang/setup.isl.xml.in
@@ -0,0 +1,326 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<gimp-ms-installer-config>
+
+  <section name="Messages">
+    <!-- InfoBefore page is used instead of license page because the GPL only concerns distribution, not 
use, and as such doesn't have to be accepted -->
+    <config name="WizardInfoBefore">
+      <value>License Agreement</value>
+    </config>
+    <config name="AboutSetupNote">
+      <value>Setup built by Jernej Simonèiè, jernej-gimp ena si</value>
+    </config>
+    <config name="WinVersionTooLowError">
+      <value>This version of GIMP requires Windows 7, or a newer version of Windows.</value>
+    </config>
+    <config name="WindowsVersionNotSupported">
+      <value>This version of GIMP requires Windows 7, or a newer version of Windows.</value>
+    </config>
+  </section>
+
+  <section name="CustomMessages">
+    <!-- Shown before the wizard starts on development versions of GIMP -->
+    <config name="DevelopmentWarningTitle">
+      <value>Development version</value>
+    </config>
+
+    <!-- Shown before the wizard starts on development versions of GIMP -->
+    <config name="DevelopmentWarning">
+      <value>This is a development version of GIMP where some features may not be finished, or it may be 
unstable.%nThis version of GIMP is not intended for day-to-day work as it may be unstable, and you could lose 
your work.%nIf you encounter any problems, first verify that they haven't already been fixed in GIT before 
you contact the developers or report it in GIMP gitlab:%n_https://gitlab.gnome.org/GNOME/gimp/issues%n%nDo 
you wish to continue with installation anyway?</value>
+    </config>
+    <config name="DevelopmentButtonContinue">
+      <value>&amp;Continue</value>
+    </config>
+    <config name="DevelopmentButtonExit">
+      <value>Exit</value>
+    </config>
+
+    <!--
+    <config name="XPSP3Recommended">
+      <value>Warning: you are running an unsupported version of Windows. Please update to at least Windows 
XP with Service Pack 3 before reporting any problems.</value>
+    </config>
+    -->
+
+    <config name="SSERequired">
+      <value>This version of GIMP requires a processor that supports SSE instructions.</value>
+    </config>
+
+    <config name="Require32BPPTitle">
+      <value>Display settings problem</value>
+    </config>
+    <config name="Require32BPP">
+      <value>Setup has detected that your Windows is not running in 32 bits-per-pixel display mode. This has 
been known to cause stability problems with GIMP, so it's recommended to change the display colour depth to 
32BPP before continuing.</value>
+    </config>
+    <config name="Require32BPPContinue">
+      <value>&amp;Continue</value>
+    </config>
+    <config name="Require32BPPExit">
+      <value>E&amp;xit</value>
+    </config>
+
+    <config name="InstallOrCustomize">
+      <value>GIMP is now ready to be installed. Click the Install now button to install using the default 
settings, or click the Customize button if you'd like to have more control over what gets installed.</value>
+    </config>
+    <config name="Install">
+      <value>&amp;Install</value>
+    </config>
+    <config name="Customize">
+      <value>&amp;Customize</value>
+    </config>
+
+    <!-- Setup types -->
+    <config name="TypeCompact">
+      <value>Compact installation</value>
+    </config>
+    <!-- Setup types -->
+    <config name="TypeCustom">
+      <value>Custom installation</value>
+    </config>
+    <!-- Setup types -->
+    <config name="TypeFull">
+      <value>Full installation</value>
+    </config>
+
+    <!-- Text above component description -->
+    <config name="ComponentsDescription">
+      <value>Description</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsGimp">
+      <value>GIMP</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsGimpDescription">
+      <value>GIMP and all default plug-ins</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsDeps">
+      <value>Run-time libraries</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsDepsDescription">
+      <value>Run-time libraries used by GIMP, including GTK+ Run-time Environment</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsDebug">
+      <value>Debug symbols</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsDebugDescription">
+      <value>Include information to help with debugging GIMP</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsGtkWimp">
+      <value>MS-Windows engine for GTK+</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsGtkWimpDescription">
+      <value>Native Windows look for GIMP</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsCompat">
+      <value>Support for old plug-ins</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsCompatDescription">
+      <value>Install libraries needed by old third-party plug-ins</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsTranslations">
+      <value>Translations</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsTranslationsDescription">
+      <value>Translations</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsPython">
+      <value>Python scripting</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsPythonDescription">
+      <value>Allows you to use GIMP plugins written in Python scripting language.</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsLua">
+      <value>Lua scripting</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsLuaDescription">
+      <value>Allows you to use GIMP plugins written in Lua scripting language.</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsMyPaint">
+      <value>MyPaint brushes</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsMyPaintDescription">
+      <value>Install the default set of MyPaint brushes</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsGhostscript">
+      <value>PostScript support</value>
+    </config>
+    <!-- Components -->
+    <config name="ComponentsGhostscriptDescription">
+      <value>Allow GIMP to load PostScript files</value>
+    </config>
+    <!-- Components, only when installing on x64 Windows -->
+    <config name="ComponentsGimp32">
+      <value>Support for 32-bit plug-ins</value>
+    </config>
+    <!-- Compoments, only when installing on x64 Windows -->
+    <config name="ComponentsGimp32Description">
+      <value>Include files necessary for using 32-bit plug-ins.%nRequired for Python support.</value>
+    </config>
+
+    <!-- Additional installation tasks -->
+    <config name="AdditionalIcons">
+      <value>Additional icons:</value>
+    </config>
+    <!-- Additional installation tasks -->
+    <config name="AdditionalIconsDesktop">
+      <value>Create a &amp;desktop icon</value>
+    </config>
+    <!-- Additional installation tasks -->
+    <config name="AdditionalIconsQuickLaunch">
+      <value>Create a &amp;Quick Launch icon</value>
+    </config>
+
+    <config name="RemoveOldGIMP">
+      <value>Remove previous GIMP version</value>
+    </config>
+
+    <!-- %1 is replaced by file name; this message should never appear (unless user runs out of disk space 
at the exact right moment) -->
+    <config name="ErrorChangingEnviron">
+      <value>There was a problem updating GIMP's environment in %1. If you get any errors loading the 
plug-ins, try uninstalling and re-installing GIMP.</value>
+    </config>
+    <!-- This message should never appear (unless user runs out of disk space at the exact right moment) -->
+    <config name="ErrorExtractingTemp">
+      <value>Error extracting temporary data.</value>
+    </config>
+    <!-- This message should never appear (unless user runs out of disk space at the exact right moment) -->
+    <config name="ErrorUpdatingPython">
+      <value>Error updating Python interpreter info.</value>
+    </config>
+    <!-- This message should never appear (unless user runs out of disk space at the exact right moment) -->
+    <config name="ErrorUpdatingMyPaint">
+      <value>Error updating MyPaint brushes info.</value>
+    </config>
+    <!-- %1 is replaced by file name; this message should never appear (unless user runs out of disk space 
at the exact right moment) -->
+    <config name="ErrorReadingGimpRC">
+      <value>There was an error updating %1.</value>
+    </config>
+    <!-- %1 is replaced by file name; this message should never appear (unless user runs out of disk space 
at the exact right moment) -->
+    <config name="ErrorUpdatingGimpRC">
+      <value>There was an error updating GIMP's configuration file %1.</value>
+    </config>
+
+    <!-- Displayed in Explorer's right-click menu -->
+    <config name="OpenWithGimp">
+      <value>Edit with GIMP</value>
+    </config>
+
+    <!-- File associations page -->
+    <config name="SelectAssociationsCaption">
+      <value>Select file associations</value>
+    </config>
+    <!-- File associations page -->
+    <config name="SelectAssociationsExtensions">
+      <value>Extensions:</value>
+    </config>
+    <!-- File associations page -->
+    <config name="SelectAssociationsInfo1">
+      <value>Select the file types you wish to associate with GIMP</value>
+    </config>
+    <!-- File associations page -->
+    <config name="SelectAssociationsInfo2">
+      <value>This will make selected files open in GIMP when you double-click them in Explorer.</value>
+    </config>
+    <!-- File associations page -->
+    <config name="SelectAssociationsSelectAll">
+      <value>Select &amp;All</value>
+    </config>
+    <!-- File associations page -->
+    <config name="SelectAssociationsUnselectAll">
+      <value>Unselect &amp;All</value>
+    </config>
+    <!-- File associations page -->
+    <config name="SelectAssociationsSelectUnused">
+      <value>Select &amp;Unused</value>
+    </config>
+
+    <!-- Shown on summary screen just before starting the install -->
+    <config name="ReadyMemoAssociations">
+      <value>File types to associate with GIMP:</value>
+    </config>
+
+    <config name="RemovingOldVersion">
+      <value>Removing previous version of GIMP:</value>
+    </config>
+    <!-- %1 = version, %2 = installation directory; ran uninstaller, but it returned an error, or didn't 
remove everything -->
+    <config name="RemovingOldVersionFailed">
+      <value>GIMP %1 cannot be installed over your currently installed GIMP version, and the automatic 
uninstall of old version has failed.%n%nPlease remove the previous version of GIMP yourself before installing 
this version in %2, or choose a Custom install, and select a different installation folder.%n%nThe Setup will 
now exit.</value>
+    </config>
+    <!-- %1 = version, %2 = installation directory; couldn't find an uninstaller, or found several 
uninstallers -->
+    <config name="RemovingOldVersionCantUninstall">
+      <value>GIMP %1 cannot be installed over your currently installed GIMP version, and Setup couldn't 
determine how to remove the old version automatically.%n%nPlease remove the previous version of GIMP and any 
add-ons yourself before installing this version in %2, or choose a Custom install, and select a different 
installation folder.%n%nThe Setup will now exit.</value>
+    </config>
+
+    <config name="RebootRequiredFirst">
+      <value>Previous GIMP version was removed successfully, but Windows has to be restarted before the 
Setup can continue.%n%nAfter restarting your computer, Setup will continue next time an administrator logs 
in.</value>
+    </config>
+
+    <!-- Displayed if restart settings couldn't be read, or if the setup couldn't re-run itself -->
+    <config name="ErrorRestartingSetup">
+      <value>There was an error restarting the Setup. (%1)</value>
+    </config>
+
+    <config name="RemovingOldFiles">
+      <value>Cleaning up old files...</value>
+    </config>
+
+    <!-- Displayed while the files are being extracted; note the capitalisation! -->
+    <config name="Billboard1">
+      <value>Remember: GIMP is Free Software.%n%nPlease visit</value>
+    </config>
+    <!-- www.gimp.org (displayed between Billboard1 and Billboard2) -->
+    <config name="Billboard2">
+      <value>for free updates.</value>
+    </config>
+
+    <config name="SettingUpAssociations">
+      <value>Setting up file associations...</value>
+    </config>
+    <config name="SettingUpPyGimp">
+      <value>Setting up environment for GIMP Python extension...</value>
+    </config>
+    <config name="SettingUpMyPaint">
+      <value>Setting up MyPaint brushes...</value>
+    </config>
+    <config name="SettingUpEnvironment">
+      <value>Setting up GIMP environment...</value>
+    </config>
+    <config name="SettingUpGimpRC">
+      <value>Setting up GIMP configuration for 32-bit plug-in support...</value>
+    </config>
+
+    <!-- Displayed on last page -->
+    <config name="LaunchGimp">
+      <value>Launch GIMP</value>
+    </config>
+
+    <!-- Shown during uninstall when removing add-ons -->
+    <config name="UninstallingAddOnCaption">
+      <value>Removing add-on</value>
+    </config>
+
+    <config name="InternalError">
+      <value>Internal error (%1).</value>
+    </config>
+
+    <!-- Used by installer for add-ons (currently only help) -->
+    <config name="DirNotGimp">
+      <value>GIMP does not appear to be installed in the selected directory. Continue anyway?</value>
+    </config>
+  </section>
+</gimp-ms-installer-config>
diff --git a/build/windows/jhbuild/README.md b/build/windows/jhbuild/README.md
index 8fac252eb1..ca388b6f9d 100644
--- a/build/windows/jhbuild/README.md
+++ b/build/windows/jhbuild/README.md
@@ -4,7 +4,7 @@ To begin with, you need to install jhbuild, mingw-w64, and a few other build-rel
 
 If you're using debian, install these packages:
 
-       sudo apt-get install build-essential mingw-w64 git jhbuild automake autoconf libtool libgtk2.0-dev 
ragel intltool bison flex gperf gtk-doc-tools nasm ruby cmake libxml-simple-perl
+       sudo apt-get install build-essential mingw-w64 git jhbuild automake autoconf libtool libgtk2.0-dev 
ragel bison flex gperf gtk-doc-tools nasm ruby cmake libxml-simple-perl
 
 From there, in theory, you can simply clone this repo, cd into it, and run:
 
diff --git a/configure.ac b/configure.ac
index 6b49d84b5a..66e66393df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -69,7 +69,6 @@ m4_define([gtk_mac_integration_required_version], [2.0.0])
 m4_define([gtk_required_version], [3.22.29])
 m4_define([gtkdoc_required_version], [1.0])
 m4_define([harfbuzz_required_version], [1.0.5])
-m4_define([intltool_required_version], [0.40.1])
 m4_define([introspection_required_version], [1.32.0])
 m4_define([json_glib_required_version], [1.2.6])
 m4_define([lcms_required_version], [2.8])
@@ -94,10 +93,6 @@ m4_define([webkitgtk_required_version], [2.20.3])
 m4_define([webp_required_version], [0.6.0])
 m4_define([wmf_required_version], [0.2.8])
 
-# Current test considers only 2 version numbers. If we update the recommended
-# version of gettext with more version numbers, please update the tests.
-m4_define([xgettext_required_version], [0.19])
-
 # required versions for build-time only tools
 m4_define([native_glib_required_version], [2.2.0])
 
@@ -109,7 +104,7 @@ AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_SRCDIR([app/core/gimp.c])
 AC_CONFIG_MACRO_DIR([m4macros])
 
-AM_INIT_AUTOMAKE(no-define dist-bzip2 dist-xz no-dist-gzip -Wno-portability)
+AM_INIT_AUTOMAKE(no-define dist-bzip2 dist-xz no-dist-gzip foreign)
 
 # Enable silent build rules by default, requires at least
 # Automake-1.11. Disable by either passing --disable-silent-rules to
@@ -178,7 +173,6 @@ GEXIV2_REQUIRED_VERSION=gexiv2_required_version
 GLIB_REQUIRED_VERSION=glib_required_version
 GTK_REQUIRED_VERSION=gtk_required_version
 HARFBUZZ_REQUIRED_VERSION=harfbuzz_required_version
-INTLTOOL_REQUIRED_VERSION=intltool_required_version
 LCMS_REQUIRED_VERSION=lcms_required_version
 LIBHEIF_REQUIRED_VERSION=libheif_required_version
 LIBJXL_REQUIRED_VERSION=libjxl_required_version
@@ -199,7 +193,6 @@ WEBKITGTK_REQUIRED_VERSION=webkitgtk_required_version
 WEBP_REQUIRED_VERSION=webp_required_version
 WMF_REQUIRED_VERSION=wmf_required_version
 LIBUNWIND_REQUIRED_VERSION=libunwind_required_version
-XGETTEXT_REQUIRED_VERSION=xgettext_required_version
 AC_SUBST(APPSTREAM_GLIB_REQUIRED_VERSION)
 AC_SUBST(ATK_REQUIRED_VERSION)
 AC_SUBST(BABL_MAJOR_MINOR_VERSION)
@@ -215,7 +208,6 @@ AC_SUBST(GEXIV2_REQUIRED_VERSION)
 AC_SUBST(GLIB_REQUIRED_VERSION)
 AC_SUBST(GTK_REQUIRED_VERSION)
 AC_SUBST(HARFBUZZ_REQUIRED_VERSION)
-AC_SUBST(INTLTOOL_REQUIRED_VERSION)
 AC_SUBST(LCMS_REQUIRED_VERSION)
 AC_SUBST(LIBHEIF_REQUIRED_VERSION)
 AC_SUBST(LIBJXL_REQUIRED_VERSION)
@@ -236,7 +228,6 @@ AC_SUBST(WEBKITGTK_REQUIRED_VERSION)
 AC_SUBST(WEBP_REQUIRED_VERSION)
 AC_SUBST(WMF_REQUIRED_VERSION)
 AC_SUBST(LIBUNWIND_REQUIRED_VERSION)
-AC_SUBST(XGETTEXT_REQUIRED_VERSION)
 
 # The symbol GIMP_UNSTABLE is defined above for substitution in
 # Makefiles and conditionally defined here as a preprocessor symbol
@@ -264,11 +255,6 @@ AC_SUBST(GETTEXT_PACKAGE)
 AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
                    [The prefix for our gettext translation domains.])
 
-# work around intltool-update issues during 'make distcheck'
-AS_IF([test "x$0" != "x./configure"], [
-        AC_SUBST([INTLTOOL_UPDATE], [/bin/true])
-])
-
 # Determine a C compiler to use
 AC_PROG_CC
 AX_PROG_CC_FOR_BUILD
@@ -672,36 +658,8 @@ m4_define([add_deps_error], [
 # Internationalisation
 ######################
 
-IT_PROG_INTLTOOL(intltool_required_version)
-
-# Testing xgettext version since we had some problem with localizing script-fu. See bug 720052.
-AC_MSG_CHECKING([for xgettext version (>= xgettext_required_version)])
-XGETTEXT_REQUIRED_VERSION_MAJOR=`echo $XGETTEXT_REQUIRED_VERSION | awk -F. '{ print $ 1; }'`
-XGETTEXT_REQUIRED_VERSION_MINOR_1=`echo $XGETTEXT_REQUIRED_VERSION | awk -F. '{ print $ 2; }'`
-
-XGETTEXT_APPLIED_VERSION=`$XGETTEXT --version | head -1 | cut -d" " -f4`
-XGETTEXT_APPLIED_VERSION_MAJOR=`echo $XGETTEXT_APPLIED_VERSION | awk -F. '{ print $ 1; }'`
-XGETTEXT_APPLIED_VERSION_MINOR_1=`echo $XGETTEXT_APPLIED_VERSION | awk -F. '{ print $ 2; }'`
-
-have_required_xgettext="no"
-if test -n "$XGETTEXT_APPLIED_VERSION_MAJOR"; then
-    if test "$XGETTEXT_REQUIRED_VERSION_MAJOR" -lt "$XGETTEXT_APPLIED_VERSION_MAJOR"; then
-        have_required_xgettext="yes"
-    elif test "$XGETTEXT_REQUIRED_VERSION_MAJOR" -eq "$XGETTEXT_APPLIED_VERSION_MAJOR"; then
-        if test -n "$XGETTEXT_APPLIED_VERSION_MINOR_1"; then
-            if test "$XGETTEXT_REQUIRED_VERSION_MINOR_1" -le "$XGETTEXT_APPLIED_VERSION_MINOR_1"; then
-                have_required_xgettext="yes"
-            fi
-        fi
-    fi
-fi
-AC_MSG_RESULT($have_required_xgettext)
-
-if test "x$have_required_xgettext" = "xno"; then
-    add_deps_error([xgettext], [xgettext >= xgettext_required_version])
-fi
-
-AM_GLIB_GNU_GETTEXT
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.19.8])
 
 ###########
 # iso-codes
@@ -2844,13 +2802,6 @@ AC_ARG_ENABLE(windows-installer,
                           (default=no)],,
               enable_windows_installer=no)
 
-if test "x$enable_windows_installer" != xno; then
-  if test ! -e "$srcdir/build/windows/installer/lang/setup.isl.ini"; then
-    AC_MSG_RESULT([no (not building from git)])
-    AC_MSG_ERROR([Building the Windows installer is only supported when building from git.])
-  fi
-fi
-
 AC_MSG_RESULT([$enable_windows_installer])
 AM_CONDITIONAL(BUILD_WINDOWS_INSTALLER, test "x$enable_windows_installer" != xno)
 
@@ -3240,37 +3191,6 @@ gimpthumb-gimp_pkgconfig_version.pc:gimpthumb.pc.in
 gimpui-gimp_pkgconfig_version.pc:gimpui.pc.in
 )
 
-# By default, autoconf will create only po/Makefile.
-# This code is used to create the POTFILES and Makefile for all
-# additional gettext catalogs.
-m4_define([generate_po_makefile], [
-  AC_MSG_NOTICE([Generating POTFILES and Makefile for $1])
-
-  AC_CONFIG_COMMANDS([$1/stamp-it],
-  [[
-    if  ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ; then
-       as_fn_error $? "$1/Makefile.in.in was not created by intltoolize." "$LINENO" 5
-    fi
-    rm -f "$1/stamp-it" "$1/POTFILES"
-    sed -e '/^#/d' -e 's/^[[].*] *//' \
-        -e '/^[        ]*$/d'        \
-        -e "s|^|       $ac_top_srcdir/|" \
-        "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" && \
-    sed -e "/^# This comment gets stripped out/ {"  \
-        -e 'r $1/POTFILES'                          \
-        -e "d" -e "}"                               \
-        "$1/Makefile.in" >"$1/Makefile" && \
-    touch "$1/stamp-it"
-  ]])
-])
-
-generate_po_makefile([po-libgimp])
-generate_po_makefile([po-python])
-generate_po_makefile([po-plug-ins])
-generate_po_makefile([po-script-fu])
-generate_po_makefile([po-tips])
-generate_po_makefile([po-windows-installer])
-
 # Print a summary of features enabled/disabled:
 optional_deps="
 Extra Binaries:
diff --git a/data/tags/Makefile.am b/data/tags/Makefile.am
index 8ab943ab24..f6eecebd59 100644
--- a/data/tags/Makefile.am
+++ b/data/tags/Makefile.am
@@ -15,10 +15,14 @@ EXTRA_DIST = \
 
 DISTCLEANFILES = $(tagsdata_data_files)
 
+itsdir = $(datadir)/gettext/its
+its_DATA = its/gimp-tags.loc its/gimp-tags.its
+
+EXTRA_DIST += $(its_DATA)
+
 
 gimp-tags-default.xml: gimp-tags-default.xml.in $(wildcard $(top_srcdir)/po-tags/*.po)
-       mkdir -p $(top_builddir)/po-tags/
-       $(INTLTOOL_MERGE) $(top_srcdir)/po-tags $< $(@) -x -u -c $(top_builddir)/po-tags/.intltool-merge-cache
+       $(AM_V_GEN) GETTEXT_DATA_DIRS=$(abs_srcdir) $(MSGFMT) --xml --template $< -d $(top_srcdir)/po-tags -o 
$@
 
 
 validate: gimp-tags-default.xml
diff --git a/data/tags/gimp-tags-default.xml.in b/data/tags/gimp-tags-default.xml.in
index 8a420191fe..407d2b06a4 100644
--- a/data/tags/gimp-tags-default.xml.in
+++ b/data/tags/gimp-tags-default.xml.in
@@ -8,15 +8,15 @@
 <tags>
   <resource identifier="${gimp_data_dir}/brushes/Round.vbr" checksum="a7f02530d3bc7484c8f9240cbe9c65b1">
     <tag>
-      <_thetag>round</_thetag>
+      <thetag>round</thetag>
     </tag>
   </resource>
 
   <resource identifier="${gimp_data_dir}/brushes/Round-Fuzzy.vbr" 
checksum="f8cb2466841104a55e42afce4568d103">
     <tag>
       <!-- fuzzy as in a feathered, blurred, unfocused, soft brush -->
-      <_thetag>fuzzy</_thetag>
-      <_thetag>round</_thetag>
+      <thetag>fuzzy</thetag>
+      <thetag>round</thetag>
     </tag>
   </resource>
 </tags>
diff --git a/data/tags/its/gimp-tags.its b/data/tags/its/gimp-tags.its
new file mode 100644
index 0000000000..ac4d11552f
--- /dev/null
+++ b/data/tags/its/gimp-tags.its
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<its:rules xmlns:its="http://www.w3.org/2005/11/its"; version="1.0">
+  <its:translateRule selector="/tags" translate="no"/>
+  <its:translateRule selector="//thetag" translate="yes"/>
+</its:rules>
diff --git a/data/tags/its/gimp-tags.loc b/data/tags/its/gimp-tags.loc
new file mode 100644
index 0000000000..c41b3e6101
--- /dev/null
+++ b/data/tags/its/gimp-tags.loc
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<locatingRules>
+  <locatingRule name="GimpTags" pattern="*.xml">
+    <documentRule localName="tags" target="gimp-tags.its"/>
+  </locatingRule>
+</locatingRules>
diff --git a/data/tags/meson.build b/data/tags/meson.build
index 464b87121f..a0bdf2e5ce 100644
--- a/data/tags/meson.build
+++ b/data/tags/meson.build
@@ -1,19 +1,15 @@
-
-xmlfilename = 'gimp-tags-default.xml'
-
-gimp_tags_default = custom_target(xmlfilename,
-  input : xmlfilename+'.in',
-  output: xmlfilename,
-
-  command: [
-    intltool_merge,
-    potags_dir,
-    '@INPUT@',
-    '@OUTPUT@',
-    '--xml-style',
-    '--utf8',
-    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+install_data([
+    'its/gimp-tags.its',
+    'its/gimp-tags.loc',
   ],
+  install_dir: get_option('datadir') / 'gettext' / 'its',
+)
+
+gimp_tags_default = i18n.merge_file(
+  input : 'gimp-tags-default.xml.in',
+  output: '@BASENAME@',
+  data_dirs: meson.current_source_dir(),
+  po_dir: potags_dir,
   install: true,
   install_dir: gimpdatadir / 'tags',
 )
diff --git a/data/tips/Makefile.am b/data/tips/Makefile.am
index 1de81aba59..0310123f97 100644
--- a/data/tips/Makefile.am
+++ b/data/tips/Makefile.am
@@ -16,9 +16,14 @@ EXTRA_DIST = \
 
 DISTCLEANFILES = $(tipsdata_data_files)
 
+itsdir = $(datadir)/gettext/its
+its_DATA = its/gimp-tips.loc its/gimp-tips.its
+
+EXTRA_DIST += $(its_DATA)
+
 
 gimp-tips.xml: gimp-tips.xml.in $(wildcard $(top_srcdir)/po-tips/*.po)
-       $(INTLTOOL_MERGE) $(top_srcdir)/po-tips $< $(@) -x -u -c $(top_builddir)/po-tips/.intltool-merge-cache
+       $(AM_V_GEN) GETTEXT_DATA_DIRS=$(abs_srcdir) $(MSGFMT) --xml --template $< -d $(top_srcdir)/po-tips -o 
$@
 
 
 validate: gimp-tips.xml
diff --git a/data/tips/gimp-tips.xml.in b/data/tips/gimp-tips.xml.in
index 61e66f25bc..8219e28aa9 100644
--- a/data/tips/gimp-tips.xml.in
+++ b/data/tips/gimp-tips.xml.in
@@ -15,63 +15,63 @@
 <!--                                                                       -->
 
   <tip level="beginner">
-    <_thetip>
+    <thetip>
       You can get context-sensitive help for most of GIMP's features by
       pressing the F1 key at any time.  This also works inside the menus.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner" help="gimp-layer-dialog">
-    <_thetip>
+    <thetip>
       GIMP uses layers to let you organize your image.  Think of them
       as a stack of slides or filters, such that looking through them you
       see a composite of their contents.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner" help="gimp-layer-menu">
-    <_thetip>
+    <thetip>
       You can perform many layer operations by right-clicking on the text
       label of a layer in the Layers dialog.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner" help="gimp-file-save">
-    <_thetip>
+    <thetip>
       Saving an image uses XCF, GIMP's native file format (file extension
       <tt>.xcf</tt>). This preserves the layers and many aspects of your
       work-in-progress, allowing to work on it again later.
       Once a project is completed, you can export it as JPEG, PNG, GIF, etc.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner" help="gimp-image-flatten">
-    <_thetip>
+    <thetip>
       Most plug-ins work on the current layer of the current image.  In
       some cases, you will have to merge all layers (Image→Flatten Image)
       if you want the plug-in to work on the whole image.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner" help="gimp-layer-alpha-add">
-    <_thetip>
+    <thetip>
       If a layer's name in the Layers dialog is displayed in <b>bold</b>,
       this layer doesn't have an alpha-channel. You can add an alpha-channel
       using Layer→Transparency→Add Alpha Channel.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner">
-    <_thetip>
+    <thetip>
       Not all effects can be applied to all kinds of images.  This is
       indicated by a grayed-out menu-entry.  You may need to change
       the image mode to RGB (Image→Mode→RGB), add an alpha-channel
       (Layer→Transparency→Add Alpha Channel) or flatten it
       (Image→Flatten Image).
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="beginner">
-    <_thetip>
+    <thetip>
       You can adjust or move a selection by using <tt>Alt</tt>-drag.
       If this makes the window move, your window manager uses the
       <tt>Alt</tt> key already.  Most window managers can be
       configured to ignore the <tt>Alt</tt> key or to use
       the <tt>Super</tt> key (or "Windows logo") instead.
-    </_thetip>
+    </thetip>
   </tip>
 
 <!--                                                                       -->
@@ -79,91 +79,91 @@
 <!--                                                                       -->
 
   <tip level="intermediate">
-    <_thetip>
+    <thetip>
       You can drag and drop many things in GIMP.  For example, dragging
       a color from the toolbox or from a color palette and dropping it into
       an image will fill the current selection with that color.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate">
-    <_thetip>
+    <thetip>
       You can use the middle mouse button to pan around the image 
       (or optionally hold <tt>Spacebar</tt> while you move the mouse).
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-concepts-image-grid">
-    <_thetip>
+    <thetip>
       Click and drag on a ruler to place a guide on an image.  All
       dragged selections will snap to the guides.  You can remove
       guides by dragging them off the image with the Move tool.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-file-new">
-    <_thetip>
+    <thetip>
       You can drag a layer from the Layers dialog and drop it onto the
       toolbox.  This will create a new image containing only that layer.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate">
-    <_thetip>
+    <thetip>
       A floating selection must be anchored to a new layer or to the last
       active layer before doing other operations on the image.  Click on the
       &quot;New Layer&quot; or the &quot;Anchor Layer&quot; button in the
       Layers dialog, or use the menus to do the same.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate">
-    <_thetip>
+    <thetip>
       GIMP supports gzip compression on the fly.  Just add <tt>.gz</tt>
       (or <tt>.bz2</tt>, if you have bzip2 installed) to the filename and
       your image will be saved compressed.  Of course loading compressed
       images works too.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate">
-    <_thetip>
+    <thetip>
       Pressing and holding the <tt>Shift</tt> key before making a selection
       allows you to add to the current selection instead of replacing it.
       Using <tt>Ctrl</tt> before making a selection subtracts from the
       current one.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-selection-stroke">
-    <_thetip>
+    <thetip>
       You can draw simple squares or circles using Edit→Stroke Selection.
       It strokes the edge of your current selection. More complex shapes
       can be drawn using the Path tool or with Filters→Render→Gfig.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-path-stroke">
-    <_thetip>
+    <thetip>
       If you stroke a path (Edit→Stroke Path), the paint tools can
       be used with their current settings.  You can use the Paintbrush in
       gradient mode or even the Eraser or the Smudge tool.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-using-paths">
-    <_thetip>
+    <thetip>
       You can create and edit complex selections using the Path tool.
       The Paths dialog allows you to work on multiple paths and to convert
       them to selections.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-using-quickmask">
-    <_thetip>
+    <thetip>
       You can use the paint tools to change the selection.  Click on the
       &quot;Quick Mask&quot; button at the bottom left of an image window.
       Change your selection by painting in the image and click on the button
       again to convert it back to a normal selection.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="intermediate" help="gimp-channel-dialog">
-    <_thetip>
+    <thetip>
       You can save a selection to a channel (Select→Save to Channel) and
       then modify this channel with any paint tools.  Using the buttons in
       the Channels dialog, you can toggle the visibility of this new channel
       or convert it to a selection.
-    </_thetip>
+    </thetip>
   </tip>
 
 <!--                                                                       -->
@@ -172,7 +172,7 @@
 <!--                                                                       -->
 
   <tip level="advanced">
-    <_thetip>
+    <thetip>
       After you enabled &quot;Dynamic Keyboard Shortcuts&quot; in the
       Preferences dialog, you can reassign shortcut keys. Do so by bringing
       up the menu, selecting a menu item, and pressing the desired key
@@ -180,56 +180,56 @@
       key bindings are saved when you exit GIMP.
       You should probably disable &quot;Dynamic Keyboard Shortcuts&quot; 
       afterwards, to prevent accidentally assigning/reassigning shortcuts.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced">
-    <_thetip>
+    <thetip>
       If your screen is too cluttered, you can press <tt>Tab</tt> 
       in an image window to toggle the visibility of the toolbox 
       and other dialogs.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced">
-    <_thetip>
+    <thetip>
       <tt>Shift</tt>-click on the eye icon in the Layers dialog to hide all
       layers but that one.  <tt>Shift</tt>-click again to show all layers.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced">
-    <_thetip>
+    <thetip>
       <tt>Ctrl</tt>-clicking on the layer mask's preview in the Layers dialog
       toggles the effect of the layer mask. <tt>Alt</tt>-clicking on the layer 
       mask's preview in the Layers dialog toggles viewing the mask directly.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced">
-    <_thetip>
+    <thetip>
       You can use <tt>Ctrl</tt>-<tt>Tab</tt> to cycle through all layers in
       an image (if your window manager doesn't trap those keys...).
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced" help="gimp-tool-bucket-fill">
-    <_thetip>
+    <thetip>
       <tt>Ctrl</tt>-click with the Bucket Fill tool to have it use
       the background color instead of the foreground color.
       Similarly, <tt>Ctrl</tt>-clicking with the eyedropper tool 
       sets the background color instead of the foreground color.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced" help="gimp-tools-transform">
-    <_thetip>
+    <thetip>
       <tt>Ctrl</tt>-drag with the Rotate tool will constrain the
       rotation to 15 degree angles.
-    </_thetip>
+    </thetip>
   </tip>
   <tip level="advanced">
-    <_thetip>
+    <thetip>
       If some of your scanned photos do not look colorful enough, you
       can easily improve their tonal range with the &quot;Auto&quot;
       button in the Levels tool (Colors→Levels).  If there are any
       color casts, you can correct them with the Curves tool
       (Colors→Curves).
-    </_thetip>
+    </thetip>
   </tip>
 
 </gimp-tips>
diff --git a/data/tips/its/gimp-tips.its b/data/tips/its/gimp-tips.its
new file mode 100644
index 0000000000..e7809f15c6
--- /dev/null
+++ b/data/tips/its/gimp-tips.its
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<its:rules xmlns:its="http://www.w3.org/2005/11/its"; version="1.0">
+  <its:translateRule selector="/gimp-tips" translate="no"/>
+  <its:translateRule selector="//thetip" translate="yes"/>
+</its:rules>
diff --git a/data/tips/its/gimp-tips.loc b/data/tips/its/gimp-tips.loc
new file mode 100644
index 0000000000..41dda46e03
--- /dev/null
+++ b/data/tips/its/gimp-tips.loc
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<locatingRules>
+  <locatingRule name="GimpTips" pattern="*.xml">
+    <documentRule localName="gimp-tips" target="gimp-tips.its"/>
+  </locatingRule>
+</locatingRules>
diff --git a/data/tips/meson.build b/data/tips/meson.build
index 490913f9cd..d70d4a0b0e 100644
--- a/data/tips/meson.build
+++ b/data/tips/meson.build
@@ -1,19 +1,15 @@
-
-xmlfilename = 'gimp-tips.xml'
-
-gimp_tips = custom_target(xmlfilename,
-  input : xmlfilename+'.in',
-  output: xmlfilename,
-
-  command: [
-    intltool_merge,
-    potips_dir,
-    '@INPUT@',
-    '@OUTPUT@',
-    '--xml-style',
-    '--utf8',
-    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+install_data([
+    'its/gimp-tips.its',
+    'its/gimp-tips.loc',
   ],
+  install_dir: get_option('datadir') / 'gettext' / 'its',
+)
+
+gimp_tips = i18n.merge_file(
+  input : 'gimp-tips.xml.in',
+  output: '@BASENAME@',
+  data_dirs: meson.current_source_dir(),
+  po_dir: potips_dir,
   install: true,
   install_dir: gimpdatadir / 'tips',
 )
@@ -38,7 +34,7 @@ if xmllint.found()
       '--output', '@OUTPUT@',
       '--path', meson.current_source_dir(),
       '--valid', gimp_tips,
-    ],
+  ],
     output: [ 'validate-tips-output.xml' ],
     build_by_default: true,
     install: false
diff --git a/desktop/Makefile.am b/desktop/Makefile.am
index d844579156..bb1dec33ec 100644
--- a/desktop/Makefile.am
+++ b/desktop/Makefile.am
@@ -10,6 +10,9 @@ appstream_in_files = \
 
 appstream_files = $(appstream_in_files:.xml.in=.xml)
 
+$(appstream_files): $(appstream_in_files)
+       $(AM_V_GEN) $(MSGFMT) --xml --template $< -d $(top_srcdir)/po -o $@
+
 if DESKTOP_DATADIR
 
 applicationsdir = $(DESKTOP_DATADIR)/applications
@@ -66,10 +69,8 @@ EXTRA_DIST = \
 
 DISTCLEANFILES = $(desktop_files) $(appstream_files)
 
-@INTLTOOL_XML_RULE@
-
 gimp.desktop: gimp.desktop.in $(wildcard $(top_srcdir)/po/*.po)
-       $(INTLTOOL_MERGE) $(top_srcdir)/po $< $(@) -d -u -c $(top_builddir)/po/.intltool-merge-cache
+       $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
 
 validate: gimp.desktop
        ( dfvalidate=`which desktop-file-validate`; \
diff --git a/desktop/gimp.desktop.in.in b/desktop/gimp.desktop.in.in
index 66f5b355c1..0ef73561b0 100644
--- a/desktop/gimp.desktop.in.in
+++ b/desktop/gimp.desktop.in.in
@@ -1,11 +1,11 @@
 [Desktop Entry]
 Version=1.0
 Type=Application
-_Name=GNU Image Manipulation Program
-_GenericName=Image Editor
-_Comment=Create images and edit photographs
+Name=GNU Image Manipulation Program
+GenericName=Image Editor
+Comment=Create images and edit photographs
 # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list 
MUST also end with a semicolon!
-_Keywords=GIMP;graphic;design;illustration;painting;
+Keywords=GIMP;graphic;design;illustration;painting;
 Exec=@GIMP_COMMAND@ %U
 TryExec=gimp-@GIMP_APP_VERSION@
 Icon=gimp
diff --git a/desktop/meson.build b/desktop/meson.build
index 618c19e884..eeabe804fa 100644
--- a/desktop/meson.build
+++ b/desktop/meson.build
@@ -33,18 +33,11 @@ desktopfilein = configure_file(
   configuration: desktop_conf,
 )
 
-desktopfile = custom_target(desktopfilename,
-  input : [ desktopfilein, ],
-  output: [ desktopfilename, ],
-  command: [
-    intltool_merge,
-    po_dir,
-    '@INPUT@',
-    '@OUTPUT@',
-    '--desktop-style',
-    '--utf8',
-    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
-  ],
+desktopfile = i18n.merge_file(
+  input : desktopfilein,
+  output: desktopfilename,
+  type: 'desktop',
+  po_dir: po_dir,
   install: true,
   install_dir: get_option('datadir') / 'applications',
 )
@@ -55,18 +48,10 @@ appdatafilein = configure_file(
   output: appdatafilename+'.in',
   configuration: desktop_conf,
 )
-appdatafile = custom_target(appdatafilename,
-  input : [ appdatafilein, ],
-  output: [ appdatafilename, ],
-  command: [
-    intltool_merge,
-    po_dir,
-    '@INPUT@',
-    '@OUTPUT@',
-    '--xml-style',
-    '--utf8',
-    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
-  ],
+appdatafile = i18n.merge_file(
+  input : appdatafilein,
+  output: appdatafilename,
+  po_dir: po_dir,
   install: true,
   install_dir: get_option('datadir') / 'metainfo',
 )
diff --git a/desktop/org.gimp.GIMP.appdata.xml.in.in b/desktop/org.gimp.GIMP.appdata.xml.in.in
index 5be28bc947..fa2a6989f1 100644
--- a/desktop/org.gimp.GIMP.appdata.xml.in.in
+++ b/desktop/org.gimp.GIMP.appdata.xml.in.in
@@ -13,28 +13,28 @@
   <metadata_license>CC0-1.0</metadata_license>
   <project_license>GPL-3.0+ AND LGPL-3.0+</project_license>
   <developer_name>The GIMP team</developer_name>
-  <_name>GNU Image Manipulation Program</_name>
-  <_summary>Create images and edit photographs</_summary>
+  <name>GNU Image Manipulation Program</name>
+  <summary>Create images and edit photographs</summary>
   <description>
-    <_p>
+    <p>
       GIMP is an acronym for GNU Image Manipulation Program. It is a
       freely distributed program for such tasks as photo retouching,
       image composition and image authoring.
-    </_p>
-    <_p>
+    </p>
+    <p>
       It has many capabilities. It can be used as a simple paint
       program, an expert quality photo retouching program, an online
       batch processing system, a mass production image renderer, an
       image format converter, etc.
-    </_p>
-    <_p>
+    </p>
+    <p>
       GIMP is expandable and extensible. It is designed to be
       augmented with plug-ins and extensions to do just about
       anything. The advanced scripting interface allows everything
       from the simplest task to the most complex image manipulation
       procedures to be easily scripted. GIMP is available for Linux,
       Microsoft Windows and OS X.
-    </_p>
+    </p>
   </description>
   <url type="bugtracker">@BUG_REPORT_URL@</url>
   <url type="donation">https://www.gimp.org/donating/</url>
@@ -45,11 +45,11 @@
   <screenshots>
     <screenshot type="default">
       <image>https://www.gimp.org/screenshots/Screenshot-gimp-2.10-painting.jpg</image>
-      <_caption>Painting in GIMP</_caption>
+      <caption>Painting in GIMP</caption>
     </screenshot>
     <screenshot type="default">
       <image>https://www.gimp.org/screenshots/Screenshot-gimp-2.10-photo-editing.jpg</image>
-      <_caption>Photo editing in GIMP</_caption>
+      <caption>Photo editing in GIMP</caption>
     </screenshot>
   </screenshots>
   <update_contact>gimp-developer-list_at_gnome.org</update_contact>
@@ -76,772 +76,772 @@
   <releases>
     <release version="2.99.12" date="2022-05-29" type="development">
       <description>
-        <_p>
+        <p>
         One step further towards GIMP 3.0, GIMP 2.99.12 comes along with the following noteworthy 
improvements:
-        </_p>
+        </p>
         <ul>
-          <_li demo="toolbox:bucket-fill,
-                     tool-options:fill-area=2,
-                     tool-options:line-art-stroke-border=1">
+          <li demo="toolbox:bucket-fill,
+                    tool-options:fill-area=2,
+                    tool-options:line-art-stroke-border=1">
           New "Stroke borders" option in Bucket Fill tool's "Fill by line art detection"
-          </_li>
-          <_li demo="toolbox:bucket-fill,
-                     tool-options:fill-area=2,
-                     tool-options:line-art-settings">
+          </li>
+          <li demo="toolbox:bucket-fill,
+                    tool-options:fill-area=2,
+                    tool-options:line-art-settings">
           Redesigned and reorganized "Fill by line art detection" settings
-          </_li>
-          <_li>Added support for the BigTIFF file format</_li>
-          <_li>New option "Number of repeats" in GIF export</_li>
-          <_li>Tool pointer settings reorganized and moved from "Image Windows" to "Input Devices" tabs in 
Preferences</_li>
-          <_li>Improved handling of unchecked "Show pointer for paint tools" option</_li>
+          </li>
+          <li>Added support for the BigTIFF file format</li>
+          <li>New option "Number of repeats" in GIF export</li>
+          <li>Tool pointer settings reorganized and moved from "Image Windows" to "Input Devices" tabs in 
Preferences</li>
+          <li>Improved handling of unchecked "Show pointer for paint tools" option</li>
         </ul>
       </description>
     </release>
     <release version="2.99.10" date="2022-02-22" type="development">
       <description>
-        <_p>
+        <p>
         GIMP 2.99.10 is a notable development release in the 2.99 series, featuring many changes.
         Let's mention in particular:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           "Linked layers" concept superseded by new "Layer set" concept
-          </_li>
-          <_li>
+          </li>
+          <li>
           Lock icons in item dockables (Layers, Channels, Paths) moved next to the visibility (eye) icon
-          </_li>
-          <_li>
+          </li>
+          <li>
           Alt-click on visibility and lock icons in item dockables massively toggles visibility and locks 
among selected items
-          </_li>
-          <_li>
+          </li>
+          <li>
           Item dockables now display icon headers for visibility and locks column
-          </_li>
-          <_li>
+          </li>
+          <li>
           Our System theme shows visible hints around unset visibility and locks icons when hovering them in 
item dockables
-          </_li>
-          <_li>
+          </li>
+          <li>
           New checkbox to enable or disable dynamics in paint tools' options (replacing "Dynamics Off" 
dynamics)
-          </_li>
-          <_li>
+          </li>
+          <li>
           Improved support for Wayland and macOS Big Sur (and newer)
-          </_li>
-          <_li>
+          </li>
+          <li>
           "Fill by line art detection" in Bucket Fill tool has a new option
-          </_li>
-          <_li>
+          </li>
+          <li>
           Channels and paths multi-selectable with part of relevant actions working
-          </_li>
-          <_li>
+          </li>
+          <li>
           Various file format support improvements, in particular to PSD, JPEG-XL and HEIF
-          </_li>
-          <_li>
+          </li>
+          <li>
           New support of Microsoft Windows Cursor file format (.cur files)
-          </_li>
-          <_li>
+          </li>
+          <li>
           Removed KDE and GNOME screenshot portals in favor of Freedesktop one
-          </_li>
-          <_li>
+          </li>
+          <li>
           Windows screenshot implementation now has an "Include mouse pointer" option
-          </_li>
-          <_li>
+          </li>
+          <li>
           New and modified libgimp API for plug-in developers
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.99.8" date="2021-10-17" type="development">
       <description>
-        <_p>
+        <p>
         While during this fourth cycle of development, many efforts were devoted to
         infrastructure, GIMP 2.99.8 still received many welcome improvements, notably:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           New modes in Clone, Heal and Perspective Clone tools when multiple layers are selected
-          </_li>
-          <_li>
+          </li>
+          <li>
           Windows Ink support for input devices on Windows
-          </_li>
-          <_li>
+          </li>
+          <li>
           Clicking on toolbox or Wilber's drop area actively focuses the canvas
-          </_li>
-          <_li>
+          </li>
+          <li>
           Marching ants display ported to Wayland and macOS Big Sur logics
-          </_li>
-          <_li>
+          </li>
+          <li>
           Initial implementation of config folder migration for GIMP 3
-          </_li>
-          <_li>
+          </li>
+          <li>
           Action "view-rotate-reset" renamed to "view-reset" and new "view-rotate-reset" and 
"view-flip-rotate" actions
-          </_li>
-          <_li>
+          </li>
+          <li>
           PSD: bigger-than-4GiB file support and up to 99 channels
-          </_li>
-          <_li>
+          </li>
+          <li>
           PSB: new support (loading only)
-          </_li>
-          <_li>
+          </li>
+          <li>
           SGI: 16-bit images support
-          </_li>
-          <_li>
+          </li>
+          <li>
           JPEG XL: new support (loading and exporting)
-          </_li>
-          <_li>
+          </li>
+          <li>
           New API functions gimp_display_present() and gimp_procedure_dialog_fill_expander()
-          </_li>
-          <_li>
+          </li>
+          <li>
           Much porting to newer API, code cleanup and bug fixing done
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.99.6" date="2021-04-26" type="development">
       <url type="details">https://www.gimp.org/news/2021/04/29/gimp-2-99-6-released/</url>
       <description>
-        <_p>
+        <p>
         For this third development release, more development effort has been shifted towards the API.
         Many functions were renamed for consistent naming scheme, some
         new functions appeared, some had signature changes, fixes were
         made to improve introspection binding of others, and so on.
         More API updates are to be expected on further development releases where stability is not 
guaranteed.
-        </_p>
-        <_p>
+        </p>
+        <p>
         Regarding end-creator changes, some notable improvements are:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Canvas Size dialog now displays a template selector
-          </_li>
-          <_li>
+          </li>
+          <li>
           Off-canvas guides are now allowed
-          </_li>
-          <_li>
+          </li>
+          <li>
           The experimental Paint Select tool got various improvements
-          </_li>
-          <_li>
+          </li>
+          <li>
           More fixes for Wayland support
-          </_li>
-          <_li>
+          </li>
+          <li>
           Dialog dropped for the Freedesktop portal implementation of the screenshot plug-in
-          </_li>
-          <_li>
+          </li>
+          <li>
           PNG import creates an ICC profile out of the gAMA and/or cHRM chunks
-          </_li>
-          <_li>
+          </li>
+          <li>
           TIFF export stores the ICC profile and comment on each layer to prevent ambiguous files
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.99.4" date="2020-12-22" type="development">
       <url type="details">https://www.gimp.org/news/2020/12/25/gimp-2-99-4-released/</url>
       <description>
-        <_p>
+        <p>
         This second development release contains various usability and API updates.
         A new experimental tool makes an entrance in the playground.
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Many usability improvements on the slider widget
-          </_li>
-          <_li>
+          </li>
+          <li>
           Usability cleaning in the Layers dockable
-          </_li>
-          <_li>
+          </li>
+          <li>
           The action search now shows all actions even inactive ones (yet pushed below)
-          </_li>
-          <_li>
+          </li>
+          <li>
           Fonts targeted for Korean and Japanese language show appropriate characters
-          </_li>
-          <_li>
+          </li>
+          <li>
           Different default tools depending on pointer device type
-          </_li>
-          <_li>
+          </li>
+          <li>
           Default dynamics is now "Pressure Size"
-          </_li>
-          <_li>
+          </li>
+          <li>
           Various usability improvements in the Input Device editor
-          </_li>
-          <_li>
+          </li>
+          <li>
           New "Paint Select" experimental tool in the playground
-          </_li>
-          <_li>
+          </li>
+          <li>
           Plug-in API now provides many dialog generation utilities
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.99.2" date="2020-10-25" type="development">
       <url type="details">https://www.gimp.org/news/2020/10/25/gimp-2-99-2-released/</url>
       <description>
-        <_p>
+        <p>
         This is the first development release for GIMP 3.0, whose focus
         was the port to the GTK+3 toolkit. Noteworthy improvements
         (though some are still work-in-progress) include:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             Multi-selection of layers in the Layers dockable
-          </_li>
-          <_li>
+          </li>
+          <li>
             Proper high pixel density display support
-          </_li>
-          <_li>
+          </li>
+          <li>
             Improved input device support
-          </_li>
-          <_li>
+          </li>
+          <li>
             Major plug-in API rewrite
-          </_li>
-          <_li>
+          </li>
+          <li>
             Plug-in API now available in C/C++, Python 3, Javascript, Lua and Vala
-          </_li>
-          <_li>
+          </li>
+          <li>
             New manageable extension format
-          </_li>
-          <_li>
+          </li>
+          <li>
             CSS-based themes and actual symbolic icon theme support
-          </_li>
-          <_li>
+          </li>
+          <li>
             Wayland support
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
 
     <release version="2.10.32" date="2022-06-12">
       <description>
-        <_p>
+        <p>
           GIMP continues strengthening its bases with this new version 2.10.32 fixing many bugs and 
improving format support.
           Notable changes:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             8 and 16-bit CMYK(A) TIFF files import is now supported
-          </_li>
-          <_li>
+          </li>
+          <li>
             BIGTIFF import and export are now supported
-          </_li>
-          <_li>
+          </li>
+          <li>
             JPEG XL files import is now supported
-          </_li>
-          <_li>
+          </li>
+          <li>
             DDS export has new "Flip" (useful for some game engine) and "Visible layers" options
-          </_li>
-          <_li>
+          </li>
+          <li>
             Other improved format supports: BMP, DICOM, EPS, RAW, TGA, WebP
-          </_li>
-          <_li>
+          </li>
+          <li>
             The screenshot plug-in on Windows has now an option to capture the cursor
-          </_li>
-          <_li>
+          </li>
+          <li>
             Several usability improvements in official themes and icons
-          </_li>
-          <_li>
+          </li>
+          <li>
             New support for localized glyphs ('locl') in Text tool
             depending on the value of the "Language" tool option
-          </_li>
-          <_li>
+          </li>
+          <li>
             More robust XCF import
-          </_li>
-          <_li>
+          </li>
+          <li>
             Several metadata handling improvements
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
 
     <release version="2.10.30" date="2021-12-19">
       <description>
-        <_p>
+        <p>
           GIMP 2.10.30 fixes many bugs, updates backend implementations
           to follow OS evolutions, improves metadata support as well as
           support of several formats, such as PSD and AVIF.
-        </_p>
+        </p>
       </description>
     </release>
     <release version="2.10.28" date="2021-09-14">
       <description>
-        <_p>
+        <p>
           GIMP 2.10.28 fixes a build issue of GIMP 2.10.26, where some
           theme data was not properly installed.
-        </_p>
+        </p>
       </description>
     </release>
     <release version="2.10.26" date="2021-09-05">
       <description>
-        <_p>
+        <p>
           GIMP 2.10.26 is a bug fix release, containing dozens of
           fixes, both in core, scripts and plug-in code.
-        </_p>
+        </p>
       </description>
     </release>
     <release version="2.10.24" date="2021-03-28">
       <url type="details">https://www.gimp.org/news/2021/03/29/gimp-2-10-24-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.24 is again mostly a bug fix release. Notable changes:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             GeoTIFF metadata support added
-          </_li>
-          <_li>
+          </li>
+          <li>
             PDF import now proposes an option to load layers in reverse
             orders and allows fractional pixel density
-          </_li>
-          <_li>
+          </li>
+          <li>
             Raw image import updated to handle API changes in darktable 3.6 and over
-          </_li>
-          <_li>
+          </li>
+          <li>
             File format improved support: HEIF, PSP, TIFF, JPEG, PNG, PDF, DDS, BMP, PSD
-          </_li>
-          <_li>
+          </li>
+          <li>
             Many fixes and improvements to the metadata viewer and editor
-          </_li>
-          <_li>
+          </li>
+          <li>
             New Kabyle translation
-          </_li>
-          <_li>
+          </li>
+          <li>
             Off-canvas point snapping (to grid, guides, paths) made possible
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.22" date="2020-10-04">
       <url type="details">https://www.gimp.org/news/2020/10/04/gimp-2-10-22-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.22 is mainly a bug fix release. Notable changes:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             HEIF support improvements: optional exporting with high bit depth,
             AVIF importing and exporting
-          </_li>
-          <_li>
+          </li>
+          <li>
             Multiple improvements in Corel PaintShop Pro support
-          </_li>
-          <_li>
+          </li>
+          <li>
             "Sample merged" now available in GEGL operation tool options
-          </_li>
-          <_li>
+          </li>
+          <li>
             "Sample merged" is now enabled by default for color picking
-          </_li>
-          <_li>
+          </li>
+          <li>
             The option enabling OpenCL support has been moved to the
             Playground tab in Preferences
-          </_li>
-          <_li>
+          </li>
+          <li>
             Matting Levin is now the default engine of Foreground Select
             tool as it performs a lot better
-          </_li>
-          <_li>
+          </li>
+          <li>
             New progressive performance logs and dashboard updates
-          </_li>
-          <_li>
+          </li>
+          <li>
             Verbose debug now shows Flatpak info when relevant
-          </_li>
-          <_li>
+          </li>
+          <li>
             Various bug fixes
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.20" date="2020-06-07">
       <url type="details">https://www.gimp.org/news/2020/06/07/gimp-2-10-20-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.20 comes with new features as well as important bugfixes.
           Notable changes:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             Tool groups now expand on hover rather than click by default
-          </_li>
-          <_li>
+          </li>
+          <li>
             Non-destructive cropping now available by cropping the canvas rather
             than actual pixels
-          </_li>
-          <_li>
+          </li>
+          <li>
             Better PSD support: exporting of 16-bit files now available,
             reading/writing channels in the right order
-          </_li>
-          <_li>
+          </li>
+          <li>
             On-canvas controls for the Vignette filter
-          </_li>
-          <_li>
+          </li>
+          <li>
             New filters: Bloom, Focus Blur, Lens Blur, Variable Blur
-          </_li>
-          <_li>
+          </li>
+          <li>
             Over 30 bugfixes
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.18" date="2020-02-23">
       <url type="details">https://www.gimp.org/news/2020/02/24/gimp-2-10-18-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.18 fixes some critical bugs, introduces naive support for CMYK PSD files,
           and adds a higher-contrast variation of the symbolic icon theme.
-        </_p>
+        </p>
       </description>
     </release>
     <release version="2.10.16" date="2020-02-19">
       <url type="details">https://www.gimp.org/news/2020/02/24/gimp-2-10-18-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.16 delivers several major usability improvements, a new tool
           for transformations in 3D space, new release checker, and the usual amount
           of bug fixes. Notable improvements:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             Tools are now grouped in the toolbox by default 
-          </_li>
-          <_li>
+          </li>
+          <li>
             Sliders now use a compact style with improved user interaction
-          </_li>
-          <_li>
+          </li>
+          <li>
             Vastly improved user experience for the transformation preview
-          </_li>
-          <_li>
+          </li>
+          <li>
             Dockable areas now highlighted when a dockable dialog is being dragged      
-          </_li>
-          <_li>
+          </li>
+          <li>
             New 3D Transform tool to rotate and pan items
-          </_li>
-          <_li>
+          </li>
+          <li>
             Much smoother brush outline motion on the canvas
-          </_li>
-          <_li>
+          </li>
+          <li>
             Consolidated user interface for merging down and anchoring layers
-          </_li>
-          <_li>
+          </li>
+          <li>
             Update check to notify users that a new release/installer is available
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.14" date="2019-10-27">
       <url type="details">https://www.gimp.org/news/2019/10/27/gimp-2-10-14-released/</url>
       <description>
-        <_p>
+        <p>
         GIMP 2.10.14 is again mostly a bug fix release, making GIMP rock-solid.
         Furthermore many old filters got finally ported to GEGL.
 
         Of course it also has a few noteworthy improvements:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           View menu: new "Show All" option to reveal pixels outside the canvas boundary
-          </_li>
-          <_li>
+          </li>
+          <li>
           Filters: new "Clipping" option to allow layer resize when relevant
-          </_li>
-          <_li>
+          </li>
+          <li>
           Foreground Select tool: new "Grayscale" Preview Mode
-          </_li>
-          <_li>
+          </li>
+          <li>
           Foreground Select tool: color/opacity selector for "Color" preview
-          </_li>
-          <_li>
+          </li>
+          <li>
           Free Select tool: improved copy-paste interaction
-          </_li>
-          <_li>
+          </li>
+          <li>
           Transform tools: new Image transform type to transform the whole image
-          </_li>
-          <_li>
+          </li>
+          <li>
           Preferences: new "Allow editing on non-visible layers" setting
-          </_li>
-          <_li>
+          </li>
+          <li>
           HEIF import/export: color profile support
-          </_li>
-          <_li>
+          </li>
+          <li>
           PDF export: text layers in layer groups now exported as texts
-          </_li>
-          <_li>
+          </li>
+          <li>
           TIFF import: now asks how to process unspecified TIFF channels
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.12" date="2019-06-12">
       <url type="details">https://www.gimp.org/news/2019/06/12/gimp-2-10-12-released/</url>
       <description>
-        <_p>
+        <p>
         GIMP 2.10.12 is a significant bug fix release, which is to be expected
         after a 2.10.10 with so many changes!
         Still, very cool improvements are also available, in particular for
         curves editing:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Improved curves interaction overall
-          </_li>
-          <_li>
+          </li>
+          <li>
           A few enhancements specific to the Curves tool
-          </_li>
-          <_li>
+          </li>
+          <li>
           Layer support in TIFF
-          </_li>
-          <_li>
+          </li>
+          <li>
           Discovery of user-installed fonts in Windows
-          </_li>
-          <_li>
+          </li>
+          <li>
           Incremental mode in the Dodge/Burn tool
-          </_li>
-          <_li>
+          </li>
+          <li>
           Free Select tool creates preliminary selection
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.10" date="2019-04-07">
       <url type="details">https://www.gimp.org/news/2019/04/07/gimp-2-10-10-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.10 is quite a big update with many new features and
           bug fixes. Notable improvements include:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Bucket Fill tool: new "Fill by line art detection" for not
           perfectly closed line art zones
-          </_li>
-          <_li>
+          </li>
+          <li>
           Bucket Fill tool can now quickly color-pick with Ctrl+click
-          </_li>
-          <_li>
+          </li>
+          <li>
           Bucket Fill tool allows holding the mouse when filling
           "similar colors" and "by line art detection"
-          </_li>
-          <_li>
+          </li>
+          <li>
           Scale tool scales around center even when using numeric input
-          </_li>
-          <_li>
+          </li>
+          <li>
           Unified Transform tool now defaults to preserving aspect ratio
           when scaling up or down
-          </_li>
-          <_li>
+          </li>
+          <li>
           Add "Constrain handles" and "Around center" options to the
           perspective-transform tool's GUI
-          </_li>
-          <_li>
+          </li>
+          <li>
           New generic canvas modifier 'Alt + middle click' to pick
           layers
-          </_li>
-          <_li>
+          </li>
+          <li>
           Parametric brushes now 32-bit float to avoid posterization
-          </_li>
-          <_li>
+          </li>
+          <li>
           Clipboard brushes and pattern can now be duplicated
-          </_li>
-          <_li>
+          </li>
+          <li>
           Failure to edit locked layers will blink to shift attention to
           the cause of the error
-          </_li>
-          <_li>
+          </li>
+          <li>
           New on-canvas GUI (simple lines) for circular, linear, and
           zoom motion blur
-          </_li>
-          <_li>
+          </li>
+          <li>
           Several optimizations including faster layer group rendering
-          </_li>
-          <_li>
+          </li>
+          <li>
           Swap and cache files are not saved in the configuration
           directory anymore
-          </_li>
-          <_li>
+          </li>
+          <li>
           Various file saving/exporting made more robust to error by not
           saving partial files
-          </_li>
-          <_li>
+          </li>
+          <li>
           HiDPI support improvements
-          </_li>
-          <_li>
+          </li>
+          <li>
           New preference to choose the default export file type
-          </_li>
-          <_li>
+          </li>
+          <li>
           New option to export PNG, JPEG and TIFF with a color profile;
           always export PSD with a color profile
-          </_li>
-          <_li>
+          </li>
+          <li>
           New DDS format loading/exporting plug-in
-          </_li>
-          <_li>
+          </li>
+          <li>
           Full rewrite of the Spyrogimp plug-in with more options and
           better interaction
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.8" date="2018-11-07">
       <url type="details">https://www.gimp.org/news/2018/11/08/gimp-2-10-8-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.8 is mostly a bug fix and optimization release. In
           particular, it includes:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Adaptative chunk size when rendering projections, improving
           responsiveness dynamically
-          </_li>
-          <_li>
+          </li>
+          <li>
           Detection of RawTherapee (version 5.5 and above) improved on
           Windows
-          </_li>
-          <_li>
+          </li>
+          <li>
           XCF compatibility information in the Save dialog more
           understandable and discoverable
-          </_li>
-          <_li>
+          </li>
+          <li>
           Various performance log tools added and log recording made
           available in the Dashboard dock
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.6" date="2018-08-19">
       <url type="details">https://www.gimp.org/news/2018/08/19/gimp-2-10-6-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.6 comes with a lot of bug fixes, optimizations and
           features. Most notable changes are:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Text layers can now represent vertical texts (with various
           character orientations and line directions)
-          </_li>
-          <_li>
+          </li>
+          <li>
           New "Little Planet" (gegl:stereographic-projection) filter
-          </_li>
-          <_li>
+          </li>
+          <li>
           New "Long Shadow" filter
-          </_li>
-          <_li>
+          </li>
+          <li>
           The "Straighten" option of the Measure Tool now allows
           vertical straightening
-          </_li>
-          <_li>
+          </li>
+          <li>
           Drawable previews are now rendered asynchronously and layer
           group previews can be disabled in Preferences
-          </_li>
-          <_li>
+          </li>
+          <li>
           New "async" field in the Dashboard "misc" group, showing the
           number of async operations currently running
-          </_li>
-          <_li>
+          </li>
+          <li>
           File format filtering in Open/Save/Export dialogs made less
           confusing
-          </_li>
-          <_li>
+          </li>
+          <li>
           New language (having GIMP translated in 81 languages now):
           Marathi
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.4" date="2018-07-04">
       <url type="details">https://www.gimp.org/news/2018/07/04/gimp-2-10-4-released/</url>
       <description>
-        <_p>
+        <p>
           GIMP 2.10.4 includes a lot of bug fixes as well as various
           optimizations. Most notable changes are:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
           Straightening in Measurement tool: layers can be rotated using
           the measurement line as horizon
-          </_li>
-          <_li>
+          </li>
+          <li>
           Fast startup: fonts loading is not blocking startup anymore
-          </_li>
-          <_li>
+          </li>
+          <li>
           Fonts Tagging with the same user interface as for brushes,
           patterns, and gradients
-          </_li>
-          <_li>
+          </li>
+          <li>
           PSD support: a pre-composited version of a PSD image can be
           imported
-          </_li>
-          <_li>
+          </li>
+          <li>
           Dashboard update: new "Memory" group and improved "Swap"
           group showing various metrics
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
     <release version="2.10.2" date="2018-05-20">
       <url type="details">https://www.gimp.org/news/2018/05/20/gimp-2-10-2-released/</url>
       <description>
-        <_p>
+        <p>
           This second release in the GIMP 2.10 series, so soon after
           2.10.0, is mostly the usual bug-fixing version after a major
           release, with a few dozen bugs fixed.
-        </_p>
-        <_p>
+        </p>
+        <p>
           It also features a new plug-in for the support of the HEIF
           format, both for importing and exporting, as well as 2 new
           filters: "Spherize" and "Recursive Transform". These are
           nice examples of our relaxed feature policy in stable micro
           releases.
-        </_p>
+        </p>
       </description>
     </release>
 
     <release version="2.10.0" date="2018-04-27">
       <url type="details">https://www.gimp.org/news/2018/04/27/gimp-2-10-0-released/</url>
       <description>
-        <_p>
+        <p>
           First release of the 2.10 series which prominently features
           the port to a new image processing engine, GEGL.
           The most outstanding changes are:
-        </_p>
+        </p>
         <ul>
-          <_li>
+          <li>
             High bit depth color processing (16/32-bit per color channel)
-          </_li>
-          <_li>
+          </li>
+          <li>
            Color management is a core feature now, most widgets
            and preview areas are color-managed
-          </_li>
-          <_li>
+          </li>
+          <li>
            On-canvas effect preview, with split view for before/after
            processing pixels
-          </_li>
-          <_li>
+          </li>
+          <li>
             Multi-threaded and hardware-accelerated rendering,
             processing and painting
-          </_li>
-          <_li>
+          </li>
+          <li>
             Most tools improved, several new transformation tools
-          </_li>
-          <_li>
+          </li>
+          <li>
            Improved support for many image formats, in particular better
            PSD importing
-          </_li>
-          <_li>
+          </li>
+          <li>
             Newly supported image formats: OpenEXR, RGBE, WebP, HGT…
-          </_li>
-          <_li>
+          </li>
+          <li>
             Improved digital painting: canvas rotation and
             flipping, symmetry painting, MyPaint brushes…
-          </_li>
-          <_li>
+          </li>
+          <li>
            Metadata viewing and editing for Exif, XMP, IPTC, and DICOM
-          </_li>
-          <_li>
+          </li>
+          <li>
             Basic HiDPI support: automatically or user-selected icon size
-          </_li>
-          <_li>
+          </li>
+          <li>
             New themes for GIMP: Light, Gray, Dark, and System
-          </_li>
-          <_li>
+          </li>
+          <li>
             And much, much more…
-          </_li>
+          </li>
         </ul>
       </description>
     </release>
@@ -849,49 +849,49 @@
     <release version="2.10.0~rc2" date="2018-04-17" type="development">
       <url type="details">https://www.gimp.org/news/2018/04/17/gimp-2-10-0-rc2-released/</url>
       <description>
-        <_p>
+        <p>
         In this second release candidate before GIMP 2.10.0, while
         debugging is still a prime target, a new focus has been put on
         speed and optimization in order to provide a smoother painting
         experience. Bigger changes are:
-        </_p>
+        </p>
         <ul>
-          <_li>Major core optimizations for painting and display,
-          including parallelized painting code</_li>
-          <_li>Symmetries are now preserved in XCF files (saved as image
-          parasites)</_li>
-          <_li>"Light" and "Dark" themes rewritten from scratch to get
+          <li>Major core optimizations for painting and display,
+          including parallelized painting code</li>
+          <li>Symmetries are now preserved in XCF files (saved as image
+          parasites)</li>
+          <li>"Light" and "Dark" themes rewritten from scratch to get
           rid of various usability issues. "Lighter" and "Darker" themes
-          removed.</_li>
-          <_li> New GimpToolGyroscope on-canvas control, currently used
+          removed.</li>
+          <li> New GimpToolGyroscope on-canvas control, currently used
           for the Panorama Projection filter. The widget provides
-          on-canvas interaction for 3D rotation (yaw, pitch, roll).</_li>
-          <_li>Plug-in debugging improved to output stack traces from
+          on-canvas interaction for 3D rotation (yaw, pitch, roll).</li>
+          <li>Plug-in debugging improved to output stack traces from
           plug-ins with --stack-trace-mode command line option not only
           on receiving signals but also on warnings and critical errors
-          when "fatal-warnings" debug key is set</_li>
+          when "fatal-warnings" debug key is set</li>
         </ul>
       </description>
     </release>
     <release version="2.10.0~rc1" date="2018-03-26" type="development">
       <url type="details">https://www.gimp.org/news/2018/03/26/gimp-2-10-0-rc1-released/</url>
       <description>
-        <_p>
+        <p>
         GIMP 2.10.0-RC1 is the first release candidate before GIMP
         2.10.0 stable release, with a focus on debugging and stability.
         Other than the many bug fixes, most notable improvements are:
-        </_p>
+        </p>
         <ul>
-          <_li>New dashboard dockable to monitor GIMP resource usage</_li>
-          <_li>New debug dialog to produce back traces and other debug
-          data, encouraging to report bugs</_li>
-          <_li>Unsaved images can now be recovered after a crash</_li>
-          <_li>Layer masks on layer groups</_li>
-          <_li>JPEG 2000 support improved for high bit depth and various
-          color spaces</_li>
-          <_li>Screenshot and color picking improved on various platforms</_li>
-          <_li>Metadata defaults preferences now available</_li>
-          <_li>Various GUI polishing</_li>
+          <li>New dashboard dockable to monitor GIMP resource usage</li>
+          <li>New debug dialog to produce back traces and other debug
+          data, encouraging to report bugs</li>
+          <li>Unsaved images can now be recovered after a crash</li>
+          <li>Layer masks on layer groups</li>
+          <li>JPEG 2000 support improved for high bit depth and various
+          color spaces</li>
+          <li>Screenshot and color picking improved on various platforms</li>
+          <li>Metadata defaults preferences now available</li>
+          <li>Various GUI polishing</li>
         </ul>
       </description>
     </release>
@@ -899,21 +899,21 @@
     <release version="2.9.8" date="2017-12-12" type="development">
       <url type="details">https://www.gimp.org/news/2017/12/12/gimp-2-9-8-released/</url>
       <description>
-        <_p>GIMP 2.9.8 introduces on-canvas gradient
+        <p>GIMP 2.9.8 introduces on-canvas gradient
         editing and various enhancements while focusing on bugfixing
-        and stability.</_p>
+        and stability.</p>
         <ul>
-          <_li>On-canvas gradient editing</_li>
-          <_li>Notification when an image is over/underexposed</_li>
-          <_li>Better and faster color management</_li>
-          <_li>Support for color picker and screenshots in Wayland on KDE Plasma</_li>
-          <_li>Paste in place feature</_li>
-          <_li>Many usability improvements</_li>
-          <_li>Manual can be displayed in the user's preferred language</_li>
-          <_li>Improvements for the Wavelet Decompose filter</_li>
-          <_li>Improved compatibility with Photoshop .psd files</_li>
-          <_li>New support for password-protected PDF</_li>
-          <_li>New support for HGT format (Digital Elevation Model data)</_li>
+          <li>On-canvas gradient editing</li>
+          <li>Notification when an image is over/underexposed</li>
+          <li>Better and faster color management</li>
+          <li>Support for color picker and screenshots in Wayland on KDE Plasma</li>
+          <li>Paste in place feature</li>
+          <li>Many usability improvements</li>
+          <li>Manual can be displayed in the user's preferred language</li>
+          <li>Improvements for the Wavelet Decompose filter</li>
+          <li>Improved compatibility with Photoshop .psd files</li>
+          <li>New support for password-protected PDF</li>
+          <li>New support for HGT format (Digital Elevation Model data)</li>
         </ul>
       </description>
     </release>
diff --git a/devel-docs/HACKING.md b/devel-docs/HACKING.md
index 0e8a482ba7..8b59f59513 100644
--- a/devel-docs/HACKING.md
+++ b/devel-docs/HACKING.md
@@ -92,16 +92,15 @@ running:
 Basically this does the following for you:
 
     gimp/trunk$ aclocal-1.9; libtoolize; automake-1.9 -a;
-    gimp/trunk$ autoconf; intltoolize --automake
+    gimp/trunk$ autoconf;
 
 The above commands create the "configure" script.  Now you can run the
 configure script in gimp/trunk to create all the Makefiles.
 
 Before running autogen.sh or configure, make sure you have libtool in
-your path. Also make sure glib-2.0.m4 glib-gettext.m4, gtk-3.0.m4,
-pkg.m4 and intltool.m4 are either installed in the same
-$prefix/share/aclocal relative to your automake/aclocal installation
-or call autogen.sh as follows:
+your path. Also make sure glib-2.0.m4 glib-gettext.m4, gtk-3.0.m4 and
+pkg.m4 are either installed in the same $prefix/share/aclocal relative to your
+automake/aclocal installation or call autogen.sh as follows:
 
     $ ACLOCAL_FLAGS="-I $prefix/share/aclocal" ./autogen.sh
 
diff --git a/extensions/goat-exercises/Makefile.am b/extensions/goat-exercises/Makefile.am
index 44dde13194..6ffb07ee08 100644
--- a/extensions/goat-exercises/Makefile.am
+++ b/extensions/goat-exercises/Makefile.am
@@ -130,7 +130,7 @@ appdatadir = $(goat_exercise_c_libexecdir)
 appdata_DATA = $(appstream_files)
 
 org.gimp.extension.goat-exercises.metainfo.xml: org.gimp.extension.goat-exercises.metainfo.xml.in $(wildcard 
$(top_srcdir)/po-plug-ins/*.po)
-       $(INTLTOOL_MERGE) $(top_srcdir)/po-plug-ins $< $(@) -x -u -c 
$(top_builddir)/po-plug-ins/.intltool-merge-cache
+       $(AM_V_GEN) $(MSGFMT) --xml --template $< -d $(top_srcdir)/po-plug-ins -o $@
 
 .PHONY: org.gimp.extension.goat-exercises.metainfo.xml
 
diff --git a/extensions/goat-exercises/meson.build b/extensions/goat-exercises/meson.build
index 7a379c81f6..0ff2f2c160 100644
--- a/extensions/goat-exercises/meson.build
+++ b/extensions/goat-exercises/meson.build
@@ -105,19 +105,10 @@ appdatafilein = configure_file(
   configuration: conf,
 )
 
-appdatafile = custom_target(appdatafilename,
+appdatafile = i18n.merge_file(
   input : [ appdatafilein, ],
   output: [ appdatafilename, ],
-  depend_files: [ po_plug_ins_dir ],
-  command: [
-    intltool_merge,
-    po_plug_ins_dir,
-    '@INPUT@',
-    '@OUTPUT@',
-    '--xml-style',
-    '--utf8',
-    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
-  ],
+  po_dir: po_plug_ins_dir,
   install: true,
   install_dir: gimpplugindir /  'extensions' / extension_name,
 )
diff --git a/extensions/goat-exercises/org.gimp.extension.goat-exercises.metainfo.xml.in.in 
b/extensions/goat-exercises/org.gimp.extension.goat-exercises.metainfo.xml.in.in
index e1eb55b5dc..902f3d6ec6 100644
--- a/extensions/goat-exercises/org.gimp.extension.goat-exercises.metainfo.xml.in.in
+++ b/extensions/goat-exercises/org.gimp.extension.goat-exercises.metainfo.xml.in.in
@@ -2,10 +2,10 @@
 <component type="addon">
   <id>org.gimp.extension.goat-exercises</id>
   <extends>org.gimp.GIMP</extends>
-  <_name>Goat Exercises</_name>
-  <_summary>Official Demo Plug-ins</_summary>
+  <name>Goat Exercises</name>
+  <summary>Official Demo Plug-ins</summary>
   <description>
-    <_p>
+    <p>
     This extension provides a set of basic examples to demonstrate
     how to create your own plug-ins.
     Each plug-in does the same thing, except it is developed in a
@@ -13,7 +13,7 @@
     They all create a GTK+ dialog with a text view displaying their own code
     (hence also demonstrating how to package data) and a button which calls
     a GEGL operation on the active layer.
-    </_p>
+    </p>
   </description>
   <url type="homepage">https://gimp.org</url>
   <metadata_license>CC0-1.0</metadata_license>
diff --git a/m4macros/.gitignore b/m4macros/.gitignore
index 5953da978a..8b1ede9acd 100644
--- a/m4macros/.gitignore
+++ b/m4macros/.gitignore
@@ -1,7 +1,6 @@
 Makefile
 Makefile.in
 gtk-doc.m4
-intltool.m4
 libtool.m4
 lt~obsolete.m4
 ltoptions.m4
diff --git a/meson.build b/meson.build
index 6408fc8404..80ee48a4a7 100644
--- a/meson.build
+++ b/meson.build
@@ -1017,7 +1017,6 @@ endif
 # Check for XML tools
 xmllint             = find_program('xmllint', required: false)
 xsltproc            = find_program('xsltproc')
-intltool_merge      = find_program('intltool-merge')
 desktop_validate    = find_program('desktop-file-validate', required: false)
 
 appstreamcli = find_program('appstreamcli', version: '>=0.15.3', required: get_option('appdata-test'))
@@ -1552,7 +1551,6 @@ install_conf.set('GEXIV2_REQUIRED_VERSION',       gexiv2_minver)
 install_conf.set('GLIB_REQUIRED_VERSION',         glib_minver)
 install_conf.set('GTK_REQUIRED_VERSION',          gtk3_minver)
 install_conf.set('HARFBUZZ_REQUIRED_VERSION',     harfbuzz_minver)
-install_conf.set('INTLTOOL_REQUIRED_VERSION',     '0.40.1')
 install_conf.set('LCMS_REQUIRED_VERSION',         lcms_minver)
 install_conf.set('LIBHEIF_REQUIRED_VERSION',      libheif_minver)
 install_conf.set('LIBLZMA_REQUIRED_VERSION',      liblzma_minver)
diff --git a/po-libgimp/.gitignore b/po-libgimp/.gitignore
index 8178716b61..d008ca8e1b 100644
--- a/po-libgimp/.gitignore
+++ b/po-libgimp/.gitignore
@@ -1,7 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po-libgimp/Makevars b/po-libgimp/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-libgimp/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-libgimp/POTFILES.in b/po-libgimp/POTFILES.in
index adaf15b928..8e85c060a4 100644
--- a/po-libgimp/POTFILES.in
+++ b/po-libgimp/POTFILES.in
@@ -1,8 +1,6 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 libgimp/gimp.c
 libgimp/gimpbrushselectbutton.c
 libgimp/gimpexport.c
diff --git a/po-plug-ins/.gitignore b/po-plug-ins/.gitignore
index 8178716b61..d008ca8e1b 100644
--- a/po-plug-ins/.gitignore
+++ b/po-plug-ins/.gitignore
@@ -1,7 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po-plug-ins/Makevars b/po-plug-ins/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-plug-ins/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-plug-ins/POTFILES.in b/po-plug-ins/POTFILES.in
index e448712e19..98c940e3bd 100644
--- a/po-plug-ins/POTFILES.in
+++ b/po-plug-ins/POTFILES.in
@@ -1,8 +1,6 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 extensions/goat-exercises/goat-exercise-c.c
 extensions/goat-exercises/goat-exercise-py3.py
 extensions/goat-exercises/goat-exercise-vala.vala
@@ -148,8 +146,8 @@ plug-ins/gimpressionist/repaint.c
 plug-ins/gimpressionist/size.c
 plug-ins/gimpressionist/sizemap.c
 plug-ins/gimpressionist/utils.c
-[type: gettext/glade]plug-ins/ui/plug-in-metadata-editor.ui
-[type: gettext/glade]plug-ins/ui/plug-in-metadata-viewer.ui
+plug-ins/ui/plug-in-metadata-editor.ui
+plug-ins/ui/plug-in-metadata-viewer.ui
 plug-ins/gradient-flare/gradient-flare.c
 plug-ins/help-browser/dialog.c
 plug-ins/help-browser/help-browser.c
diff --git a/po-python/.gitignore b/po-python/.gitignore
index 8178716b61..d008ca8e1b 100644
--- a/po-python/.gitignore
+++ b/po-python/.gitignore
@@ -1,7 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po-python/Makevars b/po-python/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-python/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-python/POTFILES.in b/po-python/POTFILES.in
index 5d04a419e6..7ccd518f83 100644
--- a/po-python/POTFILES.in
+++ b/po-python/POTFILES.in
@@ -1,8 +1,6 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 plug-ins/python/colorxhtml.py
 plug-ins/python/foggify.py
 plug-ins/python/gradients-save-as-css.py
diff --git a/po-script-fu/.gitignore b/po-script-fu/.gitignore
index 8178716b61..d008ca8e1b 100644
--- a/po-script-fu/.gitignore
+++ b/po-script-fu/.gitignore
@@ -1,7 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po-script-fu/Makevars b/po-script-fu/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-script-fu/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-script-fu/POTFILES.in b/po-script-fu/POTFILES.in
index 65826ba99d..5c520e998b 100644
--- a/po-script-fu/POTFILES.in
+++ b/po-script-fu/POTFILES.in
@@ -1,8 +1,6 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 plug-ins/script-fu/script-fu.c
 plug-ins/script-fu/script-fu-console.c
 plug-ins/script-fu/script-fu-eval.c
diff --git a/po-tags/.gitignore b/po-tags/.gitignore
index ff914d5df4..cbe74eaa2d 100644
--- a/po-tags/.gitignore
+++ b/po-tags/.gitignore
@@ -1,4 +1,3 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
diff --git a/po-tags/Makevars b/po-tags/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-tags/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-tags/POTFILES.in b/po-tags/POTFILES.in
index 61a1c927c5..404a45e2b3 100644
--- a/po-tags/POTFILES.in
+++ b/po-tags/POTFILES.in
@@ -1,6 +1,4 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 data/tags/gimp-tags-default.xml.in
diff --git a/po-tips/.gitignore b/po-tips/.gitignore
index 8178716b61..d008ca8e1b 100644
--- a/po-tips/.gitignore
+++ b/po-tips/.gitignore
@@ -1,7 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po-tips/Makevars b/po-tips/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-tips/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-tips/POTFILES.in b/po-tips/POTFILES.in
index 5a40d4310f..c13cdf8d64 100644
--- a/po-tips/POTFILES.in
+++ b/po-tips/POTFILES.in
@@ -1,6 +1,4 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 data/tips/gimp-tips.xml.in
diff --git a/po-windows-installer/.gitignore b/po-windows-installer/.gitignore
index 11dfbcd2a4..d008ca8e1b 100644
--- a/po-windows-installer/.gitignore
+++ b/po-windows-installer/.gitignore
@@ -1,8 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
-/.intltool-merge-cache.lock
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po-windows-installer/Makevars b/po-windows-installer/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po-windows-installer/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po-windows-installer/POTFILES.in b/po-windows-installer/POTFILES.in
index 0532c29bd1..5dd8e5b61c 100644
--- a/po-windows-installer/POTFILES.in
+++ b/po-windows-installer/POTFILES.in
@@ -1,6 +1,4 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
-[type: gettext/ini] build/windows/installer/lang/setup.isl.ini
+build/windows/installer/lang/setup.isl.xml.in
diff --git a/po/.gitignore b/po/.gitignore
index a9d7fbaf9c..346c34d97e 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,7 +1,6 @@
 /*.gmo
 /*.mo
 /*.pot
-/.intltool-merge-cache
 /Makefile
 /Makefile.in
 /POTFILES
diff --git a/po/Makevars b/po/Makevars
new file mode 100644
index 0000000000..16355119ff
--- /dev/null
+++ b/po/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=Q_:1g --keyword=C_:1c,2 
--keyword=NC_:1c,2 --add-comments
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = https://gitlab.gnome.org/GNOME/gimp/issues
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = yes
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = no
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = no
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b310e0a72f..734290d538 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,8 +1,6 @@
 # Files from the Gimp distribution which have already been
 # marked to allow runtime translation of messages
 
-[encoding: UTF-8]
-
 desktop/org.gimp.GIMP.appdata.xml.in.in
 desktop/gimp.desktop.in.in
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]