[virt-manager PATCH v3 3/8] setup: refactor build_i18n

Pino Toscano ptoscano at redhat.com
Wed Jul 8 06:54:49 UTC 2020


Refactor and simplify the handling of translations according to the
catalog split:
- use msgmerge to merge the translations from the update catalog,
  instead of intltool
- split the parts in different functions

Remove the writing of the temporary POTFILES.in, as it is no more needed
now.

Also, since now gettext is used at installation time:
- mention the gettext requirement in INSTALL.md
- add the gettext BuildRequires in the RPM spec file

Signed-off-by: Pino Toscano <ptoscano at redhat.com>
---
 INSTALL.md           |  1 +
 setup.py             | 69 +++++++++++++-------------------------------
 virt-manager.spec.in |  1 +
 3 files changed, 22 insertions(+), 49 deletions(-)

diff --git a/INSTALL.md b/INSTALL.md
index 685c400f..7080fce8 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -30,6 +30,7 @@ A detailed dependency list can be found in
 
 Minimum version requirements of major components:
 
+   - gettext
    - python >= 3.4
    - gtk3 >= 3.22
    - libvirt-python >= 0.6.0
diff --git a/setup.py b/setup.py
index 7bc1e3a6..d1202c68 100755
--- a/setup.py
+++ b/setup.py
@@ -67,28 +67,6 @@ def _generate_meta_potfiles_in():
     return potfiles
 
 
-def _generate_potfiles_in():
-    def find(dirname, ext):
-        ret = []
-        for root, ignore, filenames in os.walk(dirname):
-            for filename in fnmatch.filter(filenames, ext):
-                ret.append(os.path.join(root, filename))
-        ret.sort(key=lambda s: s.lower())
-        return ret
-
-    potfiles = ""
-    potfiles += "\n".join(find("virtManager", "*.py")) + "\n\n"
-    potfiles += "\n".join(find("virtinst", "*.py")) + "\n\n"
-
-    potfiles += _generate_meta_potfiles_in()
-    potfiles += "\n"
-
-    potfiles += "\n".join(["[type: gettext/glade]" + f for
-                          f in find("ui", "*.ui")]) + "\n\n"
-
-    return potfiles
-
-
 class my_build_i18n(distutils.command.build.build):
     """
     Add our desktop files to the list, saves us having to track setup.cfg
@@ -103,35 +81,23 @@ class my_build_i18n(distutils.command.build.build):
         pass
 
     def run(self):
-        potfiles = _generate_potfiles_in()
-        potpath = "po/POTFILES.in"
-
-        try:
-            print("Writing %s" % potpath)
-            open(potpath, "w").write(potfiles)
-            self._run()
-        finally:
-            print("Removing %s" % potpath)
-            os.unlink(potpath)
-
-    def _run(self):
-        # Borrowed from python-distutils-extra
-        po_dir = "po"
-
-        # Update po(t) files and print a report
-        # We have to change the working dir to the po dir for intltool
-        cmd = ["intltool-update",
-               (self.merge_po and "-r" or "-p"), "-g", "virt-manager"]
+        if self.merge_po:
+            self._msgmerge("po", "virt-manager.pot")
+            self._msgmerge("meta-po", "virt-manager-meta.pot")
+        self._msgfmt("po", "virt-manager")
+        self._merge_in("meta-po")
+
+    def _msgmerge(self, po_dir, pot_name):
+        pot_file = os.path.join(po_dir, pot_name)
+        for po_file in glob.glob("%s/*.po" % po_dir):
+            cmd = ["msgmerge", "--previous", "-o", po_file, po_file, pot_file]
+            self.spawn(cmd)
 
-        wd = os.getcwd()
-        os.chdir("po")
-        self.spawn(cmd)
-        os.chdir(wd)
-        max_po_mtime = 0
+    def _msgfmt(self, po_dir, po_name):
         for po_file in glob.glob("%s/*.po" % po_dir):
             lang = os.path.basename(po_file[:-3])
             mo_dir = os.path.join("build", "mo", lang, "LC_MESSAGES")
-            mo_file = os.path.join(mo_dir, "virt-manager.mo")
+            mo_file = os.path.join(mo_dir, po_name + ".mo")
             if not os.path.exists(mo_dir):
                 os.makedirs(mo_dir)
 
@@ -139,14 +105,19 @@ class my_build_i18n(distutils.command.build.build):
             po_mtime = os.path.getmtime(po_file)
             mo_mtime = (os.path.exists(mo_file) and
                         os.path.getmtime(mo_file)) or 0
-            if po_mtime > max_po_mtime:
-                max_po_mtime = po_mtime
             if po_mtime > mo_mtime:
                 self.spawn(cmd)
 
             targetpath = os.path.join("share/locale", lang, "LC_MESSAGES")
             self.distribution.data_files.append((targetpath, (mo_file,)))
 
+    def _merge_in(self, po_dir):
+        max_po_mtime = 0
+        for po_file in glob.glob("%s/*.po" % po_dir):
+            po_mtime = os.path.getmtime(po_file)
+            if po_mtime > max_po_mtime:
+                max_po_mtime = po_mtime
+
         # merge .in with translation
         for (file_set, switch) in [(_desktop_files, "-d"),
                                    (_appdata_files, "-x")]:
diff --git a/virt-manager.spec.in b/virt-manager.spec.in
index 1819b9ce..af2591ed 100644
--- a/virt-manager.spec.in
+++ b/virt-manager.spec.in
@@ -49,6 +49,7 @@ Recommends: libvirt-daemon-config-network
 # Optional inspection of guests
 Suggests: python3-libguestfs
 
+BuildRequires: gettext
 BuildRequires: intltool
 BuildRequires: /usr/bin/pod2man
 BuildRequires: python3-devel
-- 
2.26.2




More information about the virt-tools-list mailing list