Bash Site about Linux


Вернуться к оглавлению

12.07.2013

Меняем названия стандартных значков на рабочем столе XFCE



0. Introduction

Известная проблема переименования стандартных ярлыков на рабочем столе XFCE. Немного погуглив и посетив первые примерно 7 ссылок, нашёл лишь один способ: это скрыть значки "Файловая система", "Домашний каталог" и "Корзина", а вместо них создать свои значки запуска. Неудовлетворённый результатами поиска, пошёл другим путём.

Данный способ не так сложен как может показаться на первый взгяд. Поняв его суть можно впоследствии русифицировать многие программы.

Метод испытан на Debian, но вы без труда сможете спроецировать его на другую систему, изменив команды управления пакетами.

И так, поехали... :


1. Где находится?

При помощи нескольких "магических заклинаний", типа

grep -rIla "Файловая" /usr/share/locale/ru/LC_MESSAGES/ 
и им подобных, а так же при небольшом анализе полученных результатов, обнаруживаю, что за названия стандартных значков на рабочем столе отвечают двоичные файлы, лежащие в каталоге /usr/share/locale/ru/LC_MESSAGES/:
  • xfdesktop.mo - "Файловая смстема" и "Домашний каталог"
  • gvfs.mo - "Корзина"


2. Кому пренадлежит?

Что бы узнать каким пакетам пренадлежат данные файлы выполним команды:

dpkg -S /usr/share/locale/ru/LC_MESSAGES/xfdesktop.mo
dpkg -S /usr/share/locale/ru/LC_MESSAGES/gvfs.mo
И узнаём, что данные файлы пренадлежат пакетам xfdesktop4-data и gvfs-common

3. Готовим "рабочее место" и "инструменты"

Логинимся под root:
su
Password:
Дальше все действия выполняем под root.

Создаём в каталоге /tmp каталог /icontxt
mkdir -p /tmp/icontxt
и переходим в него:
cd /tmp/icontxt
Устанавливаем программу msgfmt. Она нужна нам, что бы компилировать файлы локализации *.mo из *.po
apt-get install msgfmt

Для сокращения кода зададим сеансовую переменную DIR_MO в которую подставим директорию расположения файлов локализации /usr/share/locale/ru/LC_MESSAGES
DIR_MO=/usr/share/locale/ru/LC_MESSAGES

а также делаем бекап файлов, которые будем заменять (в название файла добавляем "backup" и дату):
cp "$DIR_MO/xfdesktop.mo" "$DIR_MO/xfdesktop.mo.backup-`date +%d-%m-%Y`"
cp "$DIR_MO/gvfs.mo" "$DIR_MO/gvfs.mo.backup-`date +%d-%m-%Y`"


4. Скачиваем исходные коды пакетов

apt-get source xfdesktop4-data gvfs-common --download-only
После выполнения этой команды в нашем рабочем каталоге /tmp/icontxt появятся 6 файлов:
gvfs_1.16.3-1.debian.tar.gz  xfdesktop4_4.10.2-3.debian.tar.gz
gvfs_1.16.3-1.dsc	     xfdesktop4_4.10.2-3.dsc
gvfs_1.16.3.orig.tar.xz      xfdesktop4_4.10.2.orig.tar.bz2
из которых нам нужны только xfdesktop4_4.10.2.orig.tar.bz2 и gvfs_1.12.3.orig.tar.xz.

Ненужные файлы сразу удаляем:
for i in $(ls -I '*orig.tar.*'); do rm -f $i; done
Из оставшихся архивов нам нужны только файлы ru.po, извлекаем только их, одновременно переименовывая:
tar -xjf ./xfdesktop* --no-anchored 'ru.po' -O > xfdesktop.po
tar -xJf ./gvfs* --no-anchored 'ru.po' -O > gvfs.po
Обратите внимание на расширения файлов архивов:
для расширений *.tar.bz2 используем опции разархивирования -xjf, а для *.tar.xz - -xJf.
Если у вас другая система и другие расширения, то разархивировать придётся с другими опциями.
В результате этих действий в нашем рабочем каталоге появятся два файла xfdesktop.po и gvfs.po.

5a. Возможные расхождения версий (небольшое лирическое отступление)

В свежеустановленных и стабильных системах такого быть конечно же не должно.
Но бывает так, что версии скаченных source пакетов не совпадают с версиями пакетов установленных в системе. Такое может произойти например в Debian или Ubuntu.
Так, проверяя на практике данный метод, я обнаружил, что версия скаченного архива gvfs_1.16.3-1.orig.tar.xz не совпадает с версией установленного:
]$ dpkg -s gvfs-common | grep Version
Version: 1.12.3-4

Это происходит потому, что в Debian и в Ubuntu команда apt-get upgrade обновляет не все пакеты, и, после сообщения "The following packages have been kept back" (или "Пакеты, которые будут оставлены в неизменном виде") выводит список необновляемых (заблокированнеых от обновления) пакетов. В этом списке присутствовал и пакет gvfs-common
Я справился с этой проблемой выполнив:
aptitude update
aptitude safe-upgrade
Конечно в этом случае можно выполнить
apt-get dist-upgrade
но он тянет за собой gnome3, а раз вы читаете эту статью, то третий гном вам (как и мне) вероятнее всего не нужен.
После обновления системы команда
dpkg -s gvfs-common | grep Version
выдала версию пакета gvfs-common 1.16.3-1, что и соответствует скаченному.

5b. Доверяй но проверяй!

С версиями разобрались, исходники скачали, теперь проверим совпадение наверняка. Скомпилируем извлечённые из архивов файлы xfdesktop.po и gvfs.po на стандартный вывод, вычислим их контрольные суммы md5 и сравним их с контрольными суммами установленных в системе файлов.

Выполним последовательно команды (напомню, что сеансовая переменная $DIR_MO задана):
msgfmt ./xfdesktop.po -o - | md5sum | awk '{print $1}'
md5sum $DIR_MO/xfdesktop.mo
msgfmt ./gvfs.po -o - | md5sum | awk '{print $1}'
md5sum $DIR_MO/gvfs.mo
Вот как это выглядит в консоли (MD5 установленных файлов и скомпилированных нами должны совпадать, я подсветил их одним цветом):
# msgfmt ./xfdesktop.po -o - | md5sum | awk '{print $1}'
84aba241ceda9d0e516156d5b8b969bc
# md5sum $DIR_MO/xfdesktop.mo
84aba241ceda9d0e516156d5b8b969bc /usr/share/locale/ru/LC_MESSAGES/xfdesktop.mo
# msgfmt ./gvfs.po -o - | md5sum | awk '{print $1}'
6dfb26fb2df5b4d6c01cf4ddf52d4766
# md5sum $DIR_MO/gvfs.mo
6dfb26fb2df5b4d6c01cf4ddf52d4766 /usr/share/locale/ru/LC_MESSAGES/gvfs.mo
Если суммы совпадают, то продолжаем, если нет, то внимательно разбираемся что не так.

6. Редактируем файлы xfdesktop.po и gvfs.po

Для редактирования будем использовать nano:

nano ./xfdesktop.po
открывается файл для редактирования.
Ищем нужное нам словосочетание.
Для этого:
- нажимаем сочетание клавиш Ctrl+W (^W),
- вбиваем в строку поиска msgid "File System"
- и жмём Enter.
Строкой ниже исправляем "Файловая система" на желаемое (я исправил на "asus1005pxd" в честь своего нетбука)
.....	
#: ../src/xfdesktop-special-file-icon.c:273
#: ../src/xfdesktop-special-file-icon.c:432
msgid "File System"
msgstr "Файловая система"
....
Опять жмём ^W,
но теперь в строку поиска вводим: msgid "Home"
и жмём Enter.
Строкой ниже исправляем "Домашний каталог" на желаемое (я исправил на "home")
.....	
#: ../settings/main.c:299 ../src/xfdesktop-special-file-icon.c:271
#: ../src/xfdesktop-special-file-icon.c:434
msgid "Home"
msgstr "Домашний каталог"

....
Нажимаем сочетание клавиш Ctrl+O (^O) - сохранить,
затем Ctrl+X (^X) - выйти.

По аналогии правим файл gvfs.po:
nano gvfs.po
- жмём поиск ^W,
- ищем msgid "Trash",
- строкой ниже исправляем "Корзина" на "Trash".
.....
#. Translators: this is the display name of the backend
#. translators: This is the name of the backend
#: ../daemon/gvfsbackendtrash.c:755 ../daemon/gvfsbackendtrash.c:867
msgid "Trash"
msgstr "Корзина"
.....

^O - сохраняем,
^X - выходим из редактора.


7. Компилируем

Компилируем отредактированные файлы *.po в *.mo из рабочего каталога в каталог назначения
msgfmt -v ./xfdesktop.po -o $DIR_MO/xfdesktop.mo
msgfmt -v ./gvfs.po -o $DIR_MO/gvfs.mo


8. Перезагрузка

Обычно, после замены файлов, подписи под значками меняются сразу, если этого не произошла, то нужно обновить рабочий стол нажав F5.

Но иногда после замены файлов не совсем корректно отображаются подписи под некоторыми значками. Поэтому следует выйти из под пользователя и снова зайти.

xfce desktop


9. Как бы в принципе и всё, но...

Понятно, что этот метод имеет небольшой недостаток, и, при обновлении пакетов, мы вернёмся к исходным названиям.

Поэтому автоматизируем данный процесс



10. Создаём скрипт

#!/bin/bash

# Проверяем наличие прав root
if [[ $EUID -ne 0 ]]; then
echo "Для выполнения скрипта необходимы права root" 1>&2
   exit 1
fi

# проверяем наличие директории /tmp/icontxt
if [ -e /tmp/icontxt ] 
then
rm -r /tmp/icontxt/* # если она существует, то очищаю её
else
mkdir /tmp/icontxt  # если не существует, то создаю
fi

# Переходим в рабочую директорию:
cd /tmp/icontxt

# Задаём переменную DIR_MO /usr/share/locale/ru/LC_MESSAGES
DIR_MO=/usr/share/locale/ru/LC_MESSAGES

# Делаем бекап файлов
cp "$DIR_MO/xfdesktop.mo" "$DIR_MO/xfdesktop.mo.backup-`date +%d-%m-%Y`"
cp "$DIR_MO/gvfs.mo" "$DIR_MO/gvfs.mo.backup-`date +%d-%m-%Y`"

# скачиваем архивы с исходными кодами
apt-get source xfdesktop4-data gvfs-common --download-only

# Удаляем ненужные файлы:
for i in $(ls -I '*orig.tar.*'); do rm -f $i; done

# Извлекаем из архивов нужные файлы:
tar -xjf ./xfdesktop* --no-anchored 'ru.po' -O > xfdesktop.po
tar -xJf ./gvfs* --no-anchored 'ru.po' -O > gvfs.po

# Получить номера редактируемых строк в переменные:
ENUM_FS=$(( `sed -ne '/msgid "File System"/=' ./xfdesktop.po` + 1 ))
ENUM_H=$(( `sed -ne '/msgid "Home"/=' ./xfdesktop.po` + 1 ))
ENUM_T=$(( `sed -ne '/msgid "Trash"/=' ./gvfs.po` + 1 ))

# Редактируем и одновременно компилируем
# со стандартного вывода в каталог назначения:
sed -e ''$ENUM_FS's/Ф.*а/asus1005pxd/; '$ENUM_H's/Д.*г/home/' \
./xfdesktop.po | msgfmt -v - -o $DIR_MO/xfdesktop.mo
sed -e ''$ENUM_T's/К.*а/Trash/' \
./gvfs.po | msgfmt -v - -o $DIR_MO/gvfs.mo

# Очищаю каталог
rm -r /tmp/icontxt/*
echo
echo
echo Операция успешно выполнена.
echo
echo
По окончании выполнения скрипта перезагружаемся.

Вернуться к оглавлению







Яндекс.Метрика
ВебСтолица.РУ: создай свой бесплатный сайт!  | Пожаловаться  
Движок: Amiro CMS