diff mbox series

Split po/ translation files into the relevant sub-directories

Message ID 20220401095724.98956-2-plautrba@redhat.com (mailing list archive)
State Accepted
Commit 2d668b621408
Headers show
Series Split po/ translation files into the relevant sub-directories | expand

Commit Message

Petr Lautrbach April 1, 2022, 9:57 a.m. UTC
When policycoreutils was split into policycoreutils/ python/ gui/ and sandbox/
sub-directories, po/ translation files stayed in policycoreutils/.

This commit splits original policycoreutils translations to
policycoreutils, selinux-python, selinux-gui, and selinux-sandbox.

See original Fedora issue https://github.com/fedora-selinux/selinux/issues/43

Signed-off-by: Petr Lautrbach <plautrba@redhat.com>
---
 gui/Makefile                                 |  4 +
 gui/booleansPage.py                          |  2 +-
 gui/domainsPage.py                           |  2 +-
 gui/fcontextPage.py                          |  2 +-
 gui/loginsPage.py                            |  2 +-
 gui/modulesPage.py                           |  2 +-
 gui/po/Makefile                              | 84 +++++++++++++++++++
 gui/po/POTFILES                              | 17 ++++
 gui/polgengui.py                             |  2 +-
 gui/portsPage.py                             |  2 +-
 gui/semanagePage.py                          |  2 +-
 gui/statusPage.py                            |  2 +-
 gui/system-config-selinux.py                 |  2 +-
 gui/usersPage.py                             |  2 +-
 policycoreutils/po/Makefile                  | 72 ++---------------
 policycoreutils/po/POTFILES                  |  9 +++
 python/Makefile                              |  2 +-
 python/chcat/chcat                           |  2 +-
 python/po/Makefile                           | 85 ++++++++++++++++++++
 python/po/POTFILES                           | 10 +++
 python/semanage/semanage                     |  2 +-
 python/semanage/seobject.py                  |  2 +-
 python/sepolgen/src/sepolgen/sepolgeni18n.py |  2 +-
 python/sepolicy/sepolicy.py                  |  2 +-
 python/sepolicy/sepolicy/__init__.py         |  2 +-
 python/sepolicy/sepolicy/generate.py         |  2 +-
 python/sepolicy/sepolicy/gui.py              |  2 +-
 python/sepolicy/sepolicy/interface.py        |  2 +-
 sandbox/Makefile                             |  3 +
 sandbox/po/Makefile                          | 84 +++++++++++++++++++
 sandbox/po/POTFILES                          |  1 +
 sandbox/sandbox                              |  2 +-
 32 files changed, 324 insertions(+), 89 deletions(-)
 create mode 100644 gui/po/Makefile
 create mode 100644 gui/po/POTFILES
 create mode 100644 policycoreutils/po/POTFILES
 create mode 100644 python/po/Makefile
 create mode 100644 python/po/POTFILES
 create mode 100644 sandbox/po/Makefile
 create mode 100644 sandbox/po/POTFILES

Comments

James Carter April 4, 2022, 9:08 p.m. UTC | #1
On Fri, Apr 1, 2022 at 11:45 AM Petr Lautrbach <plautrba@redhat.com> wrote:
>
> When policycoreutils was split into policycoreutils/ python/ gui/ and sandbox/
> sub-directories, po/ translation files stayed in policycoreutils/.
>
> This commit splits original policycoreutils translations to
> policycoreutils, selinux-python, selinux-gui, and selinux-sandbox.
>
> See original Fedora issue https://github.com/fedora-selinux/selinux/issues/43
>
> Signed-off-by: Petr Lautrbach <plautrba@redhat.com>

There is an extra space at the end of one of the lines as indicated
below, but that can be fixed when merged.

Acked-by: James Carter <jwcart2@gmail.com>

> ---
>  gui/Makefile                                 |  4 +
>  gui/booleansPage.py                          |  2 +-
>  gui/domainsPage.py                           |  2 +-
>  gui/fcontextPage.py                          |  2 +-
>  gui/loginsPage.py                            |  2 +-
>  gui/modulesPage.py                           |  2 +-
>  gui/po/Makefile                              | 84 +++++++++++++++++++
>  gui/po/POTFILES                              | 17 ++++
>  gui/polgengui.py                             |  2 +-
>  gui/portsPage.py                             |  2 +-
>  gui/semanagePage.py                          |  2 +-
>  gui/statusPage.py                            |  2 +-
>  gui/system-config-selinux.py                 |  2 +-
>  gui/usersPage.py                             |  2 +-
>  policycoreutils/po/Makefile                  | 72 ++---------------
>  policycoreutils/po/POTFILES                  |  9 +++
>  python/Makefile                              |  2 +-
>  python/chcat/chcat                           |  2 +-
>  python/po/Makefile                           | 85 ++++++++++++++++++++
>  python/po/POTFILES                           | 10 +++
>  python/semanage/semanage                     |  2 +-
>  python/semanage/seobject.py                  |  2 +-
>  python/sepolgen/src/sepolgen/sepolgeni18n.py |  2 +-
>  python/sepolicy/sepolicy.py                  |  2 +-
>  python/sepolicy/sepolicy/__init__.py         |  2 +-
>  python/sepolicy/sepolicy/generate.py         |  2 +-
>  python/sepolicy/sepolicy/gui.py              |  2 +-
>  python/sepolicy/sepolicy/interface.py        |  2 +-
>  sandbox/Makefile                             |  3 +
>  sandbox/po/Makefile                          | 84 +++++++++++++++++++
>  sandbox/po/POTFILES                          |  1 +
>  sandbox/sandbox                              |  2 +-
>  32 files changed, 324 insertions(+), 89 deletions(-)
>  create mode 100644 gui/po/Makefile
>  create mode 100644 gui/po/POTFILES
>  create mode 100644 policycoreutils/po/POTFILES
>  create mode 100644 python/po/Makefile
>  create mode 100644 python/po/POTFILES
>  create mode 100644 sandbox/po/Makefile
>  create mode 100644 sandbox/po/POTFILES
>
> diff --git a/gui/Makefile b/gui/Makefile
> index ca965c942912..4035fb21b8c9 100644
> --- a/gui/Makefile
> +++ b/gui/Makefile
> @@ -22,6 +22,7 @@ system-config-selinux.ui \
>  usersPage.py
>
>  all: $(TARGETS) system-config-selinux.py polgengui.py
> +       (cd po && $(MAKE) $@)
>
>  install: all
>         -mkdir -p $(DESTDIR)$(MANDIR)/man8
> @@ -54,7 +55,10 @@ install: all
>                 install -m 644 sepolicy_$${i}.png $(DESTDIR)$(DATADIR)/icons/hicolor/$${i}x$${i}/apps/sepolicy.png; \
>         done
>         install -m 644 org.selinux.config.policy $(DESTDIR)$(DATADIR)/polkit-1/actions/
> +       (cd po && $(MAKE) $@)
> +
>  clean:
> +       (cd po && $(MAKE) $@)
>
>  indent:
>
> diff --git a/gui/booleansPage.py b/gui/booleansPage.py
> index 7849bea26a06..dd12b6d6ab86 100644
> --- a/gui/booleansPage.py
> +++ b/gui/booleansPage.py
> @@ -38,7 +38,7 @@ DISABLED = 2
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/domainsPage.py b/gui/domainsPage.py
> index bad5140d8c59..6bbe4de5884f 100644
> --- a/gui/domainsPage.py
> +++ b/gui/domainsPage.py
> @@ -30,7 +30,7 @@ from semanagePage import *
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/fcontextPage.py b/gui/fcontextPage.py
> index d26aa1b405a9..52292cae01d2 100644
> --- a/gui/fcontextPage.py
> +++ b/gui/fcontextPage.py
> @@ -47,7 +47,7 @@ class context:
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/loginsPage.py b/gui/loginsPage.py
> index b67eb8bc42af..cbfb0cc23f65 100644
> --- a/gui/loginsPage.py
> +++ b/gui/loginsPage.py
> @@ -29,7 +29,7 @@ from semanagePage import *
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/modulesPage.py b/gui/modulesPage.py
> index 0584acf9b3a4..35a0129bab9c 100644
> --- a/gui/modulesPage.py
> +++ b/gui/modulesPage.py
> @@ -30,7 +30,7 @@ from semanagePage import *
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/po/Makefile b/gui/po/Makefile
> new file mode 100644
> index 000000000000..7ccd48eb2422
> --- /dev/null
> +++ b/gui/po/Makefile
> @@ -0,0 +1,84 @@
> +#
> +# Makefile for the PO files (translation) catalog
> +#
> +
> +PREFIX ?= /usr
> +
> +# What is this package?
> +NLSPACKAGE     = gui
> +POTFILE                = $(NLSPACKAGE).pot
> +INSTALL                = /usr/bin/install -c -p
> +INSTALL_DATA   = $(INSTALL) -m 644
> +INSTALL_DIR    = /usr/bin/install -d
> +
> +# destination directory
> +INSTALL_NLS_DIR = $(PREFIX)/share/locale
> +
> +# PO catalog handling
> +MSGMERGE       = msgmerge
> +MSGMERGE_FLAGS = -q
> +XGETTEXT       = xgettext --default-domain=$(NLSPACKAGE)
> +MSGFMT         = msgfmt
> +
> +# All possible linguas
> +PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
> +
> +# Only the files matching what the user has set in LINGUAS
> +USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
> +
> +# if no valid LINGUAS, build all languages
> +USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
> +
> +POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
> +MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
> +POTFILES  = $(shell cat POTFILES)
> +
> +#default:: clean
> +
> +all::  $(MOFILES)
> +
> +$(POTFILE): $(POTFILES)
> +       $(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
> +       @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
> +           rm -f $(NLSPACKAGE).po; \
> +       else \
> +           mv -f $(NLSPACKAGE).po $(POTFILE); \
> +       fi; \
> +
> +
> +refresh-po: Makefile
> +       for cat in $(POFILES); do \
> +               lang=`basename $$cat .po`; \
> +               if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
> +                       mv -f $$lang.pot $$lang.po ; \
> +                       echo "$(MSGMERGE) of $$lang succeeded" ; \
> +               else \
> +                       echo "$(MSGMERGE) of $$lang failed" ; \
> +                       rm -f $$lang.pot ; \
> +               fi \
> +       done
> +
> +clean:
> +       @rm -fv *mo *~ .depend
> +       @rm -rf tmp
> +
> +install: $(MOFILES)
> +       @for n in $(MOFILES); do \
> +           l=`basename $$n .mo`; \
> +           $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
> +           $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
> +       done
> +
> +%.mo: %.po
> +       $(MSGFMT) -o $@ $<
> +report:
> +       @for cat in $(wildcard *.po); do \
> +                echo -n "$$cat: "; \
> +                msgfmt -v --statistics -o /dev/null $$cat; \
> +        done
> +
> +.PHONY: missing depend
> +
> +relabel:
> +
> +test:
> diff --git a/gui/po/POTFILES b/gui/po/POTFILES
> new file mode 100644
> index 000000000000..1795c5c1951b
> --- /dev/null
> +++ b/gui/po/POTFILES
> @@ -0,0 +1,17 @@
> +../booleansPage.py
> +../domainsPage.py
> +../fcontextPage.py
> +../loginsPage.py
> +../modulesPage.py
> +../org.selinux.config.policy
> +../polgengui.py
> +../polgen.ui
> +../portsPage.py
> +../selinux-polgengui.desktop
> +../semanagePage.py
> +../sepolicy.desktop
> +../statusPage.py
> +../system-config-selinux.desktop
> +../system-config-selinux.py
> +../system-config-selinux.ui
> +../usersPage.py
> diff --git a/gui/polgengui.py b/gui/polgengui.py
> index d284ded65279..01f541bafae8 100644
> --- a/gui/polgengui.py
> +++ b/gui/polgengui.py
> @@ -63,7 +63,7 @@ def get_all_modules():
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/portsPage.py b/gui/portsPage.py
> index 30f58383bc1d..a537ecc8c0a1 100644
> --- a/gui/portsPage.py
> +++ b/gui/portsPage.py
> @@ -35,7 +35,7 @@ from semanagePage import *
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/semanagePage.py b/gui/semanagePage.py
> index 4127804fbbee..5361d69c1313 100644
> --- a/gui/semanagePage.py
> +++ b/gui/semanagePage.py
> @@ -22,7 +22,7 @@ from gi.repository import Gdk, Gtk
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/statusPage.py b/gui/statusPage.py
> index 766854b19cba..a8f079b9b163 100644
> --- a/gui/statusPage.py
> +++ b/gui/statusPage.py
> @@ -35,7 +35,7 @@ RELABELFILE = "/.autorelabel"
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/system-config-selinux.py b/gui/system-config-selinux.py
> index 3f70122b87e8..8c46c987b974 100644
> --- a/gui/system-config-selinux.py
> +++ b/gui/system-config-selinux.py
> @@ -45,7 +45,7 @@ import selinux
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/gui/usersPage.py b/gui/usersPage.py
> index 26794ed5c3f3..d15d4c5a71dd 100644
> --- a/gui/usersPage.py
> +++ b/gui/usersPage.py
> @@ -29,7 +29,7 @@ from semanagePage import *
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-gui"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/policycoreutils/po/Makefile b/policycoreutils/po/Makefile
> index 575e143122e6..5ff92bff6fdc 100644
> --- a/policycoreutils/po/Makefile
> +++ b/policycoreutils/po/Makefile
> @@ -3,7 +3,6 @@
>  #
>
>  PREFIX ?= /usr
> -TOP     = ../..
>
>  # What is this package?
>  NLSPACKAGE     = policycoreutils
> @@ -32,74 +31,13 @@ USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
>
>  POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
>  MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
> -POTFILES = \
> -       ../run_init/open_init_pty.c \
> -       ../run_init/run_init.c \
> -       ../semodule_link/semodule_link.c \
> -       ../audit2allow/audit2allow \
> -       ../semanage/seobject.py \
> -       ../setsebool/setsebool.c \
> -       ../newrole/newrole.c \
> -       ../load_policy/load_policy.c \
> -       ../sestatus/sestatus.c \
> -       ../semodule/semodule.c \
> -       ../setfiles/setfiles.c \
> -       ../semodule_package/semodule_package.c \
> -       ../semodule_deps/semodule_deps.c \
> -       ../semodule_expand/semodule_expand.c \
> -       ../scripts/chcat \
> -       ../scripts/fixfiles \
> -       ../restorecond/stringslist.c \
> -       ../restorecond/restorecond.h \
> -       ../restorecond/utmpwatcher.h \
> -       ../restorecond/stringslist.h \
> -       ../restorecond/restorecond.c \
> -       ../restorecond/utmpwatcher.c \
> -       ../gui/booleansPage.py \
> -       ../gui/fcontextPage.py \
> -       ../gui/loginsPage.py \
> -       ../gui/mappingsPage.py \
> -       ../gui/modulesPage.py \
> -       ../gui/polgen.glade \
> -       ../gui/polgengui.py \
> -       ../gui/portsPage.py \
> -       ../gui/semanagePage.py \
> -       ../gui/statusPage.py \
> -       ../gui/system-config-selinux.glade \
> -       ../gui/system-config-selinux.py \
> -       ../gui/usersPage.py \
> -       ../secon/secon.c \
> -       booleans.py \
> -       ../sepolicy/sepolicy.py \
> -       ../sepolicy/sepolicy/communicate.py \
> -       ../sepolicy/sepolicy/__init__.py \
> -       ../sepolicy/sepolicy/network.py \
> -       ../sepolicy/sepolicy/generate.py \
> -       ../sepolicy/sepolicy/sepolicy.glade \
> -       ../sepolicy/sepolicy/gui.py \
> -       ../sepolicy/sepolicy/manpage.py \
> -       ../sepolicy/sepolicy/transition.py \
> -       ../sepolicy/sepolicy/templates/executable.py \
> -       ../sepolicy/sepolicy/templates/__init__.py \
> -       ../sepolicy/sepolicy/templates/network.py \
> -       ../sepolicy/sepolicy/templates/rw.py \
> -       ../sepolicy/sepolicy/templates/script.py \
> -       ../sepolicy/sepolicy/templates/semodule.py \
> -       ../sepolicy/sepolicy/templates/tmp.py \
> -       ../sepolicy/sepolicy/templates/user.py \
> -       ../sepolicy/sepolicy/templates/var_lib.py \
> -       ../sepolicy/sepolicy/templates/var_log.py \
> -       ../sepolicy/sepolicy/templates/var_run.py \
> -       ../sepolicy/sepolicy/templates/var_spool.py
> +POTFILES  = $(shell cat POTFILES)
>
>  #default:: clean
>
> -all::  $(MOFILES)
> +all:: $(POTFILE) $(MOFILES)
>
> -booleans.py:
> -       sepolicy booleans -a > booleans.py
> -
> -$(POTFILE): $(POTFILES) booleans.py
> +$(POTFILE): $(POTFILES)
>         $(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
>         @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
>             rm -f $(NLSPACKAGE).po; \
> @@ -107,8 +45,6 @@ $(POTFILE): $(POTFILES) booleans.py
>             mv -f $(NLSPACKAGE).po $(POTFILE); \
>         fi; \
>
> -update-po: Makefile $(POTFILE) refresh-po
> -       @rm -f booleans.py
>
>  refresh-po: Makefile
>         for cat in $(POFILES); do \
> @@ -144,3 +80,5 @@ report:
>  .PHONY: missing depend
>
>  relabel:
> +
> +test:
> diff --git a/policycoreutils/po/POTFILES b/policycoreutils/po/POTFILES
> new file mode 100644
> index 000000000000..12237dc61ee4
> --- /dev/null
> +++ b/policycoreutils/po/POTFILES
> @@ -0,0 +1,9 @@
> +../run_init/open_init_pty.c
> +../run_init/run_init.c
> +../setsebool/setsebool.c
> +../newrole/newrole.c
> +../load_policy/load_policy.c
> +../sestatus/sestatus.c
> +../semodule/semodule.c
> +../setfiles/setfiles.c
> +../secon/secon.c
> diff --git a/python/Makefile b/python/Makefile
> index 9b66d52fbd4d..00312dbdb5c6 100644
> --- a/python/Makefile
> +++ b/python/Makefile
> @@ -1,4 +1,4 @@
> -SUBDIRS = sepolicy audit2allow semanage sepolgen chcat
> +SUBDIRS = sepolicy audit2allow semanage sepolgen chcat po
>
>  all install relabel clean indent test:
>         @for subdir in $(SUBDIRS); do \
> diff --git a/python/chcat/chcat b/python/chcat/chcat
> index fdd2e46ee3f9..839ddd3b54b6 100755
> --- a/python/chcat/chcat
> +++ b/python/chcat/chcat
> @@ -30,7 +30,7 @@ import getopt
>  import selinux
>  import seobject
>
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/python/po/Makefile b/python/po/Makefile
> new file mode 100644
> index 000000000000..05e49f0cc274
> --- /dev/null
> +++ b/python/po/Makefile
> @@ -0,0 +1,85 @@
> +#
> +# Makefile for the PO files (translation) catalog
> +#
> +
> +PREFIX ?= /usr
> +
> +# What is this package?
> +NLSPACKAGE     = python
> +POTFILE                = $(NLSPACKAGE).pot
> +INSTALL                = /usr/bin/install -c -p
> +INSTALL_DATA   = $(INSTALL) -m 644
> +INSTALL_DIR    = /usr/bin/install -d
> +
> +# destination directory
> +INSTALL_NLS_DIR = $(PREFIX)/share/locale
> +
> +# PO catalog handling
> +MSGMERGE       = msgmerge
> +MSGMERGE_FLAGS = -q
> +XGETTEXT       = xgettext --default-domain=$(NLSPACKAGE)
> +MSGFMT         = msgfmt
> +
> +# All possible linguas
> +PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
> +
> +# Only the files matching what the user has set in LINGUAS
> +USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
> +
> +# if no valid LINGUAS, build all languages
> +USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
> +
> +POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
> +MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
> +POTFILES  = $(shell cat POTFILES)
> +
> +#default:: clean
> +
> +all::  $(MOFILES)
> +
> +$(POTFILE): $(POTFILES)

Extra space at the end of the line above.

> +       $(XGETTEXT) -L Python --keyword=_ --keyword=N_ $(POTFILES)
> +       $(XGETTEXT) -j --keyword=_ --keyword=N_ ../sepolicy/sepolicy/sepolicy.glade
> +       @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
> +           rm -f $(NLSPACKAGE).po; \
> +       else \
> +           mv -f $(NLSPACKAGE).po $(POTFILE); \
> +       fi; \
> +
> +
> +refresh-po: Makefile
> +       for cat in $(POFILES); do \
> +               lang=`basename $$cat .po`; \
> +               if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
> +                       mv -f $$lang.pot $$lang.po ; \
> +                       echo "$(MSGMERGE) of $$lang succeeded" ; \
> +               else \
> +                       echo "$(MSGMERGE) of $$lang failed" ; \
> +                       rm -f $$lang.pot ; \
> +               fi \
> +       done
> +
> +clean:
> +       @rm -fv *mo *~ .depend
> +       @rm -rf tmp
> +
> +install: $(MOFILES)
> +       @for n in $(MOFILES); do \
> +           l=`basename $$n .mo`; \
> +           $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
> +           $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
> +       done
> +
> +%.mo: %.po
> +       $(MSGFMT) -o $@ $<
> +report:
> +       @for cat in $(wildcard *.po); do \
> +                echo -n "$$cat: "; \
> +                msgfmt -v --statistics -o /dev/null $$cat; \
> +        done
> +
> +.PHONY: missing depend
> +
> +relabel:
> +
> +test:
> diff --git a/python/po/POTFILES b/python/po/POTFILES
> new file mode 100644
> index 000000000000..128eb870a69e
> --- /dev/null
> +++ b/python/po/POTFILES
> @@ -0,0 +1,10 @@
> +../audit2allow/audit2allow
> +../chcat/chcat
> +../semanage/semanage
> +../semanage/seobject.py
> +../sepolgen/src/sepolgen/interfaces.py
> +../sepolicy/sepolicy/generate.py
> +../sepolicy/sepolicy/gui.py
> +../sepolicy/sepolicy/__init__.py
> +../sepolicy/sepolicy/interface.py
> +../sepolicy/sepolicy.py
> diff --git a/python/semanage/semanage b/python/semanage/semanage
> index ff9fb66b1411..12bb159ef649 100644
> --- a/python/semanage/semanage
> +++ b/python/semanage/semanage
> @@ -30,7 +30,7 @@ import seobject
>  import sys
>  import traceback
>
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/python/semanage/seobject.py b/python/semanage/seobject.py
> index 21adbf6eb74f..69e60db80060 100644
> --- a/python/semanage/seobject.py
> +++ b/python/semanage/seobject.py
> @@ -29,7 +29,7 @@ import sys
>  import stat
>  import socket
>  from semanage import *
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  import sepolicy
>  from setools.policyrep import SELinuxPolicy
>  from setools.typequery import TypeQuery
> diff --git a/python/sepolgen/src/sepolgen/sepolgeni18n.py b/python/sepolgen/src/sepolgen/sepolgeni18n.py
> index 998c4356415c..56ebd807c69c 100644
> --- a/python/sepolgen/src/sepolgen/sepolgeni18n.py
> +++ b/python/sepolgen/src/sepolgen/sepolgeni18n.py
> @@ -19,7 +19,7 @@
>
>  try:
>      import gettext
> -    t = gettext.translation( 'yumex' )
> +    t = gettext.translation( 'selinux-python' )
>      _ = t.gettext
>  except:
>      def _(str):
> diff --git a/python/sepolicy/sepolicy.py b/python/sepolicy/sepolicy.py
> index 7b2230651099..32956e58f52e 100755
> --- a/python/sepolicy/sepolicy.py
> +++ b/python/sepolicy/sepolicy.py
> @@ -28,7 +28,7 @@ import sepolicy
>  from multiprocessing import Pool
>  from sepolicy import get_os_version, get_conditionals, get_conditionals_format_text
>  import argparse
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/python/sepolicy/sepolicy/__init__.py b/python/sepolicy/sepolicy/__init__.py
> index e8654abbceb3..203ca25f4210 100644
> --- a/python/sepolicy/sepolicy/__init__.py
> +++ b/python/sepolicy/sepolicy/__init__.py
> @@ -23,7 +23,7 @@ from setools.typeattrquery import TypeAttributeQuery
>  from setools.typequery import TypeQuery
>  from setools.userquery import UserQuery
>
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/python/sepolicy/sepolicy/generate.py b/python/sepolicy/sepolicy/generate.py
> index 4e1ed4e9dc31..43180ca6fda4 100644
> --- a/python/sepolicy/sepolicy/generate.py
> +++ b/python/sepolicy/sepolicy/generate.py
> @@ -48,7 +48,7 @@ import sepolgen.defaults as defaults
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/python/sepolicy/sepolicy/gui.py b/python/sepolicy/sepolicy/gui.py
> index 1e86422b864a..c9ca158ddd09 100644
> --- a/python/sepolicy/sepolicy/gui.py
> +++ b/python/sepolicy/sepolicy/gui.py
> @@ -41,7 +41,7 @@ import os
>  import re
>  import unicodedata
>
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/python/sepolicy/sepolicy/interface.py b/python/sepolicy/sepolicy/interface.py
> index bdffb770f364..9d40aea1498d 100644
> --- a/python/sepolicy/sepolicy/interface.py
> +++ b/python/sepolicy/sepolicy/interface.py
> @@ -30,7 +30,7 @@ __all__ = ['get_all_interfaces', 'get_interfaces_from_xml', 'get_admin', 'get_us
>  ##
>  ## I18N
>  ##
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-python"
>  try:
>      import gettext
>      kwargs = {}
> diff --git a/sandbox/Makefile b/sandbox/Makefile
> index 9da5e58db9e6..84cb5a39bf7e 100644
> --- a/sandbox/Makefile
> +++ b/sandbox/Makefile
> @@ -13,6 +13,7 @@ override LDLIBS += -lselinux -lcap-ng
>  SEUNSHARE_OBJS = seunshare.o
>
>  all: sandbox seunshare sandboxX.sh start
> +       (cd po && $(MAKE) $@)
>
>  seunshare: $(SEUNSHARE_OBJS)
>
> @@ -39,12 +40,14 @@ install: all
>         install -m 755 start $(DESTDIR)$(SHAREDIR)
>         -mkdir -p $(DESTDIR)$(SYSCONFDIR)
>         install -m 644 sandbox.conf $(DESTDIR)$(SYSCONFDIR)/sandbox
> +       (cd po && $(MAKE) $@)
>
>  test:
>         @$(PYTHON) test_sandbox.py -v
>
>  clean:
>         -rm -f seunshare *.o *~
> +       (cd po && $(MAKE) $@)
>
>  indent:
>         ../../scripts/Lindent $(wildcard *.[ch])
> diff --git a/sandbox/po/Makefile b/sandbox/po/Makefile
> new file mode 100644
> index 000000000000..e75343649b67
> --- /dev/null
> +++ b/sandbox/po/Makefile
> @@ -0,0 +1,84 @@
> +#
> +# Makefile for the PO files (translation) catalog
> +#
> +
> +PREFIX ?= /usr
> +
> +# What is this package?
> +NLSPACKAGE     = sandbox
> +POTFILE                = $(NLSPACKAGE).pot
> +INSTALL                = /usr/bin/install -c -p
> +INSTALL_DATA   = $(INSTALL) -m 644
> +INSTALL_DIR    = /usr/bin/install -d
> +
> +# destination directory
> +INSTALL_NLS_DIR = $(PREFIX)/share/locale
> +
> +# PO catalog handling
> +MSGMERGE       = msgmerge
> +MSGMERGE_FLAGS = -q
> +XGETTEXT       = xgettext -L Python --default-domain=$(NLSPACKAGE)
> +MSGFMT         = msgfmt
> +
> +# All possible linguas
> +PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
> +
> +# Only the files matching what the user has set in LINGUAS
> +USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
> +
> +# if no valid LINGUAS, build all languages
> +USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
> +
> +POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
> +MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
> +POTFILES  = $(shell cat POTFILES)
> +
> +#default:: clean
> +
> +all:: $(POTFILE) $(MOFILES)
> +
> +$(POTFILE): $(POTFILES)
> +       $(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
> +       @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
> +           rm -f $(NLSPACKAGE).po; \
> +       else \
> +           mv -f $(NLSPACKAGE).po $(POTFILE); \
> +       fi; \
> +
> +
> +refresh-po: Makefile
> +       for cat in $(POFILES); do \
> +               lang=`basename $$cat .po`; \
> +               if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
> +                       mv -f $$lang.pot $$lang.po ; \
> +                       echo "$(MSGMERGE) of $$lang succeeded" ; \
> +               else \
> +                       echo "$(MSGMERGE) of $$lang failed" ; \
> +                       rm -f $$lang.pot ; \
> +               fi \
> +       done
> +
> +clean:
> +       @rm -fv *mo *~ .depend
> +       @rm -rf tmp
> +
> +install: $(MOFILES)
> +       @for n in $(MOFILES); do \
> +           l=`basename $$n .mo`; \
> +           $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
> +           $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
> +       done
> +
> +%.mo: %.po
> +       $(MSGFMT) -o $@ $<
> +report:
> +       @for cat in $(wildcard *.po); do \
> +                echo -n "$$cat: "; \
> +                msgfmt -v --statistics -o /dev/null $$cat; \
> +        done
> +
> +.PHONY: missing depend
> +
> +relabel:
> +
> +test:
> diff --git a/sandbox/po/POTFILES b/sandbox/po/POTFILES
> new file mode 100644
> index 000000000000..deff3f2f4656
> --- /dev/null
> +++ b/sandbox/po/POTFILES
> @@ -0,0 +1 @@
> +../sandbox
> diff --git a/sandbox/sandbox b/sandbox/sandbox
> index ca5f1e030a51..16c43b51eaaa 100644
> --- a/sandbox/sandbox
> +++ b/sandbox/sandbox
> @@ -37,7 +37,7 @@ import sepolicy
>
>  SEUNSHARE = "/usr/sbin/seunshare"
>  SANDBOXSH = "/usr/share/sandbox/sandboxX.sh"
> -PROGNAME = "policycoreutils"
> +PROGNAME = "selinux-sandbox"
>  try:
>      import gettext
>      kwargs = {}
> --
> 2.35.1
>
Petr Lautrbach April 6, 2022, 9:32 a.m. UTC | #2
James Carter <jwcart2@gmail.com> writes:

> On Fri, Apr 1, 2022 at 11:45 AM Petr Lautrbach <plautrba@redhat.com> wrote:
>>
>> When policycoreutils was split into policycoreutils/ python/ gui/ and sandbox/
>> sub-directories, po/ translation files stayed in policycoreutils/.
>>
>> This commit splits original policycoreutils translations to
>> policycoreutils, selinux-python, selinux-gui, and selinux-sandbox.
>>
>> See original Fedora issue https://github.com/fedora-selinux/selinux/issues/43
>>
>> Signed-off-by: Petr Lautrbach <plautrba@redhat.com>
>
> There is an extra space at the end of one of the lines as indicated
> below, but that can be fixed when merged.
>
> Acked-by: James Carter <jwcart2@gmail.com>
>


Merged with fixed extra space, thanks!


>> ---
>>  gui/Makefile                                 |  4 +
>>  gui/booleansPage.py                          |  2 +-
>>  gui/domainsPage.py                           |  2 +-
>>  gui/fcontextPage.py                          |  2 +-
>>  gui/loginsPage.py                            |  2 +-
>>  gui/modulesPage.py                           |  2 +-
>>  gui/po/Makefile                              | 84 +++++++++++++++++++
>>  gui/po/POTFILES                              | 17 ++++
>>  gui/polgengui.py                             |  2 +-
>>  gui/portsPage.py                             |  2 +-
>>  gui/semanagePage.py                          |  2 +-
>>  gui/statusPage.py                            |  2 +-
>>  gui/system-config-selinux.py                 |  2 +-
>>  gui/usersPage.py                             |  2 +-
>>  policycoreutils/po/Makefile                  | 72 ++---------------
>>  policycoreutils/po/POTFILES                  |  9 +++
>>  python/Makefile                              |  2 +-
>>  python/chcat/chcat                           |  2 +-
>>  python/po/Makefile                           | 85 ++++++++++++++++++++
>>  python/po/POTFILES                           | 10 +++
>>  python/semanage/semanage                     |  2 +-
>>  python/semanage/seobject.py                  |  2 +-
>>  python/sepolgen/src/sepolgen/sepolgeni18n.py |  2 +-
>>  python/sepolicy/sepolicy.py                  |  2 +-
>>  python/sepolicy/sepolicy/__init__.py         |  2 +-
>>  python/sepolicy/sepolicy/generate.py         |  2 +-
>>  python/sepolicy/sepolicy/gui.py              |  2 +-
>>  python/sepolicy/sepolicy/interface.py        |  2 +-
>>  sandbox/Makefile                             |  3 +
>>  sandbox/po/Makefile                          | 84 +++++++++++++++++++
>>  sandbox/po/POTFILES                          |  1 +
>>  sandbox/sandbox                              |  2 +-
>>  32 files changed, 324 insertions(+), 89 deletions(-)
>>  create mode 100644 gui/po/Makefile
>>  create mode 100644 gui/po/POTFILES
>>  create mode 100644 policycoreutils/po/POTFILES
>>  create mode 100644 python/po/Makefile
>>  create mode 100644 python/po/POTFILES
>>  create mode 100644 sandbox/po/Makefile
>>  create mode 100644 sandbox/po/POTFILES
>>
>> diff --git a/gui/Makefile b/gui/Makefile
>> index ca965c942912..4035fb21b8c9 100644
>> --- a/gui/Makefile
>> +++ b/gui/Makefile
>> @@ -22,6 +22,7 @@ system-config-selinux.ui \
>>  usersPage.py
>>
>>  all: $(TARGETS) system-config-selinux.py polgengui.py
>> +       (cd po && $(MAKE) $@)
>>
>>  install: all
>>         -mkdir -p $(DESTDIR)$(MANDIR)/man8
>> @@ -54,7 +55,10 @@ install: all
>>                 install -m 644 sepolicy_$${i}.png $(DESTDIR)$(DATADIR)/icons/hicolor/$${i}x$${i}/apps/sepolicy.png; \
>>         done
>>         install -m 644 org.selinux.config.policy $(DESTDIR)$(DATADIR)/polkit-1/actions/
>> +       (cd po && $(MAKE) $@)
>> +
>>  clean:
>> +       (cd po && $(MAKE) $@)
>>
>>  indent:
>>
>> diff --git a/gui/booleansPage.py b/gui/booleansPage.py
>> index 7849bea26a06..dd12b6d6ab86 100644
>> --- a/gui/booleansPage.py
>> +++ b/gui/booleansPage.py
>> @@ -38,7 +38,7 @@ DISABLED = 2
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/domainsPage.py b/gui/domainsPage.py
>> index bad5140d8c59..6bbe4de5884f 100644
>> --- a/gui/domainsPage.py
>> +++ b/gui/domainsPage.py
>> @@ -30,7 +30,7 @@ from semanagePage import *
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/fcontextPage.py b/gui/fcontextPage.py
>> index d26aa1b405a9..52292cae01d2 100644
>> --- a/gui/fcontextPage.py
>> +++ b/gui/fcontextPage.py
>> @@ -47,7 +47,7 @@ class context:
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/loginsPage.py b/gui/loginsPage.py
>> index b67eb8bc42af..cbfb0cc23f65 100644
>> --- a/gui/loginsPage.py
>> +++ b/gui/loginsPage.py
>> @@ -29,7 +29,7 @@ from semanagePage import *
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/modulesPage.py b/gui/modulesPage.py
>> index 0584acf9b3a4..35a0129bab9c 100644
>> --- a/gui/modulesPage.py
>> +++ b/gui/modulesPage.py
>> @@ -30,7 +30,7 @@ from semanagePage import *
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/po/Makefile b/gui/po/Makefile
>> new file mode 100644
>> index 000000000000..7ccd48eb2422
>> --- /dev/null
>> +++ b/gui/po/Makefile
>> @@ -0,0 +1,84 @@
>> +#
>> +# Makefile for the PO files (translation) catalog
>> +#
>> +
>> +PREFIX ?= /usr
>> +
>> +# What is this package?
>> +NLSPACKAGE     = gui
>> +POTFILE                = $(NLSPACKAGE).pot
>> +INSTALL                = /usr/bin/install -c -p
>> +INSTALL_DATA   = $(INSTALL) -m 644
>> +INSTALL_DIR    = /usr/bin/install -d
>> +
>> +# destination directory
>> +INSTALL_NLS_DIR = $(PREFIX)/share/locale
>> +
>> +# PO catalog handling
>> +MSGMERGE       = msgmerge
>> +MSGMERGE_FLAGS = -q
>> +XGETTEXT       = xgettext --default-domain=$(NLSPACKAGE)
>> +MSGFMT         = msgfmt
>> +
>> +# All possible linguas
>> +PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
>> +
>> +# Only the files matching what the user has set in LINGUAS
>> +USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
>> +
>> +# if no valid LINGUAS, build all languages
>> +USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
>> +
>> +POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
>> +MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
>> +POTFILES  = $(shell cat POTFILES)
>> +
>> +#default:: clean
>> +
>> +all::  $(MOFILES)
>> +
>> +$(POTFILE): $(POTFILES)
>> +       $(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
>> +       @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
>> +           rm -f $(NLSPACKAGE).po; \
>> +       else \
>> +           mv -f $(NLSPACKAGE).po $(POTFILE); \
>> +       fi; \
>> +
>> +
>> +refresh-po: Makefile
>> +       for cat in $(POFILES); do \
>> +               lang=`basename $$cat .po`; \
>> +               if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
>> +                       mv -f $$lang.pot $$lang.po ; \
>> +                       echo "$(MSGMERGE) of $$lang succeeded" ; \
>> +               else \
>> +                       echo "$(MSGMERGE) of $$lang failed" ; \
>> +                       rm -f $$lang.pot ; \
>> +               fi \
>> +       done
>> +
>> +clean:
>> +       @rm -fv *mo *~ .depend
>> +       @rm -rf tmp
>> +
>> +install: $(MOFILES)
>> +       @for n in $(MOFILES); do \
>> +           l=`basename $$n .mo`; \
>> +           $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
>> +           $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
>> +       done
>> +
>> +%.mo: %.po
>> +       $(MSGFMT) -o $@ $<
>> +report:
>> +       @for cat in $(wildcard *.po); do \
>> +                echo -n "$$cat: "; \
>> +                msgfmt -v --statistics -o /dev/null $$cat; \
>> +        done
>> +
>> +.PHONY: missing depend
>> +
>> +relabel:
>> +
>> +test:
>> diff --git a/gui/po/POTFILES b/gui/po/POTFILES
>> new file mode 100644
>> index 000000000000..1795c5c1951b
>> --- /dev/null
>> +++ b/gui/po/POTFILES
>> @@ -0,0 +1,17 @@
>> +../booleansPage.py
>> +../domainsPage.py
>> +../fcontextPage.py
>> +../loginsPage.py
>> +../modulesPage.py
>> +../org.selinux.config.policy
>> +../polgengui.py
>> +../polgen.ui
>> +../portsPage.py
>> +../selinux-polgengui.desktop
>> +../semanagePage.py
>> +../sepolicy.desktop
>> +../statusPage.py
>> +../system-config-selinux.desktop
>> +../system-config-selinux.py
>> +../system-config-selinux.ui
>> +../usersPage.py
>> diff --git a/gui/polgengui.py b/gui/polgengui.py
>> index d284ded65279..01f541bafae8 100644
>> --- a/gui/polgengui.py
>> +++ b/gui/polgengui.py
>> @@ -63,7 +63,7 @@ def get_all_modules():
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/portsPage.py b/gui/portsPage.py
>> index 30f58383bc1d..a537ecc8c0a1 100644
>> --- a/gui/portsPage.py
>> +++ b/gui/portsPage.py
>> @@ -35,7 +35,7 @@ from semanagePage import *
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/semanagePage.py b/gui/semanagePage.py
>> index 4127804fbbee..5361d69c1313 100644
>> --- a/gui/semanagePage.py
>> +++ b/gui/semanagePage.py
>> @@ -22,7 +22,7 @@ from gi.repository import Gdk, Gtk
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/statusPage.py b/gui/statusPage.py
>> index 766854b19cba..a8f079b9b163 100644
>> --- a/gui/statusPage.py
>> +++ b/gui/statusPage.py
>> @@ -35,7 +35,7 @@ RELABELFILE = "/.autorelabel"
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/system-config-selinux.py b/gui/system-config-selinux.py
>> index 3f70122b87e8..8c46c987b974 100644
>> --- a/gui/system-config-selinux.py
>> +++ b/gui/system-config-selinux.py
>> @@ -45,7 +45,7 @@ import selinux
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/gui/usersPage.py b/gui/usersPage.py
>> index 26794ed5c3f3..d15d4c5a71dd 100644
>> --- a/gui/usersPage.py
>> +++ b/gui/usersPage.py
>> @@ -29,7 +29,7 @@ from semanagePage import *
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-gui"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/policycoreutils/po/Makefile b/policycoreutils/po/Makefile
>> index 575e143122e6..5ff92bff6fdc 100644
>> --- a/policycoreutils/po/Makefile
>> +++ b/policycoreutils/po/Makefile
>> @@ -3,7 +3,6 @@
>>  #
>>
>>  PREFIX ?= /usr
>> -TOP     = ../..
>>
>>  # What is this package?
>>  NLSPACKAGE     = policycoreutils
>> @@ -32,74 +31,13 @@ USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
>>
>>  POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
>>  MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
>> -POTFILES = \
>> -       ../run_init/open_init_pty.c \
>> -       ../run_init/run_init.c \
>> -       ../semodule_link/semodule_link.c \
>> -       ../audit2allow/audit2allow \
>> -       ../semanage/seobject.py \
>> -       ../setsebool/setsebool.c \
>> -       ../newrole/newrole.c \
>> -       ../load_policy/load_policy.c \
>> -       ../sestatus/sestatus.c \
>> -       ../semodule/semodule.c \
>> -       ../setfiles/setfiles.c \
>> -       ../semodule_package/semodule_package.c \
>> -       ../semodule_deps/semodule_deps.c \
>> -       ../semodule_expand/semodule_expand.c \
>> -       ../scripts/chcat \
>> -       ../scripts/fixfiles \
>> -       ../restorecond/stringslist.c \
>> -       ../restorecond/restorecond.h \
>> -       ../restorecond/utmpwatcher.h \
>> -       ../restorecond/stringslist.h \
>> -       ../restorecond/restorecond.c \
>> -       ../restorecond/utmpwatcher.c \
>> -       ../gui/booleansPage.py \
>> -       ../gui/fcontextPage.py \
>> -       ../gui/loginsPage.py \
>> -       ../gui/mappingsPage.py \
>> -       ../gui/modulesPage.py \
>> -       ../gui/polgen.glade \
>> -       ../gui/polgengui.py \
>> -       ../gui/portsPage.py \
>> -       ../gui/semanagePage.py \
>> -       ../gui/statusPage.py \
>> -       ../gui/system-config-selinux.glade \
>> -       ../gui/system-config-selinux.py \
>> -       ../gui/usersPage.py \
>> -       ../secon/secon.c \
>> -       booleans.py \
>> -       ../sepolicy/sepolicy.py \
>> -       ../sepolicy/sepolicy/communicate.py \
>> -       ../sepolicy/sepolicy/__init__.py \
>> -       ../sepolicy/sepolicy/network.py \
>> -       ../sepolicy/sepolicy/generate.py \
>> -       ../sepolicy/sepolicy/sepolicy.glade \
>> -       ../sepolicy/sepolicy/gui.py \
>> -       ../sepolicy/sepolicy/manpage.py \
>> -       ../sepolicy/sepolicy/transition.py \
>> -       ../sepolicy/sepolicy/templates/executable.py \
>> -       ../sepolicy/sepolicy/templates/__init__.py \
>> -       ../sepolicy/sepolicy/templates/network.py \
>> -       ../sepolicy/sepolicy/templates/rw.py \
>> -       ../sepolicy/sepolicy/templates/script.py \
>> -       ../sepolicy/sepolicy/templates/semodule.py \
>> -       ../sepolicy/sepolicy/templates/tmp.py \
>> -       ../sepolicy/sepolicy/templates/user.py \
>> -       ../sepolicy/sepolicy/templates/var_lib.py \
>> -       ../sepolicy/sepolicy/templates/var_log.py \
>> -       ../sepolicy/sepolicy/templates/var_run.py \
>> -       ../sepolicy/sepolicy/templates/var_spool.py
>> +POTFILES  = $(shell cat POTFILES)
>>
>>  #default:: clean
>>
>> -all::  $(MOFILES)
>> +all:: $(POTFILE) $(MOFILES)
>>
>> -booleans.py:
>> -       sepolicy booleans -a > booleans.py
>> -
>> -$(POTFILE): $(POTFILES) booleans.py
>> +$(POTFILE): $(POTFILES)
>>         $(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
>>         @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
>>             rm -f $(NLSPACKAGE).po; \
>> @@ -107,8 +45,6 @@ $(POTFILE): $(POTFILES) booleans.py
>>             mv -f $(NLSPACKAGE).po $(POTFILE); \
>>         fi; \
>>
>> -update-po: Makefile $(POTFILE) refresh-po
>> -       @rm -f booleans.py
>>
>>  refresh-po: Makefile
>>         for cat in $(POFILES); do \
>> @@ -144,3 +80,5 @@ report:
>>  .PHONY: missing depend
>>
>>  relabel:
>> +
>> +test:
>> diff --git a/policycoreutils/po/POTFILES b/policycoreutils/po/POTFILES
>> new file mode 100644
>> index 000000000000..12237dc61ee4
>> --- /dev/null
>> +++ b/policycoreutils/po/POTFILES
>> @@ -0,0 +1,9 @@
>> +../run_init/open_init_pty.c
>> +../run_init/run_init.c
>> +../setsebool/setsebool.c
>> +../newrole/newrole.c
>> +../load_policy/load_policy.c
>> +../sestatus/sestatus.c
>> +../semodule/semodule.c
>> +../setfiles/setfiles.c
>> +../secon/secon.c
>> diff --git a/python/Makefile b/python/Makefile
>> index 9b66d52fbd4d..00312dbdb5c6 100644
>> --- a/python/Makefile
>> +++ b/python/Makefile
>> @@ -1,4 +1,4 @@
>> -SUBDIRS = sepolicy audit2allow semanage sepolgen chcat
>> +SUBDIRS = sepolicy audit2allow semanage sepolgen chcat po
>>
>>  all install relabel clean indent test:
>>         @for subdir in $(SUBDIRS); do \
>> diff --git a/python/chcat/chcat b/python/chcat/chcat
>> index fdd2e46ee3f9..839ddd3b54b6 100755
>> --- a/python/chcat/chcat
>> +++ b/python/chcat/chcat
>> @@ -30,7 +30,7 @@ import getopt
>>  import selinux
>>  import seobject
>>
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/python/po/Makefile b/python/po/Makefile
>> new file mode 100644
>> index 000000000000..05e49f0cc274
>> --- /dev/null
>> +++ b/python/po/Makefile
>> @@ -0,0 +1,85 @@
>> +#
>> +# Makefile for the PO files (translation) catalog
>> +#
>> +
>> +PREFIX ?= /usr
>> +
>> +# What is this package?
>> +NLSPACKAGE     = python
>> +POTFILE                = $(NLSPACKAGE).pot
>> +INSTALL                = /usr/bin/install -c -p
>> +INSTALL_DATA   = $(INSTALL) -m 644
>> +INSTALL_DIR    = /usr/bin/install -d
>> +
>> +# destination directory
>> +INSTALL_NLS_DIR = $(PREFIX)/share/locale
>> +
>> +# PO catalog handling
>> +MSGMERGE       = msgmerge
>> +MSGMERGE_FLAGS = -q
>> +XGETTEXT       = xgettext --default-domain=$(NLSPACKAGE)
>> +MSGFMT         = msgfmt
>> +
>> +# All possible linguas
>> +PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
>> +
>> +# Only the files matching what the user has set in LINGUAS
>> +USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
>> +
>> +# if no valid LINGUAS, build all languages
>> +USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
>> +
>> +POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
>> +MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
>> +POTFILES  = $(shell cat POTFILES)
>> +
>> +#default:: clean
>> +
>> +all::  $(MOFILES)
>> +
>> +$(POTFILE): $(POTFILES)
>
> Extra space at the end of the line above.
>
>> +       $(XGETTEXT) -L Python --keyword=_ --keyword=N_ $(POTFILES)
>> +       $(XGETTEXT) -j --keyword=_ --keyword=N_ ../sepolicy/sepolicy/sepolicy.glade
>> +       @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
>> +           rm -f $(NLSPACKAGE).po; \
>> +       else \
>> +           mv -f $(NLSPACKAGE).po $(POTFILE); \
>> +       fi; \
>> +
>> +
>> +refresh-po: Makefile
>> +       for cat in $(POFILES); do \
>> +               lang=`basename $$cat .po`; \
>> +               if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
>> +                       mv -f $$lang.pot $$lang.po ; \
>> +                       echo "$(MSGMERGE) of $$lang succeeded" ; \
>> +               else \
>> +                       echo "$(MSGMERGE) of $$lang failed" ; \
>> +                       rm -f $$lang.pot ; \
>> +               fi \
>> +       done
>> +
>> +clean:
>> +       @rm -fv *mo *~ .depend
>> +       @rm -rf tmp
>> +
>> +install: $(MOFILES)
>> +       @for n in $(MOFILES); do \
>> +           l=`basename $$n .mo`; \
>> +           $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
>> +           $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
>> +       done
>> +
>> +%.mo: %.po
>> +       $(MSGFMT) -o $@ $<
>> +report:
>> +       @for cat in $(wildcard *.po); do \
>> +                echo -n "$$cat: "; \
>> +                msgfmt -v --statistics -o /dev/null $$cat; \
>> +        done
>> +
>> +.PHONY: missing depend
>> +
>> +relabel:
>> +
>> +test:
>> diff --git a/python/po/POTFILES b/python/po/POTFILES
>> new file mode 100644
>> index 000000000000..128eb870a69e
>> --- /dev/null
>> +++ b/python/po/POTFILES
>> @@ -0,0 +1,10 @@
>> +../audit2allow/audit2allow
>> +../chcat/chcat
>> +../semanage/semanage
>> +../semanage/seobject.py
>> +../sepolgen/src/sepolgen/interfaces.py
>> +../sepolicy/sepolicy/generate.py
>> +../sepolicy/sepolicy/gui.py
>> +../sepolicy/sepolicy/__init__.py
>> +../sepolicy/sepolicy/interface.py
>> +../sepolicy/sepolicy.py
>> diff --git a/python/semanage/semanage b/python/semanage/semanage
>> index ff9fb66b1411..12bb159ef649 100644
>> --- a/python/semanage/semanage
>> +++ b/python/semanage/semanage
>> @@ -30,7 +30,7 @@ import seobject
>>  import sys
>>  import traceback
>>
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/python/semanage/seobject.py b/python/semanage/seobject.py
>> index 21adbf6eb74f..69e60db80060 100644
>> --- a/python/semanage/seobject.py
>> +++ b/python/semanage/seobject.py
>> @@ -29,7 +29,7 @@ import sys
>>  import stat
>>  import socket
>>  from semanage import *
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  import sepolicy
>>  from setools.policyrep import SELinuxPolicy
>>  from setools.typequery import TypeQuery
>> diff --git a/python/sepolgen/src/sepolgen/sepolgeni18n.py b/python/sepolgen/src/sepolgen/sepolgeni18n.py
>> index 998c4356415c..56ebd807c69c 100644
>> --- a/python/sepolgen/src/sepolgen/sepolgeni18n.py
>> +++ b/python/sepolgen/src/sepolgen/sepolgeni18n.py
>> @@ -19,7 +19,7 @@
>>
>>  try:
>>      import gettext
>> -    t = gettext.translation( 'yumex' )
>> +    t = gettext.translation( 'selinux-python' )
>>      _ = t.gettext
>>  except:
>>      def _(str):
>> diff --git a/python/sepolicy/sepolicy.py b/python/sepolicy/sepolicy.py
>> index 7b2230651099..32956e58f52e 100755
>> --- a/python/sepolicy/sepolicy.py
>> +++ b/python/sepolicy/sepolicy.py
>> @@ -28,7 +28,7 @@ import sepolicy
>>  from multiprocessing import Pool
>>  from sepolicy import get_os_version, get_conditionals, get_conditionals_format_text
>>  import argparse
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/python/sepolicy/sepolicy/__init__.py b/python/sepolicy/sepolicy/__init__.py
>> index e8654abbceb3..203ca25f4210 100644
>> --- a/python/sepolicy/sepolicy/__init__.py
>> +++ b/python/sepolicy/sepolicy/__init__.py
>> @@ -23,7 +23,7 @@ from setools.typeattrquery import TypeAttributeQuery
>>  from setools.typequery import TypeQuery
>>  from setools.userquery import UserQuery
>>
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/python/sepolicy/sepolicy/generate.py b/python/sepolicy/sepolicy/generate.py
>> index 4e1ed4e9dc31..43180ca6fda4 100644
>> --- a/python/sepolicy/sepolicy/generate.py
>> +++ b/python/sepolicy/sepolicy/generate.py
>> @@ -48,7 +48,7 @@ import sepolgen.defaults as defaults
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/python/sepolicy/sepolicy/gui.py b/python/sepolicy/sepolicy/gui.py
>> index 1e86422b864a..c9ca158ddd09 100644
>> --- a/python/sepolicy/sepolicy/gui.py
>> +++ b/python/sepolicy/sepolicy/gui.py
>> @@ -41,7 +41,7 @@ import os
>>  import re
>>  import unicodedata
>>
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/python/sepolicy/sepolicy/interface.py b/python/sepolicy/sepolicy/interface.py
>> index bdffb770f364..9d40aea1498d 100644
>> --- a/python/sepolicy/sepolicy/interface.py
>> +++ b/python/sepolicy/sepolicy/interface.py
>> @@ -30,7 +30,7 @@ __all__ = ['get_all_interfaces', 'get_interfaces_from_xml', 'get_admin', 'get_us
>>  ##
>>  ## I18N
>>  ##
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-python"
>>  try:
>>      import gettext
>>      kwargs = {}
>> diff --git a/sandbox/Makefile b/sandbox/Makefile
>> index 9da5e58db9e6..84cb5a39bf7e 100644
>> --- a/sandbox/Makefile
>> +++ b/sandbox/Makefile
>> @@ -13,6 +13,7 @@ override LDLIBS += -lselinux -lcap-ng
>>  SEUNSHARE_OBJS = seunshare.o
>>
>>  all: sandbox seunshare sandboxX.sh start
>> +       (cd po && $(MAKE) $@)
>>
>>  seunshare: $(SEUNSHARE_OBJS)
>>
>> @@ -39,12 +40,14 @@ install: all
>>         install -m 755 start $(DESTDIR)$(SHAREDIR)
>>         -mkdir -p $(DESTDIR)$(SYSCONFDIR)
>>         install -m 644 sandbox.conf $(DESTDIR)$(SYSCONFDIR)/sandbox
>> +       (cd po && $(MAKE) $@)
>>
>>  test:
>>         @$(PYTHON) test_sandbox.py -v
>>
>>  clean:
>>         -rm -f seunshare *.o *~
>> +       (cd po && $(MAKE) $@)
>>
>>  indent:
>>         ../../scripts/Lindent $(wildcard *.[ch])
>> diff --git a/sandbox/po/Makefile b/sandbox/po/Makefile
>> new file mode 100644
>> index 000000000000..e75343649b67
>> --- /dev/null
>> +++ b/sandbox/po/Makefile
>> @@ -0,0 +1,84 @@
>> +#
>> +# Makefile for the PO files (translation) catalog
>> +#
>> +
>> +PREFIX ?= /usr
>> +
>> +# What is this package?
>> +NLSPACKAGE     = sandbox
>> +POTFILE                = $(NLSPACKAGE).pot
>> +INSTALL                = /usr/bin/install -c -p
>> +INSTALL_DATA   = $(INSTALL) -m 644
>> +INSTALL_DIR    = /usr/bin/install -d
>> +
>> +# destination directory
>> +INSTALL_NLS_DIR = $(PREFIX)/share/locale
>> +
>> +# PO catalog handling
>> +MSGMERGE       = msgmerge
>> +MSGMERGE_FLAGS = -q
>> +XGETTEXT       = xgettext -L Python --default-domain=$(NLSPACKAGE)
>> +MSGFMT         = msgfmt
>> +
>> +# All possible linguas
>> +PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
>> +
>> +# Only the files matching what the user has set in LINGUAS
>> +USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
>> +
>> +# if no valid LINGUAS, build all languages
>> +USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
>> +
>> +POFILES                = $(patsubst %,%.po,$(USE_LINGUAS))
>> +MOFILES                = $(patsubst %.po,%.mo,$(POFILES))
>> +POTFILES  = $(shell cat POTFILES)
>> +
>> +#default:: clean
>> +
>> +all:: $(POTFILE) $(MOFILES)
>> +
>> +$(POTFILE): $(POTFILES)
>> +       $(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
>> +       @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
>> +           rm -f $(NLSPACKAGE).po; \
>> +       else \
>> +           mv -f $(NLSPACKAGE).po $(POTFILE); \
>> +       fi; \
>> +
>> +
>> +refresh-po: Makefile
>> +       for cat in $(POFILES); do \
>> +               lang=`basename $$cat .po`; \
>> +               if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
>> +                       mv -f $$lang.pot $$lang.po ; \
>> +                       echo "$(MSGMERGE) of $$lang succeeded" ; \
>> +               else \
>> +                       echo "$(MSGMERGE) of $$lang failed" ; \
>> +                       rm -f $$lang.pot ; \
>> +               fi \
>> +       done
>> +
>> +clean:
>> +       @rm -fv *mo *~ .depend
>> +       @rm -rf tmp
>> +
>> +install: $(MOFILES)
>> +       @for n in $(MOFILES); do \
>> +           l=`basename $$n .mo`; \
>> +           $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
>> +           $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
>> +       done
>> +
>> +%.mo: %.po
>> +       $(MSGFMT) -o $@ $<
>> +report:
>> +       @for cat in $(wildcard *.po); do \
>> +                echo -n "$$cat: "; \
>> +                msgfmt -v --statistics -o /dev/null $$cat; \
>> +        done
>> +
>> +.PHONY: missing depend
>> +
>> +relabel:
>> +
>> +test:
>> diff --git a/sandbox/po/POTFILES b/sandbox/po/POTFILES
>> new file mode 100644
>> index 000000000000..deff3f2f4656
>> --- /dev/null
>> +++ b/sandbox/po/POTFILES
>> @@ -0,0 +1 @@
>> +../sandbox
>> diff --git a/sandbox/sandbox b/sandbox/sandbox
>> index ca5f1e030a51..16c43b51eaaa 100644
>> --- a/sandbox/sandbox
>> +++ b/sandbox/sandbox
>> @@ -37,7 +37,7 @@ import sepolicy
>>
>>  SEUNSHARE = "/usr/sbin/seunshare"
>>  SANDBOXSH = "/usr/share/sandbox/sandboxX.sh"
>> -PROGNAME = "policycoreutils"
>> +PROGNAME = "selinux-sandbox"
>>  try:
>>      import gettext
>>      kwargs = {}
>> --
>> 2.35.1
>>
diff mbox series

Patch

diff --git a/gui/Makefile b/gui/Makefile
index ca965c942912..4035fb21b8c9 100644
--- a/gui/Makefile
+++ b/gui/Makefile
@@ -22,6 +22,7 @@  system-config-selinux.ui \
 usersPage.py
 
 all: $(TARGETS) system-config-selinux.py polgengui.py
+	(cd po && $(MAKE) $@)
 
 install: all
 	-mkdir -p $(DESTDIR)$(MANDIR)/man8
@@ -54,7 +55,10 @@  install: all
 		install -m 644 sepolicy_$${i}.png $(DESTDIR)$(DATADIR)/icons/hicolor/$${i}x$${i}/apps/sepolicy.png; \
 	done
 	install -m 644 org.selinux.config.policy $(DESTDIR)$(DATADIR)/polkit-1/actions/
+	(cd po && $(MAKE) $@)
+
 clean:
+	(cd po && $(MAKE) $@)
 
 indent:
 
diff --git a/gui/booleansPage.py b/gui/booleansPage.py
index 7849bea26a06..dd12b6d6ab86 100644
--- a/gui/booleansPage.py
+++ b/gui/booleansPage.py
@@ -38,7 +38,7 @@  DISABLED = 2
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/domainsPage.py b/gui/domainsPage.py
index bad5140d8c59..6bbe4de5884f 100644
--- a/gui/domainsPage.py
+++ b/gui/domainsPage.py
@@ -30,7 +30,7 @@  from semanagePage import *
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/fcontextPage.py b/gui/fcontextPage.py
index d26aa1b405a9..52292cae01d2 100644
--- a/gui/fcontextPage.py
+++ b/gui/fcontextPage.py
@@ -47,7 +47,7 @@  class context:
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/loginsPage.py b/gui/loginsPage.py
index b67eb8bc42af..cbfb0cc23f65 100644
--- a/gui/loginsPage.py
+++ b/gui/loginsPage.py
@@ -29,7 +29,7 @@  from semanagePage import *
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/modulesPage.py b/gui/modulesPage.py
index 0584acf9b3a4..35a0129bab9c 100644
--- a/gui/modulesPage.py
+++ b/gui/modulesPage.py
@@ -30,7 +30,7 @@  from semanagePage import *
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/po/Makefile b/gui/po/Makefile
new file mode 100644
index 000000000000..7ccd48eb2422
--- /dev/null
+++ b/gui/po/Makefile
@@ -0,0 +1,84 @@ 
+#
+# Makefile for the PO files (translation) catalog
+#
+
+PREFIX ?= /usr
+
+# What is this package?
+NLSPACKAGE	= gui
+POTFILE		= $(NLSPACKAGE).pot
+INSTALL		= /usr/bin/install -c -p
+INSTALL_DATA	= $(INSTALL) -m 644
+INSTALL_DIR	= /usr/bin/install -d
+
+# destination directory
+INSTALL_NLS_DIR = $(PREFIX)/share/locale
+
+# PO catalog handling
+MSGMERGE	= msgmerge
+MSGMERGE_FLAGS	= -q
+XGETTEXT	= xgettext --default-domain=$(NLSPACKAGE)
+MSGFMT		= msgfmt
+
+# All possible linguas
+PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
+
+# Only the files matching what the user has set in LINGUAS
+USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
+
+# if no valid LINGUAS, build all languages
+USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
+
+POFILES		= $(patsubst %,%.po,$(USE_LINGUAS))
+MOFILES		= $(patsubst %.po,%.mo,$(POFILES))
+POTFILES  = $(shell cat POTFILES)
+
+#default:: clean
+
+all::  $(MOFILES)
+
+$(POTFILE): $(POTFILES)
+	$(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
+	@if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
+	    rm -f $(NLSPACKAGE).po; \
+	else \
+	    mv -f $(NLSPACKAGE).po $(POTFILE); \
+	fi; \
+
+
+refresh-po: Makefile
+	for cat in $(POFILES); do \
+		lang=`basename $$cat .po`; \
+		if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
+			mv -f $$lang.pot $$lang.po ; \
+			echo "$(MSGMERGE) of $$lang succeeded" ; \
+		else \
+			echo "$(MSGMERGE) of $$lang failed" ; \
+			rm -f $$lang.pot ; \
+		fi \
+	done
+
+clean:
+	@rm -fv *mo *~ .depend
+	@rm -rf tmp
+
+install: $(MOFILES)
+	@for n in $(MOFILES); do \
+	    l=`basename $$n .mo`; \
+	    $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
+	    $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
+	done
+
+%.mo: %.po
+	$(MSGFMT) -o $@ $<
+report:
+	@for cat in $(wildcard *.po); do \
+                echo -n "$$cat: "; \
+                msgfmt -v --statistics -o /dev/null $$cat; \
+        done
+
+.PHONY: missing depend
+
+relabel:
+
+test:
diff --git a/gui/po/POTFILES b/gui/po/POTFILES
new file mode 100644
index 000000000000..1795c5c1951b
--- /dev/null
+++ b/gui/po/POTFILES
@@ -0,0 +1,17 @@ 
+../booleansPage.py
+../domainsPage.py
+../fcontextPage.py
+../loginsPage.py
+../modulesPage.py
+../org.selinux.config.policy
+../polgengui.py
+../polgen.ui
+../portsPage.py
+../selinux-polgengui.desktop
+../semanagePage.py
+../sepolicy.desktop
+../statusPage.py
+../system-config-selinux.desktop
+../system-config-selinux.py
+../system-config-selinux.ui
+../usersPage.py
diff --git a/gui/polgengui.py b/gui/polgengui.py
index d284ded65279..01f541bafae8 100644
--- a/gui/polgengui.py
+++ b/gui/polgengui.py
@@ -63,7 +63,7 @@  def get_all_modules():
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/portsPage.py b/gui/portsPage.py
index 30f58383bc1d..a537ecc8c0a1 100644
--- a/gui/portsPage.py
+++ b/gui/portsPage.py
@@ -35,7 +35,7 @@  from semanagePage import *
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/semanagePage.py b/gui/semanagePage.py
index 4127804fbbee..5361d69c1313 100644
--- a/gui/semanagePage.py
+++ b/gui/semanagePage.py
@@ -22,7 +22,7 @@  from gi.repository import Gdk, Gtk
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/statusPage.py b/gui/statusPage.py
index 766854b19cba..a8f079b9b163 100644
--- a/gui/statusPage.py
+++ b/gui/statusPage.py
@@ -35,7 +35,7 @@  RELABELFILE = "/.autorelabel"
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/system-config-selinux.py b/gui/system-config-selinux.py
index 3f70122b87e8..8c46c987b974 100644
--- a/gui/system-config-selinux.py
+++ b/gui/system-config-selinux.py
@@ -45,7 +45,7 @@  import selinux
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/gui/usersPage.py b/gui/usersPage.py
index 26794ed5c3f3..d15d4c5a71dd 100644
--- a/gui/usersPage.py
+++ b/gui/usersPage.py
@@ -29,7 +29,7 @@  from semanagePage import *
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-gui"
 try:
     import gettext
     kwargs = {}
diff --git a/policycoreutils/po/Makefile b/policycoreutils/po/Makefile
index 575e143122e6..5ff92bff6fdc 100644
--- a/policycoreutils/po/Makefile
+++ b/policycoreutils/po/Makefile
@@ -3,7 +3,6 @@ 
 #
 
 PREFIX ?= /usr
-TOP	 = ../..
 
 # What is this package?
 NLSPACKAGE	= policycoreutils
@@ -32,74 +31,13 @@  USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
 
 POFILES		= $(patsubst %,%.po,$(USE_LINGUAS))
 MOFILES		= $(patsubst %.po,%.mo,$(POFILES))
-POTFILES = \
-	../run_init/open_init_pty.c \
-	../run_init/run_init.c \
-	../semodule_link/semodule_link.c \
-	../audit2allow/audit2allow \
-	../semanage/seobject.py \
-	../setsebool/setsebool.c \
-	../newrole/newrole.c \
-	../load_policy/load_policy.c \
-	../sestatus/sestatus.c \
-	../semodule/semodule.c \
-	../setfiles/setfiles.c \
-	../semodule_package/semodule_package.c \
-	../semodule_deps/semodule_deps.c \
-	../semodule_expand/semodule_expand.c \
-	../scripts/chcat \
-	../scripts/fixfiles \
-	../restorecond/stringslist.c \
-	../restorecond/restorecond.h \
-	../restorecond/utmpwatcher.h \
-	../restorecond/stringslist.h \
-	../restorecond/restorecond.c \
-	../restorecond/utmpwatcher.c \
-	../gui/booleansPage.py \
-	../gui/fcontextPage.py \
-	../gui/loginsPage.py \
-	../gui/mappingsPage.py \
-	../gui/modulesPage.py \
-	../gui/polgen.glade \
-	../gui/polgengui.py \
-	../gui/portsPage.py \
-	../gui/semanagePage.py \
-	../gui/statusPage.py \
-	../gui/system-config-selinux.glade \
-	../gui/system-config-selinux.py \
-	../gui/usersPage.py \
-	../secon/secon.c \
-	booleans.py \
-	../sepolicy/sepolicy.py \
-	../sepolicy/sepolicy/communicate.py \
-	../sepolicy/sepolicy/__init__.py \
-	../sepolicy/sepolicy/network.py \
-	../sepolicy/sepolicy/generate.py \
-	../sepolicy/sepolicy/sepolicy.glade \
-	../sepolicy/sepolicy/gui.py \
-	../sepolicy/sepolicy/manpage.py \
-	../sepolicy/sepolicy/transition.py \
-	../sepolicy/sepolicy/templates/executable.py \
-	../sepolicy/sepolicy/templates/__init__.py \
-	../sepolicy/sepolicy/templates/network.py \
-	../sepolicy/sepolicy/templates/rw.py \
-	../sepolicy/sepolicy/templates/script.py \
-	../sepolicy/sepolicy/templates/semodule.py \
-	../sepolicy/sepolicy/templates/tmp.py \
-	../sepolicy/sepolicy/templates/user.py \
-	../sepolicy/sepolicy/templates/var_lib.py \
-	../sepolicy/sepolicy/templates/var_log.py \
-	../sepolicy/sepolicy/templates/var_run.py \
-	../sepolicy/sepolicy/templates/var_spool.py
+POTFILES  = $(shell cat POTFILES)
 
 #default:: clean
 
-all::  $(MOFILES)
+all:: $(POTFILE) $(MOFILES)
 
-booleans.py:
-	sepolicy booleans -a > booleans.py
-
-$(POTFILE): $(POTFILES) booleans.py
+$(POTFILE): $(POTFILES)
 	$(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
 	@if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
 	    rm -f $(NLSPACKAGE).po; \
@@ -107,8 +45,6 @@  $(POTFILE): $(POTFILES) booleans.py
 	    mv -f $(NLSPACKAGE).po $(POTFILE); \
 	fi; \
 
-update-po: Makefile $(POTFILE) refresh-po
-	@rm -f booleans.py
 
 refresh-po: Makefile
 	for cat in $(POFILES); do \
@@ -144,3 +80,5 @@  report:
 .PHONY: missing depend
 
 relabel:
+
+test:
diff --git a/policycoreutils/po/POTFILES b/policycoreutils/po/POTFILES
new file mode 100644
index 000000000000..12237dc61ee4
--- /dev/null
+++ b/policycoreutils/po/POTFILES
@@ -0,0 +1,9 @@ 
+../run_init/open_init_pty.c
+../run_init/run_init.c
+../setsebool/setsebool.c
+../newrole/newrole.c
+../load_policy/load_policy.c
+../sestatus/sestatus.c
+../semodule/semodule.c
+../setfiles/setfiles.c
+../secon/secon.c
diff --git a/python/Makefile b/python/Makefile
index 9b66d52fbd4d..00312dbdb5c6 100644
--- a/python/Makefile
+++ b/python/Makefile
@@ -1,4 +1,4 @@ 
-SUBDIRS = sepolicy audit2allow semanage sepolgen chcat
+SUBDIRS = sepolicy audit2allow semanage sepolgen chcat po
 
 all install relabel clean indent test:
 	@for subdir in $(SUBDIRS); do \
diff --git a/python/chcat/chcat b/python/chcat/chcat
index fdd2e46ee3f9..839ddd3b54b6 100755
--- a/python/chcat/chcat
+++ b/python/chcat/chcat
@@ -30,7 +30,7 @@  import getopt
 import selinux
 import seobject
 
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/python/po/Makefile b/python/po/Makefile
new file mode 100644
index 000000000000..05e49f0cc274
--- /dev/null
+++ b/python/po/Makefile
@@ -0,0 +1,85 @@ 
+#
+# Makefile for the PO files (translation) catalog
+#
+
+PREFIX ?= /usr
+
+# What is this package?
+NLSPACKAGE	= python
+POTFILE		= $(NLSPACKAGE).pot
+INSTALL		= /usr/bin/install -c -p
+INSTALL_DATA	= $(INSTALL) -m 644
+INSTALL_DIR	= /usr/bin/install -d
+
+# destination directory
+INSTALL_NLS_DIR = $(PREFIX)/share/locale
+
+# PO catalog handling
+MSGMERGE	= msgmerge
+MSGMERGE_FLAGS	= -q
+XGETTEXT	= xgettext --default-domain=$(NLSPACKAGE)
+MSGFMT		= msgfmt
+
+# All possible linguas
+PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
+
+# Only the files matching what the user has set in LINGUAS
+USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
+
+# if no valid LINGUAS, build all languages
+USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
+
+POFILES		= $(patsubst %,%.po,$(USE_LINGUAS))
+MOFILES		= $(patsubst %.po,%.mo,$(POFILES))
+POTFILES  = $(shell cat POTFILES)
+
+#default:: clean
+
+all::  $(MOFILES)
+
+$(POTFILE): $(POTFILES) 
+	$(XGETTEXT) -L Python --keyword=_ --keyword=N_ $(POTFILES)
+	$(XGETTEXT) -j --keyword=_ --keyword=N_ ../sepolicy/sepolicy/sepolicy.glade
+	@if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
+	    rm -f $(NLSPACKAGE).po; \
+	else \
+	    mv -f $(NLSPACKAGE).po $(POTFILE); \
+	fi; \
+
+
+refresh-po: Makefile
+	for cat in $(POFILES); do \
+		lang=`basename $$cat .po`; \
+		if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
+			mv -f $$lang.pot $$lang.po ; \
+			echo "$(MSGMERGE) of $$lang succeeded" ; \
+		else \
+			echo "$(MSGMERGE) of $$lang failed" ; \
+			rm -f $$lang.pot ; \
+		fi \
+	done
+
+clean:
+	@rm -fv *mo *~ .depend
+	@rm -rf tmp
+
+install: $(MOFILES)
+	@for n in $(MOFILES); do \
+	    l=`basename $$n .mo`; \
+	    $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
+	    $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
+	done
+
+%.mo: %.po
+	$(MSGFMT) -o $@ $<
+report:
+	@for cat in $(wildcard *.po); do \
+                echo -n "$$cat: "; \
+                msgfmt -v --statistics -o /dev/null $$cat; \
+        done
+
+.PHONY: missing depend
+
+relabel:
+
+test:
diff --git a/python/po/POTFILES b/python/po/POTFILES
new file mode 100644
index 000000000000..128eb870a69e
--- /dev/null
+++ b/python/po/POTFILES
@@ -0,0 +1,10 @@ 
+../audit2allow/audit2allow
+../chcat/chcat
+../semanage/semanage
+../semanage/seobject.py
+../sepolgen/src/sepolgen/interfaces.py
+../sepolicy/sepolicy/generate.py
+../sepolicy/sepolicy/gui.py
+../sepolicy/sepolicy/__init__.py
+../sepolicy/sepolicy/interface.py
+../sepolicy/sepolicy.py
diff --git a/python/semanage/semanage b/python/semanage/semanage
index ff9fb66b1411..12bb159ef649 100644
--- a/python/semanage/semanage
+++ b/python/semanage/semanage
@@ -30,7 +30,7 @@  import seobject
 import sys
 import traceback
 
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/python/semanage/seobject.py b/python/semanage/seobject.py
index 21adbf6eb74f..69e60db80060 100644
--- a/python/semanage/seobject.py
+++ b/python/semanage/seobject.py
@@ -29,7 +29,7 @@  import sys
 import stat
 import socket
 from semanage import *
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 import sepolicy
 from setools.policyrep import SELinuxPolicy
 from setools.typequery import TypeQuery
diff --git a/python/sepolgen/src/sepolgen/sepolgeni18n.py b/python/sepolgen/src/sepolgen/sepolgeni18n.py
index 998c4356415c..56ebd807c69c 100644
--- a/python/sepolgen/src/sepolgen/sepolgeni18n.py
+++ b/python/sepolgen/src/sepolgen/sepolgeni18n.py
@@ -19,7 +19,7 @@ 
 
 try: 
     import gettext
-    t = gettext.translation( 'yumex' )
+    t = gettext.translation( 'selinux-python' )
     _ = t.gettext
 except:
     def _(str):
diff --git a/python/sepolicy/sepolicy.py b/python/sepolicy/sepolicy.py
index 7b2230651099..32956e58f52e 100755
--- a/python/sepolicy/sepolicy.py
+++ b/python/sepolicy/sepolicy.py
@@ -28,7 +28,7 @@  import sepolicy
 from multiprocessing import Pool
 from sepolicy import get_os_version, get_conditionals, get_conditionals_format_text
 import argparse
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/python/sepolicy/sepolicy/__init__.py b/python/sepolicy/sepolicy/__init__.py
index e8654abbceb3..203ca25f4210 100644
--- a/python/sepolicy/sepolicy/__init__.py
+++ b/python/sepolicy/sepolicy/__init__.py
@@ -23,7 +23,7 @@  from setools.typeattrquery import TypeAttributeQuery
 from setools.typequery import TypeQuery
 from setools.userquery import UserQuery
 
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/python/sepolicy/sepolicy/generate.py b/python/sepolicy/sepolicy/generate.py
index 4e1ed4e9dc31..43180ca6fda4 100644
--- a/python/sepolicy/sepolicy/generate.py
+++ b/python/sepolicy/sepolicy/generate.py
@@ -48,7 +48,7 @@  import sepolgen.defaults as defaults
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/python/sepolicy/sepolicy/gui.py b/python/sepolicy/sepolicy/gui.py
index 1e86422b864a..c9ca158ddd09 100644
--- a/python/sepolicy/sepolicy/gui.py
+++ b/python/sepolicy/sepolicy/gui.py
@@ -41,7 +41,7 @@  import os
 import re
 import unicodedata
 
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/python/sepolicy/sepolicy/interface.py b/python/sepolicy/sepolicy/interface.py
index bdffb770f364..9d40aea1498d 100644
--- a/python/sepolicy/sepolicy/interface.py
+++ b/python/sepolicy/sepolicy/interface.py
@@ -30,7 +30,7 @@  __all__ = ['get_all_interfaces', 'get_interfaces_from_xml', 'get_admin', 'get_us
 ##
 ## I18N
 ##
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-python"
 try:
     import gettext
     kwargs = {}
diff --git a/sandbox/Makefile b/sandbox/Makefile
index 9da5e58db9e6..84cb5a39bf7e 100644
--- a/sandbox/Makefile
+++ b/sandbox/Makefile
@@ -13,6 +13,7 @@  override LDLIBS += -lselinux -lcap-ng
 SEUNSHARE_OBJS = seunshare.o
 
 all: sandbox seunshare sandboxX.sh start
+	(cd po && $(MAKE) $@)
 
 seunshare: $(SEUNSHARE_OBJS)
 
@@ -39,12 +40,14 @@  install: all
 	install -m 755 start $(DESTDIR)$(SHAREDIR)
 	-mkdir -p $(DESTDIR)$(SYSCONFDIR)
 	install -m 644 sandbox.conf $(DESTDIR)$(SYSCONFDIR)/sandbox
+	(cd po && $(MAKE) $@)
 
 test:
 	@$(PYTHON) test_sandbox.py -v
 
 clean:
 	-rm -f seunshare *.o *~
+	(cd po && $(MAKE) $@)
 
 indent:
 	../../scripts/Lindent $(wildcard *.[ch])
diff --git a/sandbox/po/Makefile b/sandbox/po/Makefile
new file mode 100644
index 000000000000..e75343649b67
--- /dev/null
+++ b/sandbox/po/Makefile
@@ -0,0 +1,84 @@ 
+#
+# Makefile for the PO files (translation) catalog
+#
+
+PREFIX ?= /usr
+
+# What is this package?
+NLSPACKAGE	= sandbox
+POTFILE		= $(NLSPACKAGE).pot
+INSTALL		= /usr/bin/install -c -p
+INSTALL_DATA	= $(INSTALL) -m 644
+INSTALL_DIR	= /usr/bin/install -d
+
+# destination directory
+INSTALL_NLS_DIR = $(PREFIX)/share/locale
+
+# PO catalog handling
+MSGMERGE	= msgmerge
+MSGMERGE_FLAGS	= -q
+XGETTEXT	= xgettext -L Python --default-domain=$(NLSPACKAGE)
+MSGFMT		= msgfmt
+
+# All possible linguas
+PO_LINGUAS := $(sort $(patsubst %.po,%,$(wildcard *.po)))
+
+# Only the files matching what the user has set in LINGUAS
+USER_LINGUAS := $(filter $(patsubst %,%%,$(LINGUAS)),$(PO_LINGUAS))
+
+# if no valid LINGUAS, build all languages
+USE_LINGUAS := $(if $(USER_LINGUAS),$(USER_LINGUAS),$(PO_LINGUAS))
+
+POFILES		= $(patsubst %,%.po,$(USE_LINGUAS))
+MOFILES		= $(patsubst %.po,%.mo,$(POFILES))
+POTFILES  = $(shell cat POTFILES)
+
+#default:: clean
+
+all:: $(POTFILE) $(MOFILES)
+
+$(POTFILE): $(POTFILES)
+	$(XGETTEXT) --keyword=_ --keyword=N_ $(POTFILES)
+	@if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
+	    rm -f $(NLSPACKAGE).po; \
+	else \
+	    mv -f $(NLSPACKAGE).po $(POTFILE); \
+	fi; \
+
+
+refresh-po: Makefile
+	for cat in $(POFILES); do \
+		lang=`basename $$cat .po`; \
+		if $(MSGMERGE) $(MSGMERGE_FLAGS) $$lang.po $(POTFILE) > $$lang.pot ; then \
+			mv -f $$lang.pot $$lang.po ; \
+			echo "$(MSGMERGE) of $$lang succeeded" ; \
+		else \
+			echo "$(MSGMERGE) of $$lang failed" ; \
+			rm -f $$lang.pot ; \
+		fi \
+	done
+
+clean:
+	@rm -fv *mo *~ .depend
+	@rm -rf tmp
+
+install: $(MOFILES)
+	@for n in $(MOFILES); do \
+	    l=`basename $$n .mo`; \
+	    $(INSTALL_DIR) $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
+	    $(INSTALL_DATA) --verbose $$n $(DESTDIR)$(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/selinux-$(NLSPACKAGE).mo; \
+	done
+
+%.mo: %.po
+	$(MSGFMT) -o $@ $<
+report:
+	@for cat in $(wildcard *.po); do \
+                echo -n "$$cat: "; \
+                msgfmt -v --statistics -o /dev/null $$cat; \
+        done
+
+.PHONY: missing depend
+
+relabel:
+
+test:
diff --git a/sandbox/po/POTFILES b/sandbox/po/POTFILES
new file mode 100644
index 000000000000..deff3f2f4656
--- /dev/null
+++ b/sandbox/po/POTFILES
@@ -0,0 +1 @@ 
+../sandbox
diff --git a/sandbox/sandbox b/sandbox/sandbox
index ca5f1e030a51..16c43b51eaaa 100644
--- a/sandbox/sandbox
+++ b/sandbox/sandbox
@@ -37,7 +37,7 @@  import sepolicy
 
 SEUNSHARE = "/usr/sbin/seunshare"
 SANDBOXSH = "/usr/share/sandbox/sandboxX.sh"
-PROGNAME = "policycoreutils"
+PROGNAME = "selinux-sandbox"
 try:
     import gettext
     kwargs = {}