mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-09 09:54:14 +02:00
0.9.0
This commit is contained in:
@@ -2,9 +2,14 @@ import os
|
||||
from pathlib import Path
|
||||
|
||||
from bauh.api.constants import CONFIG_PATH
|
||||
from bauh.commons import resource
|
||||
|
||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
LOCAL_PATH = '{}/.local/share/bauh/appimage'.format(Path.home())
|
||||
LOCAL_PATH = '{}/.local/share/bauh/appimage'.format(str(Path.home()))
|
||||
INSTALLATION_PATH = LOCAL_PATH + '/installed/'
|
||||
SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt'
|
||||
CONFIG_FILE = '{}/appimage.yml'.format(CONFIG_PATH)
|
||||
|
||||
|
||||
def get_icon_path() -> str:
|
||||
return resource.get_path('img/appimage.svg', ROOT_DIR)
|
||||
|
||||
@@ -9,23 +9,24 @@ import traceback
|
||||
from datetime import datetime
|
||||
from math import floor
|
||||
from pathlib import Path
|
||||
from threading import Lock, Thread
|
||||
from threading import Lock
|
||||
from typing import Set, Type, List, Tuple
|
||||
|
||||
from colorama import Fore
|
||||
|
||||
from bauh.api.abstract.context import ApplicationContext
|
||||
from bauh.api.abstract.controller import SoftwareManager, SearchResult
|
||||
from bauh.api.abstract.controller import SoftwareManager, SearchResult, UpgradeRequirements, UpgradeRequirement
|
||||
from bauh.api.abstract.disk import DiskCacheLoader
|
||||
from bauh.api.abstract.handler import ProcessWatcher
|
||||
from bauh.api.abstract.handler import ProcessWatcher, TaskManager
|
||||
from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpdate, PackageSuggestion, \
|
||||
SuggestionPriority
|
||||
SuggestionPriority, CustomSoftwareAction
|
||||
from bauh.api.abstract.view import MessageType, ViewComponent, FormComponent, InputOption, SingleSelectComponent, \
|
||||
SelectViewType, TextInputComponent, PanelComponent
|
||||
SelectViewType, TextInputComponent, PanelComponent, FileChooserComponent
|
||||
from bauh.commons import resource
|
||||
from bauh.commons.config import save_config
|
||||
from bauh.commons.html import bold
|
||||
from bauh.commons.system import SystemProcess, new_subprocess, ProcessHandler, run_cmd, SimpleProcess
|
||||
from bauh.gems.appimage import query, INSTALLATION_PATH, LOCAL_PATH, SUGGESTIONS_FILE, CONFIG_FILE
|
||||
from bauh.gems.appimage import query, INSTALLATION_PATH, LOCAL_PATH, SUGGESTIONS_FILE, CONFIG_FILE, ROOT_DIR
|
||||
from bauh.gems.appimage.config import read_config
|
||||
from bauh.gems.appimage.model import AppImage
|
||||
from bauh.gems.appimage.worker import DatabaseUpdater
|
||||
@@ -52,6 +53,86 @@ class AppImageManager(SoftwareManager):
|
||||
self.logger = context.logger
|
||||
self.file_downloader = context.file_downloader
|
||||
self.db_locks = {DB_APPS_PATH: Lock(), DB_RELEASES_PATH: Lock()}
|
||||
self.custom_actions = [CustomSoftwareAction(i18_label_key='appimage.custom_action.install_file',
|
||||
i18n_status_key='appimage.custom_action.install_file.status',
|
||||
manager=self,
|
||||
manager_method='install_file',
|
||||
icon_path=resource.get_path('img/appimage.svg', ROOT_DIR),
|
||||
requires_root=False)]
|
||||
|
||||
def install_file(self, root_password: str, watcher: ProcessWatcher) -> bool:
|
||||
file_chooser = FileChooserComponent(label=self.i18n['file'].capitalize(), allowed_extensions={'AppImage'})
|
||||
input_name = TextInputComponent(label=self.i18n['name'].capitalize())
|
||||
input_version = TextInputComponent(label=self.i18n['version'].capitalize())
|
||||
input_description = TextInputComponent(label=self.i18n['description'].capitalize())
|
||||
|
||||
cat_ops = [InputOption(label=self.i18n['category.none'].capitalize(), value=0)]
|
||||
cat_ops.extend([InputOption(label=self.i18n[c.lower()].capitalize(), value=c) for c in self.context.default_categories])
|
||||
inp_cat = SingleSelectComponent(label=self.i18n['category'], type_=SelectViewType.COMBO, options=cat_ops,
|
||||
default_option=cat_ops[0])
|
||||
|
||||
form = FormComponent(label='', components=[file_chooser, input_name, input_version, input_description, inp_cat], spaces=False)
|
||||
|
||||
while True:
|
||||
if watcher.request_confirmation(title=self.i18n['appimage.custom_action.install_file.details'], body=None,
|
||||
components=[form],
|
||||
confirmation_label=self.i18n['proceed'].capitalize(),
|
||||
deny_label=self.i18n['cancel'].capitalize()):
|
||||
if not file_chooser.file_path or not os.path.isfile(file_chooser.file_path):
|
||||
watcher.request_confirmation(title=self.i18n['error'].capitalize(),
|
||||
body=self.i18n['appimage.custom_action.install_file.invalid_file'],
|
||||
deny_button=False)
|
||||
elif not input_name.get_value() or not input_name.get_value().strip():
|
||||
watcher.request_confirmation(title=self.i18n['error'].capitalize(),
|
||||
body=self.i18n['appimage.custom_action.install_file.invalid_name'],
|
||||
deny_button=False)
|
||||
else:
|
||||
break
|
||||
else:
|
||||
return False
|
||||
|
||||
appim = AppImage(i18n=self.i18n, imported=True)
|
||||
appim.name = input_name.get_value().strip()
|
||||
appim.local_file_path = file_chooser.file_path
|
||||
appim.version = input_version.get_value()
|
||||
appim.latest_version = input_version.get_value()
|
||||
appim.description = input_description.get_value()
|
||||
appim.categories = ['Imported']
|
||||
|
||||
if inp_cat.get_selected() != cat_ops[0].value:
|
||||
appim.categories.append(inp_cat.get_selected())
|
||||
|
||||
installed = self.install(root_password=root_password, pkg=appim, watcher=watcher)
|
||||
|
||||
if installed:
|
||||
appim.installed = True
|
||||
self.cache_to_disk(appim, None, False)
|
||||
|
||||
return installed
|
||||
|
||||
def update_file(self, pkg: AppImage, root_password: str, watcher: ProcessWatcher):
|
||||
file_chooser = FileChooserComponent(label=self.i18n['file'].capitalize(), allowed_extensions={'AppImage'})
|
||||
input_version = TextInputComponent(label=self.i18n['version'].capitalize())
|
||||
|
||||
while True:
|
||||
if watcher.request_confirmation(title=self.i18n['appimage.custom_action.manual_update.details'], body=None,
|
||||
components=[FormComponent(label='', components=[file_chooser, input_version], spaces=False)],
|
||||
confirmation_label=self.i18n['proceed'].capitalize(),
|
||||
deny_label=self.i18n['cancel'].capitalize()):
|
||||
if not file_chooser.file_path or not os.path.isfile(file_chooser.file_path):
|
||||
watcher.request_confirmation(title=self.i18n['error'].capitalize(),
|
||||
body=self.i18n['appimage.custom_action.install_file.invalid_file'],
|
||||
deny_button=False)
|
||||
else:
|
||||
break
|
||||
else:
|
||||
return False
|
||||
|
||||
pkg.local_file_path = file_chooser.file_path
|
||||
pkg.version = input_version.get_value()
|
||||
|
||||
reqs = UpgradeRequirements(to_install=None, to_remove=None, to_upgrade=[UpgradeRequirement(pkg=pkg)], cannot_upgrade=None)
|
||||
return self.upgrade(reqs, root_password=root_password, watcher=watcher)
|
||||
|
||||
def _get_db_connection(self, db_path: str) -> sqlite3.Connection:
|
||||
if os.path.exists(db_path):
|
||||
@@ -82,7 +163,7 @@ class AppImageManager(SoftwareManager):
|
||||
found_map = {}
|
||||
idx = 0
|
||||
for l in cursor.fetchall():
|
||||
app = AppImage(*l)
|
||||
app = AppImage(*l, i18n=self.i18n)
|
||||
res.new.append(app)
|
||||
found_map[self._gen_app_key(app)] = {'app': app, 'idx': idx}
|
||||
idx += 1
|
||||
@@ -118,7 +199,7 @@ class AppImageManager(SoftwareManager):
|
||||
for path in installed.split('\n'):
|
||||
if path:
|
||||
with open(path) as f:
|
||||
app = AppImage(installed=True, **json.loads(f.read()))
|
||||
app = AppImage(installed=True, i18n=self.i18n, **json.loads(f.read()))
|
||||
app.icon_url = app.icon_path
|
||||
|
||||
res.installed.append(app)
|
||||
@@ -189,18 +270,25 @@ class AppImageManager(SoftwareManager):
|
||||
|
||||
return False
|
||||
|
||||
def update(self, pkg: AppImage, root_password: str, watcher: ProcessWatcher) -> bool:
|
||||
if not self.uninstall(pkg, root_password, watcher):
|
||||
watcher.show_message(title=self.i18n['error'],
|
||||
body=self.i18n['appimage.error.uninstall_current_version'],
|
||||
type_=MessageType.ERROR)
|
||||
return False
|
||||
def upgrade(self, requirements: UpgradeRequirements, root_password: str, watcher: ProcessWatcher) -> bool:
|
||||
for req in requirements.to_upgrade:
|
||||
watcher.change_status("{} {} ({})...".format(self.i18n['manage_window.status.upgrading'], req.pkg.name, req.pkg.version))
|
||||
|
||||
if self.install(pkg, root_password, watcher):
|
||||
self.cache_to_disk(pkg, None, False)
|
||||
return True
|
||||
if not self.uninstall(req.pkg, root_password, watcher):
|
||||
watcher.show_message(title=self.i18n['error'],
|
||||
body=self.i18n['appimage.error.uninstall_current_version'],
|
||||
type_=MessageType.ERROR)
|
||||
watcher.change_substatus('')
|
||||
return False
|
||||
|
||||
return False
|
||||
if not self.install(req.pkg, root_password, watcher):
|
||||
watcher.change_substatus('')
|
||||
return False
|
||||
|
||||
self.cache_to_disk(req.pkg, None, False)
|
||||
|
||||
watcher.change_substatus('')
|
||||
return True
|
||||
|
||||
def uninstall(self, pkg: AppImage, root_password: str, watcher: ProcessWatcher) -> bool:
|
||||
if os.path.exists(pkg.get_disk_cache_path()):
|
||||
@@ -290,17 +378,47 @@ class AppImageManager(SoftwareManager):
|
||||
|
||||
def install(self, pkg: AppImage, root_password: str, watcher: ProcessWatcher) -> bool:
|
||||
handler = ProcessHandler(watcher)
|
||||
|
||||
out_dir = INSTALLATION_PATH + pkg.name.lower()
|
||||
counter = 0
|
||||
while True:
|
||||
if os.path.exists(out_dir):
|
||||
self.logger.info("Installation dir '{}' already exists. Generating a different one".format(out_dir))
|
||||
out_dir += '-{}'.format(counter)
|
||||
counter += 1
|
||||
else:
|
||||
break
|
||||
|
||||
Path(out_dir).mkdir(parents=True, exist_ok=True)
|
||||
pkg.install_dir = out_dir
|
||||
|
||||
appimage_url = pkg.url_download_latest_version if pkg.update else pkg.url_download
|
||||
file_name = appimage_url.split('/')[-1]
|
||||
pkg.version = pkg.latest_version
|
||||
pkg.url_download = appimage_url
|
||||
if pkg.imported:
|
||||
|
||||
file_path = out_dir + '/' + file_name
|
||||
downloaded = self.file_downloader.download(file_url=pkg.url_download, watcher=watcher,
|
||||
output_path=file_path, cwd=str(Path.home()))
|
||||
downloaded, file_name = True, pkg.local_file_path.split('/')[-1]
|
||||
|
||||
file_path = out_dir + '/' + file_name
|
||||
|
||||
try:
|
||||
moved, output = handler.handle_simple(SimpleProcess(['mv', pkg.local_file_path, file_path]))
|
||||
except:
|
||||
self.logger.error("Could not rename file '' as '{}'".format(pkg.local_file_path, file_path))
|
||||
moved = False
|
||||
|
||||
if not moved:
|
||||
watcher.show_message(title=self.i18n['error'].capitalize(),
|
||||
body=self.i18n['appimage.install.imported.rename_error'].format(bold(pkg.local_file_path.split('/')[-1]), bold(output)),
|
||||
type_=MessageType.ERROR)
|
||||
return False
|
||||
|
||||
else:
|
||||
appimage_url = pkg.url_download_latest_version if pkg.update else pkg.url_download
|
||||
file_name = appimage_url.split('/')[-1]
|
||||
pkg.version = pkg.latest_version
|
||||
pkg.url_download = appimage_url
|
||||
|
||||
file_path = out_dir + '/' + file_name
|
||||
downloaded = self.file_downloader.download(file_url=pkg.url_download, watcher=watcher,
|
||||
output_path=file_path, cwd=str(Path.home()))
|
||||
|
||||
if downloaded:
|
||||
watcher.change_substatus(self.i18n['appimage.install.permission'].format(bold(file_name)))
|
||||
@@ -392,20 +510,19 @@ class AppImageManager(SoftwareManager):
|
||||
def requires_root(self, action: str, pkg: AppImage):
|
||||
return False
|
||||
|
||||
def _start_updater(self):
|
||||
def prepare(self, task_manager: TaskManager, root_password: str, internet_available: bool):
|
||||
local_config = read_config(update_file=True)
|
||||
interval = local_config['db_updater']['interval'] or 20 * 60
|
||||
|
||||
updater = DatabaseUpdater(http_client=self.context.http_client, logger=self.context.logger,
|
||||
updater = DatabaseUpdater(task_man=task_manager,
|
||||
i18n=self.context.i18n,
|
||||
http_client=self.context.http_client, logger=self.context.logger,
|
||||
db_locks=self.db_locks, interval=interval)
|
||||
if local_config['db_updater']['enabled']:
|
||||
updater.start()
|
||||
else:
|
||||
elif internet_available:
|
||||
updater.download_databases() # only once
|
||||
|
||||
def prepare(self):
|
||||
Thread(target=self._start_updater, daemon=True).start()
|
||||
|
||||
def list_updates(self, internet_available: bool) -> List[PackageUpdate]:
|
||||
res = self.read_installed(disk_loader=None, internet_available=internet_available)
|
||||
|
||||
@@ -413,7 +530,7 @@ class AppImageManager(SoftwareManager):
|
||||
if res.installed:
|
||||
for app in res.installed:
|
||||
if app.update:
|
||||
updates.append(PackageUpdate(pkg_id=app.name, pkg_type='appimage', version=app.latest_version))
|
||||
updates.append(PackageUpdate(pkg_id=app.name, pkg_type='AppImage', version=app.latest_version, name=app.name))
|
||||
|
||||
return updates
|
||||
|
||||
@@ -458,7 +575,7 @@ class AppImageManager(SoftwareManager):
|
||||
cursor.execute(query.FIND_APPS_BY_NAME_FULL.format(','.join(["'{}'".format(s) for s in sugs_map.keys()])))
|
||||
|
||||
for t in cursor.fetchall():
|
||||
app = AppImage(*t)
|
||||
app = AppImage(*t, i18n=self.i18n)
|
||||
res.append(PackageSuggestion(app, sugs_map[app.name.lower()]))
|
||||
self.logger.info("Mapped {} suggestions".format(len(res)))
|
||||
except:
|
||||
@@ -538,3 +655,22 @@ class AppImageManager(SoftwareManager):
|
||||
return True, None
|
||||
except:
|
||||
return False, [traceback.format_exc()]
|
||||
|
||||
def get_custom_actions(self) -> List[CustomSoftwareAction]:
|
||||
return self.custom_actions
|
||||
|
||||
def get_upgrade_requirements(self, pkgs: List[AppImage], root_password: str, watcher: ProcessWatcher) -> UpgradeRequirements:
|
||||
to_update = []
|
||||
|
||||
for pkg in pkgs:
|
||||
requirement = UpgradeRequirement(pkg)
|
||||
installed_size = self.http_client.get_content_length_in_bytes(pkg.url_download)
|
||||
upgrade_size = self.http_client.get_content_length_in_bytes(pkg.url_download_latest_version)
|
||||
requirement.required_size = upgrade_size
|
||||
|
||||
if upgrade_size and installed_size:
|
||||
requirement.extra_size = upgrade_size - installed_size
|
||||
|
||||
to_update.append(requirement)
|
||||
|
||||
return UpgradeRequirements([], [], to_update, [])
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
from bauh.api.abstract.model import SoftwarePackage
|
||||
from typing import List
|
||||
|
||||
from bauh.api.abstract.model import SoftwarePackage, CustomSoftwareAction
|
||||
from bauh.commons import resource
|
||||
from bauh.gems.appimage import ROOT_DIR, INSTALLATION_PATH
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
CACHED_ATTRS = {'name', 'description', 'version', 'url_download', 'author', 'license', 'source',
|
||||
'icon_path', 'github', 'categories'}
|
||||
'icon_path', 'github', 'categories', 'imported', 'install_dir'}
|
||||
|
||||
CUSTOM_ACTIONS = [CustomSoftwareAction(i18_label_key='appimage.custom_action.manual_update',
|
||||
i18n_status_key='appimage.custom_action.manual_update.status',
|
||||
manager_method='update_file',
|
||||
requires_root=False,
|
||||
icon_path=resource.get_path('img/refresh.svg', ROOT_DIR))]
|
||||
|
||||
|
||||
class AppImage(SoftwarePackage):
|
||||
@@ -11,7 +20,8 @@ class AppImage(SoftwarePackage):
|
||||
def __init__(self, name: str = None, description: str = None, github: str = None, source: str = None, version: str = None,
|
||||
url_download: str = None, url_icon: str = None, url_screenshot: str = None, license: str = None, author: str = None,
|
||||
categories=None, icon_path: str = None, installed: bool = False,
|
||||
url_download_latest_version: str = None, **kwargs):
|
||||
url_download_latest_version: str = None, local_file_path: str = None, imported: bool = False,
|
||||
i18n: I18n = None, install_dir: str = None, **kwargs):
|
||||
super(AppImage, self).__init__(id=name, name=name, version=version, latest_version=version,
|
||||
icon_url=url_icon, license=license, description=description,
|
||||
installed=installed)
|
||||
@@ -23,6 +33,10 @@ class AppImage(SoftwarePackage):
|
||||
self.url_screenshot = url_screenshot
|
||||
self.author = author
|
||||
self.url_download_latest_version = url_download_latest_version
|
||||
self.local_file_path = local_file_path
|
||||
self.imported = imported
|
||||
self.i18n = i18n
|
||||
self.install_dir = install_dir
|
||||
|
||||
def __repr__(self):
|
||||
return "{} (name={}, github={})".format(self.__class__.__name__, self.name, self.github)
|
||||
@@ -31,13 +45,13 @@ class AppImage(SoftwarePackage):
|
||||
return not self.installed and self.url_download
|
||||
|
||||
def has_history(self):
|
||||
return self.installed
|
||||
return self.installed and not self.imported
|
||||
|
||||
def has_info(self):
|
||||
return True
|
||||
|
||||
def can_be_downgraded(self):
|
||||
return self.installed
|
||||
return self.installed and not self.imported
|
||||
|
||||
def get_type(self):
|
||||
return 'AppImage'
|
||||
@@ -75,7 +89,9 @@ class AppImage(SoftwarePackage):
|
||||
return self.author
|
||||
|
||||
def get_disk_cache_path(self) -> str:
|
||||
if self.name:
|
||||
if self.install_dir:
|
||||
return self.install_dir
|
||||
elif self.name:
|
||||
return INSTALLATION_PATH + self.name.lower()
|
||||
|
||||
def get_disk_icon_path(self):
|
||||
@@ -83,3 +99,16 @@ class AppImage(SoftwarePackage):
|
||||
|
||||
def has_screenshots(self):
|
||||
return not self.installed and self.url_screenshot
|
||||
|
||||
def get_display_name(self) -> str:
|
||||
if self.name and self.imported:
|
||||
return '{} ( {} )'.format(self.name, self.i18n['imported'])
|
||||
|
||||
return self.name
|
||||
|
||||
def get_custom_supported_actions(self) -> List[CustomSoftwareAction]:
|
||||
if self.imported:
|
||||
return CUSTOM_ACTIONS
|
||||
|
||||
def supports_backup(self) -> bool:
|
||||
return False
|
||||
|
||||
146
bauh/gems/appimage/resources/img/refresh.svg
Executable file
146
bauh/gems/appimage/resources/img/refresh.svg
Executable file
@@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Capa_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="48"
|
||||
height="48"
|
||||
viewBox="0 0 47.999999 47.999999"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="refresh_2.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
|
||||
id="metadata45"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs43"><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient540"><stop
|
||||
style="stop-color:#0088aa;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop536" /><stop
|
||||
style="stop-color:#0088aa;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop538" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient540"
|
||||
id="linearGradient542"
|
||||
x1="-130.74721"
|
||||
y1="-214.80638"
|
||||
x2="-556.49438"
|
||||
y2="110.01643"
|
||||
gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="703"
|
||||
id="namedview41"
|
||||
showgrid="false"
|
||||
showborder="false"
|
||||
inkscape:zoom="1.9374833"
|
||||
inkscape:cx="165.58246"
|
||||
inkscape:cy="-10.288149"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="260"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Capa_1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(0.10547014,0,0,0.0985161,-1.6940777,0)"
|
||||
style="fill:url(#linearGradient542);fill-opacity:1">
|
||||
<g
|
||||
id="g6"
|
||||
style="fill:url(#linearGradient542);fill-opacity:1">
|
||||
<path
|
||||
d="m 55.323,203.641 c 15.664,0 29.813,-9.405 35.872,-23.854 25.017,-59.604 83.842,-101.61 152.42,-101.61 37.797,0 72.449,12.955 100.23,34.442 l -21.775,3.371 c -7.438,1.153 -13.224,7.054 -14.232,14.512 -1.01,7.454 3.008,14.686 9.867,17.768 l 119.746,53.872 c 5.249,2.357 11.33,1.904 16.168,-1.205 4.83,-3.114 7.764,-8.458 7.796,-14.208 l 0.621,-131.943 c 0.042,-7.506 -4.851,-14.144 -12.024,-16.332 -7.185,-2.188 -14.947,0.589 -19.104,6.837 L 414.403,70.096 C 370.398,26.778 310.1,0 243.615,0 142.806,0 56.133,61.562 19.167,149.06 c -5.134,12.128 -3.84,26.015 3.429,36.987 7.269,10.976 19.556,17.594 32.727,17.594 z"
|
||||
id="path2"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient542);fill-opacity:1" />
|
||||
<path
|
||||
d="m 464.635,301.184 c -7.27,-10.977 -19.558,-17.594 -32.728,-17.594 -15.664,0 -29.813,9.405 -35.872,23.854 -25.018,59.604 -83.843,101.61 -152.42,101.61 -37.798,0 -72.45,-12.955 -100.232,-34.442 l 21.776,-3.369 c 7.437,-1.153 13.223,-7.055 14.233,-14.514 1.009,-7.453 -3.008,-14.686 -9.867,-17.768 L 49.779,285.089 c -5.25,-2.356 -11.33,-1.905 -16.169,1.205 -4.829,3.114 -7.764,8.458 -7.795,14.207 l -0.622,131.943 c -0.042,7.506 4.85,14.144 12.024,16.332 7.185,2.188 14.948,-0.59 19.104,-6.839 l 16.505,-24.805 c 44.004,43.32 104.303,70.098 170.788,70.098 100.811,0 187.481,-61.561 224.446,-149.059 5.137,-12.128 3.843,-26.014 -3.425,-36.987 z"
|
||||
id="path4"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient542);fill-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g10"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g12"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g14"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g16"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g18"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g20"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g22"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g24"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g26"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g28"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g30"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g32"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g34"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g36"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
<g
|
||||
id="g38"
|
||||
transform="translate(-16.062155,-439.23)">
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
@@ -1,23 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Aplicacions publicades a https://appimage.github.io/
|
||||
appimage.install.permission=S’està concedint el permís d’execució a {}
|
||||
appimage.install.extract=S’està extraient el contingut de {}
|
||||
appimage.install.desktop_entry=S’està creant una drecera del menú
|
||||
appimage.uninstall.error.remove_folder=No s’ha pogut suprimir el directori d’instal·lació de l’aplicació {}
|
||||
appimage.info.url_download=URL del fitxer
|
||||
appimage.info.icon_path=icona
|
||||
appimage.history.0_version=versió
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=URL del fitxer
|
||||
appimage.downgrade.impossible.title=No s’ha pogut revertir la versió
|
||||
appimage.downgrade.impossible.body={} té només una versió publicada.
|
||||
appimage.downgrade.unknown_version.body=No s’ha pogut identificar la versió actual de {} a l’historial de versions
|
||||
appimage.downgrade.first_version={} és a la seva primera versió publicada
|
||||
appimage.downgrade.uninstall_current_version=No s’ha pogut desinstal·lar la versió actual de {}
|
||||
appimage.downgrade.install_version=No s’ha pogut instal·lar la versió {} ({})
|
||||
appimage.install.download.error=No s’ha pogut baixar el fitxer {}. El servidor del fitxer pot estar inactiu.
|
||||
appimage.install.appimagelauncher.error = {appimgl} no permet la instal·lació de {app}. Desinstal·leu {appimgl}, reinicieu el sistema i torneu a provar d’instal·lar {app}.
|
||||
appimage.config.db_updates=Database update
|
||||
appimage.config.db_updates.activated=activated
|
||||
appimage.config.db_updates.activated.tip=It will be possible to check for updates related to the installed applications
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.details=Installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.details=Upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.downgrade.first_version={} és a la seva primera versió publicada
|
||||
appimage.downgrade.impossible.body={} té només una versió publicada.
|
||||
appimage.downgrade.impossible.title=No s’ha pogut revertir la versió
|
||||
appimage.downgrade.install_version=No s’ha pogut instal·lar la versió {} ({})
|
||||
appimage.downgrade.unknown_version.body=No s’ha pogut identificar la versió actual de {} a l’historial de versions
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=versió
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=URL del fitxer
|
||||
appimage.info.icon_path=icona
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.url_download=URL del fitxer
|
||||
appimage.install.appimagelauncher.error={appimgl} no permet la instal·lació de {app}. Desinstal·leu {appimgl}, reinicieu el sistema i torneu a provar d’instal·lar {app}.
|
||||
appimage.install.desktop_entry=S’està creant una drecera del menú
|
||||
appimage.install.download.error=No s’ha pogut baixar el fitxer {}. El servidor del fitxer pot estar inactiu.
|
||||
appimage.install.extract=S’està extraient el contingut de {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=S’està concedint el permís d’execució a {}
|
||||
appimage.task.db_update=Actualització de bases de dades
|
||||
appimage.uninstall.error.remove_folder=No s’ha pogut suprimir el directori d’instal·lació de l’aplicació {}
|
||||
gem.appimage.info=Aplicacions publicades a https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,23 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Anwendungen veröffentlicht auf https://appimage.github.io/
|
||||
appimage.install.permission=Ausführberechtigungen für {}
|
||||
appimage.install.extract=Entpacke Inhalt von {}
|
||||
appimage.install.desktop_entry=Menü-Shortcut erstellen
|
||||
appimage.uninstall.error.remove_folder=Anwendungordner {} konnte nicht entfernt werden
|
||||
appimage.info.url_download=Datei URL
|
||||
appimage.info.icon_path=icon
|
||||
appimage.history.0_version=Version
|
||||
appimage.history.1_published_at=Datum
|
||||
appimage.history.2_url_download=Datei URL
|
||||
appimage.downgrade.impossible.title=Downgrade nicht möglich
|
||||
appimage.downgrade.impossible.body={} hat nur eine veröffentliche Version
|
||||
appimage.downgrade.unknown_version.body=Die Identifikation der aktuellen Version von {} im Versionsverlauf war nicht möglich
|
||||
appimage.downgrade.first_version={} ist in der ersten veröffentlichten Version
|
||||
appimage.error.uninstall_current_version=Deinstallation der aktuellen Version von {} war nicht möglich
|
||||
appimage.downgrade.install_version=Die Installation der Version {} ({}) war nicht möglich
|
||||
appimage.install.download.error=Das Herunterladen der Datei {} ist fehlgeschlagen. Eventuell ist der Server nicht verfügbar
|
||||
appimage.install.appimagelauncher.error={appimgl} verhindert die installation von {app}. Deinstalliere {appimgl}, starte deinen Computer neu und versuche die installation von {app} erneut.
|
||||
appimage.config.db_updates=Database update
|
||||
appimage.config.db_updates.activated=activated
|
||||
appimage.config.db_updates.activated.tip=It will be possible to check for updates related to the installed applications
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.details=Installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.details=Upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.downgrade.first_version={} ist in der ersten veröffentlichten Version
|
||||
appimage.downgrade.impossible.body={} hat nur eine veröffentliche Version
|
||||
appimage.downgrade.impossible.title=Downgrade nicht möglich
|
||||
appimage.downgrade.install_version=Die Installation der Version {} ({}) war nicht möglich
|
||||
appimage.downgrade.unknown_version.body=Die Identifikation der aktuellen Version von {} im Versionsverlauf war nicht möglich
|
||||
appimage.error.uninstall_current_version=Deinstallation der aktuellen Version von {} war nicht möglich
|
||||
appimage.history.0_version=Version
|
||||
appimage.history.1_published_at=Datum
|
||||
appimage.history.2_url_download=Datei URL
|
||||
appimage.info.icon_path=icon
|
||||
appimage.info.imported.false=Nien
|
||||
appimage.info.imported.true=Ya
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.url_download=Datei URL
|
||||
appimage.install.appimagelauncher.error={appimgl} verhindert die installation von {app}. Deinstalliere {appimgl}, starte deinen Computer neu und versuche die installation von {app} erneut.
|
||||
appimage.install.desktop_entry=Menü-Shortcut erstellen
|
||||
appimage.install.download.error=Das Herunterladen der Datei {} ist fehlgeschlagen. Eventuell ist der Server nicht verfügbar
|
||||
appimage.install.extract=Entpacke Inhalt von {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=Ausführberechtigungen für {}
|
||||
appimage.task.db_update=Updating databases
|
||||
appimage.uninstall.error.remove_folder=Anwendungordner {} konnte nicht entfernt werden
|
||||
gem.appimage.info=Anwendungen veröffentlicht auf https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,23 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Applications published at https://appimage.github.io/
|
||||
appimage.install.permission=Giving execution permission to {}
|
||||
appimage.install.extract=Extracting the content from {}
|
||||
appimage.install.desktop_entry=Generating a menu shortcut
|
||||
appimage.uninstall.error.remove_folder=Could not remove the application installation directory {}
|
||||
appimage.info.url_download=File URL
|
||||
appimage.info.icon_path=icon
|
||||
appimage.history.0_version=version
|
||||
appimage.history.1_published_at=date
|
||||
appimage.history.2_url_download=File URL
|
||||
appimage.downgrade.impossible.title=Impossible to downgrade
|
||||
appimage.downgrade.impossible.body={} has only one published version.
|
||||
appimage.downgrade.unknown_version.body=It was not possible to identify {} current version in its versions history
|
||||
appimage.downgrade.first_version={} is in its first published version
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.downgrade.install_version=It was not possible to install the version {} ({})
|
||||
appimage.install.download.error=It was not possible to download the file {}. The file server can be down.
|
||||
appimage.install.appimagelauncher.error={appimgl} is not allowing {app} to be installed. Uninstall {appimgl}, reboot your system and try to install {app} again.
|
||||
appimage.config.db_updates=Database update
|
||||
appimage.config.db_updates.activated=activated
|
||||
appimage.config.db_updates.activated.tip=It will be possible to check for updates related to the installed applications
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.details=Installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.details=Upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.downgrade.first_version={} is in its first published version
|
||||
appimage.downgrade.impossible.body={} has only one published version.
|
||||
appimage.downgrade.impossible.title=Impossible to downgrade
|
||||
appimage.downgrade.install_version=It was not possible to install the version {} ({})
|
||||
appimage.downgrade.unknown_version.body=It was not possible to identify {} current version in its versions history
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=version
|
||||
appimage.history.1_published_at=date
|
||||
appimage.history.2_url_download=File URL
|
||||
appimage.info.icon_path=icon
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.url_download=File URL
|
||||
appimage.install.appimagelauncher.error={appimgl} is not allowing {app} to be installed. Uninstall {appimgl}, reboot your system and try to install {app} again.
|
||||
appimage.install.desktop_entry=Generating a menu shortcut
|
||||
appimage.install.download.error=It was not possible to download the file {}. The file server can be down.
|
||||
appimage.install.extract=Extracting the content from {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=Giving execution permission to {}
|
||||
appimage.task.db_update=Updating databases
|
||||
appimage.uninstall.error.remove_folder=Could not remove the application installation directory {}
|
||||
gem.appimage.info=Applications published at https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,23 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Aplicativos publicados en https://appimage.github.io/
|
||||
appimage.install.permission=Concediendo permiso de ejecución a {}
|
||||
appimage.install.extract=Extrayendo el contenido de {}
|
||||
appimage.install.desktop_entry=Creando un atajo en el menú
|
||||
appimage.uninstall.error.remove_folder=No se pudo eliminar el directorio de instalación de la aplicación {}
|
||||
appimage.info.url_download=URL del archivo
|
||||
appimage.info.icon_path=icono
|
||||
appimage.history.0_version=versión
|
||||
appimage.history.1_published_at=fecha
|
||||
appimage.history.2_url_download=URL del archivo
|
||||
appimage.downgrade.impossible.title=Imposible revertir la versión
|
||||
appimage.downgrade.impossible.body={} solo tiene una versión publicada.
|
||||
appimage.downgrade.unknown_version.body=No fue posible identificar la versión actual de {} en su historial de versiones
|
||||
appimage.downgrade.first_version={} está en su primera versión publicada
|
||||
appimage.downgrade.uninstall_current_version=No fue posible desinstalar la versión actual de {}
|
||||
appimage.downgrade.install_version=No fue posible instalar la versión {} ({})
|
||||
appimage.install.download.error=No fue posible descargar el archivo {}. El servidor del archivo puede estar inactivo.
|
||||
appimage.install.appimagelauncher.error={appimgl} no permite la instalación de {app}. Desinstale {appimgl}, reinicie su sistema e intente instalar {app} nuevamente.
|
||||
appimage.config.db_updates=Actualización de la base de datos
|
||||
appimage.config.db_updates.activated=activada
|
||||
appimage.config.db_updates.activated.tip=Será posible buscar actualizaciones relacionadas con las aplicaciones instaladas
|
||||
appimage.config.db_updates.interval.tip=Intervalo de actualización en SEGUNDOS
|
||||
appimage.config.db_updates.interval.tip=Intervalo de actualización en SEGUNDOS
|
||||
appimage.custom_action.install_file=Instalar archivo AppImage
|
||||
appimage.custom_action.install_file.details=Detalles de instalación
|
||||
appimage.custom_action.install_file.invalid_file=Debe definir un archivo AppImage válido
|
||||
appimage.custom_action.install_file.invalid_name=Debe definir un nombre para la aplicación
|
||||
appimage.custom_action.install_file.status=Instalando archivo AppImage
|
||||
appimage.custom_action.manual_update=Actualizar archivo
|
||||
appimage.custom_action.manual_update.details=Detalles de actualización
|
||||
appimage.custom_action.manual_update.status=Actualizando
|
||||
appimage.downgrade.first_version={} está en su primera versión publicada
|
||||
appimage.downgrade.impossible.body={} solo tiene una versión publicada.
|
||||
appimage.downgrade.impossible.title=Imposible revertir la versión
|
||||
appimage.downgrade.install_version=No fue posible instalar la versión {} ({})
|
||||
appimage.downgrade.unknown_version.body=No fue posible identificar la versión actual de {} en su historial de versiones
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=versión
|
||||
appimage.history.1_published_at=fecha
|
||||
appimage.history.2_url_download=URL del archivo
|
||||
appimage.info.icon_path=icono
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Sí
|
||||
appimage.info.install_dir=Directorio de instalación
|
||||
appimage.info.url_download=URL del archivo
|
||||
appimage.install.appimagelauncher.error={appimgl} no permite la instalación de {app}. Desinstale {appimgl}, reinicie su sistema e intente instalar {app} nuevamente.
|
||||
appimage.install.desktop_entry=Creando un atajo en el menú
|
||||
appimage.install.download.error=No fue posible descargar el archivo {}. El servidor del archivo puede estar inactivo.
|
||||
appimage.install.extract=Extrayendo el contenido de {}
|
||||
appimage.install.imported.rename_error=No fue posible mover el archivo {} a {}
|
||||
appimage.install.permission=Concediendo permiso de ejecución a {}
|
||||
appimage.task.db_update=Actualizando base de datos
|
||||
appimage.uninstall.error.remove_folder=No se pudo eliminar el directorio de instalación de la aplicación {}
|
||||
gem.appimage.info=Aplicativos publicados en https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,24 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Applicazioni pubblicate su https://appimage.github.io/
|
||||
appimage.install.permission=Gdare il permesso di esecuzione a {}
|
||||
appimage.install.extract=Estrarre il contenuto da {}
|
||||
appimage.install.desktop_entry=Genera un collegamento al menu
|
||||
appimage.uninstall.error.remove_folder=Impossibile rimuovere la directory di installazione dell'applicazione {}
|
||||
appimage.info.url_download=File URL
|
||||
appimage.info.icon_path=icona
|
||||
appimage.history.0_version=versione
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=File URL
|
||||
appimage.downgrade.impossible.title=Impossibile eseguire il downgrade
|
||||
appimage.downgrade.impossible.body={} ha solo una versione pubblicata.
|
||||
appimage.downgrade.unknown_version.body=Non è stato possibile identificare la {} versione corrente nella sua cronologia delle versioni
|
||||
appimage.downgrade.first_version={} è nella sua prima versione pubblicata
|
||||
appimage.error.uninstall_current_version = Non è stato possibile disinstallare la versione corrente di {}
|
||||
appimage.downgrade.install_version=Non è stato possibile installare la versione {} ({})
|
||||
appimage.install.download.error=Non è stato possibile scaricare il file {}. Il file server può essere inattivo.
|
||||
appimage.install.appimagelauncher.error={appimgl} non consente l'installazione di {app}. Disinstallare {appimgl}, riavviare il sistema e provare a installare nuovamente {app}.
|
||||
appimage.config.db_updates=Database update
|
||||
appimage.config.db_updates.activated=activated
|
||||
appimage.config.db_updates.activated.tip=It will be possible to check for updates related to the installed applications
|
||||
appimage.config.db_updates.interval.tip=Update interval in SECONDS
|
||||
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.details=Installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.details=Upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.downgrade.first_version={} è nella sua prima versione pubblicata
|
||||
appimage.downgrade.impossible.body={} ha solo una versione pubblicata.
|
||||
appimage.downgrade.impossible.title=Impossibile eseguire il downgrade
|
||||
appimage.downgrade.install_version=Non è stato possibile installare la versione {} ({})
|
||||
appimage.downgrade.unknown_version.body=Non è stato possibile identificare la {} versione corrente nella sua cronologia delle versioni
|
||||
appimage.error.uninstall_current_version=Non è stato possibile disinstallare la versione corrente di {}
|
||||
appimage.history.0_version=versione
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=File URL
|
||||
appimage.info.icon_path=icona
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.url_download=File URL
|
||||
appimage.install.appimagelauncher.error={appimgl} non consente l'installazione di {app}. Disinstallare {appimgl}, riavviare il sistema e provare a installare nuovamente {app}.
|
||||
appimage.install.desktop_entry=Genera un collegamento al menu
|
||||
appimage.install.download.error=Non è stato possibile scaricare il file {}. Il file server può essere inattivo.
|
||||
appimage.install.extract=Estrarre il contenuto da {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=Gdare il permesso di esecuzione a {}
|
||||
appimage.task.db_update=Aggiornamento dei database
|
||||
appimage.uninstall.error.remove_folder=Impossibile rimuovere la directory di installazione dell'applicazione {}
|
||||
gem.appimage.info=Applicazioni pubblicate su https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,23 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Aplicativos publicados em https://appimage.github.io/
|
||||
appimage.install.permission=Concedendo permissão de execução para {}
|
||||
appimage.install.extract=Extraindo o conteúdo de {}
|
||||
appimage.install.desktop_entry=Criando um atalho no menu
|
||||
appimage.uninstall.error.remove_folder=Não foi possível remover o diretóri ode instalação do aplicativo {}
|
||||
appimage.info.url_download=URL do arquivo
|
||||
appimage.info.icon_path=ícone
|
||||
appimage.history.0_version=versão
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=URL do arquivo
|
||||
appimage.downgrade.impossible.title=Impossível reverter a versão
|
||||
appimage.downgrade.impossible.body={} tem somente uma versão publicada.
|
||||
appimage.downgrade.unknown_version.body=Não foi possível identificar a versão atual de {} no seu histórico de versões
|
||||
appimage.downgrade.first_version={} se encontra em sua primeira versão publicada
|
||||
appimage.downgrade.uninstall_current_version=Não foi possível desinstalar a versão atual de {}
|
||||
appimage.downgrade.install_version=Não foi possivel instalar a versão {} ({})
|
||||
appimage.install.download.error=Não foi possível baixar o arquivo {}. O servidor do arquivo pode estar fora do ar.
|
||||
appimage.install.appimagelauncher.error={appimgl} não está permitindo que o {app} seja instalado. Desinstale o {appimgl}, reinicie o sistema e tente instalar o {app} novamente.
|
||||
appimage.config.db_updates=Atualização da base de dados
|
||||
appimage.config.db_updates.activated=ativada
|
||||
appimage.config.db_updates.activated.tip=Será possível verificar se há atualizações para os aplicativos instalados
|
||||
appimage.config.db_updates.interval.tip=Intervalo de atualização em SEGUNDOS
|
||||
appimage.config.db_updates.interval.tip=Intervalo de atualização em SEGUNDOS
|
||||
appimage.custom_action.install_file=Instalar arquivo AppImage
|
||||
appimage.custom_action.install_file.details=Detalhes de instalação
|
||||
appimage.custom_action.install_file.invalid_file=Você precisa definir um arquivo AppImage válido
|
||||
appimage.custom_action.install_file.invalid_name=Você precisa definir um nome para o aplicativo
|
||||
appimage.custom_action.install_file.status=Instalando arquivo AppImage
|
||||
appimage.custom_action.manual_update=Atualizar arquivo
|
||||
appimage.custom_action.manual_update.details=Detalhes de atualização
|
||||
appimage.custom_action.manual_update.status=Atualizando
|
||||
appimage.downgrade.first_version={} se encontra em sua primeira versão publicada
|
||||
appimage.downgrade.impossible.body={} tem somente uma versão publicada.
|
||||
appimage.downgrade.impossible.title=Impossível reverter a versão
|
||||
appimage.downgrade.install_version=Não foi possivel instalar a versão {} ({})
|
||||
appimage.downgrade.unknown_version.body=Não foi possível identificar a versão atual de {} no seu histórico de versões
|
||||
appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {}
|
||||
appimage.history.0_version=versão
|
||||
appimage.history.1_published_at=data
|
||||
appimage.history.2_url_download=URL do arquivo
|
||||
appimage.info.icon_path=ícone
|
||||
appimage.info.imported.false=Não
|
||||
appimage.info.imported.true=Sim
|
||||
appimage.info.install_dir=Diretório de instalação
|
||||
appimage.info.url_download=URL do arquivo
|
||||
appimage.install.appimagelauncher.error={appimgl} não está permitindo que o {app} seja instalado. Desinstale o {appimgl}, reinicie o sistema e tente instalar o {app} novamente.
|
||||
appimage.install.desktop_entry=Criando um atalho no menu
|
||||
appimage.install.download.error=Não foi possível baixar o arquivo {}. O servidor do arquivo pode estar fora do ar.
|
||||
appimage.install.extract=Extraindo o conteúdo de {}
|
||||
appimage.install.imported.rename_error=Não foi possível mover o arquivo {} para {}
|
||||
appimage.install.permission=Concedendo permissão de execução para {}
|
||||
appimage.task.db_update=Atualizando base de dados
|
||||
appimage.uninstall.error.remove_folder=Não foi possível remover o diretóri ode instalação do aplicativo {}
|
||||
gem.appimage.info=Aplicativos publicados em https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -1,23 +1,36 @@
|
||||
gem.appimage.label=AppImage
|
||||
gem.appimage.info=Приложения, опубликованные на https://appimage.github.io/
|
||||
appimage.install.permission=Установить права на выполнение для {}
|
||||
appimage.install.extract=Извлечь содержимое из {}
|
||||
appimage.install.desktop_entry=Создать ярлык в меню
|
||||
appimage.uninstall.error.remove_folder=Не удалось удалить каталог приложения {}
|
||||
appimage.info.url_download=URL Файла
|
||||
appimage.info.icon_path=Значок
|
||||
appimage.history.0_version=версия
|
||||
appimage.history.1_published_at=дата
|
||||
appimage.history.2_url_download=URL Файла
|
||||
appimage.downgrade.impossible.title=Не удалось понизить версию
|
||||
appimage.downgrade.impossible.body={} Имеет только одну опубликованную версию
|
||||
appimage.downgrade.unknown_version.body=Не удалось определить текущую версию {} в истории версий
|
||||
appimage.downgrade.first_version={} первая опубликованная версия
|
||||
appimage.error.uninstall_current_version=Не удалось удалить текущую версию {}
|
||||
appimage.downgrade.install_version=Не удалось установить версию {} ({})
|
||||
appimage.install.download.error=Не удалось загрузить файл {}. Файловый сервер не отвечает
|
||||
appimage.install.appimagelauncher.error={appimgl} не позволяет установить {app} . Удалите {appimgl}, перезагрузите ваш компьютер и попробуйте снова установить {app} .
|
||||
appimage.config.db_updates=Обновление базы данных
|
||||
appimage.config.db_updates.activated=активировать
|
||||
appimage.config.db_updates.activated.tip=Позволит проверять обновления установленных приложений
|
||||
appimage.config.db_updates.interval.tip=Интервал обновления в секундах
|
||||
appimage.custom_action.install_file=Install AppImage file
|
||||
appimage.custom_action.install_file.details=Installation details
|
||||
appimage.custom_action.install_file.invalid_file=You must define a valid AppImage file
|
||||
appimage.custom_action.install_file.invalid_name=You must define a name for the application
|
||||
appimage.custom_action.install_file.status=Installing AppImage file
|
||||
appimage.custom_action.manual_update=Upgrade file
|
||||
appimage.custom_action.manual_update.details=Upgrade details
|
||||
appimage.custom_action.manual_update.status=Upgrading
|
||||
appimage.downgrade.first_version={} первая опубликованная версия
|
||||
appimage.downgrade.impossible.body={} Имеет только одну опубликованную версию
|
||||
appimage.downgrade.impossible.title=Не удалось понизить версию
|
||||
appimage.downgrade.install_version=Не удалось установить версию {} ({})
|
||||
appimage.downgrade.unknown_version.body=Не удалось определить текущую версию {} в истории версий
|
||||
appimage.error.uninstall_current_version=Не удалось удалить текущую версию {}
|
||||
appimage.history.0_version=версия
|
||||
appimage.history.1_published_at=дата
|
||||
appimage.history.2_url_download=URL Файла
|
||||
appimage.info.icon_path=Значок
|
||||
appimage.info.imported.false=No
|
||||
appimage.info.imported.true=Yes
|
||||
appimage.info.install_dir=Installation directory
|
||||
appimage.info.url_download=URL Файла
|
||||
appimage.install.appimagelauncher.error={appimgl} не позволяет установить {app} . Удалите {appimgl}, перезагрузите ваш компьютер и попробуйте снова установить {app} .
|
||||
appimage.install.desktop_entry=Создать ярлык в меню
|
||||
appimage.install.download.error=Не удалось загрузить файл {}. Файловый сервер не отвечает
|
||||
appimage.install.extract=Извлечь содержимое из {}
|
||||
appimage.install.imported.rename_error=It was not possible to move the file {} to {}
|
||||
appimage.install.permission=Установить права на выполнение для {}
|
||||
appimage.task.db_update=Updating databases
|
||||
appimage.uninstall.error.remove_folder=Не удалось удалить каталог приложения {}
|
||||
gem.appimage.info=Приложения, опубликованные на https://appimage.github.io/
|
||||
gem.appimage.label=AppImage
|
||||
@@ -9,33 +9,54 @@ from threading import Thread
|
||||
|
||||
import requests
|
||||
|
||||
from bauh.api.abstract.handler import TaskManager
|
||||
from bauh.api.http import HttpClient
|
||||
from bauh.commons import internet
|
||||
from bauh.gems.appimage import LOCAL_PATH
|
||||
from bauh.gems.appimage import LOCAL_PATH, get_icon_path
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class DatabaseUpdater(Thread):
|
||||
URL_DB = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/dbs.tar.gz'
|
||||
COMPRESS_FILE_PATH = LOCAL_PATH + '/db.tar.gz'
|
||||
|
||||
def __init__(self, http_client: HttpClient, logger: logging.Logger, db_locks: dict, interval: int):
|
||||
def __init__(self, task_man: TaskManager, i18n: I18n, http_client: HttpClient, logger: logging.Logger, db_locks: dict, interval: int):
|
||||
super(DatabaseUpdater, self).__init__(daemon=True)
|
||||
self.http_client = http_client
|
||||
self.logger = logger
|
||||
self.db_locks = db_locks
|
||||
self.sleep = interval
|
||||
self.i18n = i18n
|
||||
self.task_man = task_man
|
||||
self.task_id = 'appim_db'
|
||||
|
||||
def _finish_task(self):
|
||||
if self.task_man:
|
||||
self.task_man.update_progress(self.task_id, 100, None)
|
||||
self.task_man.finish_task(self.task_id)
|
||||
self.task_man = None
|
||||
|
||||
def download_databases(self):
|
||||
if self.task_man:
|
||||
self.task_man.register_task(self.task_id, self.i18n['appimage.task.db_update'], get_icon_path())
|
||||
self.task_man.update_progress(self.task_id, 10, None)
|
||||
|
||||
try:
|
||||
if not internet.is_available(self.http_client, self.logger):
|
||||
if not internet.is_available():
|
||||
self._finish_task()
|
||||
return
|
||||
except requests.exceptions.ConnectionError:
|
||||
self.logger.warning('The internet connection seems to be off.')
|
||||
self._finish_task()
|
||||
return
|
||||
|
||||
self.logger.info('Retrieving AppImage databases')
|
||||
|
||||
res = self.http_client.get(self.URL_DB)
|
||||
try:
|
||||
res = self.http_client.get(self.URL_DB, session=False)
|
||||
except Exception as e:
|
||||
self.logger.error("An error ocurred while downloading the AppImage database: {}".format(e.__class__.__name__))
|
||||
res = None
|
||||
|
||||
if res:
|
||||
Path(LOCAL_PATH).mkdir(parents=True, exist_ok=True)
|
||||
@@ -71,9 +92,10 @@ class DatabaseUpdater(Thread):
|
||||
self.logger.info('Deleting {}'.format(self.COMPRESS_FILE_PATH))
|
||||
os.remove(self.COMPRESS_FILE_PATH)
|
||||
self.logger.info('Successfully removed {}'.format(self.COMPRESS_FILE_PATH))
|
||||
|
||||
self._finish_task()
|
||||
else:
|
||||
self.logger.warning('Could not download the database file {}'.format(self.URL_DB))
|
||||
self._finish_task()
|
||||
|
||||
def run(self):
|
||||
while True:
|
||||
|
||||
Reference in New Issue
Block a user