10.2. Сборка пакета с поддержкой переводов
Соберём пакет, в котором будут поддерживаться переводы. При этом возникают некоторые особенности установки.
При установке пакета в систему файлы переводов должны быть установлены в специальную директорию хранения всех переводов приложений системы — /usr/share/locale. Расположение файла с доменом в ней стандартное — /usr/share/locale/<код_локали>/<класс_объекта>/<домен>.mo .
Для сборки напишем небольшой Makefile, в котором макрос PACKAGE зададим сразу, а вот расположение директории с локалями оставим на усмотрение автора пакета. Обычно make игнорирует описание переменных в Makefile, если пользователь переопределил их из командной строки. Для того чтобы дополнить описание в Makefile командной строкой, пометим его ключевым словом override и используем операцию «+=»:
@user:
sheepcounter-pkg/Makefile
RU = ru/LC_MESSAGES
PROGRAM = sheepcounter
override CFLAGS += -Wall -O0 -g -DPACKAGE='"$(PROGRAM)"'
CC = cc
GENS = */*.mo $(PROGRAM) */*.pot
TRASH = *.o *~ */*~ o.*
all: $(RU)/$(PROGRAM).mo $(PROGRAM)
$(PROGRAM): src/$(PROGRAM).c
$(CC) $(CFLAGS) $< -o $@
$(RU)/$(PROGRAM).mo: po/ru.po
mkdir -p `dirname $@`
msgfmt $< -o $@
po/$(PROGRAM).pot: src/$(PROGRAM).c
xgettext -k_ -c $< -o $@
po/ru.po: po/$(PROGRAM).pot
msgmerge -U $@ $<
clean:
rm -f $(TRASH)
distclean: clean
rm -f $(GENS)
Добавим .gear/rules и spec-файл:
@user:
sheepcounter-pkg/.gear/rules
spec: .gear/sheepcounter.spec
tar.gz: . name=@name@-@version@
В файл спецификации добавим определение недостающего макроса LOCALE_PATH таким образом, чтобы перевод находился после установки пакета. Поскольку в Makefile всё для конкатенации уже написано, здесь необходимо просто указать данные для конкатенации в соответствующей переменной:
@user:
sheepcounter-pkg/.gear/sheepcounter.spec
Name: sheepcounter
Version: 0.0
Release: alt1
Summary: Test pkg with i18n
License: GPL-3.0-or-later
Group: Development/Other
Source0: %name-%version.tar.gz
%description
This is a small testing package, builded with i18n
%prep
%setup
%build
make CFLAGS=-DLOCALE_PATH=\'\"%_datadir/locale\"\'
%install
install -D %name %buildroot%_bindir/%name
install -D -m644 ru/LC_MESSAGES/%name.mo %buildroot%_datadir/locale/ru/LC_MESSAGES/%name.mo
%files
%_bindir/%name
%_datadir/locale/*/*/*.mo
%changelog
* Wed Jul 30 2025 UsamG1t <usamg1t@altlinux.org> 0.0-alt1
- Initial build
В spec-файле производится ручная установка исполняемого файла и файла переводов, в директиве %files явно описаны итоговые файлы пакета.
Соберём пакет и попробуем запустить его:
@user
[user@VM sheepcounter-pkg]$ gear-hsh --lazy
<...>
[user@VM sheepcounter-pkg]$ cp ~/hasher/repo/x86_64/RPMS.hasher/sheepcounter-0.0-alt1.x86_64.rpm ~/hasher/chroot/.in
[user@VM sheepcounter-pkg]$ hypersh --rooter
@rooter
[root@localhost .in]# rpm -i sheepcounter-0.0-alt1.x86_64.rpm
<13>Jul 30 05:59:13 rpm: sheepcounter-0.0-alt1 1753854986 installed
[root@localhost .in]# which sheepcounter
/usr/bin/sheepcounter
[root@localhost .in]# locale
LANG=C.UTF-8
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
[root@localhost .in]# sheepcounter
Let's count sheeps together!
How many sheeps do you want to count?
10
Oh, I know only digits, not numbers, try again:
6
We counted 1 sheep
We counted 2 sheeps
We counted 3 sheeps
We counted 4 sheeps
We counted 5 sheeps
We counted 6 sheeps
[root@localhost .in]# LC_MESSAGES=ru_RU.UTF-8 sheepcounter
Давай считать овец вместе!
Сколько овец ты хочешь посчитать?
8
Мы посчитали 1 овцу
Мы посчитали 2 овцы
Мы посчитали 3 овцы
Мы посчитали 4 овцы
Мы посчитали 5 овец
Мы посчитали 6 овец
Мы посчитали 7 овец
Мы посчитали 8 овец
[root@localhost .in]#