Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Как реализовать универсальный, мультиязычный путь на Рабочий стол?  (Прочитано 539 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ase66

  • Автор темы
  • Участник
  • *
  • Сообщений: 177
    • Просмотр профиля
Нужен путь к такой цели "/home/${SUDO_USER:-$USER}/Рабочий стол/"

Чтобы сработал на любом языке ("/home/${SUDO_USER:-$USER}/Desktop/" в русской Ubuntu не работает).

Оффлайн faveoled

  • Участник
  • *
  • Сообщений: 241
    • Просмотр профиля

Оффлайн bezbo

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1828
    • Просмотр профиля
Desktop='Рабочий стол' ; cd "/home/${SUDO_USER:-$USER}/$Desktop/"

Оффлайн ase66

  • Автор темы
  • Участник
  • *
  • Сообщений: 177
    • Просмотр профиля
Нужен именно универсальный путь. Где "Рабочий стол" может быть прописан на любом языке.

Правило "/home/${SUDO_USER:-$USER}/Рабочий стол/" это часть сложного скрипта, и точно работает.

Как это реализуется при установке программ с созданием .desktop на рабочем столе? Там эту проблему как-то решили.

Можно прописать "/home/${SUDO_USER:-$USER}/Рабочий стол/" "/home/${SUDO_USER:-$USER}/Desktop/" "/home/${SUDO_USER:-$USER}/桌面/" но на все языки мира не напишешся.
Нет ли какого БОЛЬШОГО слова для всех Рабочих столов?
« Последнее редактирование: 18 Января 2025, 23:13:39 от ase66 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7578
  • We do what we must
    • Просмотр профиля
при установке программ с созданием .desktop на рабочем столе?
Что-то не припомню, чтобы хоть одна программа ярлыки на рабочем столе создавала.
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн valrust

  • Активист
  • *
  • Сообщений: 372
    • Просмотр профиля
Нужен именно универсальный путь. Где "Рабочий стол" может быть прописан на любом языке.

Путь к рабочему столу определяется не языком, а конфигурационным файлом, который обычно находится по пути $HOME/.config/user-dirs.dirs.
Например, у меня рабочий стол это $HOME/Desktop, а документы $HOME/Документы.

Так что универсальный путь на всех языках писать бесполезно. Лучше использовать специальную утилиту, которую уже подсказали ранее:

Так?
xdg-user-dir DESKTOP

Утилита xdg-user-dir с параметром DESKTOP выдает путь до рабочего стола пользователя.

Детали читайте на странице утилиты xdg-user-dirs.

Можно утилиту использовать таким образом:
ls -l "$(xdg-user-dir DESKTOP)"
« Последнее редактирование: 19 Января 2025, 00:55:02 от valrust »

Оффлайн F12

  • Администратор
  • Старожил
  • *
  • Сообщений: 5405
    • Просмотр профиля
Что-то не припомню, чтобы хоть одна программа ярлыки на рабочем столе создавала.
- одно время виндовые проги этим страдали сильно, ещё и спрашивали как именно создавать, для одного пользователя или для всех

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

Оффлайн Irshat

  • Активист
  • *
  • Сообщений: 736
    • Просмотр профиля
как решение можно сделать, оеоление папок сделать, ну то что делает, переименование после установки
вроде так было
Цитировать
xdg-user-dirs-update && xdg-user-dirs-gtk-update
не ручаюсь

Оффлайн cargan

  • Активист
  • *
  • Сообщений: 558
  • Oderint, dum metuant
    • Просмотр профиля
Что-то не припомню, чтобы хоть одна программа ярлыки на рабочем столе создавала.
да запросто
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 19 Января 2025, 04:46:48 от cargan »

Оффлайн ase66

  • Автор темы
  • Участник
  • *
  • Сообщений: 177
    • Просмотр профиля
xdg-user-dir DESKTOP конечно всё покажет, но я не смогу подключить ответ в скрипт. Нужно прописать выхлоп как правило в строку local_apps=

Для меня это слишком сложно, я другим делом занимаюсь. Но если кому интересно посмотрите.

#!/bin/bash

# Script for fixing hardcoded icons. Script fix.sh written and maintained on GitHub
# at https://github.com/Foggalong/hardcode-fixer - addtions welcome!
# This script fix2.sh and tofix2.csv and tofix-snap.txt mod. ZMA.

# Copyright (C) 2014
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License (version 3+) as
# published by the Free Software Foundation. You should have received
# a copy of the GNU General Public License along with this program.
# If not, see <http://www.gnu.org/licenses/>.

# Version info
date=202501141  # [year][month][date][extra]"applications/chi/info/bench/"

# Locations
local_icon="/home/${SUDO_USER:-$USER}/.local/share/icons/hicolor/48x48/apps/"
local_scalable_icon="/home/${SUDO_USER:-$USER}/.local/share/icons/hicolor/scalable/apps/"
global_apps=("/etc/xdg/autostart/" "/usr/share/applications/" "/usr/share/applications/*/" "/usr/share/applications/antix/" "/usr/share/applications/BHS/" "/usr/share/applications/bigcontrolcenter/" "applications/chi/info/bench/" "/usr/share/applications/data/" "/usr/share/applications/Deface/" "/usr/share/applications/Defcon/" "/usr/share/applications/Development/" "/usr/share/applications/dvda-author/" "/usr/share/applications/edit/" "/usr/share/applications/hildon" "/usr/share/applications/info/" "/usr/share/applications/inputmethods/" "/usr/share/applications/kde/" "/usr/share/applications/kde4/" "/usr/share/applications/kde5/" "/usr/share/applications/LegacyOS/" "/usr/share/applications/Loc-OS/" "/usr/share/applications/Multimedia/" "/usr/share/applications/minino/" "/usr/share/applications/lxrightclicks/" "/usr/share/applications/postgresql/" "/usr/local/share/applications/" "/usr/local/share/applications/kde4/" "/usr/local/share/applications/kde5/""/usr/share/mate/applications/" "/usr/local/share/applications/minino/" "/usr/share/applications/openbox_extra/" "/usr/share/applications/PakOS_Launchers/" "/usr/share/applications/screenlets/" "/usr/share/applications/screenlets_pack_basic/" "/usr/share/applications/screenlets_pack_all/" "/usr/share/applications/screenlets-pack-basic/" "/usr/share/applications/services/" "/usr/share/applications/snaps/" "/usr/share/applications/system/" "/usr/share/applications/update/" "/usr/share/applications/Vine/" "/usr/share/xsessions/" "/var/lib/snapd/desktop/applications/")
local_apps=("/home/${SUDO_USER:-$USER}/.local/share/applications/" "/home/${SUDO_USER:-$USER}/.local/share/applications/kde4/" "/home/${SUDO_USER:-$USER}/.local/share/applications/kde5/" "/home/${SUDO_USER:-$USER}/Рабочий стол/" "/home/${SUDO_USER:-$USER}/Desktop/" "/home/${SUDO_USER:-$USER}/桌面/")
global_icon="/usr/share/icons/hicolor/48x48/apps/"
global_scalable_icon="/usr/share/icons/hicolor/scalable/apps/"
steam_icon="${global_icon}steam.png"

# Allows timeout when launched via 'Run in Terminal'
function gerror() { sleep 3; exit 1; }

# Fix sugar-activity

find /home/${SUDO_USER:-$USER}/.local/share/applications/ /usr/share/applications/ -name '*.desktop' \
| xargs -d '\n' sed -i 's/Name = /Name=/'

find /home/${SUDO_USER:-$USER}/.local/share/applications/ /usr/share/applications/ -name '*.desktop' \
| xargs -d '\n' sed -i 's/Icon = /Icon=/'

# Fix #Icon=

find /home/${SUDO_USER:-$USER}/.local/share/applications/ /usr/share/applications/ /etc/xdg/autostart/ -name '*.desktop' \
| grep -f /home/${SUDO_USER:-$USER}/tofix-snap.txt \
| xargs -d '\n' sed -i 's/#Icon=.*$/Icon=/'

# Faking Canonical snap and other stubborn .desktop

find /home/${SUDO_USER:-$USER}/.local/share/applications/ /usr/share/applications/ /usr/share/applications/snaps/ /var/lib/snapd/desktop/applications/ -name '*.desktop' \
| grep -f /home/${SUDO_USER:-$USER}/tofix-snap.txt \
| xargs -d '\n' sed -i 's/Icon=.*$/Icon=/'

# Deals with the flags
if [ -z "$1" ]; then
    mode="fix"
else
    case $1 in
        -l|--local)
            mode="local";;
        -r|--revert)
            echo "This will undo all changes previously made."
            while true; do
                read -r -p "Are you sure you want to continue? " answer
                case $answer in
                    [Yy]* ) mode="revert"; break;;
                    [Nn]* ) exit;;
                    * ) echo "Please answer [Y/y]es or [N/n]o.";;
                esac
            done;;
        -h|--help)
            echo -e \
                "Usage: ./$(basename -- $0) [OPTION]\n" \
                "\rFixes hardcoded icons of installed applications.\n\n" \
                "\rCurrently supported options:\n" \
                "\r  -l, --local \t Only fixes local launchers.\n" \
                "\r  -r, --revert \t Reverts any changes made.\n" \
                "\r  -h, --help \t\t Displays this help menu.\n" \
                "\r  -v, --version \t Displays program version.\n"
            exit 0 ;;
        -v|--version)
            echo -e "$(basename -- $0) $date\n"
            exit 0 ;;
        *)
            echo -e "$(basename -- $0): invalid option -- '$1'"
            echo -e "Try '$(basename -- $0) --help' for more information."
            gerror
    esac
fi

chown "${SUDO_USER:-$USER}" "/home/${SUDO_USER:-$USER}/tofix2.csv"

# Checks for root
if [[ $UID -ne 0 ]] && [ $mode != "local" ]; then
    echo "The script must be run as root to (un)fix global launchers."
    while true; do
        read -r -p "Do you want to continue in local mode? " answer
        case $answer in
            [Yy]* )
                if [ "$mode" == "fix" ]; then
                    mode="local"; break
                elif [ "$mode" == "revert" ]; then
                    mode="l-revert"; break
                fi;;
            [Nn]* ) exit;;
            * ) echo "Please answer [Y/y]es or [N/n]o.";;
        esac
    done
fi

# Itterating over lines of tofix2.csv, each split into an array
IFS=","
while read -r name launcher current new_icon; do
    # Basic corrections
    name=$(echo "$name" | sed -e "s/\r//g")
    launcher=$(echo "$launcher".desktop | sed -e "s/\r//g")
    current=$(echo "$current" | sed -e "s/\r//g")
    new_icon=$(echo "$new_icon" | sed -e "s/\r//g")
    filename=$(basename "$current")
    extension="${filename##*.}"
    # Escape non-standard and special characters in file names by creating a new variable
    old_icon="${current//\\/\\\\}" # escape backslashes
    old_icon="${old_icon//\//\\/}" # escape slashes
    # Fixing code
    if [ "$current" == "hardcoded" ]; then #checks if the icon path is hardcoded
        if [ "$mode" == "local" ]; then
            combined_apps=("${local_apps[@]}")
        else
            combined_apps=("${local_apps[@]}" "${global_apps[@]}")
        fi

        for app_location in "${combined_apps[@]}"
        do
            if [ -f "$app_location$launcher" ] && [ ! -f "$new_current" ] ; then
                new_current=$(grep -Gq "Icon=*$" "$app_location$launcher")
            fi
        done
        if [ -f "$new_current" ];then
            sed -i "s/$name,$launcher,$current,$new_icon/$name,$launcher,$new_current,$new_icon/" "tofix2.csv"
        fi
    fi
    if [ ! -d "$local_scalable_icon" ]; then
        su -c "mkdir '$local_scalable_icon' -p" "${SUDO_USER:-$USER}"
    fi
    if [ ! -d "$local_icon" ]; then
        su -c "mkdir '$local_icon' -p" "${SUDO_USER:-$USER}"
    fi
    if [ "$mode" == "fix" ] || [ "$mode" == "local" ]; then
        # Local & Steam launchers
        for local_app in "${local_apps[@]}"
        do
            if [ -f "$local_app$launcher" ]; then
                if [ "$current" != "steam" ]; then
                    if grep -Gq "Icon=$current$" "$local_app$launcher"; then
                        # Local launchers
                        echo "L: Fixing $name..."
                        if [ -f "$current" ]; then # checks if icon exists to copy
                            if [ ! -d "$local_icon" ]; then
                                su -c "mkdir '$local_icon' -p" "${SUDO_USER:-$USER}"
                            fi
                            if [ "$extension" == "png" ] || [ "$extension" == "xpm" ];then
                                if [ ! -f "$local_icon$new_icon" ];then
                                    cp "$current" "$local_icon$new_icon"
                                fi
                            fi
                            if [ "$extension" == "svg" ];then
                                if [ ! -f "$local_scalable_icon$new_icon" ];then
                                    cp "$current" "$local_scalable_icon$new_icon"
                                fi
                            fi
                        fi
                        sed -i "s/Icon=${old_icon}.*/Icon=$new_icon/" "$local_app$launcher"
                    fi
                else
                    # Steam launchers
                    if [ -f "$steam_icon" ]; then # checks if steam icon exists to copy
                        if grep -Gq "Icon=$current$" "$local_app$launcher"; then
                            echo "S: Fixing $name..."
                            if [ ! -d "$local_icon" ]; then
                                su -c "mkdir '$local_icon' -p" "${SUDO_USER:-$USER}"
                            fi
                            if [ ! -f "$local_icon${new_icon}.png" ];then
                                cp "$steam_icon" "$local_icon${new_icon}.png"
                            fi
                            sed -i "s/Icon=steam.*/Icon=$new_icon/" "$local_app$launcher"
                        fi
                    fi
                fi
            fi
        done
        # Global launchers
        for global_app in "${global_apps[@]}"
        do
            if [ $mode != "local" ] && [ -f "$global_app$launcher" ]; then
                if grep -Gq "Icon=$current$" "$global_app$launcher"; then
                    echo "G: Fixing $name..."
                    if [ -f "$current" ]; then # checks if icon exists to copy
                        if [ "$extension" == "png" ] || [ "$extension" == "xpm" ];then
                            if [ ! -f "$global_icon$new_icon" ] ;then
                                cp "$current" "$global_icon$new_icon"
                            fi
                        fi
                        if [ "$extension" == "svg" ];then
                            if [ ! -f "$global_scalable_icon$new_icon" ];then
                                cp "$current" "$global_scalable_icon$new_icon"
                            fi
                        fi
                    fi
                    sed -i "s/Icon=${old_icon}.*/Icon=$new_icon/g" "$global_app$launcher"
                fi
            fi
        done
    # Reversion code
    elif [ "$mode" == "revert" ] || [ "$mode" == "l-revert" ]; then
        # Local revert
        for local_app in "${local_apps[@]}"
        do
            if [ -f "$local_app$launcher" ]; then
                if grep -Gq "Icon=$new_icon$" "$local_app$launcher"; then
                    echo "F: Reverting $name..."
                    rm -f "$local_icon$new_icon"*
                    rm -f "$local_scalable_icon$new_icon"*
                    sed -i "s/Icon=${new_icon}.*/Icon=$old_icon/" "$local_app$launcher"
                fi
            fi
            # Steam revert
            if [ -f "$local_app$launcher" ] && [ -f "$steam_icon" ]; then
                if grep -Gq "Icon=$new_icon$" "$local_app$launcher"; then
                    echo "S: Reverting $name..."
                    rm -f "$local_icon$new_icon"*
                    rm -f "$local_scalable_icon$new_icon"*
                    sed -i "s/Icon=${new_icon}.*/Icon=$old_icon/" "$local_app$launcher"
                fi
            fi
        done
        # Global revert
        for global_app in "${global_apps[@]}"
        do
            if [ $mode != "l-revert" ] && [ -f "$global_app$launcher" ]; then
                if grep -Gq "Icon=$new_icon$" "$global_app$launcher"; then
                    echo "G: Reverting $name..."
                    rm -f "$global_icon$new_icon"*
                    rm -f "$global_scalable_icon$new_icon"*
                    sed -i "s/Icon=${new_icon}.*/Icon=$old_icon/" "$global_app$launcher"
                fi
            fi
        done
    fi
done < /home/${SUDO_USER:-$USER}/tofix2.csv

Я пожалуй пока оставлю  "/home/${SUDO_USER:-$USER}/Рабочий стол/" "/home/${SUDO_USER:-$USER}/Desktop/" "/home/${SUDO_USER:-$USER}/桌面/"

Потому что массовая установка .desktop на рабочий стол происходит из Spark Store, а там всё на Китайском языке. Т.е. по 99% того что вижу сработает.

Иконки, скрипт, ресурсы для скрипта - https://yadi.sk/d/kVzafq1ptMV4R
Все .desktop - https://yadi.sk/d/XWNibgF6V9Fhdg

P.S.Сегодня удалил это:# Backup applications

cd /home/${SUDO_USER:-$USER}/.local/share/applications/
tar -czpf backup-applications-$(date +%d%m%Y-%H%M%S).tar.gz *
cd
cd /var/lib/snapd/desktop/applications
tar -czpf backup-applications-$(date +%d%m%Y-%H%M%S).tar.gz *
cd
cd /usr/share/applications
tar -czpf backup-applications-$(date +%d%m%Y-%H%M%S).tar.gz *
cd

К сожалению эти команды бакупа не корректны. Если указанной папки нет, то архиватор вместо игнора сжимает всё вокруг.
Как сжать если папки есть, и не сжимать если их нет?
« Последнее редактирование: 04 Февраля 2025, 09:27:26 от ase66 »

 

Страница сгенерирована за 0.12 секунд. Запросов: 26.