From: Darrick J. Wong Date: Tue, 1 Apr 2025 14:44:44 +0000 (-0700) Subject: xfs_scrub_all: localize the strings in the program X-Git-Tag: v6.14.0~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d5e0a41c199272ada5d54d51a2a8cbb76da6eee;p=thirdparty%2Fxfsprogs-dev.git xfs_scrub_all: localize the strings in the program Use gettext to localize the output of this program. While we're at it, convert everything to f-strings to make it easier for translators to understand the string. f-strings introduce a runtime requirement of Python 3.6, which includes Debian 10 and RHEL 7. Signed-off-by: Darrick J. Wong Reviewed-by: Andrey Albershteyn Reviewed-by: Bill O'Donnell --- diff --git a/scrub/Makefile b/scrub/Makefile index b8105f69..3636a479 100644 --- a/scrub/Makefile +++ b/scrub/Makefile @@ -116,7 +116,7 @@ xfs_scrub_all.timer: xfs_scrub_all.timer.in $(builddefs) @echo " [SED] $@" $(Q)$(SED) -e "s|@pkg_state_dir@|$(PKG_STATE_DIR)|g" < $< > $@ -$(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs) +$(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs) $(TOPDIR)/libfrog/gettext.py @echo " [SED] $@" $(Q)$(SED) -e "s|@sbindir@|$(PKG_SBIN_DIR)|g" \ -e "s|@scrub_svcname@|$(scrub_svcname)|g" \ @@ -124,7 +124,10 @@ $(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs) -e "s|@pkg_version@|$(PKG_VERSION)|g" \ -e "s|@stampfile@|$(XFS_SCRUB_ALL_AUTO_MEDIA_SCAN_STAMP)|g" \ -e "s|@scrub_service_args@|$(XFS_SCRUB_SERVICE_ARGS)|g" \ - -e "s|@scrub_args@|$(XFS_SCRUB_ARGS)|g" < $< > $@ + -e "s|@scrub_args@|$(XFS_SCRUB_ARGS)|g" \ + -e '/@INIT_GETTEXT@/r $(TOPDIR)/libfrog/gettext.py' \ + -e '/@INIT_GETTEXT@/d' \ + < $< > $@ $(Q)chmod a+x $@ xfs_scrub_fail: xfs_scrub_fail.in $(builddefs) diff --git a/scrub/xfs_scrub_all.py.in b/scrub/xfs_scrub_all.py.in index fe4bca4b..515cc144 100644 --- a/scrub/xfs_scrub_all.py.in +++ b/scrub/xfs_scrub_all.py.in @@ -7,6 +7,7 @@ # Run online scrubbers in parallel, but avoid thrashing. +@INIT_GETTEXT@ import subprocess import json import threading @@ -115,7 +116,7 @@ class scrub_subprocess(scrub_control): global debug if debug: - print('run ', ' '.join(self.cmdline)) + print(_('run '), ' '.join(self.cmdline)) try: self.proc = subprocess.Popen(self.cmdline) @@ -132,7 +133,7 @@ class scrub_subprocess(scrub_control): global debug if debug: - print('kill ', ' '.join(self.cmdline)) + print(_('kill '), ' '.join(self.cmdline)) if self.proc is not None: self.proc.terminate() @@ -270,7 +271,8 @@ class scrub_service(scrub_control): for i in range(0, int(wait_for / interval)): s = self.state() if debug: - print('waiting for activation %s %s' % (self.unitname, s)) + msg = _("waiting for activation") + print(f'{msg} {self.unitname} {s}') if s == 'failed': return 1 if s != 'inactive': @@ -284,7 +286,8 @@ class scrub_service(scrub_control): s = self.state() if debug: - print('waited for startup %s %s' % (self.unitname, s)) + msg = _('waited for startup') + print(f'{msg} {self.unitname} {s}') if s == 'failed': return 1 if s != 'inactive': @@ -307,11 +310,13 @@ class scrub_service(scrub_control): s = self.state() while s not in ['failed', 'inactive']: if debug: - print('waiting %s %s' % (self.unitname, s)) + msg = _("waiting for") + print(f'{msg} {self.unitname} {s}') time.sleep(interval) s = self.state() if debug: - print('waited %s %s' % (self.unitname, s)) + msg = _('waited for') + print(f'{msg} {self.unitname} {s}') if s == 'failed': return 1 return 0 @@ -323,7 +328,8 @@ class scrub_service(scrub_control): global debug if debug: - print('starting %s' % self.unitname) + msg = _("starting") + print(f'{msg} {self.unitname}') try: last_active = self.last_activation() @@ -348,7 +354,8 @@ class scrub_service(scrub_control): global debug if debug: - print('stopping %s' % self.unitname) + msg = _('stopping') + print(f'{msg} {self.unitname}') try: self.__dbusrun(lambda: self.unit.Stop('replace')) @@ -387,11 +394,13 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs): if 'SERVICE_MODE' in os.environ: ret = run_service(mnt, scrub_media, killfuncs) if ret == 32: - print("Scrubbing %s disabled by administrator, (err=%d)" % (mnt, ret)) + msg = _("Scrubbing disabled by administrator") + print(f"{mnt}: {msg}, (err={ret})") sys.stdout.flush() return if ret == 0 or ret == 1: - print("Scrubbing %s done, (err=%d)" % (mnt, ret)) + msg = _("Scrubbing done") + print(f"{mnt}: {msg}, (err={ret})") sys.stdout.flush() retcode |= ret return @@ -404,7 +413,8 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs): # systemd services are unavailable. ret = run_subprocess(mnt, scrub_media, killfuncs) if ret >= 0: - print("Scrubbing %s done, (err=%d)" % (mnt, ret)) + msg = _("Scrubbing done") + print(f"{mnt}: {msg}, (err={ret})") sys.stdout.flush() retcode |= ret return @@ -412,7 +422,7 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs): if terminate: return - print("Unable to start scrub tool.") + print(_("Unable to start scrub tool.")) sys.stdout.flush() finally: running_devs -= mntdevs @@ -426,7 +436,7 @@ def signal_scrubs(signum, cond): global terminate if debug: - print('Signal handler called with signal', signum) + print(_('Signal handler called with signal'), signum) sys.stdout.flush() terminate = True @@ -441,7 +451,7 @@ def wait_for_termination(cond, killfuncs): global terminate if debug: - print('waiting for threads to terminate') + print(_('waiting for threads to terminate')) sys.stdout.flush() cond.acquire() @@ -454,7 +464,7 @@ def wait_for_termination(cond, killfuncs): if not terminate: return False - print("Terminating...") + print(_("Terminating...")) sys.stdout.flush() while len(killfuncs) > 0: fn = killfuncs.pop() @@ -496,8 +506,8 @@ def enable_automatic_media_scan(args): try: interval = scan_interval(args.auto_media_scan_interval) except Exception as e: - raise Exception('%s: Invalid media scan interval.' % \ - args.auto_media_scan_interval) + msg = _("Invalid media scan interval.") + raise Exception(f'{args.auto_media_scan_interval}: {msg}') p = Path(args.auto_media_scan_stamp) if already_enabled: @@ -515,7 +525,7 @@ def enable_automatic_media_scan(args): with p.open('w') as f: pass if not already_enabled: - print('Automatically enabling file data scrub.') + print(_('Automatically enabling file data scrub.')) sys.stdout.flush() return res @@ -532,21 +542,23 @@ def main(): global debug parser = argparse.ArgumentParser( \ - description = "Scrub all mounted XFS filesystems.") - parser.add_argument("--debug", help = "Enabling debugging messages.", \ + description = _("Scrub all mounted XFS filesystems.")) + parser.add_argument("--debug", help = _("Enabling debugging messages."), \ action = "store_true") - parser.add_argument("-V", help = "Report version and exit.", \ + parser.add_argument("-V", help = _("Report version and exit."), \ action = "store_true") - parser.add_argument("-x", help = "Scrub file data after filesystem metadata.", \ + parser.add_argument("-x", help = _("Scrub file data after filesystem metadata."), \ action = "store_true") - parser.add_argument("--auto-media-scan-interval", help = "Automatically scrub file data at this interval.", \ + parser.add_argument("--auto-media-scan-interval", help = _("Automatically scrub file data at this interval."), \ default = None) - parser.add_argument("--auto-media-scan-stamp", help = "Stamp file for automatic file data scrub.", \ + parser.add_argument("--auto-media-scan-stamp", help = _("Stamp file for automatic file data scrub."), \ default = '@stampfile@') args = parser.parse_args() if args.V: - print("xfs_scrub_all version @pkg_version@") + msg = _("xfs_scrub_all version") + pkgver = "@pkg_version@" + print(f"{msg} {pkgver}") sys.exit(0) if args.debug: