0.9.0
@@ -1,6 +1,3 @@
|
||||
import logging
|
||||
import os
|
||||
import traceback
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
@@ -21,17 +18,12 @@ def read_config(update_file: bool = False) -> dict:
|
||||
},
|
||||
'locale': None,
|
||||
'updates': {
|
||||
'check_interval': 30,
|
||||
'sort_packages': True,
|
||||
"pre_dependency_checking": True
|
||||
'check_interval': 30
|
||||
},
|
||||
'system': {
|
||||
'notifications': True,
|
||||
'single_dependency_checking': False
|
||||
},
|
||||
'disk_cache': {
|
||||
'enabled': True
|
||||
},
|
||||
'suggestions': {
|
||||
'enabled': True,
|
||||
'by_type': 10
|
||||
@@ -52,7 +44,20 @@ def read_config(update_file: bool = False) -> dict:
|
||||
'download': {
|
||||
'multithreaded': True,
|
||||
'icons': True
|
||||
},
|
||||
'store_root_password': True,
|
||||
'disk': {
|
||||
'trim_after_update': False
|
||||
},
|
||||
'backup': {
|
||||
'enabled': True,
|
||||
'install': None,
|
||||
'uninstall': None,
|
||||
'downgrade': None,
|
||||
'upgrade': None,
|
||||
'mode': 'incremental'
|
||||
}
|
||||
|
||||
}
|
||||
return read(FILE_PATH, default, update_file=update_file, update_async=True)
|
||||
|
||||
@@ -62,14 +67,3 @@ def save(config: dict):
|
||||
|
||||
with open(FILE_PATH, 'w+') as f:
|
||||
f.write(yaml.safe_dump(config))
|
||||
|
||||
|
||||
def remove_old_config(logger: logging.Logger):
|
||||
old_file = FILE_PATH.replace('.yml', '.json')
|
||||
if os.path.exists(old_file):
|
||||
try:
|
||||
os.remove(old_file)
|
||||
logger.info('Old configuration file {} deleted'.format(old_file))
|
||||
except:
|
||||
logger.error('Could not delete the old configuration file {}'.format(old_file))
|
||||
traceback.print_exc()
|
||||
|
||||
@@ -1,21 +1,38 @@
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
import traceback
|
||||
from pathlib import Path
|
||||
from threading import Thread
|
||||
from typing import List, Set, Type, Tuple
|
||||
from typing import List, Set, Type, Tuple, Dict
|
||||
|
||||
from bauh.api.abstract.controller import SoftwareManager, SearchResult, ApplicationContext
|
||||
from bauh import __app_name__, __version__
|
||||
from bauh.api.abstract.controller import SoftwareManager, SearchResult, ApplicationContext, UpgradeRequirements, \
|
||||
UpgradeRequirement
|
||||
from bauh.api.abstract.disk import DiskCacheLoader
|
||||
from bauh.api.abstract.handler import ProcessWatcher
|
||||
from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, PackageAction
|
||||
from bauh.api.abstract.handler import ProcessWatcher, TaskManager
|
||||
from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, \
|
||||
CustomSoftwareAction
|
||||
from bauh.api.abstract.view import ViewComponent, TabGroupComponent
|
||||
from bauh.api.constants import CACHE_PATH
|
||||
from bauh.api.exception import NoInternetException
|
||||
from bauh.commons import internet
|
||||
from bauh.commons.html import bold, link
|
||||
from bauh.view.core.settings import GenericSettingsManager
|
||||
|
||||
RE_IS_URL = re.compile(r'^https?://.+')
|
||||
|
||||
|
||||
class GenericUpgradeRequirements(UpgradeRequirements):
|
||||
|
||||
def __init__(self, to_install: List[UpgradeRequirement], to_remove: List[UpgradeRequirement],
|
||||
to_upgrade: List[UpgradeRequirement], cannot_upgrade: List[SoftwarePackage],
|
||||
sub_requirements: Dict[SoftwareManager, UpgradeRequirements]):
|
||||
super(GenericUpgradeRequirements, self).__init__(to_install=to_install, to_upgrade=to_upgrade,
|
||||
to_remove=to_remove, cannot_upgrade=cannot_upgrade)
|
||||
self.sub_requirements = sub_requirements
|
||||
|
||||
|
||||
class GenericSoftwareManager(SoftwareManager):
|
||||
|
||||
def __init__(self, managers: List[SoftwareManager], context: ApplicationContext, config: dict,
|
||||
@@ -32,6 +49,7 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
self.working_managers = []
|
||||
self.config = config
|
||||
self.settings_manager = settings_manager
|
||||
self.http_client = context.http_client
|
||||
|
||||
def reset_cache(self):
|
||||
if self._available_cache is not None:
|
||||
@@ -100,7 +118,7 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
|
||||
res = SearchResult([], [], 0)
|
||||
|
||||
if internet.is_available(self.context.http_client, self.context.logger):
|
||||
if internet.is_available():
|
||||
norm_word = word.strip().lower()
|
||||
|
||||
url_words = RE_IS_URL.match(norm_word)
|
||||
@@ -142,26 +160,15 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
def can_work(self) -> bool:
|
||||
return True
|
||||
|
||||
def _is_internet_available(self, res: dict):
|
||||
res['available'] = internet.is_available(self.context.http_client, self.context.logger)
|
||||
|
||||
def _get_internet_check(self, res: dict) -> Thread:
|
||||
t = Thread(target=self._is_internet_available, args=(res,))
|
||||
t.start()
|
||||
return t
|
||||
|
||||
def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, net_check: bool = None) -> SearchResult:
|
||||
def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None) -> SearchResult:
|
||||
ti = time.time()
|
||||
self._wait_to_be_ready()
|
||||
|
||||
net_check = {}
|
||||
thread_internet_check = self._get_internet_check(net_check)
|
||||
|
||||
res = SearchResult([], None, 0)
|
||||
|
||||
disk_loader = None
|
||||
|
||||
internet_available = None
|
||||
net_available = internet.is_available()
|
||||
if not pkg_types: # any type
|
||||
for man in self.managers:
|
||||
if self._can_work(man):
|
||||
@@ -169,12 +176,8 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
disk_loader = self.disk_loader_factory.new()
|
||||
disk_loader.start()
|
||||
|
||||
if internet_available is None:
|
||||
thread_internet_check.join()
|
||||
internet_available = net_check.get('available', True)
|
||||
|
||||
mti = time.time()
|
||||
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available)
|
||||
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_available)
|
||||
mtf = time.time()
|
||||
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(mtf - mti))
|
||||
|
||||
@@ -191,12 +194,8 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
disk_loader = self.disk_loader_factory.new()
|
||||
disk_loader.start()
|
||||
|
||||
if internet_available is None:
|
||||
thread_internet_check.join()
|
||||
internet_available = net_check.get('available', True)
|
||||
|
||||
mti = time.time()
|
||||
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available)
|
||||
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_available)
|
||||
mtf = time.time()
|
||||
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(mtf - mti))
|
||||
|
||||
@@ -229,11 +228,14 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
if man:
|
||||
return man.clean_cache_for(app)
|
||||
|
||||
def update(self, app: SoftwarePackage, root_password: str, handler: ProcessWatcher) -> bool:
|
||||
man = self._get_manager_for(app)
|
||||
def upgrade(self, requirements: GenericUpgradeRequirements, root_password: str, handler: ProcessWatcher) -> bool:
|
||||
for man, man_reqs in requirements.sub_requirements.items():
|
||||
res = man.upgrade(man_reqs, root_password, handler)
|
||||
|
||||
if man:
|
||||
return man.update(app, root_password, handler)
|
||||
if not res:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def uninstall(self, app: SoftwarePackage, root_password: str, handler: ProcessWatcher) -> bool:
|
||||
man = self._get_manager_for(app)
|
||||
@@ -283,56 +285,100 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
return man if man and self._can_work(man) else None
|
||||
|
||||
def cache_to_disk(self, pkg: SoftwarePackage, icon_bytes: bytes, only_icon: bool):
|
||||
if self.context.disk_cache and pkg.supports_disk_cache():
|
||||
if pkg.supports_disk_cache():
|
||||
man = self._get_manager_for(pkg)
|
||||
|
||||
if man:
|
||||
return man.cache_to_disk(pkg, icon_bytes=icon_bytes, only_icon=only_icon)
|
||||
|
||||
def requires_root(self, action: str, app: SoftwarePackage):
|
||||
man = self._get_manager_for(app)
|
||||
def requires_root(self, action: str, app: SoftwarePackage) -> bool:
|
||||
if app is None:
|
||||
if self.managers:
|
||||
for man in self.managers:
|
||||
if self._can_work(man):
|
||||
if man.requires_root(action, app):
|
||||
return True
|
||||
return False
|
||||
else:
|
||||
man = self._get_manager_for(app)
|
||||
|
||||
if man:
|
||||
return man.requires_root(action, app)
|
||||
if man:
|
||||
return man.requires_root(action, app)
|
||||
|
||||
def _prepare(self):
|
||||
def prepare(self, task_manager: TaskManager, root_password: str, internet_available: bool):
|
||||
if self.managers:
|
||||
internet_on = internet.is_available()
|
||||
for man in self.managers:
|
||||
if man not in self._already_prepared and self._can_work(man):
|
||||
man.prepare()
|
||||
if task_manager:
|
||||
man.prepare(task_manager, root_password, internet_on)
|
||||
self._already_prepared.append(man)
|
||||
|
||||
def prepare(self):
|
||||
self.thread_prepare = Thread(target=self._prepare)
|
||||
self.thread_prepare.start()
|
||||
|
||||
def list_updates(self, net_check: bool = None) -> List[PackageUpdate]:
|
||||
def list_updates(self, internet_available: bool = None) -> List[PackageUpdate]:
|
||||
self._wait_to_be_ready()
|
||||
|
||||
updates = []
|
||||
|
||||
if self.managers:
|
||||
net_check = {}
|
||||
thread_internet_check = self._get_internet_check(net_check)
|
||||
net_available = internet.is_available()
|
||||
|
||||
for man in self.managers:
|
||||
if self._can_work(man):
|
||||
|
||||
if thread_internet_check.is_alive():
|
||||
thread_internet_check.join()
|
||||
|
||||
man_updates = man.list_updates(internet_available=net_check['available'])
|
||||
man_updates = man.list_updates(internet_available=net_available)
|
||||
if man_updates:
|
||||
updates.extend(man_updates)
|
||||
|
||||
return updates
|
||||
|
||||
def _check_for_updates(self) -> str:
|
||||
self.logger.info("Checking for updates")
|
||||
|
||||
try:
|
||||
releases = self.http_client.get_json('https://api.github.com/repos/vinifmor/bauh/releases')
|
||||
|
||||
if releases:
|
||||
latest = None
|
||||
|
||||
for r in releases:
|
||||
if not r['draft']:
|
||||
latest = r
|
||||
break
|
||||
|
||||
if latest and latest.get('tag_name'):
|
||||
notifications_dir = '{}/updates'.format(CACHE_PATH)
|
||||
release_file = '{}/{}'.format(notifications_dir, latest['tag_name'])
|
||||
if os.path.exists(release_file):
|
||||
self.logger.info("Release {} already notified".format(latest['tag_name']))
|
||||
elif latest['tag_name'] > __version__:
|
||||
try:
|
||||
Path(notifications_dir).mkdir(parents=True, exist_ok=True)
|
||||
with open(release_file, 'w+') as f:
|
||||
f.write('')
|
||||
except:
|
||||
self.logger.error("An error occurred while trying to create the update notification file: {}".format(release_file))
|
||||
|
||||
return self.i18n['warning.update_available'].format(bold(__app_name__), bold(latest['tag_name']), link(latest.get('html_url', '?')))
|
||||
else:
|
||||
self.logger.info("No updates available")
|
||||
else:
|
||||
self.logger.warning("No official release found")
|
||||
else:
|
||||
self.logger.warning("No releases returned from the GitHub API")
|
||||
except:
|
||||
self.logger.error("An error occurred while trying to retrieve the current releases")
|
||||
|
||||
def list_warnings(self, internet_available: bool = None) -> List[str]:
|
||||
warnings = []
|
||||
|
||||
if self.managers:
|
||||
int_available = internet.is_available(self.context.http_client, self.context.logger)
|
||||
int_available = internet.is_available()
|
||||
|
||||
if int_available:
|
||||
updates_msg = self._check_for_updates()
|
||||
|
||||
if updates_msg:
|
||||
warnings.append(updates_msg)
|
||||
|
||||
if self.managers:
|
||||
for man in self.managers:
|
||||
if man.is_enabled():
|
||||
man_warnings = man.list_warnings(internet_available=int_available)
|
||||
@@ -360,7 +406,7 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
|
||||
def list_suggestions(self, limit: int, filter_installed: bool) -> List[PackageSuggestion]:
|
||||
if bool(self.config['suggestions']['enabled']):
|
||||
if self.managers and internet.is_available(self.context.http_client, self.context.logger):
|
||||
if self.managers and internet.is_available():
|
||||
suggestions, threads = [], []
|
||||
for man in self.managers:
|
||||
t = Thread(target=self._fill_suggestions, args=(suggestions, man, int(self.config['suggestions']['by_type']), filter_installed))
|
||||
@@ -376,11 +422,11 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
return suggestions
|
||||
return []
|
||||
|
||||
def execute_custom_action(self, action: PackageAction, pkg: SoftwarePackage, root_password: str, watcher: ProcessWatcher):
|
||||
man = self._get_manager_for(pkg)
|
||||
def execute_custom_action(self, action: CustomSoftwareAction, pkg: SoftwarePackage, root_password: str, watcher: ProcessWatcher):
|
||||
man = action.manager if action.manager else self._get_manager_for(pkg)
|
||||
|
||||
if man:
|
||||
return exec('man.{}(pkg=pkg, root_password=root_password, watcher=watcher)'.format(action.manager_method))
|
||||
return eval('man.{}({}root_password=root_password, watcher=watcher)'.format(action.manager_method, 'pkg=pkg, ' if pkg else ''))
|
||||
|
||||
def is_default_enabled(self) -> bool:
|
||||
return True
|
||||
@@ -418,9 +464,12 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
def save_settings(self, component: TabGroupComponent) -> Tuple[bool, List[str]]:
|
||||
return self.settings_manager.save_settings(component)
|
||||
|
||||
def sort_update_order(self, pkgs: List[SoftwarePackage]) -> List[SoftwarePackage]:
|
||||
def _map_pkgs_by_manager(self, pkgs: List[SoftwarePackage], pkg_filters: list = None) -> Dict[SoftwareManager, List[SoftwarePackage]]:
|
||||
by_manager = {}
|
||||
for pkg in pkgs:
|
||||
if pkg_filters and not all((1 for f in pkg_filters if f(pkg))):
|
||||
continue
|
||||
|
||||
man = self._get_manager_for(pkg)
|
||||
|
||||
if man:
|
||||
@@ -432,42 +481,75 @@ class GenericSoftwareManager(SoftwareManager):
|
||||
|
||||
man_pkgs.append(pkg)
|
||||
|
||||
sorted_list = []
|
||||
return by_manager
|
||||
|
||||
if by_manager:
|
||||
for man, pkgs in by_manager.items():
|
||||
if len(pkgs) > 1:
|
||||
ti = time.time()
|
||||
sorted_list.extend(man.sort_update_order(pkgs))
|
||||
tf = time.time()
|
||||
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(tf - ti))
|
||||
else:
|
||||
self.logger.info("Only one package to sort for {}. Ignoring sorting.".format(man.__class__.__name__))
|
||||
sorted_list.extend(pkgs)
|
||||
|
||||
return sorted_list
|
||||
|
||||
def get_update_requirements(self, pkgs: List[SoftwarePackage], watcher: ProcessWatcher) -> List[SoftwarePackage]:
|
||||
by_manager = {}
|
||||
for pkg in pkgs:
|
||||
man = self._get_manager_for(pkg)
|
||||
|
||||
if man:
|
||||
man_pkgs = by_manager.get(man)
|
||||
|
||||
if man_pkgs is None:
|
||||
man_pkgs = []
|
||||
by_manager[man] = man_pkgs
|
||||
|
||||
man_pkgs.append(pkg)
|
||||
|
||||
required = []
|
||||
def get_upgrade_requirements(self, pkgs: List[SoftwarePackage], root_password: str, watcher: ProcessWatcher) -> UpgradeRequirements:
|
||||
by_manager = self._map_pkgs_by_manager(pkgs)
|
||||
res = GenericUpgradeRequirements([], [], [], [], {})
|
||||
|
||||
if by_manager:
|
||||
for man, pkgs in by_manager.items():
|
||||
ti = time.time()
|
||||
required.extend(man.get_update_requirements(pkgs, watcher))
|
||||
man_reqs = man.get_upgrade_requirements(pkgs, root_password, watcher)
|
||||
tf = time.time()
|
||||
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(tf - ti))
|
||||
|
||||
return required
|
||||
if not man_reqs:
|
||||
return # it means the process should be stopped
|
||||
|
||||
if man_reqs:
|
||||
res.sub_requirements[man] = man_reqs
|
||||
if man_reqs.to_install:
|
||||
res.to_install.extend(man_reqs.to_install)
|
||||
|
||||
if man_reqs.to_remove:
|
||||
res.to_remove.extend(man_reqs.to_remove)
|
||||
|
||||
if man_reqs.to_upgrade:
|
||||
res.to_upgrade.extend(man_reqs.to_upgrade)
|
||||
|
||||
if man_reqs.cannot_upgrade:
|
||||
res.cannot_upgrade.extend(man_reqs.cannot_upgrade)
|
||||
|
||||
return res
|
||||
|
||||
def get_custom_actions(self) -> List[CustomSoftwareAction]:
|
||||
if self.managers:
|
||||
actions = []
|
||||
|
||||
working_managers = []
|
||||
|
||||
for man in self.managers:
|
||||
if self._can_work(man):
|
||||
working_managers.append(man)
|
||||
|
||||
if working_managers:
|
||||
working_managers.sort(key=lambda m: m.__class__.__name__)
|
||||
|
||||
for man in working_managers:
|
||||
man_actions = man.get_custom_actions()
|
||||
|
||||
if man_actions:
|
||||
actions.extend(man_actions)
|
||||
|
||||
return actions
|
||||
|
||||
def _fill_sizes(self, man: SoftwareManager, pkgs: List[SoftwarePackage]):
|
||||
ti = time.time()
|
||||
man.fill_sizes(pkgs)
|
||||
tf = time.time()
|
||||
self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(tf - ti))
|
||||
|
||||
def fill_sizes(self, pkgs: List[SoftwarePackage]):
|
||||
by_manager = self._map_pkgs_by_manager(pkgs, pkg_filters=[lambda p: p.size is None])
|
||||
|
||||
if by_manager:
|
||||
threads = []
|
||||
for man, man_pkgs in by_manager.items():
|
||||
if man_pkgs:
|
||||
t = Thread(target=self._fill_sizes, args=(man, man_pkgs), daemon=True)
|
||||
t.start()
|
||||
threads.append(t)
|
||||
|
||||
for t in threads:
|
||||
t.join()
|
||||
|
||||
@@ -11,7 +11,7 @@ from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.view import ViewComponent, TabComponent, InputOption, TextComponent, MultipleSelectComponent, \
|
||||
PanelComponent, FormComponent, TabGroupComponent, SingleSelectComponent, SelectViewType, TextInputComponent, \
|
||||
FileChooserComponent
|
||||
from bauh.view.core import config
|
||||
from bauh.view.core import config, timeshift
|
||||
from bauh.view.core.config import read_config
|
||||
from bauh.view.util import translation
|
||||
from bauh.view.util.translation import I18n
|
||||
@@ -70,6 +70,11 @@ class GenericSettingsManager:
|
||||
tabs.append(self._gen_tray_settings(core_config, screen_width, screen_height))
|
||||
tabs.append(self._gen_adv_settings(core_config, screen_width, screen_height))
|
||||
|
||||
bkp_settings = self._gen_backup_settings(core_config, screen_width, screen_height)
|
||||
|
||||
if bkp_settings:
|
||||
tabs.append(bkp_settings)
|
||||
|
||||
for tab in gem_tabs:
|
||||
tabs.append(tab)
|
||||
|
||||
@@ -78,12 +83,6 @@ class GenericSettingsManager:
|
||||
def _gen_adv_settings(self, core_config: dict, screen_width: int, screen_height: int) -> TabComponent:
|
||||
default_width = floor(0.11 * screen_width)
|
||||
|
||||
select_dcache = self._gen_bool_component(label=self.i18n['core.config.disk_cache'],
|
||||
tooltip=self.i18n['core.config.disk_cache.tip'],
|
||||
value=core_config['disk_cache']['enabled'],
|
||||
max_width=default_width,
|
||||
id_='dcache')
|
||||
|
||||
input_data_exp = TextInputComponent(label=self.i18n['core.config.mem_cache.data_exp'],
|
||||
tooltip=self.i18n['core.config.mem_cache.data_exp.tip'],
|
||||
value=str(core_config['memory_cache']['data_expiration']),
|
||||
@@ -98,17 +97,11 @@ class GenericSettingsManager:
|
||||
max_width=default_width,
|
||||
id_="icon_exp")
|
||||
|
||||
select_update_sort = self._gen_bool_component(label=self.i18n['core.config.updates.sort_pkgs'],
|
||||
tooltip=self.i18n['core.config.updates.sort_pkgs.tip'],
|
||||
value=bool(core_config['updates']['sort_packages']),
|
||||
max_width=default_width,
|
||||
id_="up_sort")
|
||||
|
||||
select_update_check = self._gen_bool_component(label=self.i18n['core.config.updates.dep_check'],
|
||||
tooltip=self.i18n['core.config.updates.dep_check.tip'],
|
||||
value=bool(core_config['updates']['pre_dependency_checking']),
|
||||
max_width=default_width,
|
||||
id_="up_dep_check")
|
||||
select_trim_up = self._gen_bool_component(label=self.i18n['core.config.trim_after_update'],
|
||||
tooltip=self.i18n['core.config.trim_after_update.tip'],
|
||||
value=bool(core_config['disk']['trim_after_update']),
|
||||
max_width=default_width,
|
||||
id_='trim_after_update')
|
||||
|
||||
select_dep_check = self._gen_bool_component(label=self.i18n['core.config.system.dep_checking'],
|
||||
tooltip=self.i18n['core.config.system.dep_checking.tip'],
|
||||
@@ -122,7 +115,7 @@ class GenericSettingsManager:
|
||||
max_width=default_width,
|
||||
value=core_config['download']['multithreaded'])
|
||||
|
||||
sub_comps = [FormComponent([select_dcache, select_dmthread, select_update_check, select_update_sort, select_dep_check, input_data_exp, input_icon_exp], spaces=False)]
|
||||
sub_comps = [FormComponent([select_dmthread, select_trim_up, select_dep_check, input_data_exp, input_icon_exp], spaces=False)]
|
||||
return TabComponent(self.i18n['core.config.tab.advanced'].capitalize(), PanelComponent(sub_comps), None, 'core.adv')
|
||||
|
||||
def _gen_tray_settings(self, core_config: dict, screen_width: int, screen_height: int) -> TabComponent:
|
||||
@@ -219,6 +212,12 @@ class GenericSettingsManager:
|
||||
max_width=default_width,
|
||||
id_='locale')
|
||||
|
||||
select_store_pwd = self._gen_bool_component(label=self.i18n['core.config.store_password'].capitalize(),
|
||||
tooltip=self.i18n['core.config.store_password.tip'].capitalize(),
|
||||
id_="store_pwd",
|
||||
max_width=default_width,
|
||||
value=bool(core_config['store_root_password']))
|
||||
|
||||
select_sysnotify = self._gen_bool_component(label=self.i18n['core.config.system.notifications'].capitalize(),
|
||||
tooltip=self.i18n['core.config.system.notifications.tip'].capitalize(),
|
||||
value=bool(core_config['system']['notifications']),
|
||||
@@ -238,7 +237,7 @@ class GenericSettingsManager:
|
||||
max_width=default_width,
|
||||
id_="sugs_by_type")
|
||||
|
||||
sub_comps = [FormComponent([select_locale, select_sysnotify, select_sugs, inp_sugs], spaces=False)]
|
||||
sub_comps = [FormComponent([select_locale, select_store_pwd, select_sysnotify, select_sugs, inp_sugs], spaces=False)]
|
||||
return TabComponent(self.i18n['core.config.tab.general'].capitalize(), PanelComponent(sub_comps), None, 'core.gen')
|
||||
|
||||
def _gen_bool_component(self, label: str, tooltip: str, value: bool, id_: str, max_width: int = 200) -> SingleSelectComponent:
|
||||
@@ -256,6 +255,7 @@ class GenericSettingsManager:
|
||||
|
||||
def _save_settings(self, general: PanelComponent,
|
||||
advanced: PanelComponent,
|
||||
backup: PanelComponent,
|
||||
ui: PanelComponent,
|
||||
tray: PanelComponent,
|
||||
gems_panel: PanelComponent) -> Tuple[bool, List[str]]:
|
||||
@@ -271,20 +271,17 @@ class GenericSettingsManager:
|
||||
|
||||
core_config['system']['notifications'] = general_form.get_component('sys_notify').get_selected()
|
||||
core_config['suggestions']['enabled'] = general_form.get_component('sugs_enabled').get_selected()
|
||||
core_config['store_root_password'] = general_form.get_component('store_pwd').get_selected()
|
||||
|
||||
sugs_by_type = general_form.get_component('sugs_by_type').get_int_value()
|
||||
core_config['suggestions']['by_type'] = sugs_by_type
|
||||
|
||||
# advanced
|
||||
adv_form = advanced.components[0]
|
||||
core_config['disk_cache']['enabled'] = adv_form.get_component('dcache').get_selected()
|
||||
|
||||
download_mthreaded = adv_form.get_component('down_mthread').get_selected()
|
||||
core_config['download']['multithreaded'] = download_mthreaded
|
||||
|
||||
core_config['updates']['pre_dependency_checking'] = adv_form.get_component('up_dep_check').get_selected()
|
||||
core_config['updates']['sort_packages'] = adv_form.get_component('up_sort').get_selected()
|
||||
|
||||
single_dep_check = adv_form.get_component('dep_check').get_selected()
|
||||
core_config['system']['single_dependency_checking'] = single_dep_check
|
||||
|
||||
@@ -294,6 +291,19 @@ class GenericSettingsManager:
|
||||
icon_exp = adv_form.get_component('icon_exp').get_int_value()
|
||||
core_config['memory_cache']['icon_expiration'] = icon_exp
|
||||
|
||||
core_config['disk']['trim_after_update'] = adv_form.get_component('trim_after_update').get_selected()
|
||||
|
||||
# backup
|
||||
if backup:
|
||||
bkp_form = backup.components[0]
|
||||
|
||||
core_config['backup']['enabled'] = bkp_form.get_component('enabled').get_selected()
|
||||
core_config['backup']['mode'] = bkp_form.get_component('mode').get_selected()
|
||||
core_config['backup']['install'] = bkp_form.get_component('install').get_selected()
|
||||
core_config['backup']['uninstall'] = bkp_form.get_component('uninstall').get_selected()
|
||||
core_config['backup']['upgrade'] = bkp_form.get_component('upgrade').get_selected()
|
||||
core_config['backup']['downgrade'] = bkp_form.get_component('downgrade').get_selected()
|
||||
|
||||
# tray
|
||||
tray_form = tray.components[0]
|
||||
core_config['updates']['check_interval'] = tray_form.get_component('updates_interval').get_int_value()
|
||||
@@ -346,9 +356,11 @@ class GenericSettingsManager:
|
||||
|
||||
saved, warnings = True, []
|
||||
|
||||
bkp = component.get_tab('core.bkp')
|
||||
success, errors = self._save_settings(general=component.get_tab('core.gen').content,
|
||||
advanced=component.get_tab('core.adv').content,
|
||||
tray=component.get_tab('core.tray').content,
|
||||
backup=bkp.content if bkp else None,
|
||||
ui=component.get_tab('core.ui').content,
|
||||
gems_panel=component.get_tab('core.types').content)
|
||||
|
||||
@@ -378,3 +390,71 @@ class GenericSettingsManager:
|
||||
warnings.extend(errors)
|
||||
|
||||
return saved, warnings
|
||||
|
||||
def _gen_backup_settings(self, core_config: dict, screen_width: int, screen_height: int) -> TabComponent:
|
||||
if timeshift.is_available():
|
||||
default_width = floor(0.22 * screen_width)
|
||||
|
||||
enabled_opt = self._gen_bool_component(label=self.i18n['core.config.backup'],
|
||||
tooltip=None,
|
||||
value=bool(core_config['backup']['enabled']),
|
||||
id_='enabled',
|
||||
max_width=default_width)
|
||||
|
||||
ops_opts = [(self.i18n['yes'].capitalize(), True, None),
|
||||
(self.i18n['no'].capitalize(), False, None),
|
||||
(self.i18n['ask'].capitalize(), None, None)]
|
||||
|
||||
install_mode = self._gen_select(label=self.i18n['core.config.backup.install'],
|
||||
tip=None,
|
||||
value=core_config['backup']['install'],
|
||||
opts=ops_opts,
|
||||
max_width=default_width,
|
||||
id_='install')
|
||||
|
||||
uninstall_mode = self._gen_select(label=self.i18n['core.config.backup.uninstall'],
|
||||
tip=None,
|
||||
value=core_config['backup']['uninstall'],
|
||||
opts=ops_opts,
|
||||
max_width=default_width,
|
||||
id_='uninstall')
|
||||
|
||||
upgrade_mode = self._gen_select(label=self.i18n['core.config.backup.upgrade'],
|
||||
tip=None,
|
||||
value=core_config['backup']['upgrade'],
|
||||
opts=ops_opts,
|
||||
max_width=default_width,
|
||||
id_='upgrade')
|
||||
|
||||
downgrade_mode = self._gen_select(label=self.i18n['core.config.backup.downgrade'],
|
||||
tip=None,
|
||||
value=core_config['backup']['downgrade'],
|
||||
opts=ops_opts,
|
||||
max_width=default_width,
|
||||
id_='downgrade')
|
||||
|
||||
mode = self._gen_select(label=self.i18n['core.config.backup.mode'],
|
||||
tip=None,
|
||||
value=core_config['backup']['mode'],
|
||||
opts=[
|
||||
(self.i18n['core.config.backup.mode.incremental'], 'incremental', self.i18n['core.config.backup.mode.incremental.tip']),
|
||||
(self.i18n['core.config.backup.mode.only_one'], 'only_one', self.i18n['core.config.backup.mode.only_one.tip'])
|
||||
],
|
||||
max_width=default_width,
|
||||
id_='mode')
|
||||
|
||||
sub_comps = [FormComponent([enabled_opt, mode, install_mode, uninstall_mode, upgrade_mode, downgrade_mode], spaces=False)]
|
||||
return TabComponent(self.i18n['core.config.tab.backup'].capitalize(), PanelComponent(sub_comps), None, 'core.bkp')
|
||||
|
||||
def _gen_select(self, label: str, tip: str, id_: str, opts: List[tuple], value: str, max_width: int, type_: SelectViewType = SelectViewType.RADIO):
|
||||
inp_opts = [InputOption(label=o[0].capitalize(), value=o[1], tooltip=o[2]) for o in opts]
|
||||
def_opt = [o for o in inp_opts if o.value == value]
|
||||
return SingleSelectComponent(label=label,
|
||||
tooltip=tip,
|
||||
options=inp_opts,
|
||||
default_option=def_opt[0] if def_opt else inp_opts[0],
|
||||
max_per_line=len(inp_opts),
|
||||
max_width=max_width,
|
||||
type_=type_,
|
||||
id_=id_)
|
||||
|
||||
|
||||
13
bauh/view/core/timeshift.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from bauh.commons.system import run_cmd, SimpleProcess
|
||||
|
||||
|
||||
def is_available() -> bool:
|
||||
return bool(run_cmd('which timeshift', print_error=False))
|
||||
|
||||
|
||||
def delete_all_snapshots(root_password: str) -> SimpleProcess:
|
||||
return SimpleProcess(['timeshift', '--delete-all', '--scripted'], root_password=root_password)
|
||||
|
||||
|
||||
def create_snapshot(root_password: str) -> SimpleProcess:
|
||||
return SimpleProcess(['timeshift', '--create', '--scripted'], root_password=root_password)
|
||||
12
bauh/view/core/tray_client.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from pathlib import Path
|
||||
|
||||
from bauh.api.constants import CACHE_PATH
|
||||
|
||||
TRAY_CHECK_FILE = '{}/notify_tray'.format(CACHE_PATH) # it is a file that signals to the tray icon it should recheck for updates
|
||||
|
||||
|
||||
def notify_tray():
|
||||
Path(CACHE_PATH).mkdir(exist_ok=True, parents=True)
|
||||
|
||||
with open(TRAY_CHECK_FILE, 'w+') as f:
|
||||
f.write('')
|
||||
@@ -1,12 +1,12 @@
|
||||
from glob import glob
|
||||
|
||||
from PyQt5.QtCore import Qt, QSize
|
||||
from PyQt5.QtGui import QPixmap, QIcon
|
||||
from PyQt5.QtGui import QIcon
|
||||
from PyQt5.QtWidgets import QVBoxLayout, QDialog, QLabel, QWidget, QHBoxLayout
|
||||
|
||||
from bauh import __version__, __app_name__, ROOT_DIR
|
||||
from bauh.view.util import resource, util
|
||||
from bauh.view.util.translation import I18n
|
||||
from bauh.context import generate_i18n
|
||||
from bauh.view.util import resource
|
||||
|
||||
PROJECT_URL = 'https://github.com/vinifmor/' + __app_name__
|
||||
LICENSE_URL = 'https://raw.githubusercontent.com/vinifmor/{}/master/LICENSE'.format(__app_name__)
|
||||
@@ -14,14 +14,15 @@ LICENSE_URL = 'https://raw.githubusercontent.com/vinifmor/{}/master/LICENSE'.for
|
||||
|
||||
class AboutDialog(QDialog):
|
||||
|
||||
def __init__(self, i18n: I18n):
|
||||
def __init__(self, app_config: dict):
|
||||
super(AboutDialog, self).__init__()
|
||||
self.setWindowTitle(i18n['tray.action.about'])
|
||||
i18n = generate_i18n(app_config, resource.get_path('locale/about'))
|
||||
self.setWindowTitle('{} ({})'.format(i18n['about.title'].capitalize(), __app_name__))
|
||||
layout = QVBoxLayout()
|
||||
self.setLayout(layout)
|
||||
|
||||
label_logo = QLabel()
|
||||
icon = util.get_default_icon()[1].pixmap(64, 64)
|
||||
icon = QIcon(resource.get_path('img/logo.svg')).pixmap(64, 64)
|
||||
label_logo.setPixmap(icon)
|
||||
label_logo.setAlignment(Qt.AlignCenter)
|
||||
layout.addWidget(label_logo)
|
||||
@@ -31,7 +32,7 @@ class AboutDialog(QDialog):
|
||||
label_name.setAlignment(Qt.AlignCenter)
|
||||
layout.addWidget(label_name)
|
||||
|
||||
label_version = QLabel(i18n['version'].lower() + ' ' + __version__)
|
||||
label_version = QLabel(i18n['about.version'].lower() + ' ' + __version__)
|
||||
label_version.setStyleSheet('QLabel { font-size: 11px; font-weight: bold }')
|
||||
label_version.setAlignment(Qt.AlignCenter)
|
||||
layout.addWidget(label_version)
|
||||
|
||||
@@ -15,7 +15,7 @@ from bauh.api.abstract.model import PackageStatus
|
||||
from bauh.commons.html import strip_html
|
||||
from bauh.view.qt import dialog
|
||||
from bauh.view.qt.components import IconButton
|
||||
from bauh.view.qt.view_model import PackageView, PackageViewStatus
|
||||
from bauh.view.qt.view_model import PackageView
|
||||
from bauh.view.util import resource
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
@@ -28,10 +28,10 @@ PUBLISHER_MAX_SIZE = 25
|
||||
|
||||
class UpdateToggleButton(QWidget):
|
||||
|
||||
def __init__(self, app_view: PackageView, root: QWidget, i18n: I18n, checked: bool = True, clickable: bool = True):
|
||||
def __init__(self, pkg: PackageView, root: QWidget, i18n: I18n, checked: bool = True, clickable: bool = True):
|
||||
super(UpdateToggleButton, self).__init__()
|
||||
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
|
||||
self.app_view = app_view
|
||||
self.app_view = pkg
|
||||
self.root = root
|
||||
|
||||
layout = QHBoxLayout()
|
||||
@@ -40,22 +40,41 @@ class UpdateToggleButton(QWidget):
|
||||
self.setLayout(layout)
|
||||
|
||||
self.bt = QToolButton()
|
||||
self.bt.setCheckable(clickable)
|
||||
self.bt.setCheckable(True)
|
||||
self.bt.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
|
||||
if clickable:
|
||||
self.bt.clicked.connect(self.change_state)
|
||||
|
||||
self.bt.setIcon(QIcon(resource.get_path('img/app_update.svg')))
|
||||
self.bt.setStyleSheet('QToolButton { background: #20A435 } ' +
|
||||
('QToolButton:checked { background: gray }' if clickable else ''))
|
||||
layout.addWidget(self.bt)
|
||||
'QToolButton:checked { background: gray } ' +
|
||||
('QToolButton:disabled { background: #d69003 }' if not clickable and not checked else ''))
|
||||
|
||||
self.setToolTip(i18n['manage_window.apps_table.upgrade_toggle.tooltip'])
|
||||
layout.addWidget(self.bt)
|
||||
|
||||
if not checked:
|
||||
self.bt.click()
|
||||
|
||||
if clickable:
|
||||
self.bt.setIcon(QIcon(resource.get_path('img/app_update.svg')))
|
||||
self.setToolTip('{} {}'.format(i18n['manage_window.apps_table.upgrade_toggle.tooltip'],
|
||||
i18n['manage_window.apps_table.upgrade_toggle.enabled.tooltip']))
|
||||
else:
|
||||
if not checked:
|
||||
self.bt.setIcon(QIcon(resource.get_path('img/exclamation.svg')))
|
||||
self.bt.setEnabled(False)
|
||||
|
||||
tooltip = i18n['{}.update.disabled.tooltip'.format(pkg.model.gem_name)]
|
||||
|
||||
if tooltip:
|
||||
self.setToolTip(tooltip)
|
||||
else:
|
||||
self.setToolTip('{} {}'.format(i18n['manage_window.apps_table.upgrade_toggle.tooltip'],
|
||||
i18n['manage_window.apps_table.upgrade_toggle.disabled.tooltip']))
|
||||
else:
|
||||
self.bt.setIcon(QIcon(resource.get_path('img/app_update.svg')))
|
||||
self.bt.setCheckable(False)
|
||||
|
||||
def change_state(self, not_checked: bool):
|
||||
self.app_view.update_checked = not not_checked
|
||||
self.root.update_bt_upgrade()
|
||||
@@ -65,11 +84,10 @@ class AppsTable(QTableWidget):
|
||||
|
||||
COL_NUMBER = 8
|
||||
|
||||
def __init__(self, parent: QWidget, icon_cache: MemoryCache, disk_cache: bool, download_icons: bool):
|
||||
def __init__(self, parent: QWidget, icon_cache: MemoryCache, download_icons: bool):
|
||||
super(AppsTable, self).__init__()
|
||||
self.setParent(parent)
|
||||
self.window = parent
|
||||
self.disk_cache = disk_cache
|
||||
self.download_icons = download_icons
|
||||
self.setColumnCount(self.COL_NUMBER)
|
||||
self.setFocusPolicy(Qt.NoFocus)
|
||||
@@ -150,22 +168,13 @@ class AppsTable(QTableWidget):
|
||||
def refresh(self, pkg: PackageView):
|
||||
self._update_row(pkg, update_check_enabled=False, change_update_col=False)
|
||||
|
||||
def fill_async_data(self):
|
||||
if self.window.pkgs:
|
||||
def update_package(self, pkg: PackageView):
|
||||
if self.download_icons and pkg.model.icon_url:
|
||||
icon_request = QNetworkRequest(QUrl(pkg.model.icon_url))
|
||||
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
|
||||
self.network_man.get(icon_request)
|
||||
|
||||
for idx, app_v in enumerate(self.window.pkgs):
|
||||
|
||||
if app_v.status == PackageViewStatus.LOADING and app_v.model.status == PackageStatus.READY:
|
||||
|
||||
if self.download_icons:
|
||||
icon_request = QNetworkRequest(QUrl(app_v.model.icon_url))
|
||||
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
|
||||
self.network_man.get(icon_request)
|
||||
|
||||
self._update_row(app_v, change_update_col=False)
|
||||
app_v.status = PackageViewStatus.READY
|
||||
|
||||
self.window.resize_and_center()
|
||||
self._update_row(pkg, change_update_col=False)
|
||||
|
||||
def _uninstall_app(self, app_v: PackageView):
|
||||
if dialog.ask_confirmation(title=self.i18n['manage_window.apps_table.row.actions.uninstall.popup.title'],
|
||||
@@ -222,18 +231,24 @@ class AppsTable(QTableWidget):
|
||||
col_name = self.item(idx, 0)
|
||||
col_name.setIcon(icon_data['icon'])
|
||||
|
||||
if self.disk_cache and app.model.supports_disk_cache() and app.model.get_disk_icon_path():
|
||||
if app.model.supports_disk_cache() and app.model.get_disk_icon_path():
|
||||
if not icon_was_cached or not os.path.exists(app.model.get_disk_icon_path()):
|
||||
self.window.manager.cache_to_disk(pkg=app.model, icon_bytes=icon_data['bytes'], only_icon=True)
|
||||
|
||||
def update_pkgs(self, pkg_views: List[PackageView], update_check_enabled: bool = True):
|
||||
self.setRowCount(len(pkg_views) if pkg_views else 0)
|
||||
def update_packages(self, pkgs: List[PackageView], update_check_enabled: bool = True):
|
||||
self.setRowCount(len(pkgs) if pkgs else 0)
|
||||
self.setEnabled(True)
|
||||
|
||||
if pkg_views:
|
||||
for idx, pkgv in enumerate(pkg_views):
|
||||
pkgv.table_index = idx
|
||||
self._update_row(pkgv, update_check_enabled)
|
||||
if pkgs:
|
||||
for idx, pkg in enumerate(pkgs):
|
||||
pkg.table_index = idx
|
||||
|
||||
if self.download_icons and pkg.model.status == PackageStatus.READY and pkg.model.icon_url:
|
||||
icon_request = QNetworkRequest(QUrl(pkg.model.icon_url))
|
||||
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
|
||||
self.network_man.get(icon_request)
|
||||
|
||||
self._update_row(pkg, update_check_enabled)
|
||||
|
||||
def _update_row(self, pkg: PackageView, update_check_enabled: bool = True, change_update_col: bool = True):
|
||||
self._set_col_name(0, pkg)
|
||||
@@ -250,7 +265,11 @@ class AppsTable(QTableWidget):
|
||||
if update_check_enabled and pkg.model.update:
|
||||
col_update = QToolBar()
|
||||
col_update.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
col_update.addWidget(UpdateToggleButton(pkg, self.window, self.i18n, pkg.update_checked))
|
||||
col_update.addWidget(UpdateToggleButton(pkg=pkg,
|
||||
root=self.window,
|
||||
i18n=self.i18n,
|
||||
checked=pkg.update_checked if pkg.model.can_be_updated() else False,
|
||||
clickable=pkg.model.can_be_updated()))
|
||||
|
||||
self.setCellWidget(pkg.table_index, 7, col_update)
|
||||
|
||||
@@ -301,17 +320,18 @@ class AppsTable(QTableWidget):
|
||||
self.setCellWidget(pkg.table_index, col, toolbar)
|
||||
|
||||
def _set_col_type(self, col: int, pkg: PackageView):
|
||||
icon_data = self.cache_type_icon.get(pkg.model.get_type())
|
||||
|
||||
pixmap = self.cache_type_icon.get(pkg.model.get_type())
|
||||
|
||||
if not pixmap:
|
||||
if icon_data is None:
|
||||
pixmap = QIcon(pkg.model.get_type_icon_path()).pixmap(QSize(16, 16))
|
||||
self.cache_type_icon[pkg.model.get_type()] = pixmap
|
||||
icon_data = {'px': pixmap, 'tip': '{}: {}'.format(self.i18n['type'], pkg.get_type_label())}
|
||||
self.cache_type_icon[pkg.model.get_type()] = icon_data
|
||||
|
||||
item = QLabel()
|
||||
item.setPixmap(pixmap)
|
||||
item.setPixmap(icon_data['px'])
|
||||
item.setAlignment(Qt.AlignCenter)
|
||||
item.setToolTip('{}: {}'.format(self.i18n['type'], pkg.model.get_type().capitalize()))
|
||||
|
||||
item.setToolTip(icon_data['tip'])
|
||||
self.setCellWidget(pkg.table_index, col, item)
|
||||
|
||||
def _set_col_version(self, col: int, pkg: PackageView):
|
||||
@@ -343,8 +363,8 @@ class AppsTable(QTableWidget):
|
||||
item = QTableWidgetItem()
|
||||
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
|
||||
|
||||
if pkg.model.name:
|
||||
name = pkg.model.name
|
||||
name = pkg.model.get_display_name()
|
||||
if name:
|
||||
item.setToolTip('{}: {}'.format(self.i18n['app.name'].lower(), pkg.model.get_name_tooltip()))
|
||||
else:
|
||||
name = '...'
|
||||
@@ -359,7 +379,7 @@ class AppsTable(QTableWidget):
|
||||
item.setText(name)
|
||||
|
||||
icon_path = pkg.model.get_disk_icon_path()
|
||||
if self.disk_cache and pkg.model.supports_disk_cache() and icon_path and os.path.isfile(icon_path):
|
||||
if pkg.model.supports_disk_cache() and icon_path and os.path.isfile(icon_path):
|
||||
with open(icon_path, 'rb') as f:
|
||||
icon_bytes = f.read()
|
||||
pixmap = QPixmap()
|
||||
|
||||
@@ -15,7 +15,7 @@ def new_pkgs_info() -> dict:
|
||||
|
||||
|
||||
def update_info(pkgv: PackageView, pkgs_info: dict):
|
||||
pkgs_info['available_types'][pkgv.model.get_type()] = pkgv.model.get_type_icon_path()
|
||||
pkgs_info['available_types'][pkgv.model.get_type()] = {'icon': pkgv.model.get_type_icon_path(), 'label': pkgv.get_type_label()}
|
||||
|
||||
if pkgv.model.is_application():
|
||||
pkgs_info['apps_count'] += 1
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
import os
|
||||
import time
|
||||
import traceback
|
||||
from pathlib import Path
|
||||
from threading import Thread
|
||||
from typing import Tuple
|
||||
|
||||
from PyQt5.QtCore import Qt, QSize
|
||||
from PyQt5.QtGui import QIcon, QPixmap, QIntValidator
|
||||
from PyQt5.QtWidgets import QRadioButton, QGroupBox, QCheckBox, QComboBox, QGridLayout, QWidget, \
|
||||
QLabel, QSizePolicy, QLineEdit, QToolButton, QHBoxLayout, QFormLayout, QFileDialog, QTabWidget, QVBoxLayout, \
|
||||
QSlider
|
||||
QSlider, QScrollArea, QFrame
|
||||
|
||||
from bauh.api.abstract.view import SingleSelectComponent, InputOption, MultipleSelectComponent, SelectViewType, \
|
||||
TextInputComponent, FormComponent, FileChooserComponent, ViewComponent, TabGroupComponent, PanelComponent, \
|
||||
@@ -25,6 +27,9 @@ class RadioButtonQt(QRadioButton):
|
||||
self.model_parent = model_parent
|
||||
self.toggled.connect(self._set_checked)
|
||||
|
||||
if model.icon_path:
|
||||
self.setIcon(QIcon(model.icon_path))
|
||||
|
||||
if self.model.read_only:
|
||||
self.setAttribute(Qt.WA_TransparentForMouseEvents)
|
||||
self.setFocusPolicy(Qt.NoFocus)
|
||||
@@ -90,7 +95,8 @@ class FormComboBoxQt(QComboBox):
|
||||
self.setMaximumWidth(model.max_width)
|
||||
|
||||
for idx, op in enumerate(self.model.options):
|
||||
self.addItem(op.label, op.value)
|
||||
icon = QIcon(op.icon_path) if op.icon_path else QIcon()
|
||||
self.addItem(icon, op.label, op.value)
|
||||
|
||||
if op.tooltip:
|
||||
self.setItemData(idx, op.tooltip, Qt.ToolTipRole)
|
||||
@@ -178,7 +184,7 @@ class ComboSelectQt(QGroupBox):
|
||||
self.model = model
|
||||
self.setLayout(QGridLayout())
|
||||
self.setStyleSheet('QGridLayout {margin-left: 0} QLabel { font-weight: bold}')
|
||||
self.layout().addWidget(QLabel(model.label + ' :'), 0, 0)
|
||||
self.layout().addWidget(QLabel(model.label + ' :' if model.label else ''), 0, 0)
|
||||
self.layout().addWidget(FormComboBoxQt(model), 0, 1)
|
||||
|
||||
|
||||
@@ -352,15 +358,27 @@ class InputFilter(QLineEdit):
|
||||
super(InputFilter, self).__init__()
|
||||
self.on_key_press = on_key_press
|
||||
self.last_text = ''
|
||||
self.typing = None
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
super(InputFilter, self).keyPressEvent(event)
|
||||
def notify_text_change(self):
|
||||
time.sleep(2)
|
||||
text = self.text().strip()
|
||||
|
||||
if text != self.last_text:
|
||||
self.last_text = text
|
||||
self.on_key_press()
|
||||
|
||||
self.typing = None
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
super(InputFilter, self).keyPressEvent(event)
|
||||
|
||||
if self.typing:
|
||||
return
|
||||
|
||||
self.typing = Thread(target=self.notify_text_change, daemon=True)
|
||||
self.typing.start()
|
||||
|
||||
def get_text(self):
|
||||
return self.last_text
|
||||
|
||||
@@ -464,11 +482,17 @@ class FormQt(QGroupBox):
|
||||
label_comp = QLabel()
|
||||
label.layout().addWidget(label_comp)
|
||||
|
||||
if hasattr(comp, 'size') and comp.size is not None:
|
||||
label_comp.setStyleSheet("QLabel { font-size: " + str(comp.size) + "px }")
|
||||
|
||||
attr = 'label' if hasattr(comp,'label') else 'value'
|
||||
text = getattr(comp, attr)
|
||||
|
||||
if text:
|
||||
label_comp.setText(text.capitalize())
|
||||
if hasattr(comp, 'capitalize_label') and getattr(comp, 'capitalize_label'):
|
||||
label_comp.setText(text.capitalize())
|
||||
else:
|
||||
label_comp.setText(text)
|
||||
|
||||
if comp.tooltip:
|
||||
label.layout().addWidget(self.gen_tip_icon(comp.tooltip))
|
||||
@@ -499,7 +523,7 @@ class FormQt(QGroupBox):
|
||||
line_edit.setPlaceholderText(c.placeholder)
|
||||
|
||||
if c.value:
|
||||
line_edit.setText(c.value)
|
||||
line_edit.setText(str(c.value) if c.value else '')
|
||||
line_edit.setCursorPosition(0)
|
||||
|
||||
if c.read_only:
|
||||
@@ -604,7 +628,11 @@ class TabGroupQt(QTabWidget):
|
||||
traceback.print_exc()
|
||||
icon = QIcon()
|
||||
|
||||
self.addTab(to_widget(c.content, i18n), icon, c.label)
|
||||
scroll = QScrollArea()
|
||||
scroll.setFrameShape(QFrame.NoFrame)
|
||||
scroll.setWidgetResizable(True)
|
||||
scroll.setWidget(to_widget(c.content, i18n))
|
||||
self.addTab(scroll, icon, c.label)
|
||||
|
||||
|
||||
def new_single_select(model: SingleSelectComponent) -> QWidget:
|
||||
@@ -643,6 +671,10 @@ def to_widget(comp: ViewComponent, i18n: I18n, parent: QWidget = None) -> QWidge
|
||||
return TwoStateButtonQt(comp)
|
||||
elif isinstance(comp, TextComponent):
|
||||
label = QLabel(comp.value)
|
||||
|
||||
if comp.size is not None:
|
||||
label.setStyleSheet("QLabel { font-size: " + str(comp.size) + "px }")
|
||||
|
||||
label.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
|
||||
return label
|
||||
elif isinstance(comp, SpacerComponent):
|
||||
|
||||
@@ -12,7 +12,7 @@ from bauh.view.util.translation import I18n
|
||||
class ConfirmationDialog(QMessageBox):
|
||||
|
||||
def __init__(self, title: str, body: str, i18n: I18n, screen_size: QSize, components: List[ViewComponent] = None,
|
||||
confirmation_label: str = None, deny_label: str = None):
|
||||
confirmation_label: str = None, deny_label: str = None, deny_button: bool = True):
|
||||
super(ConfirmationDialog, self).__init__()
|
||||
self.setWindowTitle(title)
|
||||
self.setStyleSheet('QLabel { margin-right: 25px; }')
|
||||
@@ -20,7 +20,8 @@ class ConfirmationDialog(QMessageBox):
|
||||
self.bt_yes.setStyleSheet(css.OK_BUTTON)
|
||||
self.setDefaultButton(self.bt_yes)
|
||||
|
||||
self.addButton(i18n['popup.button.no'] if not deny_label else deny_label.capitalize(), QMessageBox.NoRole)
|
||||
if deny_button:
|
||||
self.addButton(i18n['popup.button.no'] if not deny_label else deny_label.capitalize(), QMessageBox.NoRole)
|
||||
|
||||
label = None
|
||||
if body:
|
||||
|
||||
@@ -96,7 +96,7 @@ class GemSelectorPanel(QWidget):
|
||||
self.manager.prepare()
|
||||
self.window.verify_warnings()
|
||||
self.window.types_changed = True
|
||||
self.window.refresh_apps()
|
||||
self.window.refresh_packages()
|
||||
self.close()
|
||||
|
||||
def exit(self):
|
||||
|
||||
@@ -7,6 +7,7 @@ from PyQt5.QtWidgets import QDialog, QVBoxLayout, QTableWidget, QTableWidgetItem
|
||||
|
||||
from bauh.api.abstract.cache import MemoryCache
|
||||
from bauh.api.abstract.model import PackageHistory
|
||||
from bauh.view.qt.view_model import get_type_label, PackageView
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
@@ -16,7 +17,9 @@ class HistoryDialog(QDialog):
|
||||
super(HistoryDialog, self).__init__()
|
||||
self.setWindowFlags(self.windowFlags() | Qt.WindowSystemMenuHint | Qt.WindowMinMaxButtonsHint)
|
||||
|
||||
self.setWindowTitle('{} - {} ({})'.format(i18n['popup.history.title'], history.pkg.name, history.pkg.get_type()))
|
||||
view = PackageView(model=history.pkg, i18n=i18n)
|
||||
|
||||
self.setWindowTitle('{} - {}'.format(i18n['popup.history.title'], view))
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.setLayout(layout)
|
||||
|
||||
@@ -49,7 +49,7 @@ class InfoDialog(QDialog):
|
||||
|
||||
for idx, attr in enumerate(sorted(app.keys())):
|
||||
if attr not in IGNORED_ATTRS and app[attr]:
|
||||
i18n_key = app['__app__'].model.get_type().lower() + '.info.' + attr.lower()
|
||||
i18n_key = app['__app__'].model.gem_name + '.info.' + attr.lower()
|
||||
|
||||
if isinstance(app[attr], list):
|
||||
val = ' '.join([str(e).strip() for e in app[attr] if e])
|
||||
|
||||
311
bauh/view/qt/prepare.py
Normal file
@@ -0,0 +1,311 @@
|
||||
import datetime
|
||||
import operator
|
||||
import time
|
||||
from functools import reduce
|
||||
from typing import Tuple
|
||||
|
||||
from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal, QCoreApplication
|
||||
from PyQt5.QtGui import QIcon
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QSizePolicy, QTableWidget, QHeaderView, QPushButton, QToolBar, \
|
||||
QProgressBar, QApplication
|
||||
|
||||
from bauh.api.abstract.context import ApplicationContext
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.handler import TaskManager
|
||||
from bauh.view.qt import root
|
||||
from bauh.view.qt.components import new_spacer
|
||||
from bauh.view.qt.qt_utils import centralize
|
||||
from bauh.view.qt.thread import AnimateProgress
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class Prepare(QThread, TaskManager):
|
||||
signal_register = pyqtSignal(str, str, object)
|
||||
signal_update = pyqtSignal(str, float, str)
|
||||
signal_finished = pyqtSignal(str)
|
||||
signal_started = pyqtSignal()
|
||||
signal_ask_password = pyqtSignal()
|
||||
|
||||
def __init__(self, context: ApplicationContext, manager: SoftwareManager, i18n: I18n):
|
||||
super(Prepare, self).__init__()
|
||||
self.manager = manager
|
||||
self.i18n = i18n
|
||||
self.context = context
|
||||
self.waiting_password = False
|
||||
self.password_response = None
|
||||
|
||||
def ask_password(self) -> Tuple[str, bool]:
|
||||
self.waiting_password = True
|
||||
self.signal_ask_password.emit()
|
||||
|
||||
while self.waiting_password:
|
||||
time.sleep(0.1) # waiting for user input
|
||||
|
||||
return self.password_response
|
||||
|
||||
def set_password_reply(self, password: str, valid: bool):
|
||||
self.password_response = password, valid
|
||||
self.waiting_password = False
|
||||
|
||||
def run(self):
|
||||
root_pwd = None
|
||||
if self.manager.requires_root('prepare', None):
|
||||
root_pwd, ok = self.ask_password()
|
||||
|
||||
if not ok:
|
||||
QCoreApplication.exit(1)
|
||||
|
||||
self.signal_started.emit()
|
||||
self.manager.prepare(self, root_pwd, None)
|
||||
|
||||
def update_progress(self, task_id: str, progress: float, substatus: str):
|
||||
self.signal_update.emit(task_id, progress, substatus)
|
||||
|
||||
def register_task(self, id_: str, label: str, icon_path: str):
|
||||
self.signal_register.emit(id_, label, icon_path)
|
||||
|
||||
def finish_task(self, task_id: str):
|
||||
self.signal_finished.emit(task_id)
|
||||
|
||||
|
||||
class CheckFinished(QThread):
|
||||
signal_finished = pyqtSignal()
|
||||
|
||||
def __init__(self):
|
||||
super(CheckFinished, self).__init__()
|
||||
self.total = None
|
||||
self.finished = None
|
||||
|
||||
def run(self):
|
||||
while True:
|
||||
if self.total is not None and self.finished is not None:
|
||||
if self.total == self.finished:
|
||||
break
|
||||
|
||||
time.sleep(0.01)
|
||||
|
||||
self.signal_finished.emit()
|
||||
|
||||
def update(self, total: int, finished: int):
|
||||
if total is not None:
|
||||
self.total = total
|
||||
|
||||
if finished is not None:
|
||||
self.finished = finished
|
||||
|
||||
|
||||
class EnableSkip(QThread):
|
||||
|
||||
signal_timeout = pyqtSignal()
|
||||
|
||||
def run(self):
|
||||
ti = datetime.datetime.now()
|
||||
|
||||
while True:
|
||||
if datetime.datetime.now() >= ti + datetime.timedelta(minutes=1.5):
|
||||
self.signal_timeout.emit()
|
||||
break
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
|
||||
class PreparePanel(QWidget, TaskManager):
|
||||
|
||||
signal_status = pyqtSignal(object, object)
|
||||
signal_password_response = pyqtSignal(str, bool)
|
||||
|
||||
def __init__(self, context: ApplicationContext, manager: SoftwareManager, screen_size: QSize, i18n: I18n, manage_window: QWidget):
|
||||
super(PreparePanel, self).__init__()
|
||||
self.i18n = i18n
|
||||
self.context = context
|
||||
self.manage_window = manage_window
|
||||
self.setWindowTitle(' ')
|
||||
self.setMinimumWidth(screen_size.width() * 0.5)
|
||||
self.setMinimumHeight(screen_size.height() * 0.35)
|
||||
self.setMaximumHeight(screen_size.height() * 0.95)
|
||||
self.setLayout(QVBoxLayout())
|
||||
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
self.manager = manager
|
||||
self.tasks = {}
|
||||
self.ntasks = 0
|
||||
self.ftasks = 0
|
||||
self.self_close = False
|
||||
|
||||
self.prepare_thread = Prepare(self.context, manager, self.i18n)
|
||||
self.prepare_thread.signal_register.connect(self.register_task)
|
||||
self.prepare_thread.signal_update.connect(self.update_progress)
|
||||
self.prepare_thread.signal_finished.connect(self.finish_task)
|
||||
self.prepare_thread.signal_started.connect(self.start)
|
||||
self.prepare_thread.signal_ask_password.connect(self.ask_root_password)
|
||||
self.signal_password_response.connect(self.prepare_thread.set_password_reply)
|
||||
|
||||
self.check_thread = CheckFinished()
|
||||
self.signal_status.connect(self.check_thread.update)
|
||||
self.check_thread.signal_finished.connect(self.finish)
|
||||
|
||||
self.skip_thread = EnableSkip()
|
||||
self.skip_thread.signal_timeout.connect(self._enable_skip_button)
|
||||
|
||||
self.progress_thread = AnimateProgress()
|
||||
self.progress_thread.signal_change.connect(self._change_progress)
|
||||
|
||||
self.label_top = QLabel()
|
||||
self.label_top.setText("{}...".format(self.i18n['prepare_panel.title.start'].capitalize()))
|
||||
self.label_top.setAlignment(Qt.AlignHCenter)
|
||||
self.label_top.setStyleSheet("QLabel { font-size: 14px; font-weight: bold; }")
|
||||
self.layout().addWidget(self.label_top)
|
||||
self.layout().addWidget(QLabel())
|
||||
|
||||
self.table = QTableWidget()
|
||||
self.table.setStyleSheet("QTableWidget { background-color: transparent; }")
|
||||
self.table.setFocusPolicy(Qt.NoFocus)
|
||||
self.table.setShowGrid(False)
|
||||
self.table.verticalHeader().setVisible(False)
|
||||
self.table.horizontalHeader().setVisible(False)
|
||||
self.table.horizontalHeader().setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
|
||||
self.table.setColumnCount(4)
|
||||
self.table.setHorizontalHeaderLabels(['' for _ in range(4)])
|
||||
self.layout().addWidget(self.table)
|
||||
|
||||
toolbar = QToolBar()
|
||||
self.bt_close = QPushButton(self.i18n['close'].capitalize())
|
||||
self.bt_close.clicked.connect(self.close)
|
||||
self.bt_close.setVisible(False)
|
||||
self.ref_bt_close = toolbar.addWidget(self.bt_close)
|
||||
|
||||
toolbar.addWidget(new_spacer())
|
||||
self.progress_bar = QProgressBar()
|
||||
self.progress_bar.setMaximumHeight(10 if QApplication.instance().style().objectName().lower() == 'windows' else 4)
|
||||
self.progress_bar.setTextVisible(False)
|
||||
self.progress_bar.setVisible(False)
|
||||
self.ref_progress_bar = toolbar.addWidget(self.progress_bar)
|
||||
toolbar.addWidget(new_spacer())
|
||||
|
||||
self.bt_skip = QPushButton(self.i18n['prepare_panel.bt_skip.label'].capitalize())
|
||||
self.bt_skip.clicked.connect(self.finish)
|
||||
self.bt_skip.setEnabled(False)
|
||||
toolbar.addWidget(self.bt_skip)
|
||||
|
||||
self.layout().addWidget(toolbar)
|
||||
|
||||
def ask_root_password(self):
|
||||
root_pwd, ok = root.ask_root_password(self.context, self.i18n)
|
||||
self.signal_password_response.emit(root_pwd, ok)
|
||||
|
||||
def _enable_skip_button(self):
|
||||
self.bt_skip.setEnabled(True)
|
||||
|
||||
def _change_progress(self, value: int):
|
||||
self.progress_bar.setValue(value)
|
||||
|
||||
def get_table_width(self) -> int:
|
||||
return reduce(operator.add, [self.table.columnWidth(i) for i in range(self.table.columnCount())])
|
||||
|
||||
def _resize_columns(self):
|
||||
header_horizontal = self.table.horizontalHeader()
|
||||
for i in range(self.table.columnCount()):
|
||||
header_horizontal.setSectionResizeMode(i, QHeaderView.ResizeToContents)
|
||||
|
||||
self.resize(self.get_table_width() * 1.05, self.sizeHint().height())
|
||||
|
||||
def show(self):
|
||||
super(PreparePanel, self).show()
|
||||
self.prepare_thread.start()
|
||||
centralize(self)
|
||||
|
||||
def start(self):
|
||||
self.ref_bt_close.setVisible(True)
|
||||
self.check_thread.start()
|
||||
self.skip_thread.start()
|
||||
|
||||
self.ref_progress_bar.setVisible(True)
|
||||
self.progress_thread.start()
|
||||
|
||||
def closeEvent(self, QCloseEvent):
|
||||
if not self.self_close:
|
||||
QCoreApplication.exit()
|
||||
|
||||
def register_task(self, id_: str, label: str, icon_path: str):
|
||||
self.ntasks += 1
|
||||
self.table.setRowCount(self.ntasks)
|
||||
|
||||
task_row = self.ntasks - 1
|
||||
|
||||
lb_icon = QLabel()
|
||||
lb_icon.setContentsMargins(0, 2, 0, 0)
|
||||
lb_icon.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
|
||||
if icon_path:
|
||||
lb_icon.setPixmap(QIcon(icon_path).pixmap(12, 12))
|
||||
lb_icon.setAlignment(Qt.AlignHCenter)
|
||||
|
||||
self.table.setCellWidget(task_row, 0, lb_icon)
|
||||
|
||||
lb_status = QLabel(label)
|
||||
lb_status.setAlignment(Qt.AlignHCenter)
|
||||
lb_status.setContentsMargins(2, 0, 2, 0)
|
||||
lb_status.setMinimumWidth(50)
|
||||
lb_status.setAlignment(Qt.AlignHCenter)
|
||||
lb_status.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
lb_status.setStyleSheet("QLabel { color: blue; font-weight: bold; }")
|
||||
self.table.setCellWidget(task_row, 1, lb_status)
|
||||
|
||||
lb_sub = QLabel()
|
||||
lb_sub.setContentsMargins(2, 0, 2, 0)
|
||||
lb_sub.setAlignment(Qt.AlignHCenter)
|
||||
lb_sub.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
lb_sub.setMinimumWidth(50)
|
||||
self.table.setCellWidget(task_row, 2, lb_sub)
|
||||
|
||||
lb_progress = QLabel('{0:.2f}'.format(0) + '%')
|
||||
lb_progress.setContentsMargins(2, 2, 2, 2)
|
||||
lb_progress.setStyleSheet("QLabel { color: blue; font-weight: bold; }")
|
||||
lb_progress.setAlignment(Qt.AlignHCenter)
|
||||
lb_progress.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
|
||||
self.table.setCellWidget(task_row, 3, lb_progress)
|
||||
|
||||
self.tasks[id_] = {'lb_status': lb_status,
|
||||
'lb_prog': lb_progress,
|
||||
'progress': 0,
|
||||
'lb_sub': lb_sub,
|
||||
'finished': False}
|
||||
|
||||
self.signal_status.emit(self.ntasks, self.ftasks)
|
||||
|
||||
def update_progress(self, task_id: str, progress: float, substatus: str):
|
||||
task = self.tasks[task_id]
|
||||
|
||||
if progress != task['progress']:
|
||||
task['progress'] = progress
|
||||
task['lb_prog'].setText('{0:.2f}'.format(progress) + '%')
|
||||
|
||||
if substatus:
|
||||
task['lb_sub'].setText('( {} )'.format(substatus))
|
||||
else:
|
||||
task['lb_sub'].setText('')
|
||||
|
||||
self._resize_columns()
|
||||
|
||||
def finish_task(self, task_id: str):
|
||||
task = self.tasks[task_id]
|
||||
task['lb_sub'].setText('')
|
||||
|
||||
for key in ('lb_prog', 'lb_status'):
|
||||
task[key].setStyleSheet('QLabel { color: green; text-decoration: line-through; }')
|
||||
|
||||
task['finished'] = True
|
||||
self._resize_columns()
|
||||
|
||||
self.ftasks += 1
|
||||
self.signal_status.emit(self.ntasks, self.ftasks)
|
||||
|
||||
if self.ntasks == self.ftasks:
|
||||
self.label_top.setText("... {} ...".format(self.i18n['ready'].capitalize()))
|
||||
|
||||
def finish(self):
|
||||
if self.isVisible():
|
||||
self.manage_window.refresh_packages()
|
||||
self.manage_window.show()
|
||||
self.self_close = True
|
||||
self.close()
|
||||
@@ -1,9 +1,12 @@
|
||||
import os
|
||||
from typing import Tuple
|
||||
|
||||
from PyQt5.QtWidgets import QInputDialog, QLineEdit
|
||||
|
||||
from bauh.api.abstract.context import ApplicationContext
|
||||
from bauh.api.abstract.view import MessageType
|
||||
from bauh.commons.system import new_subprocess
|
||||
from bauh.view.core.config import read_config
|
||||
from bauh.view.qt.dialog import show_message
|
||||
from bauh.view.qt.view_utils import load_resource_icon
|
||||
from bauh.view.util.translation import I18n
|
||||
@@ -13,7 +16,14 @@ def is_root():
|
||||
return os.getuid() == 0
|
||||
|
||||
|
||||
def ask_root_password(i18n: I18n):
|
||||
def ask_root_password(context: ApplicationContext, i18n: I18n, app_config: dict = None) -> Tuple[str, bool]:
|
||||
|
||||
cur_config = read_config() if not app_config else app_config
|
||||
store_password = bool(cur_config['store_root_password'])
|
||||
|
||||
if store_password and context.root_password and validate_password(context.root_password):
|
||||
return context.root_password, True
|
||||
|
||||
diag = QInputDialog()
|
||||
diag.setStyleSheet("""QLineEdit { border-radius: 5px; font-size: 16px; border: 1px solid lightblue }""")
|
||||
diag.setInputMode(QInputDialog.TextInput)
|
||||
@@ -44,6 +54,9 @@ def ask_root_password(i18n: I18n):
|
||||
diag.setTextValue('')
|
||||
|
||||
if ok:
|
||||
if store_password:
|
||||
context.root_password = diag.textValue()
|
||||
|
||||
return diag.textValue(), ok
|
||||
else:
|
||||
break
|
||||
|
||||
@@ -1,28 +1,29 @@
|
||||
import gc
|
||||
from io import StringIO
|
||||
|
||||
from PyQt5.QtCore import QSize, Qt
|
||||
from PyQt5.QtCore import QSize, Qt, QCoreApplication
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolBar, QSizePolicy, QPushButton
|
||||
|
||||
from bauh import __app_name__
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.view import MessageType
|
||||
from bauh.view.core.controller import GenericSoftwareManager
|
||||
from bauh.view.qt import dialog, css
|
||||
from bauh.view.qt.components import to_widget, new_spacer
|
||||
from bauh.view.qt.qt_utils import centralize
|
||||
from bauh.view.util import util
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class SettingsWindow(QWidget):
|
||||
|
||||
def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, tray, window: QWidget, parent: QWidget = None):
|
||||
def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, window: QWidget, parent: QWidget = None):
|
||||
super(SettingsWindow, self).__init__(parent=parent)
|
||||
self.setWindowTitle(i18n['settings'].capitalize())
|
||||
self.setWindowTitle('{} ({})'.format(i18n['settings'].capitalize(), __app_name__))
|
||||
self.setLayout(QVBoxLayout())
|
||||
self.manager = manager
|
||||
self.i18n = i18n
|
||||
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
|
||||
self.tray = tray
|
||||
self.window = window
|
||||
|
||||
self.settings_model = self.manager.get_settings(screen_size.width(), screen_size.height())
|
||||
@@ -49,13 +50,16 @@ class SettingsWindow(QWidget):
|
||||
|
||||
self.layout().addWidget(action_bar)
|
||||
|
||||
def show(self):
|
||||
super(SettingsWindow, self).show()
|
||||
centralize(self)
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self.window and self.window.settings_window == self:
|
||||
self.deleteLater()
|
||||
self.window.settings_window = None
|
||||
elif self.tray and self.tray.settings_window == self:
|
||||
self.deleteLater()
|
||||
self.tray.settings_window = None
|
||||
elif not self.window:
|
||||
QCoreApplication.exit()
|
||||
|
||||
gc.collect()
|
||||
|
||||
@@ -70,24 +74,29 @@ class SettingsWindow(QWidget):
|
||||
def _save_settings(self):
|
||||
success, warnings = self.manager.save_settings(self.settings_model)
|
||||
|
||||
# Configurações alteradas com sucesso, porém algumas delas só surtirão após a reinicialização
|
||||
|
||||
if success:
|
||||
if dialog.ask_confirmation(title=self.i18n['warning'].capitalize(),
|
||||
body="<p>{}</p><p>{}</p>".format(self.i18n['settings.changed.success.warning'],
|
||||
self.i18n['settings.changed.success.reboot']),
|
||||
i18n=self.i18n):
|
||||
util.restart_app(self.window and self.window.isVisible())
|
||||
if not self.window:
|
||||
dialog.show_message(title=self.i18n['success'].capitalize(),
|
||||
body=self.i18n['settings.changed.success.warning'],
|
||||
type_=MessageType.INFO)
|
||||
QCoreApplication.exit()
|
||||
elif dialog.ask_confirmation(title=self.i18n['warning'].capitalize(),
|
||||
body="<p>{}</p><p>{}</p>".format(self.i18n['settings.changed.success.warning'],
|
||||
self.i18n['settings.changed.success.reboot']),
|
||||
i18n=self.i18n):
|
||||
self.close()
|
||||
util.restart_app()
|
||||
else:
|
||||
if isinstance(self.manager, GenericSoftwareManager):
|
||||
self.manager.reset_cache()
|
||||
|
||||
self.manager.prepare()
|
||||
self.manager.prepare(task_manager=None, root_password=None, internet_available=None)
|
||||
|
||||
if self.window and self.window.isVisible():
|
||||
self.window.update_custom_actions()
|
||||
self.window.verify_warnings()
|
||||
self.window.types_changed = True
|
||||
self.window.refresh_apps()
|
||||
self.window.refresh_packages()
|
||||
self.close()
|
||||
else:
|
||||
msg = StringIO()
|
||||
|
||||
@@ -1,48 +1,82 @@
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
from io import StringIO
|
||||
from subprocess import Popen
|
||||
from threading import Lock, Thread
|
||||
from typing import List
|
||||
|
||||
from PyQt5.QtCore import QThread, pyqtSignal, QCoreApplication, Qt, QSize
|
||||
from PyQt5.QtCore import QThread, pyqtSignal, QCoreApplication, QSize
|
||||
from PyQt5.QtGui import QIcon
|
||||
from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QWidget, QSizePolicy
|
||||
from PyQt5.QtWidgets import QSystemTrayIcon, QMenu
|
||||
|
||||
from bauh import __app_name__
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh import __app_name__, ROOT_DIR
|
||||
from bauh.api.abstract.model import PackageUpdate
|
||||
from bauh.view.qt import qt_utils
|
||||
from bauh.commons.system import run_cmd
|
||||
from bauh.context import generate_i18n
|
||||
from bauh.view.core.tray_client import TRAY_CHECK_FILE
|
||||
from bauh.view.qt.about import AboutDialog
|
||||
from bauh.view.qt.settings import SettingsWindow
|
||||
from bauh.view.qt.view_utils import load_resource_icon
|
||||
from bauh.view.qt.window import ManageWindow
|
||||
from bauh.view.util import util
|
||||
from bauh.view.util.translation import I18n
|
||||
from bauh.view.util import util, resource
|
||||
|
||||
|
||||
def list_updates() -> List[PackageUpdate]:
|
||||
if run_cmd('which bauh-cli', print_error=False):
|
||||
output = run_cmd('bauh-cli updates -f json')
|
||||
|
||||
if output:
|
||||
return [PackageUpdate(pkg_id=o['id'], name=o['name'], version=o['version'], pkg_type=o['type']) for o in json.loads(output)]
|
||||
|
||||
return []
|
||||
|
||||
|
||||
class UpdateCheck(QThread):
|
||||
|
||||
signal = pyqtSignal(list)
|
||||
|
||||
def __init__(self, manager: SoftwareManager, check_interval: int, parent=None):
|
||||
def __init__(self, check_interval: int, lock: Lock, check_file: bool, parent=None):
|
||||
super(UpdateCheck, self).__init__(parent)
|
||||
self.check_interval = check_interval
|
||||
self.manager = manager
|
||||
self.lock = lock
|
||||
self.check_file = check_file
|
||||
|
||||
def _notify_updates(self):
|
||||
self.lock.acquire()
|
||||
try:
|
||||
updates = list_updates()
|
||||
|
||||
if updates is not None:
|
||||
self.signal.emit(updates)
|
||||
finally:
|
||||
self.lock.release()
|
||||
|
||||
time.sleep(self.check_interval)
|
||||
|
||||
def run(self):
|
||||
|
||||
while True:
|
||||
updates = self.manager.list_updates()
|
||||
self.signal.emit(updates)
|
||||
time.sleep(self.check_interval)
|
||||
if self.check_file:
|
||||
if os.path.exists(TRAY_CHECK_FILE):
|
||||
self._notify_updates()
|
||||
try:
|
||||
os.remove(TRAY_CHECK_FILE)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
else:
|
||||
time.sleep(self.check_interval)
|
||||
else:
|
||||
self._notify_updates()
|
||||
|
||||
|
||||
class TrayIcon(QSystemTrayIcon):
|
||||
|
||||
def __init__(self, i18n: I18n, manager: SoftwareManager, manage_window: ManageWindow, config: dict, screen_size: QSize):
|
||||
def __init__(self, config: dict, screen_size: QSize, manage_process: Popen = None, settings_process: Popen = None):
|
||||
super(TrayIcon, self).__init__()
|
||||
self.i18n = i18n
|
||||
self.manager = manager
|
||||
self.i18n = generate_i18n(config, resource.get_path('locale/tray'))
|
||||
self.screen_size = screen_size
|
||||
self.manage_process = manage_process
|
||||
self.settings_process = settings_process
|
||||
|
||||
if config['ui']['tray']['default_icon']:
|
||||
self.icon_default = QIcon(config['ui']['tray']['default_icon'])
|
||||
@@ -67,7 +101,7 @@ class TrayIcon(QSystemTrayIcon):
|
||||
self.action_manage = self.menu.addAction(self.i18n['tray.action.manage'])
|
||||
self.action_manage.triggered.connect(self.show_manage_window)
|
||||
|
||||
self.action_settings = self.menu.addAction(self.i18n['settings'].capitalize())
|
||||
self.action_settings = self.menu.addAction(self.i18n['tray.settings'].capitalize())
|
||||
self.action_settings.triggered.connect(self.show_settings_window)
|
||||
|
||||
self.action_about = self.menu.addAction(self.i18n['tray.action.about'])
|
||||
@@ -82,10 +116,15 @@ class TrayIcon(QSystemTrayIcon):
|
||||
self.dialog_about = None
|
||||
self.settings_window = None
|
||||
|
||||
self.check_thread = UpdateCheck(check_interval=int(config['updates']['check_interval']), manager=self.manager)
|
||||
self.check_lock = Lock()
|
||||
self.check_thread = UpdateCheck(check_interval=int(config['updates']['check_interval']), check_file=False, lock=self.check_lock)
|
||||
self.check_thread.signal.connect(self.notify_updates)
|
||||
self.check_thread.start()
|
||||
|
||||
self.recheck_thread = UpdateCheck(check_interval=2, check_file=True, lock=self.check_lock)
|
||||
self.recheck_thread.signal.connect(self.notify_updates)
|
||||
self.recheck_thread.start()
|
||||
|
||||
self.last_updates = set()
|
||||
self.update_notification = bool(config['system']['notifications'])
|
||||
self.lock_notify = Lock()
|
||||
@@ -93,10 +132,8 @@ class TrayIcon(QSystemTrayIcon):
|
||||
self.activated.connect(self.handle_click)
|
||||
self.set_default_tooltip()
|
||||
|
||||
self.manage_window = manage_window
|
||||
|
||||
def set_default_tooltip(self):
|
||||
self.setToolTip('{} ({})'.format(self.i18n['manage_window.title'], __app_name__).lower())
|
||||
self.setToolTip('{} ({})'.format(self.i18n['tray.action.manage'], __app_name__).lower())
|
||||
|
||||
def handle_click(self, reason):
|
||||
if reason == self.Trigger:
|
||||
@@ -109,7 +146,6 @@ class TrayIcon(QSystemTrayIcon):
|
||||
self.notify_updates(self.manager.list_updates(), notify_user=notify_user)
|
||||
|
||||
def notify_updates(self, updates: List[PackageUpdate], notify_user: bool = True):
|
||||
|
||||
self.lock_notify.acquire()
|
||||
|
||||
try:
|
||||
@@ -133,8 +169,8 @@ class TrayIcon(QSystemTrayIcon):
|
||||
msg.write(self.i18n['notification.update{}'.format('' if n_updates == 1 else 's')].format(n_updates))
|
||||
|
||||
if len(ups_by_type) > 1:
|
||||
for ptype, count in ups_by_type.items():
|
||||
msg.write('\n * {} ( {} )'.format(ptype.capitalize(), count))
|
||||
for ptype in sorted(ups_by_type):
|
||||
msg.write('\n * {} ( {} )'.format(ptype, ups_by_type[ptype]))
|
||||
|
||||
msg.seek(0)
|
||||
msg = msg.read()
|
||||
@@ -155,25 +191,18 @@ class TrayIcon(QSystemTrayIcon):
|
||||
self.lock_notify.release()
|
||||
|
||||
def show_manage_window(self):
|
||||
if self.manage_window.isMinimized():
|
||||
self.manage_window.setWindowState(Qt.WindowNoState)
|
||||
elif not self.manage_window.isVisible():
|
||||
self.manage_window.refresh_apps()
|
||||
self.manage_window.show()
|
||||
if self.manage_process is None:
|
||||
self.manage_process = Popen([sys.executable, '{}/app.py'.format(ROOT_DIR)])
|
||||
elif self.manage_process.poll() is not None: # it means it has finished
|
||||
self.manage_process = None
|
||||
self.show_manage_window()
|
||||
|
||||
def show_settings_window(self):
|
||||
if self.settings_window:
|
||||
self.settings_window.handle_display()
|
||||
else:
|
||||
self.settings_window = SettingsWindow(manager=self.manager,
|
||||
i18n=self.i18n,
|
||||
screen_size=self.screen_size,
|
||||
tray=self,
|
||||
window=self.manage_window)
|
||||
self.settings_window.setMinimumWidth(int(self.screen_size.width() / 4))
|
||||
self.settings_window.adjustSize()
|
||||
qt_utils.centralize(self.settings_window)
|
||||
self.settings_window.show()
|
||||
if self.settings_process is None:
|
||||
self.settings_process = Popen([sys.executable, '{}/app.py'.format(ROOT_DIR), '--settings'])
|
||||
elif self.settings_process.poll() is not None: # it means it has finished
|
||||
self.settings_process = None
|
||||
self.show_settings_window()
|
||||
|
||||
def show_about(self):
|
||||
if self.dialog_about is None:
|
||||
|
||||
@@ -1,22 +1,30 @@
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime, timedelta
|
||||
from io import StringIO
|
||||
from pathlib import Path
|
||||
from typing import List, Type, Set, Tuple
|
||||
|
||||
import requests
|
||||
from PyQt5.QtCore import QThread, pyqtSignal
|
||||
|
||||
from bauh import LOGS_PATH
|
||||
from bauh.api.abstract.cache import MemoryCache
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.controller import SoftwareManager, UpgradeRequirement, UpgradeRequirements
|
||||
from bauh.api.abstract.handler import ProcessWatcher
|
||||
from bauh.api.abstract.model import PackageStatus, SoftwarePackage, PackageAction
|
||||
from bauh.api.abstract.view import InputViewComponent, MessageType, MultipleSelectComponent, InputOption
|
||||
from bauh.api.abstract.model import PackageStatus, SoftwarePackage, CustomSoftwareAction
|
||||
from bauh.api.abstract.view import MessageType, MultipleSelectComponent, InputOption, TextComponent, \
|
||||
FormComponent, ViewComponent
|
||||
from bauh.api.exception import NoInternetException
|
||||
from bauh.commons import user
|
||||
from bauh.commons.html import bold
|
||||
from bauh.view.core import config
|
||||
from bauh.commons.system import get_human_size_str, ProcessHandler, SimpleProcess
|
||||
from bauh.view.core import timeshift
|
||||
from bauh.view.core.config import read_config
|
||||
from bauh.view.qt import commons
|
||||
from bauh.view.qt.view_model import PackageView
|
||||
from bauh.view.qt.view_model import PackageView, PackageViewStatus
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
RE_VERSION_IN_NAME = re.compile(r'\s+version\s+[\w\.]+\s*$')
|
||||
@@ -32,6 +40,7 @@ class AsyncAction(QThread, ProcessWatcher):
|
||||
signal_substatus = pyqtSignal(str) # changes the GUI substatus message
|
||||
signal_progress = pyqtSignal(int)
|
||||
signal_root_password = pyqtSignal()
|
||||
signal_progress_control = pyqtSignal(bool)
|
||||
|
||||
def __init__(self):
|
||||
super(AsyncAction, self).__init__()
|
||||
@@ -40,9 +49,9 @@ class AsyncAction(QThread, ProcessWatcher):
|
||||
self.root_password = None
|
||||
self.stop = False
|
||||
|
||||
def request_confirmation(self, title: str, body: str, components: List[InputViewComponent] = None, confirmation_label: str = None, deny_label: str = None) -> bool:
|
||||
def request_confirmation(self, title: str, body: str, components: List[ViewComponent] = None, confirmation_label: str = None, deny_label: str = None, deny_button: bool = True) -> bool:
|
||||
self.wait_confirmation = True
|
||||
self.signal_confirmation.emit({'title': title, 'body': body, 'components': components, 'confirmation_label': confirmation_label, 'deny_label': deny_label})
|
||||
self.signal_confirmation.emit({'title': title, 'body': body, 'components': components, 'confirmation_label': confirmation_label, 'deny_label': deny_label, 'deny_button': deny_button})
|
||||
self.wait_user()
|
||||
return self.confirmation_res
|
||||
|
||||
@@ -90,117 +99,374 @@ class AsyncAction(QThread, ProcessWatcher):
|
||||
def should_stop(self):
|
||||
return self.stop
|
||||
|
||||
def enable_progress_controll(self):
|
||||
self.signal_progress_control.emit(True)
|
||||
|
||||
class UpdateSelectedApps(AsyncAction):
|
||||
def disable_progress_controll(self):
|
||||
self.signal_progress_control.emit(False)
|
||||
|
||||
def __init__(self, manager: SoftwareManager, i18n: I18n, pkgs: List[PackageView] = None):
|
||||
super(UpdateSelectedApps, self).__init__()
|
||||
self.pkgs = pkgs
|
||||
self.manager = manager
|
||||
self.root_password = None
|
||||
self.i18n = i18n
|
||||
def request_reboot(self, msg: str) -> bool:
|
||||
if self.request_confirmation(title=self.i18n['action.request_reboot.title'],
|
||||
body=msg,
|
||||
confirmation_label=self.i18n['yes'].capitalize(),
|
||||
deny_label=self.i18n['bt.not_now']):
|
||||
ProcessHandler(self).handle_simple(SimpleProcess(['reboot']))
|
||||
return True
|
||||
|
||||
def _pkg_as_option(self, pkg: SoftwarePackage, tooltip: bool = True) -> InputOption:
|
||||
if pkg.installed:
|
||||
icon_path = pkg.get_disk_icon_path()
|
||||
return False
|
||||
|
||||
if not icon_path or not os.path.isfile(icon_path):
|
||||
icon_path = pkg.get_type_icon_path()
|
||||
|
||||
else:
|
||||
icon_path = pkg.get_type_icon_path()
|
||||
|
||||
return InputOption(label='{}{}'.format(pkg.name, ' ( {} )'.format(pkg.latest_version) if pkg.latest_version else ''),
|
||||
value=None,
|
||||
tooltip=pkg.get_name_tooltip() if tooltip else None,
|
||||
read_only=True,
|
||||
icon_path=icon_path)
|
||||
|
||||
def _handle_update_requirements(self, pkgs: List[SoftwarePackage]) -> bool:
|
||||
self.change_substatus(self.i18n['action.update.requirements.status'])
|
||||
required_pkgs = self.manager.get_update_requirements(pkgs, self)
|
||||
|
||||
if required_pkgs:
|
||||
opts = [self._pkg_as_option(p) for p in required_pkgs]
|
||||
|
||||
if not self.request_confirmation(self.i18n['action.update.requirements.title'],
|
||||
self.i18n['action.update.requirements.body'].format(bold(str(len(opts)))),
|
||||
[MultipleSelectComponent(label='', options=opts, default_options=set(opts))],
|
||||
confirmation_label=self.i18n['continue'].capitalize(),
|
||||
deny_label=self.i18n['cancel'].capitalize()):
|
||||
self.notify_finished({'success': False, 'updated': 0, 'types': set()})
|
||||
self.pkgs = None
|
||||
def _generate_backup(self, app_config: dict, i18n: I18n, root_password: str) -> bool:
|
||||
if timeshift.is_available():
|
||||
if app_config['backup']['mode'] not in ('only_one', 'incremental'):
|
||||
self.show_message(title=self.i18n['error'].capitalize(),
|
||||
body='{}: {}'.format(self.i18n['action.backup.invalid_mode'], bold(app_config['backup']['mode'])),
|
||||
type_=MessageType.ERROR)
|
||||
return False
|
||||
|
||||
if not user.is_root() and not root_password:
|
||||
root_pwd, valid = self.request_root_password()
|
||||
else:
|
||||
for pkg in required_pkgs:
|
||||
if not self.manager.install(pkg, self.root_password, self):
|
||||
self.notify_finished({'success': False, 'updated': 0, 'types': set()})
|
||||
self.pkgs = None
|
||||
label = '{}{}'.format(pkg.name, ' ( {} )'.format(pkg.version) if pkg.version else '')
|
||||
self.show_message(title=self.i18n['action.update.install_req.fail.title'],
|
||||
body=self.i18n['action.update.install_req.fail.body'].format(label),
|
||||
type_=MessageType.ERROR)
|
||||
return False
|
||||
root_pwd, valid = root_password, True
|
||||
|
||||
if not valid:
|
||||
return False
|
||||
|
||||
handler = ProcessHandler(self)
|
||||
if app_config['backup']['mode'] == 'only_one':
|
||||
self.change_substatus('[{}] {}'.format(i18n['core.config.tab.backup'].lower(), i18n['action.backup.substatus.delete']))
|
||||
deleted, _ = handler.handle_simple(timeshift.delete_all_snapshots(root_pwd))
|
||||
|
||||
if not deleted and not self.request_confirmation(title=i18n['core.config.tab.backup'],
|
||||
body='{}. {}'.format(i18n['action.backup.error.delete'], i18n['action.backup.error.proceed']),
|
||||
confirmation_label=i18n['yes'].capitalize(),
|
||||
deny_label=i18n['no'].capitalize()):
|
||||
return False
|
||||
|
||||
self.change_substatus('[{}] {}'.format(i18n['core.config.tab.backup'].lower(), i18n['action.backup.substatus.create']))
|
||||
created, _ = handler.handle_simple(timeshift.create_snapshot(root_pwd))
|
||||
|
||||
if not created and not self.request_confirmation(title=i18n['core.config.tab.backup'],
|
||||
body='{}. {}'.format(i18n['action.backup.error.create'],
|
||||
i18n['action.backup.error.proceed']),
|
||||
confirmation_label=i18n['yes'].capitalize(),
|
||||
deny_label=i18n['no'].capitalize()):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def _sort_packages(self, pkgs: List[SoftwarePackage], app_config: dict) -> Tuple[bool, List[SoftwarePackage]]:
|
||||
if bool(app_config['updates']['sort_packages']):
|
||||
self.change_substatus(self.i18n['action.update.status.sorting'])
|
||||
sorted_pkgs = self.manager.sort_update_order([view.model for view in self.pkgs])
|
||||
else:
|
||||
sorted_pkgs = pkgs
|
||||
def request_backup(self, app_config: dict, key: str, i18n: I18n, root_password: str = None) -> bool:
|
||||
if bool(app_config['backup']['enabled']) and timeshift.is_available():
|
||||
val = app_config['backup'][key] if key else None
|
||||
|
||||
if len(sorted_pkgs) > 1:
|
||||
opts = [self._pkg_as_option(p, tooltip=False) for p in sorted_pkgs]
|
||||
proceed = self.request_confirmation(title=self.i18n['action.update.order.title'],
|
||||
body=self.i18n['action.update.order.body'] + ':',
|
||||
components=[MultipleSelectComponent(label='', options=opts, default_options=set(opts))],
|
||||
confirmation_label=self.i18n['continue'].capitalize(),
|
||||
deny_label=self.i18n['cancel'].capitalize())
|
||||
else:
|
||||
proceed = True
|
||||
if val is None: # ask mode
|
||||
if self.request_confirmation(title=i18n['core.config.tab.backup'],
|
||||
body=i18n['action.backup.msg'],
|
||||
confirmation_label=i18n['yes'].capitalize(),
|
||||
deny_label=i18n['no'].capitalize()):
|
||||
res = self._generate_backup(app_config, i18n, root_password)
|
||||
self.change_substatus('')
|
||||
return res
|
||||
|
||||
return proceed, sorted_pkgs
|
||||
elif val is True: # direct mode
|
||||
res = self._generate_backup(app_config, i18n, root_password)
|
||||
self.change_substatus('')
|
||||
return res
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class UpgradeSelected(AsyncAction):
|
||||
|
||||
LOGS_DIR = '{}/upgrade'.format(LOGS_PATH)
|
||||
SUMMARY_FILE = LOGS_DIR + '/{}_summary.txt'
|
||||
|
||||
def __init__(self, manager: SoftwareManager, i18n: I18n, pkgs: List[PackageView] = None):
|
||||
super(UpgradeSelected, self).__init__()
|
||||
self.pkgs = pkgs
|
||||
self.manager = manager
|
||||
self.i18n = i18n
|
||||
|
||||
def _req_as_option(self, req: UpgradeRequirement, tooltip: bool = True, custom_tooltip: str = None) -> InputOption:
|
||||
if req.pkg.installed:
|
||||
icon_path = req.pkg.get_disk_icon_path()
|
||||
|
||||
if not icon_path or not os.path.isfile(icon_path):
|
||||
icon_path = req.pkg.get_type_icon_path()
|
||||
|
||||
else:
|
||||
icon_path = req.pkg.get_type_icon_path()
|
||||
|
||||
size_str = '{}: {}'.format(self.i18n['size'].capitalize(),
|
||||
'?' if req.extra_size is None else get_human_size_str(req.extra_size))
|
||||
if req.extra_size != req.required_size:
|
||||
size_str += ' ( {}: {} )'.format(self.i18n['action.update.pkg.required_size'].capitalize(),
|
||||
'?' if req.required_size is None else get_human_size_str(req.required_size))
|
||||
|
||||
label = '{}{} - {}'.format(req.pkg.name,
|
||||
' ( {} )'.format(req.pkg.latest_version) if req.pkg.latest_version else '',
|
||||
size_str)
|
||||
|
||||
return InputOption(label=label,
|
||||
value=None,
|
||||
tooltip=custom_tooltip if custom_tooltip else (req.pkg.get_name_tooltip() if tooltip else None),
|
||||
read_only=True,
|
||||
icon_path=icon_path)
|
||||
|
||||
def filter_to_update(self) -> Tuple[List[PackageView], bool]: # packages to update and if they require root privileges
|
||||
to_update, requires_root = [], False
|
||||
root_user = user.is_root()
|
||||
|
||||
for pkg in self.pkgs:
|
||||
if pkg.model.update and pkg.update_checked:
|
||||
to_update.append(pkg)
|
||||
|
||||
if not root_user and not requires_root and self.manager.requires_root('update', pkg.model):
|
||||
requires_root = True
|
||||
|
||||
return to_update, requires_root
|
||||
|
||||
def _sum_pkgs_size(self, reqs: List[UpgradeRequirement]) -> Tuple[int, int]:
|
||||
required, extra = 0, 0
|
||||
for r in reqs:
|
||||
if r.required_size is not None:
|
||||
required += r.required_size
|
||||
|
||||
if r.extra_size is not None:
|
||||
extra += r.extra_size
|
||||
|
||||
return required, extra
|
||||
|
||||
def _gen_cannot_update_form(self, reqs: List[UpgradeRequirement]) -> FormComponent:
|
||||
opts = [self._req_as_option(r.pkg, False, r.reason) for r in reqs]
|
||||
comps = [MultipleSelectComponent(label='', options=opts, default_options=set(opts))]
|
||||
|
||||
return FormComponent(label=self.i18n['action.update.cannot_update_label'], components=comps)
|
||||
|
||||
def _gen_to_install_form(self, reqs: List[UpgradeRequirement]) -> Tuple[FormComponent, Tuple[int, int]]:
|
||||
opts = [self._req_as_option(r) for r in reqs]
|
||||
comps = [MultipleSelectComponent(label='', options=opts, default_options=set(opts))]
|
||||
required_size, extra_size = self._sum_pkgs_size(reqs)
|
||||
|
||||
lb = '{} ( {}: {}. {}: {}. {}: {} )'.format(self.i18n['action.update.required_label'].capitalize(),
|
||||
self.i18n['amount'].capitalize(),
|
||||
len(opts),
|
||||
self.i18n['size'].capitalize(),
|
||||
'?' if extra_size is None else get_human_size_str(extra_size),
|
||||
self.i18n['action.update.pkg.required_size'].capitalize(),
|
||||
'?' if required_size is None else get_human_size_str(required_size))
|
||||
return FormComponent(label=lb, components=comps), (required_size, extra_size)
|
||||
|
||||
def _gen_to_remove_form(self, reqs: List[UpgradeRequirement]) -> FormComponent:
|
||||
opts = [self._req_as_option(r, False, r.reason) for r in reqs]
|
||||
comps = [MultipleSelectComponent(label='', options=opts, default_options=set(opts))]
|
||||
required_size, extra_size = self._sum_pkgs_size(reqs)
|
||||
|
||||
lb = '{} ( {}: {}. {}: {} )'.format(self.i18n['action.update.label_to_remove'].capitalize(),
|
||||
self.i18n['amount'].capitalize(),
|
||||
len(opts),
|
||||
self.i18n['size'].capitalize(),
|
||||
'?' if extra_size is None else get_human_size_str(-extra_size))
|
||||
return FormComponent(label=lb, components=comps)
|
||||
|
||||
def _gen_to_update_form(self, reqs: List[UpgradeRequirement]) -> Tuple[FormComponent, Tuple[int, int]]:
|
||||
opts = [self._req_as_option(r, tooltip=False) for r in reqs]
|
||||
comps = [MultipleSelectComponent(label='', options=opts, default_options=set(opts))]
|
||||
required_size, extra_size = self._sum_pkgs_size(reqs)
|
||||
|
||||
lb = '{} ( {}: {}. {}: {}. {}: {} )'.format(self.i18n['action.update.label_to_upgrade'].capitalize(),
|
||||
self.i18n['amount'].capitalize(),
|
||||
len(opts),
|
||||
self.i18n['size'].capitalize(),
|
||||
'?' if extra_size is None else get_human_size_str(extra_size),
|
||||
self.i18n['action.update.pkg.required_size'].capitalize(),
|
||||
'?' if required_size is None else get_human_size_str(required_size))
|
||||
|
||||
return FormComponent(label=lb, components=comps), (required_size, extra_size)
|
||||
|
||||
def _trim_disk(self, root_password: str):
|
||||
if self.request_confirmation(title=self.i18n['confirmation'].capitalize(),
|
||||
body=self.i18n['action.trim_disk.ask']):
|
||||
|
||||
pwd = root_password
|
||||
|
||||
if not pwd and user.is_root():
|
||||
pwd, success = self.request_root_password()
|
||||
|
||||
if not success:
|
||||
return
|
||||
|
||||
self.change_substatus(self.i18n['action.disk_trim'].capitalize())
|
||||
|
||||
success, output = ProcessHandler(self).handle_simple(SimpleProcess(['fstrim', '/', '-v'], root_password=pwd))
|
||||
|
||||
if not success:
|
||||
self.show_message(title=self.i18n['success'].capitalize(),
|
||||
body=self.i18n['action.disk_trim.error'],
|
||||
type_=MessageType.ERROR)
|
||||
|
||||
def _write_summary_log(self, upgrade_id: str, requirements: UpgradeRequirements):
|
||||
try:
|
||||
Path(self.LOGS_DIR).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
summary_text = StringIO()
|
||||
summary_text.write('Upgrade summary ( id: {} )'.format(upgrade_id))
|
||||
|
||||
if requirements.cannot_upgrade:
|
||||
summary_text.write('\nCannot upgrade:')
|
||||
|
||||
for dep in requirements.cannot_upgrade:
|
||||
type_label = self.i18n.get('gem.{}.type.{}.label'.format(dep.pkg.gem_name, dep.pkg.get_type().lower()), dep.pkg.get_type().capitalize())
|
||||
summary_text.write('\n * Type:{}\tName: {}\tVersion: {}\tReason: {}'.format(type_label, dep.pkg.name, dep.pkg.version if dep.pkg.version else '?', dep.reason if dep.reason else '?'))
|
||||
|
||||
summary_text.write('\n')
|
||||
|
||||
if requirements.to_remove:
|
||||
summary_text.write('\nMust be removed:')
|
||||
|
||||
for dep in requirements.to_remove:
|
||||
type_label = self.i18n.get('gem.{}.type.{}.label'.format(dep.pkg.gem_name, dep.pkg.get_type().lower()), dep.pkg.get_type().capitalize())
|
||||
summary_text.write('\n * Type:{}\tName: {}\tVersion: {}\tReason: {}'.format(type_label, dep.pkg.name, dep.pkg.version if dep.pkg.version else '?', dep.reason if dep.reason else '?'))
|
||||
|
||||
summary_text.write('\n')
|
||||
|
||||
if requirements.to_install:
|
||||
summary_text.write('\nMust be installed:')
|
||||
|
||||
for dep in requirements.to_install:
|
||||
type_label = self.i18n.get(
|
||||
'gem.{}.type.{}.label'.format(dep.pkg.gem_name, dep.pkg.get_type().lower()),
|
||||
dep.pkg.get_type().capitalize())
|
||||
summary_text.write('\n * Type:{}\tName: {}\tVersion: {}\tReason: {}'.format(type_label,
|
||||
dep.pkg.name,
|
||||
dep.pkg.version if dep.pkg.version else '?',
|
||||
dep.reason if dep.reason else '?'))
|
||||
|
||||
summary_text.write('\n')
|
||||
|
||||
if requirements.to_upgrade:
|
||||
summary_text.write('\nWill be upgraded:')
|
||||
|
||||
for dep in requirements.to_upgrade:
|
||||
type_label = self.i18n.get('gem.{}.type.{}.label'.format(dep.pkg.gem_name, dep.pkg.get_type().lower()), dep.pkg.get_type().capitalize())
|
||||
summary_text.write(
|
||||
'\n * Type:{}\tName: {}\tVersion:{} \tNew version: {}'.format(type_label,
|
||||
dep.pkg.name,
|
||||
dep.pkg.version if dep.pkg.version else '?',
|
||||
dep.pkg.latest_version if dep.pkg.latest_version else '?'))
|
||||
|
||||
summary_text.write('\n')
|
||||
|
||||
summary_text.seek(0)
|
||||
|
||||
with open(self.SUMMARY_FILE.format(upgrade_id), 'w+') as f:
|
||||
f.write(summary_text.read())
|
||||
|
||||
except:
|
||||
traceback.print_exc()
|
||||
|
||||
def run(self):
|
||||
to_update, requires_root = self.filter_to_update()
|
||||
|
||||
root_password = None
|
||||
|
||||
success = False
|
||||
if not user.is_root() and requires_root:
|
||||
root_password, ok = self.request_root_password()
|
||||
|
||||
if self.pkgs:
|
||||
updated, updated_types = 0, set()
|
||||
|
||||
app_config = config.read_config()
|
||||
|
||||
models = [view.model for view in self.pkgs]
|
||||
|
||||
if bool(app_config['updates']['pre_dependency_checking']) and not self._handle_update_requirements(models):
|
||||
return
|
||||
|
||||
proceed, sorted_pkgs = self._sort_packages(models, app_config)
|
||||
|
||||
if not proceed:
|
||||
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types})
|
||||
if not ok:
|
||||
self.notify_finished({'success': False, 'updated': 0, 'types': set(), 'id': None})
|
||||
self.pkgs = None
|
||||
return
|
||||
|
||||
for pkg in sorted_pkgs:
|
||||
self.change_substatus('')
|
||||
name = pkg.name if not RE_VERSION_IN_NAME.findall(pkg.name) else pkg.name.split('version')[0].strip()
|
||||
if len(to_update) > 1:
|
||||
self.disable_progress_controll()
|
||||
else:
|
||||
self.enable_progress_controll()
|
||||
|
||||
self.change_status('{} {} {}...'.format(self.i18n['manage_window.status.upgrading'], name, pkg.version))
|
||||
success = bool(self.manager.update(pkg, self.root_password, self))
|
||||
self.change_substatus('')
|
||||
success = False
|
||||
|
||||
if not success:
|
||||
updated, updated_types = 0, set()
|
||||
|
||||
models = [view.model for view in to_update]
|
||||
|
||||
self.change_substatus(self.i18n['action.update.requirements.status'])
|
||||
requirements = self.manager.get_upgrade_requirements(models, root_password, self)
|
||||
|
||||
if not requirements:
|
||||
self.pkgs = None
|
||||
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types, 'id': None})
|
||||
return
|
||||
|
||||
comps, required_size, extra_size = [], 0, 0
|
||||
|
||||
if requirements.cannot_upgrade:
|
||||
comps.append(self._gen_cannot_update_form(requirements.cannot_upgrade))
|
||||
|
||||
if requirements.to_install:
|
||||
req_form, reqs_size = self._gen_to_install_form(requirements.to_install)
|
||||
required_size += reqs_size[0]
|
||||
extra_size += reqs_size[1]
|
||||
comps.append(req_form)
|
||||
|
||||
if requirements.to_remove:
|
||||
comps.append(self._gen_to_remove_form(requirements.to_remove))
|
||||
|
||||
updates_form, updates_size = self._gen_to_update_form(requirements.to_upgrade)
|
||||
required_size += updates_size[0]
|
||||
extra_size += updates_size[1]
|
||||
comps.append(updates_form)
|
||||
|
||||
extra_size_text = '{}: {}'.format(self.i18n['action.update.total_size'].capitalize(), get_human_size_str(extra_size))
|
||||
req_size_text = '{}: {}'.format(self.i18n['action.update.required_size'].capitalize(),
|
||||
get_human_size_str(required_size))
|
||||
comps.insert(0, TextComponent(bold('{} | {}').format(extra_size_text, req_size_text), size=14))
|
||||
comps.insert(1, TextComponent(''))
|
||||
|
||||
if not self.request_confirmation(title=self.i18n['action.update.summary'].capitalize(), body='', components=comps):
|
||||
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types, 'id': None})
|
||||
self.pkgs = None
|
||||
return
|
||||
|
||||
self.change_substatus('')
|
||||
|
||||
app_config = read_config()
|
||||
|
||||
if bool(app_config['backup']['enabled']) and app_config['backup']['upgrade'] in (True, None) and timeshift.is_available():
|
||||
any_requires_bkp = False
|
||||
|
||||
for dep in requirements.to_upgrade:
|
||||
if dep.pkg.supports_backup():
|
||||
any_requires_bkp = True
|
||||
break
|
||||
else:
|
||||
updated += 1
|
||||
updated_types.add(pkg.__class__)
|
||||
self.signal_output.emit('\n')
|
||||
|
||||
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types})
|
||||
if any_requires_bkp:
|
||||
if not self.request_backup(app_config, 'upgrade', self.i18n, root_password):
|
||||
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types, 'id': None})
|
||||
self.pkgs = None
|
||||
return
|
||||
|
||||
self.change_substatus('')
|
||||
|
||||
timestamp = datetime.now()
|
||||
upgrade_id = 'upgrade_{}{}{}_{}'.format(timestamp.year, timestamp.month, timestamp.day, int(time.time()))
|
||||
|
||||
self._write_summary_log(upgrade_id, requirements)
|
||||
|
||||
success = bool(self.manager.upgrade(requirements, root_password, self))
|
||||
self.change_substatus('')
|
||||
|
||||
if success:
|
||||
updated = len(requirements.to_upgrade)
|
||||
updated_types.update((req.pkg.__class__ for req in requirements.to_upgrade))
|
||||
|
||||
if bool(app_config['disk']['trim_after_update']):
|
||||
self._trim_disk(root_password)
|
||||
|
||||
msg = '<p>{}</p>{}</p><br/><p>{}</p>'.format(self.i18n['action.update.success.reboot.line1'],
|
||||
self.i18n['action.update.success.reboot.line2'],
|
||||
self.i18n['action.update.success.reboot.line3'])
|
||||
self.request_reboot(msg)
|
||||
|
||||
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types, 'id': upgrade_id})
|
||||
self.pkgs = None
|
||||
|
||||
|
||||
@@ -241,16 +507,24 @@ class RefreshApps(AsyncAction):
|
||||
|
||||
class UninstallApp(AsyncAction):
|
||||
|
||||
def __init__(self, manager: SoftwareManager, icon_cache: MemoryCache, app: PackageView = None):
|
||||
def __init__(self, manager: SoftwareManager, icon_cache: MemoryCache, i18n: I18n, app: PackageView = None):
|
||||
super(UninstallApp, self).__init__()
|
||||
self.app = app
|
||||
self.manager = manager
|
||||
self.icon_cache = icon_cache
|
||||
self.root_password = None
|
||||
self.root_pwd = None
|
||||
self.i18n = i18n
|
||||
|
||||
def run(self):
|
||||
if self.app:
|
||||
success = self.manager.uninstall(self.app.model, self.root_password, self)
|
||||
if self.app.model.supports_backup():
|
||||
if not self.request_backup(read_config(), 'uninstall', self.i18n, self.root_pwd):
|
||||
self.notify_finished(False)
|
||||
self.app = None
|
||||
self.root_pwd = None
|
||||
return
|
||||
|
||||
success = self.manager.uninstall(self.app.model, self.root_pwd, self)
|
||||
|
||||
if success:
|
||||
self.icon_cache.delete(self.app.model.icon_url)
|
||||
@@ -258,7 +532,7 @@ class UninstallApp(AsyncAction):
|
||||
|
||||
self.notify_finished(self.app if success else None)
|
||||
self.app = None
|
||||
self.root_password = None
|
||||
self.root_pwd = None
|
||||
|
||||
|
||||
class DowngradeApp(AsyncAction):
|
||||
@@ -268,20 +542,28 @@ class DowngradeApp(AsyncAction):
|
||||
self.manager = manager
|
||||
self.app = app
|
||||
self.i18n = i18n
|
||||
self.root_password = None
|
||||
self.root_pwd = None
|
||||
|
||||
def run(self):
|
||||
if self.app:
|
||||
success = False
|
||||
|
||||
if self.app.model.supports_backup():
|
||||
if not self.request_backup(read_config(), 'downgrade', self.i18n, self.root_pwd):
|
||||
self.notify_finished({'app': self.app, 'success': success})
|
||||
self.app = None
|
||||
self.root_pwd = None
|
||||
return
|
||||
|
||||
try:
|
||||
success = self.manager.downgrade(self.app.model, self.root_password, self)
|
||||
success = self.manager.downgrade(self.app.model, self.root_pwd, self)
|
||||
except (requests.exceptions.ConnectionError, NoInternetException) as e:
|
||||
success = False
|
||||
self.print(self.i18n['internet.required'])
|
||||
finally:
|
||||
self.notify_finished({'app': self.app, 'success': success})
|
||||
self.app = None
|
||||
self.root_password = None
|
||||
self.root_pwd = None
|
||||
|
||||
|
||||
class GetAppInfo(AsyncAction):
|
||||
@@ -341,23 +623,27 @@ class SearchPackages(AsyncAction):
|
||||
|
||||
class InstallPackage(AsyncAction):
|
||||
|
||||
def __init__(self, manager: SoftwareManager, disk_cache: bool, icon_cache: MemoryCache, i18n: I18n, pkg: PackageView = None):
|
||||
def __init__(self, manager: SoftwareManager, icon_cache: MemoryCache, i18n: I18n, pkg: PackageView = None):
|
||||
super(InstallPackage, self).__init__()
|
||||
self.pkg = pkg
|
||||
self.manager = manager
|
||||
self.icon_cache = icon_cache
|
||||
self.disk_cache = disk_cache
|
||||
self.i18n = i18n
|
||||
self.root_password = None
|
||||
self.root_pwd = None
|
||||
|
||||
def run(self):
|
||||
if self.pkg:
|
||||
success = False
|
||||
|
||||
try:
|
||||
success = self.manager.install(self.pkg.model, self.root_password, self)
|
||||
if self.pkg.model.supports_backup():
|
||||
if not self.request_backup(read_config(), 'install', self.i18n, self.root_pwd):
|
||||
self.signal_finished.emit({'success': False, 'pkg': self.pkg})
|
||||
return
|
||||
|
||||
if success and self.disk_cache:
|
||||
try:
|
||||
success = self.manager.install(self.pkg.model, self.root_pwd, self)
|
||||
|
||||
if success:
|
||||
self.pkg.model.installed = True
|
||||
|
||||
if self.pkg.model.supports_disk_cache():
|
||||
@@ -405,6 +691,9 @@ class AnimateProgress(QThread):
|
||||
self.increment = 0.5
|
||||
self.paused = False
|
||||
|
||||
if self.progress_value >= val:
|
||||
self.progress_value = val
|
||||
|
||||
def pause(self):
|
||||
self.paused = True
|
||||
|
||||
@@ -440,47 +729,62 @@ class AnimateProgress(QThread):
|
||||
self._reset()
|
||||
|
||||
|
||||
class VerifyModels(QThread):
|
||||
class NotifyPackagesReady(QThread):
|
||||
|
||||
signal_updates = pyqtSignal()
|
||||
signal_finished = pyqtSignal()
|
||||
signal_changed = pyqtSignal(int)
|
||||
|
||||
def __init__(self, apps: List[PackageView] = None):
|
||||
super(VerifyModels, self).__init__()
|
||||
self.apps = apps
|
||||
def __init__(self, pkgs: List[PackageView] = None):
|
||||
super(NotifyPackagesReady, self).__init__()
|
||||
self.pkgs = pkgs
|
||||
self.work = True
|
||||
|
||||
def run(self):
|
||||
timeout = datetime.now() + timedelta(seconds=15)
|
||||
|
||||
if self.apps:
|
||||
|
||||
stop_at = datetime.utcnow() + timedelta(seconds=30)
|
||||
last_ready = 0
|
||||
|
||||
while True:
|
||||
|
||||
to_verify = {p.table_index: p for p in self.pkgs}
|
||||
while self.work and datetime.now() < timeout:
|
||||
to_remove = []
|
||||
for idx, pkg in to_verify.items():
|
||||
if not self.work:
|
||||
break
|
||||
elif pkg.model.status == PackageStatus.READY:
|
||||
to_remove.append(idx)
|
||||
if pkg.status == PackageViewStatus.LOADING:
|
||||
self.signal_changed.emit(pkg.table_index)
|
||||
|
||||
current_ready = 0
|
||||
if not self.work:
|
||||
break
|
||||
|
||||
for app in self.apps:
|
||||
current_ready += 1 if app.model.status == PackageStatus.READY else 0
|
||||
if datetime.now() >= timeout:
|
||||
break
|
||||
|
||||
if current_ready > last_ready:
|
||||
last_ready = current_ready
|
||||
self.signal_updates.emit()
|
||||
for idx in to_remove:
|
||||
del to_verify[idx]
|
||||
|
||||
if current_ready == len(self.apps):
|
||||
self.signal_updates.emit()
|
||||
break
|
||||
if not to_verify:
|
||||
break
|
||||
|
||||
if stop_at <= datetime.utcnow():
|
||||
break
|
||||
|
||||
time.sleep(0.1)
|
||||
time.sleep(0.1)
|
||||
|
||||
self.pkgs = None
|
||||
self.work = True
|
||||
self.apps = None
|
||||
self.signal_finished.emit()
|
||||
|
||||
|
||||
class NotifyInstalledLoaded(QThread):
|
||||
signal_loaded = pyqtSignal()
|
||||
|
||||
def __init__(self):
|
||||
super(NotifyInstalledLoaded, self).__init__()
|
||||
self.loaded = False
|
||||
|
||||
def notify_loaded(self):
|
||||
self.loaded = True
|
||||
|
||||
def run(self):
|
||||
time.sleep(0.1)
|
||||
self.signal_loaded.emit()
|
||||
|
||||
|
||||
class FindSuggestions(AsyncAction):
|
||||
@@ -560,30 +864,37 @@ class ApplyFilters(AsyncAction):
|
||||
|
||||
class CustomAction(AsyncAction):
|
||||
|
||||
def __init__(self, manager: SoftwareManager, i18n: I18n, custom_action: PackageAction = None, pkg: PackageView = None, root_password: str = None):
|
||||
def __init__(self, manager: SoftwareManager, i18n: I18n, custom_action: CustomSoftwareAction = None, pkg: PackageView = None, root_password: str = None):
|
||||
super(CustomAction, self).__init__()
|
||||
self.manager = manager
|
||||
self.pkg = pkg
|
||||
self.custom_action = custom_action
|
||||
self.root_password = root_password
|
||||
self.root_pwd = root_password
|
||||
self.i18n = i18n
|
||||
|
||||
def run(self):
|
||||
success = True
|
||||
if self.pkg:
|
||||
try:
|
||||
success = self.manager.execute_custom_action(action=self.custom_action,
|
||||
pkg=self.pkg.model,
|
||||
root_password=self.root_password,
|
||||
watcher=self)
|
||||
except (requests.exceptions.ConnectionError, NoInternetException):
|
||||
success = False
|
||||
self.signal_output.emit(self.i18n['internet.required'])
|
||||
if self.custom_action.backup:
|
||||
app_config = read_config()
|
||||
if not self.request_backup(app_config, None, self.i18n, self.root_pwd):
|
||||
self.notify_finished({'success': False, 'pkg': self.pkg})
|
||||
self.pkg = None
|
||||
self.custom_action = None
|
||||
self.root_pwd = None
|
||||
return
|
||||
|
||||
try:
|
||||
success = self.manager.execute_custom_action(action=self.custom_action,
|
||||
pkg=self.pkg.model if self.pkg else None,
|
||||
root_password=self.root_pwd,
|
||||
watcher=self)
|
||||
except (requests.exceptions.ConnectionError, NoInternetException):
|
||||
success = False
|
||||
self.signal_output.emit(self.i18n['internet.required'])
|
||||
|
||||
self.notify_finished({'success': success, 'pkg': self.pkg})
|
||||
self.pkg = None
|
||||
self.custom_action = None
|
||||
self.root_password = None
|
||||
self.root_pwd = None
|
||||
|
||||
|
||||
class GetScreenshots(AsyncAction):
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from enum import Enum
|
||||
|
||||
from bauh.api.abstract.model import SoftwarePackage
|
||||
from bauh.api.abstract.model import SoftwarePackage, PackageStatus
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class PackageViewStatus(Enum):
|
||||
@@ -8,13 +9,22 @@ class PackageViewStatus(Enum):
|
||||
READY = 1
|
||||
|
||||
|
||||
def get_type_label(type_: str, gem: str, i18n: I18n) -> str:
|
||||
type_label = 'gem.{}.type.{}.label'.format(gem, type_)
|
||||
return i18n.get(type_label, type_.capitalize()).strip()
|
||||
|
||||
|
||||
class PackageView:
|
||||
|
||||
def __init__(self, model: SoftwarePackage):
|
||||
def __init__(self, model: SoftwarePackage, i18n: I18n):
|
||||
self.model = model
|
||||
self.update_checked = model.update
|
||||
self.status = PackageViewStatus.LOADING
|
||||
self.status = PackageViewStatus.LOADING if model.status == PackageStatus.LOADING_DATA else PackageViewStatus.READY
|
||||
self.table_index = -1
|
||||
self.i18n = i18n
|
||||
|
||||
def get_type_label(self) -> str:
|
||||
return get_type_label(self.model.get_type(), self.model.gem_name, self.i18n)
|
||||
|
||||
def __repr__(self):
|
||||
return '{} ( {} )'.format(self.model.name, self.model.get_type())
|
||||
return '{} ( {} )'.format(self.model.name, self.get_type_label())
|
||||
|
||||
@@ -1,22 +1,25 @@
|
||||
import logging
|
||||
import time
|
||||
import traceback
|
||||
from pathlib import Path
|
||||
from typing import List, Type, Set
|
||||
from typing import List, Type, Set, Tuple
|
||||
|
||||
from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal, QCoreApplication
|
||||
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent
|
||||
from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal
|
||||
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QCursor
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHeaderView, QToolBar, \
|
||||
QLabel, QPlainTextEdit, QLineEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy
|
||||
QLabel, QPlainTextEdit, QLineEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy, \
|
||||
QMenu, QAction
|
||||
|
||||
from bauh import LOGS_PATH
|
||||
from bauh.api.abstract.cache import MemoryCache
|
||||
from bauh.api.abstract.context import ApplicationContext
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.model import SoftwarePackage, PackageAction
|
||||
from bauh.api.abstract.model import SoftwarePackage
|
||||
from bauh.api.abstract.view import MessageType
|
||||
from bauh.api.http import HttpClient
|
||||
from bauh.commons import user
|
||||
from bauh.commons.html import bold
|
||||
from bauh.gems.web import TEMP_PATH
|
||||
from bauh.view.core.tray_client import notify_tray
|
||||
from bauh.view.qt import dialog, commons, qt_utils, root
|
||||
from bauh.view.qt.about import AboutDialog
|
||||
from bauh.view.qt.apps_table import AppsTable, UpdateToggleButton
|
||||
@@ -27,10 +30,11 @@ from bauh.view.qt.info import InfoDialog
|
||||
from bauh.view.qt.root import ask_root_password
|
||||
from bauh.view.qt.screenshots import ScreenshotsDialog
|
||||
from bauh.view.qt.settings import SettingsWindow
|
||||
from bauh.view.qt.thread import UpdateSelectedApps, RefreshApps, UninstallApp, DowngradeApp, GetAppInfo, \
|
||||
GetAppHistory, SearchPackages, InstallPackage, AnimateProgress, VerifyModels, FindSuggestions, ListWarnings, \
|
||||
AsyncAction, LaunchApp, ApplyFilters, CustomAction, GetScreenshots
|
||||
from bauh.view.qt.view_model import PackageView
|
||||
from bauh.view.qt.thread import UpgradeSelected, RefreshApps, UninstallApp, DowngradeApp, GetAppInfo, \
|
||||
GetAppHistory, SearchPackages, InstallPackage, AnimateProgress, NotifyPackagesReady, FindSuggestions, \
|
||||
ListWarnings, \
|
||||
AsyncAction, LaunchApp, ApplyFilters, CustomSoftwareAction, GetScreenshots, CustomAction, NotifyInstalledLoaded
|
||||
from bauh.view.qt.view_model import PackageView, PackageViewStatus
|
||||
from bauh.view.util import util, resource
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
@@ -49,12 +53,11 @@ class ManageWindow(QWidget):
|
||||
signal_table_update = pyqtSignal()
|
||||
|
||||
def __init__(self, i18n: I18n, icon_cache: MemoryCache, manager: SoftwareManager, screen_size, config: dict,
|
||||
context: ApplicationContext, http_client: HttpClient, logger: logging.Logger, icon: QIcon, tray_icon=None):
|
||||
context: ApplicationContext, http_client: HttpClient, logger: logging.Logger, icon: QIcon):
|
||||
super(ManageWindow, self).__init__()
|
||||
self.i18n = i18n
|
||||
self.logger = logger
|
||||
self.manager = manager
|
||||
self.tray_icon = tray_icon
|
||||
self.working = False # restrict the number of threaded actions
|
||||
self.pkgs = [] # packages current loaded in the table
|
||||
self.pkgs_available = [] # all packages loaded in memory
|
||||
@@ -188,7 +191,7 @@ class ManageWindow(QWidget):
|
||||
self.bt_installed.setToolTip(self.i18n['manage_window.bt.installed.tooltip'])
|
||||
self.bt_installed.setIcon(QIcon(resource.get_path('img/disk.svg')))
|
||||
self.bt_installed.setText(self.i18n['manage_window.bt.installed.text'].capitalize())
|
||||
self.bt_installed.clicked.connect(self._show_installed)
|
||||
self.bt_installed.clicked.connect(self._begin_loading_installed)
|
||||
self.bt_installed.setStyleSheet(toolbar_button_style('#A94E0A'))
|
||||
self.ref_bt_installed = self.toolbar.addWidget(self.bt_installed)
|
||||
toolbar_bts.append(self.bt_installed)
|
||||
@@ -211,7 +214,7 @@ class ManageWindow(QWidget):
|
||||
self.bt_refresh.setIcon(QIcon(resource.get_path('img/refresh.svg')))
|
||||
self.bt_refresh.setText(self.i18n['manage_window.bt.refresh.text'])
|
||||
self.bt_refresh.setStyleSheet(toolbar_button_style('#2368AD'))
|
||||
self.bt_refresh.clicked.connect(lambda: self.refresh_apps(keep_console=False))
|
||||
self.bt_refresh.clicked.connect(lambda: self.refresh_packages(keep_console=False))
|
||||
toolbar_bts.append(self.bt_refresh)
|
||||
self.ref_bt_refresh = self.toolbar.addWidget(self.bt_refresh)
|
||||
|
||||
@@ -238,9 +241,7 @@ class ManageWindow(QWidget):
|
||||
|
||||
self.layout.addWidget(self.toolbar)
|
||||
|
||||
self.table_apps = AppsTable(self, self.icon_cache,
|
||||
disk_cache=bool(self.config['disk_cache']['enabled']),
|
||||
download_icons=bool(self.config['download']['icons']))
|
||||
self.table_apps = AppsTable(self, self.icon_cache, download_icons=bool(self.config['download']['icons']))
|
||||
self.table_apps.change_headers_policy()
|
||||
|
||||
self.layout.addWidget(self.table_apps)
|
||||
@@ -275,9 +276,9 @@ class ManageWindow(QWidget):
|
||||
self.layout.addWidget(self.toolbar_substatus)
|
||||
self._change_label_substatus('')
|
||||
|
||||
self.thread_update = self._bind_async_action(UpdateSelectedApps(self.manager, self.i18n), finished_call=self._finish_update_selected)
|
||||
self.thread_update = self._bind_async_action(UpgradeSelected(self.manager, self.i18n), finished_call=self._finish_upgrade_selected)
|
||||
self.thread_refresh = self._bind_async_action(RefreshApps(self.manager), finished_call=self._finish_refresh_apps, only_finished=True)
|
||||
self.thread_uninstall = self._bind_async_action(UninstallApp(self.manager, self.icon_cache), finished_call=self._finish_uninstall)
|
||||
self.thread_uninstall = self._bind_async_action(UninstallApp(self.manager, self.icon_cache, self.i18n), finished_call=self._finish_uninstall)
|
||||
self.thread_get_info = self._bind_async_action(GetAppInfo(self.manager), finished_call=self._finish_get_info)
|
||||
self.thread_get_history = self._bind_async_action(GetAppHistory(self.manager, self.i18n), finished_call=self._finish_get_history)
|
||||
self.thread_search = self._bind_async_action(SearchPackages(self.manager), finished_call=self._finish_search, only_finished=True)
|
||||
@@ -292,14 +293,15 @@ class ManageWindow(QWidget):
|
||||
self.thread_apply_filters.signal_table.connect(self._update_table_and_upgrades)
|
||||
self.signal_table_update.connect(self.thread_apply_filters.stop_waiting)
|
||||
|
||||
self.thread_install = InstallPackage(manager=self.manager, disk_cache=bool(self.config['disk_cache']['enabled']), icon_cache=self.icon_cache, i18n=self.i18n)
|
||||
self.thread_install = InstallPackage(manager=self.manager, icon_cache=self.icon_cache, i18n=self.i18n)
|
||||
self._bind_async_action(self.thread_install, finished_call=self._finish_install)
|
||||
|
||||
self.thread_animate_progress = AnimateProgress()
|
||||
self.thread_animate_progress.signal_change.connect(self._update_progress)
|
||||
|
||||
self.thread_verify_models = VerifyModels()
|
||||
self.thread_verify_models.signal_updates.connect(self._notify_model_data_change)
|
||||
self.thread_notify_pkgs_ready = NotifyPackagesReady()
|
||||
self.thread_notify_pkgs_ready.signal_changed.connect(self._update_package_data)
|
||||
self.thread_notify_pkgs_ready.signal_finished.connect(self._update_state_when_pkgs_ready)
|
||||
|
||||
self.toolbar_bottom = QToolBar()
|
||||
self.toolbar_bottom.setIconSize(QSize(16, 16))
|
||||
@@ -315,6 +317,15 @@ class ManageWindow(QWidget):
|
||||
|
||||
self.toolbar_bottom.addWidget(new_spacer())
|
||||
|
||||
self.custom_actions = manager.get_custom_actions()
|
||||
bt_custom_actions = IconButton(QIcon(resource.get_path('img/custom_actions.svg')),
|
||||
action=self.show_custom_actions,
|
||||
background="#669900",
|
||||
i18n=self.i18n,
|
||||
tooltip=self.i18n['manage_window.bt_custom_actions.tip'])
|
||||
bt_custom_actions.setVisible(bool(self.custom_actions))
|
||||
self.ref_bt_custom_actions = self.toolbar_bottom.addWidget(bt_custom_actions)
|
||||
|
||||
bt_settings = IconButton(QIcon(resource.get_path('img/app_settings.svg')),
|
||||
action=self.show_settings,
|
||||
background='#12ABAB',
|
||||
@@ -351,15 +362,20 @@ class ManageWindow(QWidget):
|
||||
self.settings_window = None
|
||||
self.search_performed = False
|
||||
|
||||
def set_tray_icon(self, tray_icon):
|
||||
self.tray_icon = tray_icon
|
||||
# self.combo_styles.show_panel_after_restart = bool(tray_icon)
|
||||
self.thread_load_installed = NotifyInstalledLoaded()
|
||||
self.thread_load_installed.signal_loaded.connect(self._finish_loading_installed)
|
||||
|
||||
def update_custom_actions(self):
|
||||
self.custom_actions = self.manager.get_custom_actions()
|
||||
self.ref_bt_custom_actions.setVisible(bool(self.custom_actions))
|
||||
|
||||
def _update_process_progress(self, val: int):
|
||||
if self.progress_controll_enabled:
|
||||
self.thread_animate_progress.set_progress(val)
|
||||
|
||||
def apply_filters_async(self):
|
||||
self.thread_notify_pkgs_ready.work = False
|
||||
self.thread_notify_pkgs_ready.wait(5)
|
||||
self.label_status.setText(self.i18n['manage_window.status.filtering'] + '...')
|
||||
|
||||
self.ref_toolbar_search.setVisible(False)
|
||||
@@ -370,19 +386,32 @@ class ManageWindow(QWidget):
|
||||
self.thread_apply_filters.filters = self._gen_filters()
|
||||
self.thread_apply_filters.pkgs = self.pkgs_available
|
||||
self.thread_apply_filters.start()
|
||||
self.checkbox_only_apps.setEnabled(False)
|
||||
self.combo_categories.setEnabled(False)
|
||||
self.combo_filter_type.setEnabled(False)
|
||||
self.input_name_filter.setEnabled(False)
|
||||
self.checkbox_updates.setEnabled(False)
|
||||
self.table_apps.setEnabled(False)
|
||||
|
||||
def _update_table_and_upgrades(self, pkgs_info: dict):
|
||||
self._update_table(pkgs_info=pkgs_info, signal=True)
|
||||
self.update_bt_upgrade(pkgs_info)
|
||||
|
||||
if self.pkgs_available:
|
||||
self._notify_model_data_change()
|
||||
self.thread_verify_models.work = False
|
||||
self.thread_verify_models.wait(50)
|
||||
self.thread_verify_models.apps = self.pkgs_available
|
||||
self.thread_verify_models.start()
|
||||
if self.pkgs:
|
||||
self._update_state_when_pkgs_ready()
|
||||
self.thread_notify_pkgs_ready.work = False
|
||||
self.thread_notify_pkgs_ready.wait(5)
|
||||
self.thread_notify_pkgs_ready.pkgs = self.pkgs
|
||||
self.thread_notify_pkgs_ready.work = True
|
||||
self.thread_notify_pkgs_ready.start()
|
||||
|
||||
def _finish_apply_filters_async(self, success: bool):
|
||||
self.checkbox_only_apps.setEnabled(True)
|
||||
self.checkbox_updates.setEnabled(True)
|
||||
self.combo_categories.setEnabled(True)
|
||||
self.combo_filter_type.setEnabled(True)
|
||||
self.input_name_filter.setEnabled(True)
|
||||
self.table_apps.setEnabled(True)
|
||||
self.label_status.setText('')
|
||||
self.ref_toolbar_search.setVisible(True)
|
||||
|
||||
@@ -399,7 +428,8 @@ class ManageWindow(QWidget):
|
||||
action.signal_status.connect(self._change_label_status)
|
||||
action.signal_substatus.connect(self._change_label_substatus)
|
||||
action.signal_progress.connect(self._update_process_progress)
|
||||
action.signal_root_password.connect(self._ask_root_password)
|
||||
action.signal_progress_control.connect(self.set_progress_controll)
|
||||
action.signal_root_password.connect(self._pause_and_ask_root_password)
|
||||
|
||||
self.signal_user_res.connect(action.confirm)
|
||||
self.signal_root_password.connect(action.set_root_password)
|
||||
@@ -414,14 +444,16 @@ class ManageWindow(QWidget):
|
||||
components=msg['components'],
|
||||
confirmation_label=msg['confirmation_label'],
|
||||
deny_label=msg['deny_label'],
|
||||
deny_button=msg['deny_button'],
|
||||
screen_size=self.screen_size)
|
||||
res = diag.is_confirmed()
|
||||
self.thread_animate_progress.animate()
|
||||
self.signal_user_res.emit(res)
|
||||
|
||||
def _ask_root_password(self):
|
||||
def _pause_and_ask_root_password(self):
|
||||
self.thread_animate_progress.pause()
|
||||
password, valid = root.ask_root_password(self.i18n)
|
||||
password, valid = root.ask_root_password(self.context, self.i18n)
|
||||
|
||||
self.thread_animate_progress.animate()
|
||||
self.signal_root_password.emit(password, valid)
|
||||
|
||||
@@ -443,19 +475,23 @@ class ManageWindow(QWidget):
|
||||
def verify_warnings(self):
|
||||
self.thread_warnings.start()
|
||||
|
||||
def _show_installed(self):
|
||||
def _begin_loading_installed(self):
|
||||
if self.pkgs_installed:
|
||||
self.finish_action()
|
||||
self.search_performed = False
|
||||
self.ref_bt_upgrade.setVisible(True)
|
||||
self.ref_checkbox_only_apps.setVisible(True)
|
||||
self.input_search.setText('')
|
||||
self.input_name_filter.setText('')
|
||||
self.update_pkgs(new_pkgs=None, as_installed=True)
|
||||
self._begin_action(self.i18n['manage_window.status.installed'], keep_bt_installed=False, clear_filters=not self.recent_uninstall)
|
||||
self.thread_load_installed.start()
|
||||
|
||||
def _finish_loading_installed(self):
|
||||
self.finish_action()
|
||||
self.update_pkgs(new_pkgs=None, as_installed=True)
|
||||
|
||||
def _show_about(self):
|
||||
if self.dialog_about is None:
|
||||
self.dialog_about = AboutDialog(self.i18n)
|
||||
self.dialog_about = AboutDialog(self.config)
|
||||
|
||||
self.dialog_about.show()
|
||||
|
||||
@@ -476,12 +512,20 @@ class ManageWindow(QWidget):
|
||||
self.category_filter = self.combo_categories.itemData(idx)
|
||||
self.apply_filters_async()
|
||||
|
||||
def _notify_model_data_change(self):
|
||||
self.table_apps.fill_async_data()
|
||||
def _update_state_when_pkgs_ready(self):
|
||||
if self.progress_bar.isVisible():
|
||||
return
|
||||
|
||||
if not self.recent_installation:
|
||||
if not self.ref_progress_bar.isVisible():
|
||||
self._reload_categories()
|
||||
self._reload_categories()
|
||||
|
||||
self.resize_and_center()
|
||||
|
||||
def _update_package_data(self, idx: int):
|
||||
if self.table_apps.isEnabled():
|
||||
pkg = self.pkgs[idx]
|
||||
pkg.status = PackageViewStatus.READY
|
||||
self.table_apps.update_package(pkg)
|
||||
|
||||
def _reload_categories(self):
|
||||
categories = set()
|
||||
@@ -500,14 +544,6 @@ class ManageWindow(QWidget):
|
||||
policy = QHeaderView.Stretch if self._maximized else QHeaderView.ResizeToContents
|
||||
self.table_apps.change_headers_policy(policy)
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self.tray_icon:
|
||||
event.ignore()
|
||||
self.hide()
|
||||
self._handle_console_option(False)
|
||||
else:
|
||||
QCoreApplication.exit() # needed because QuitOnLastWindowClosed is disabled
|
||||
|
||||
def _handle_console(self, checked: bool):
|
||||
|
||||
if checked:
|
||||
@@ -524,7 +560,7 @@ class ManageWindow(QWidget):
|
||||
self.checkbox_console.setChecked(False)
|
||||
self.textarea_output.hide()
|
||||
|
||||
def refresh_apps(self, keep_console: bool = True, top_app: PackageView = None, pkg_types: Set[Type[SoftwarePackage]] = None):
|
||||
def refresh_packages(self, keep_console: bool = True, top_app: PackageView = None, pkg_types: Set[Type[SoftwarePackage]] = None):
|
||||
self.recent_installation = False
|
||||
self.input_search.clear()
|
||||
|
||||
@@ -561,20 +597,16 @@ class ManageWindow(QWidget):
|
||||
self._hide_fields_after_recent_installation()
|
||||
|
||||
def uninstall_app(self, app: PackageView):
|
||||
pwd = None
|
||||
requires_root = self.manager.requires_root('uninstall', app.model)
|
||||
pwd, proceed = self._ask_root_password('uninstall', app)
|
||||
|
||||
if not user.is_root() and requires_root:
|
||||
pwd, ok = ask_root_password(self.i18n)
|
||||
|
||||
if not ok:
|
||||
return
|
||||
if not proceed:
|
||||
return
|
||||
|
||||
self._handle_console_option(True)
|
||||
self._begin_action('{} {}'.format(self.i18n['manage_window.status.uninstalling'], app.model.name), clear_filters=False)
|
||||
|
||||
self.thread_uninstall.app = app
|
||||
self.thread_uninstall.root_password = pwd
|
||||
self.thread_uninstall.root_pwd = pwd
|
||||
self.thread_uninstall.start()
|
||||
|
||||
def run_app(self, app: PackageView):
|
||||
@@ -595,10 +627,9 @@ class ManageWindow(QWidget):
|
||||
only_pkg_type = False
|
||||
|
||||
self.recent_uninstall = True
|
||||
self.refresh_apps(pkg_types={pkgv.model.__class__} if only_pkg_type else None)
|
||||
self.refresh_packages(pkg_types={pkgv.model.__class__} if only_pkg_type else None)
|
||||
|
||||
if self.tray_icon:
|
||||
self.tray_icon.verify_updates()
|
||||
notify_tray()
|
||||
else:
|
||||
if self._can_notify_user():
|
||||
util.notify_user('{}: {}'.format(pkgv.model.name, self.i18n['notification.uninstall.failed']))
|
||||
@@ -615,10 +646,9 @@ class ManageWindow(QWidget):
|
||||
if self._can_notify_user():
|
||||
util.notify_user('{} {}'.format(res['app'], self.i18n['downgraded']))
|
||||
|
||||
self.refresh_apps(pkg_types={res['app'].model.__class__} if len(self.pkgs) > 1 else None)
|
||||
self.refresh_packages(pkg_types={res['app'].model.__class__} if len(self.pkgs) > 1 else None)
|
||||
|
||||
if self.tray_icon:
|
||||
self.tray_icon.verify_updates(notify_user=False)
|
||||
notify_tray()
|
||||
else:
|
||||
if self._can_notify_user():
|
||||
util.notify_user(self.i18n['notification.downgrade.failed'])
|
||||
@@ -638,7 +668,7 @@ class ManageWindow(QWidget):
|
||||
def _update_table(self, pkgs_info: dict, signal: bool = False):
|
||||
self.pkgs = pkgs_info['pkgs_displayed']
|
||||
|
||||
self.table_apps.update_pkgs(self.pkgs, update_check_enabled=pkgs_info['not_installed'] == 0)
|
||||
self.table_apps.update_packages(self.pkgs, update_check_enabled=pkgs_info['not_installed'] == 0)
|
||||
|
||||
if not self._maximized:
|
||||
self.table_apps.change_headers_policy(QHeaderView.Stretch)
|
||||
@@ -692,20 +722,20 @@ class ManageWindow(QWidget):
|
||||
setattr(self, attr, checked)
|
||||
checkbox.blockSignals(False)
|
||||
|
||||
def _gen_filters(self, updates: int = 0, ignore_updates: bool = False) -> dict:
|
||||
def _gen_filters(self, ignore_updates: bool = False) -> dict:
|
||||
return {
|
||||
'only_apps': False if self.search_performed else self.filter_only_apps,
|
||||
'type': self.type_filter,
|
||||
'category': self.category_filter,
|
||||
'updates': False if ignore_updates else self.filter_updates,
|
||||
'name': self.input_name_filter.get_text().lower() if self.input_name_filter.get_text() else None,
|
||||
'display_limit': self.display_limit if updates <= 0 else None
|
||||
'display_limit': None if self.filter_updates else self.display_limit
|
||||
}
|
||||
|
||||
def update_pkgs(self, new_pkgs: List[SoftwarePackage], as_installed: bool, types: Set[type] = None, ignore_updates: bool = False, keep_filters: bool = False):
|
||||
self.input_name_filter.setText('')
|
||||
pkgs_info = commons.new_pkgs_info()
|
||||
filters = self._gen_filters(ignore_updates)
|
||||
filters = self._gen_filters(ignore_updates=ignore_updates)
|
||||
|
||||
if new_pkgs is not None:
|
||||
old_installed = None
|
||||
@@ -715,7 +745,7 @@ class ManageWindow(QWidget):
|
||||
self.pkgs_installed = []
|
||||
|
||||
for pkg in new_pkgs:
|
||||
app_model = PackageView(model=pkg)
|
||||
app_model = PackageView(model=pkg, i18n=self.i18n)
|
||||
commons.update_info(app_model, pkgs_info)
|
||||
commons.apply_filters(app_model, filters, pkgs_info)
|
||||
|
||||
@@ -764,8 +794,8 @@ class ManageWindow(QWidget):
|
||||
self._update_table(pkgs_info=pkgs_info)
|
||||
|
||||
if new_pkgs:
|
||||
self.thread_verify_models.apps = self.pkgs
|
||||
self.thread_verify_models.start()
|
||||
self.thread_notify_pkgs_ready.pkgs = self.pkgs
|
||||
self.thread_notify_pkgs_ready.start()
|
||||
|
||||
if self.pkgs_installed:
|
||||
self.ref_bt_installed.setVisible(not as_installed and not self.recent_installation)
|
||||
@@ -774,7 +804,7 @@ class ManageWindow(QWidget):
|
||||
|
||||
def _apply_filters(self, pkgs_info: dict, ignore_updates: bool):
|
||||
pkgs_info['pkgs_displayed'] = []
|
||||
filters = self._gen_filters(updates=pkgs_info['updates'], ignore_updates=ignore_updates)
|
||||
filters = self._gen_filters(ignore_updates=ignore_updates)
|
||||
for pkgv in pkgs_info['pkgs']:
|
||||
commons.apply_filters(pkgv, filters, pkgs_info)
|
||||
|
||||
@@ -795,7 +825,7 @@ class ManageWindow(QWidget):
|
||||
|
||||
sel_type = -1
|
||||
for idx, item in enumerate(available_types.items()):
|
||||
app_type, icon_path = item[0], item[1]
|
||||
app_type, icon_path, label = item[0], item[1]['icon'], item[1]['label']
|
||||
|
||||
icon = self.cache_type_filter_icons.get(app_type)
|
||||
|
||||
@@ -803,7 +833,7 @@ class ManageWindow(QWidget):
|
||||
icon = QIcon(icon_path)
|
||||
self.cache_type_filter_icons[app_type] = icon
|
||||
|
||||
self.combo_filter_type.addItem(icon, app_type.capitalize(), app_type)
|
||||
self.combo_filter_type.addItem(icon, label, app_type)
|
||||
|
||||
if keeping_selected and app_type == self.type_filter:
|
||||
sel_type = idx + 1
|
||||
@@ -816,7 +846,6 @@ class ManageWindow(QWidget):
|
||||
self.ref_combo_filter_type.setVisible(False)
|
||||
|
||||
def _update_categories(self, categories: Set[str] = None, keep_selected: bool = False):
|
||||
|
||||
if categories is None:
|
||||
self.ref_combo_categories.setVisible(self.combo_categories.count() > 1)
|
||||
else:
|
||||
@@ -835,9 +864,8 @@ class ManageWindow(QWidget):
|
||||
cat_list.sort()
|
||||
|
||||
for idx, c in enumerate(cat_list):
|
||||
i18n_cat = self.i18n.get(c)
|
||||
cat_label = i18n_cat if i18n_cat else c
|
||||
self.combo_categories.addItem(cat_label.capitalize(), c)
|
||||
i18n_cat = self.i18n.get('category.{}'.format(c), self.i18n.get(c, c))
|
||||
self.combo_categories.addItem(i18n_cat.capitalize(), c)
|
||||
|
||||
if keeping_selected and c == self.category_filter:
|
||||
selected_cat = idx + 1
|
||||
@@ -863,49 +891,45 @@ class ManageWindow(QWidget):
|
||||
|
||||
qt_utils.centralize(self)
|
||||
|
||||
def set_progress_controll(self, enabled: bool):
|
||||
self.progress_controll_enabled = enumerate
|
||||
|
||||
def update_selected(self):
|
||||
if self.pkgs:
|
||||
requires_root = False
|
||||
if dialog.ask_confirmation(title=self.i18n['manage_window.upgrade_all.popup.title'],
|
||||
body=self.i18n['manage_window.upgrade_all.popup.body'],
|
||||
i18n=self.i18n,
|
||||
widgets=[UpdateToggleButton(None, self, self.i18n, clickable=False)]):
|
||||
|
||||
to_update = []
|
||||
self._handle_console_option(True)
|
||||
self._begin_action(self.i18n['manage_window.status.upgrading'])
|
||||
self.thread_update.pkgs = self.pkgs
|
||||
self.thread_update.start()
|
||||
|
||||
for app_v in self.pkgs:
|
||||
if app_v.update_checked:
|
||||
to_update.append(app_v)
|
||||
|
||||
if self.manager.requires_root('update', app_v.model):
|
||||
requires_root = True
|
||||
|
||||
if to_update and dialog.ask_confirmation(title=self.i18n['manage_window.upgrade_all.popup.title'],
|
||||
body=self.i18n['manage_window.upgrade_all.popup.body'],
|
||||
i18n=self.i18n,
|
||||
widgets=[UpdateToggleButton(None, self, self.i18n, clickable=False)]):
|
||||
pwd = None
|
||||
|
||||
if not user.is_root() and requires_root:
|
||||
pwd, ok = ask_root_password(self.i18n)
|
||||
|
||||
if not ok:
|
||||
return
|
||||
|
||||
self._handle_console_option(True)
|
||||
self.progress_controll_enabled = len(to_update) == 1
|
||||
self._begin_action(self.i18n['manage_window.status.upgrading'])
|
||||
self.thread_update.pkgs = to_update
|
||||
self.thread_update.root_password = pwd
|
||||
self.thread_update.start()
|
||||
|
||||
def _finish_update_selected(self, res: dict):
|
||||
def _finish_upgrade_selected(self, res: dict):
|
||||
self.finish_action()
|
||||
|
||||
if res.get('id'):
|
||||
output = self.textarea_output.toPlainText()
|
||||
|
||||
if output:
|
||||
try:
|
||||
Path(UpgradeSelected.LOGS_DIR).mkdir(parents=True, exist_ok=True)
|
||||
logs_path = '{}/{}.log'.format(UpgradeSelected.LOGS_DIR, res['id'])
|
||||
with open(logs_path, 'w+') as f:
|
||||
f.write(output)
|
||||
|
||||
self.textarea_output.appendPlainText('\n*Upgrade summary generated at: {}'.format(UpgradeSelected.SUMMARY_FILE.format(res['id'])))
|
||||
self.textarea_output.appendPlainText('*Upgrade logs generated at: {}'.format(logs_path))
|
||||
except:
|
||||
traceback.print_exc()
|
||||
|
||||
if res['success']:
|
||||
if self._can_notify_user():
|
||||
util.notify_user('{} {}'.format(res['updated'], self.i18n['notification.update_selected.success']))
|
||||
|
||||
self.refresh_apps(pkg_types=res['types'])
|
||||
self.refresh_packages(pkg_types=res['types'])
|
||||
|
||||
if self.tray_icon:
|
||||
self.tray_icon.verify_updates()
|
||||
notify_tray()
|
||||
else:
|
||||
if self._can_notify_user():
|
||||
util.notify_user(self.i18n['notification.update_selected.failed'])
|
||||
@@ -920,6 +944,7 @@ class ManageWindow(QWidget):
|
||||
self.ref_input_name_filter.setVisible(False)
|
||||
self.ref_combo_filter_type.setVisible(False)
|
||||
self.ref_combo_categories.setVisible(False)
|
||||
self.ref_bt_custom_actions.setVisible(False)
|
||||
self.ref_bt_settings.setVisible(False)
|
||||
self.ref_bt_about.setVisible(False)
|
||||
self.thread_animate_progress.stop = False
|
||||
@@ -961,6 +986,7 @@ class ManageWindow(QWidget):
|
||||
self.progress_bar.setTextVisible(False)
|
||||
|
||||
self._change_label_substatus('')
|
||||
self.ref_bt_custom_actions.setVisible(bool(self.custom_actions))
|
||||
self.ref_bt_settings.setVisible(True)
|
||||
self.ref_bt_about.setVisible(True)
|
||||
|
||||
@@ -997,20 +1023,16 @@ class ManageWindow(QWidget):
|
||||
self.ref_input_name_filter.setVisible(False)
|
||||
|
||||
def downgrade(self, pkgv: PackageView):
|
||||
pwd = None
|
||||
requires_root = self.manager.requires_root('downgrade', pkgv.model)
|
||||
pwd, proceed = self._ask_root_password('downgrade', pkgv)
|
||||
|
||||
if not user.is_root() and requires_root:
|
||||
pwd, ok = ask_root_password(self.i18n)
|
||||
|
||||
if not ok:
|
||||
return
|
||||
if not proceed:
|
||||
return
|
||||
|
||||
self._handle_console_option(True)
|
||||
self._begin_action('{} {}'.format(self.i18n['manage_window.status.downgrading'], pkgv.model.name))
|
||||
|
||||
self.thread_downgrade.app = pkgv
|
||||
self.thread_downgrade.root_password = pwd
|
||||
self.thread_downgrade.root_pwd = pwd
|
||||
self.thread_downgrade.start()
|
||||
|
||||
def get_app_info(self, pkg: dict):
|
||||
@@ -1043,7 +1065,7 @@ class ManageWindow(QWidget):
|
||||
body=self.i18n['popup.screenshots.no_screenshot.body'].format(bold(res['pkg'].model.name)),
|
||||
type_=MessageType.ERROR)
|
||||
|
||||
def get_app_history(self, app: dict):
|
||||
def get_app_history(self, app: PackageView):
|
||||
self._handle_console_option(False)
|
||||
self._begin_action(self.i18n['manage_window.status.history'])
|
||||
|
||||
@@ -1062,6 +1084,10 @@ class ManageWindow(QWidget):
|
||||
self._handle_console_option(True)
|
||||
self.textarea_output.appendPlainText(res['error'])
|
||||
self.checkbox_console.setChecked(True)
|
||||
elif not res['history'].history:
|
||||
dialog.show_message(title=self.i18n['action.history.no_history.title'],
|
||||
body=self.i18n['action.history.no_history.body'].format(bold(res['history'].pkg.name)),
|
||||
type_=MessageType.WARNING)
|
||||
else:
|
||||
dialog_history = HistoryDialog(res['history'], self.icon_cache, self.i18n)
|
||||
dialog_history.exec_()
|
||||
@@ -1090,21 +1116,29 @@ class ManageWindow(QWidget):
|
||||
else:
|
||||
dialog.show_message(title=self.i18n['warning'].capitalize(), body=self.i18n[res['error']], type_=MessageType.WARNING)
|
||||
|
||||
def install(self, pkg: PackageView):
|
||||
def _ask_root_password(self, action: str, pkg: PackageView) -> Tuple[str, bool]:
|
||||
pwd = None
|
||||
requires_root = self.manager.requires_root('install', pkg.model)
|
||||
requires_root = self.manager.requires_root(action, pkg.model)
|
||||
|
||||
if not user.is_root() and requires_root:
|
||||
pwd, ok = ask_root_password(self.i18n)
|
||||
pwd, ok = ask_root_password(self.context, self.i18n)
|
||||
|
||||
if not ok:
|
||||
return
|
||||
return pwd, False
|
||||
|
||||
return pwd, True
|
||||
|
||||
def install(self, pkg: PackageView):
|
||||
pwd, proceed = self._ask_root_password('install', pkg)
|
||||
|
||||
if not proceed:
|
||||
return
|
||||
|
||||
self._handle_console_option(True)
|
||||
self._begin_action('{} {}'.format(self.i18n['manage_window.status.installing'], pkg.model.name))
|
||||
|
||||
self.thread_install.pkg = pkg
|
||||
self.thread_install.root_password = pwd
|
||||
self.thread_install.root_pwd = pwd
|
||||
self.thread_install.start()
|
||||
|
||||
def _finish_install(self, res: dict):
|
||||
@@ -1114,7 +1148,7 @@ class ManageWindow(QWidget):
|
||||
console_output = self.textarea_output.toPlainText()
|
||||
|
||||
if console_output:
|
||||
log_path = '{}/logs/install/{}/{}'.format(TEMP_PATH, res['pkg'].model.get_type(), res['pkg'].model.name)
|
||||
log_path = '{}/install/{}/{}'.format(LOGS_PATH, res['pkg'].model.get_type(), res['pkg'].model.name)
|
||||
try:
|
||||
Path(log_path).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
@@ -1146,27 +1180,34 @@ class ManageWindow(QWidget):
|
||||
def _finish_run_app(self, success: bool):
|
||||
self.finish_action()
|
||||
|
||||
def execute_custom_action(self, pkg: PackageView, action: PackageAction):
|
||||
def execute_custom_action(self, pkg: PackageView, action: CustomSoftwareAction):
|
||||
|
||||
if pkg is None and not dialog.ask_confirmation(title=self.i18n['confirmation'].capitalize(),
|
||||
body=self.i18n['custom_action.proceed_with'].capitalize().format('"{}"'.format(self.i18n[action.i18_label_key].capitalize())),
|
||||
icon=QIcon(action.icon_path) if action.icon_path else QIcon(resource.get_path('img/logo.svg')),
|
||||
i18n=self.i18n):
|
||||
return False
|
||||
|
||||
pwd = None
|
||||
|
||||
if not user.is_root() and action.requires_root:
|
||||
pwd, ok = ask_root_password(self.i18n)
|
||||
pwd, ok = ask_root_password(self.context, self.i18n)
|
||||
|
||||
if not ok:
|
||||
return
|
||||
|
||||
self._handle_console_option(True)
|
||||
self._begin_action('{} {}'.format(self.i18n[action.i18n_status_key], pkg.model.name))
|
||||
self._begin_action('{}{}'.format(self.i18n[action.i18n_status_key], ' {}'.format(pkg.model.name) if pkg else ''))
|
||||
|
||||
self.thread_custom_action.pkg = pkg
|
||||
self.thread_custom_action.root_password = pwd
|
||||
self.thread_custom_action.root_pwd = pwd
|
||||
self.thread_custom_action.custom_action = action
|
||||
self.thread_custom_action.start()
|
||||
|
||||
def _finish_custom_action(self, res: dict):
|
||||
self.finish_action()
|
||||
if res['success']:
|
||||
self.refresh_apps(pkg_types={res['pkg'].model.__class__})
|
||||
self.refresh_packages(pkg_types={res['pkg'].model.__class__} if res['pkg'] else None)
|
||||
else:
|
||||
self.checkbox_console.setChecked(True)
|
||||
|
||||
@@ -1174,9 +1215,24 @@ class ManageWindow(QWidget):
|
||||
if self.settings_window:
|
||||
self.settings_window.handle_display()
|
||||
else:
|
||||
self.settings_window = SettingsWindow(self.manager, self.i18n, self.screen_size, self.tray_icon, self)
|
||||
self.settings_window = SettingsWindow(self.manager, self.i18n, self.screen_size, self)
|
||||
self.settings_window.setMinimumWidth(int(self.screen_size.width() / 4))
|
||||
self.settings_window.resize(self.size())
|
||||
self.settings_window.adjustSize()
|
||||
qt_utils.centralize(self.settings_window)
|
||||
self.settings_window.show()
|
||||
|
||||
def _map_custom_action(self, action: CustomSoftwareAction) -> QAction:
|
||||
custom_action = QAction(self.i18n[action.i18_label_key])
|
||||
custom_action.setIcon(QIcon(action.icon_path))
|
||||
custom_action.triggered.connect(lambda: self.execute_custom_action(None, action))
|
||||
return custom_action
|
||||
|
||||
def show_custom_actions(self):
|
||||
if self.custom_actions:
|
||||
menu_row = QMenu()
|
||||
actions = [self._map_custom_action(a) for a in self.custom_actions]
|
||||
menu_row.addActions(actions)
|
||||
menu_row.adjustSize()
|
||||
menu_row.popup(QCursor.pos())
|
||||
menu_row.exec_()
|
||||
|
||||
61
bauh/view/resources/img/custom_actions.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="18pt"
|
||||
viewBox="0 0 18 18"
|
||||
width="18pt"
|
||||
version="1.1"
|
||||
id="svg5741"
|
||||
sodipodi:docname="custom_actions.svg"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14">
|
||||
<metadata
|
||||
id="metadata5747">
|
||||
<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="defs5745" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1360"
|
||||
inkscape:window-height="644"
|
||||
id="namedview5743"
|
||||
showgrid="false"
|
||||
showborder="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="3.1607143"
|
||||
inkscape:cx="54.894116"
|
||||
inkscape:cy="34.001197"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg5741" />
|
||||
<path
|
||||
d="m 16.392858,7.39286 h -5.464286 c -0.177508,0 -0.321429,-0.14392 -0.321429,-0.32143 V 1.60714 C 10.607143,0.7196 9.8875387,0 9.0000003,0 8.1124619,0 7.3928574,0.7196 7.3928574,1.60714 v 5.46429 c 0,0.17751 -0.1439209,0.32143 -0.3214286,0.32143 H 1.6071429 C 0.71960451,7.39286 0,8.11246 0,9 c 0,0.88754 0.71960451,1.60714 1.6071429,1.60714 h 5.4642859 c 0.1775077,0 0.3214286,0.14392 0.3214286,0.32143 v 5.46429 C 7.3928574,17.2804 8.1124619,18 9.0000003,18 9.8875387,18 10.607143,17.2804 10.607143,16.39286 v -5.46429 c 0,-0.17751 0.143921,-0.32143 0.321429,-0.32143 h 5.464286 c 0.887538,0 1.607143,-0.7196 1.607143,-1.60714 0,-0.88754 -0.719605,-1.60714 -1.607143,-1.60714 z m 0,0"
|
||||
id="path5739"
|
||||
style="fill:#ffffff;stroke-width:0.04017857"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
140
bauh/view/resources/img/exclamation.svg
Executable file → Normal file
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
@@ -7,47 +7,21 @@
|
||||
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"
|
||||
viewBox="0 0 24 24"
|
||||
viewBox="0 0 384 384"
|
||||
style="enable-background:new 0 0 384 384;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="exclamation2.svg"
|
||||
width="24"
|
||||
height="24"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
|
||||
id="metadata949"><rdf:RDF><cc:Work
|
||||
sodipodi:docname="exclamation_2.svg"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
|
||||
id="metadata1642"><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="defs947"><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient955"><stop
|
||||
style="stop-color:#d4aa00;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop951" /><stop
|
||||
style="stop-color:#d4aa00;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop953" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient955"
|
||||
id="linearGradient957"
|
||||
x1="-5.0336413"
|
||||
y1="-1.8872991"
|
||||
x2="-22.291842"
|
||||
y2="17.528175"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient955"
|
||||
id="linearGradient1210"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-5.0336413"
|
||||
y1="-1.8872991"
|
||||
x2="-22.291842"
|
||||
y2="17.528175" /></defs><sodipodi:namedview
|
||||
id="defs1640" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
@@ -57,88 +31,88 @@
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="739"
|
||||
id="namedview945"
|
||||
inkscape:window-height="703"
|
||||
id="namedview1638"
|
||||
showgrid="false"
|
||||
showborder="false"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="3.6611245"
|
||||
inkscape:cy="14.576667"
|
||||
inkscape:zoom="0.30729167"
|
||||
inkscape:cx="1011.3408"
|
||||
inkscape:cy="-178.79428"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="260"
|
||||
inkscape:window-y="0"
|
||||
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" />
|
||||
|
||||
inkscape:current-layer="Capa_1" />
|
||||
<g
|
||||
id="g914">
|
||||
id="g1599"
|
||||
style="fill:#ffffff">
|
||||
<g
|
||||
id="g1597"
|
||||
style="fill:#ffffff">
|
||||
<circle
|
||||
cx="192"
|
||||
cy="341.333"
|
||||
r="42.667"
|
||||
id="circle1595"
|
||||
style="fill:#ffffff" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g916">
|
||||
id="g1605"
|
||||
style="fill:#ffffff">
|
||||
<g
|
||||
id="g1603"
|
||||
style="fill:#ffffff">
|
||||
<rect
|
||||
x="149.333"
|
||||
width="85.333"
|
||||
height="256"
|
||||
id="rect1601"
|
||||
style="fill:#ffffff" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g918">
|
||||
id="g1607">
|
||||
</g>
|
||||
<g
|
||||
id="g920">
|
||||
id="g1609">
|
||||
</g>
|
||||
<g
|
||||
id="g922">
|
||||
id="g1611">
|
||||
</g>
|
||||
<g
|
||||
id="g924">
|
||||
id="g1613">
|
||||
</g>
|
||||
<g
|
||||
id="g926">
|
||||
id="g1615">
|
||||
</g>
|
||||
<g
|
||||
id="g928">
|
||||
id="g1617">
|
||||
</g>
|
||||
<g
|
||||
id="g930">
|
||||
id="g1619">
|
||||
</g>
|
||||
<g
|
||||
id="g932">
|
||||
id="g1621">
|
||||
</g>
|
||||
<g
|
||||
id="g934">
|
||||
id="g1623">
|
||||
</g>
|
||||
<g
|
||||
id="g936">
|
||||
id="g1625">
|
||||
</g>
|
||||
<g
|
||||
id="g938">
|
||||
id="g1627">
|
||||
</g>
|
||||
<g
|
||||
id="g940">
|
||||
id="g1629">
|
||||
</g>
|
||||
<g
|
||||
id="g942">
|
||||
id="g1631">
|
||||
</g>
|
||||
<g
|
||||
id="g1217"
|
||||
transform="translate(10.429681,16.353516)"><g
|
||||
transform="translate(-10.429681,-16.353516)"
|
||||
style="fill:url(#linearGradient957);fill-opacity:1"
|
||||
id="g912">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path910"
|
||||
d="M 12,0 C 5.373,0 0,5.373 0,12 0,18.627 5.373,24 12,24 18.627,24 24,18.627 24,12 24,5.373 18.627,0 12,0 Z m 0,19.66 c -0.938,0 -1.58,-0.723 -1.58,-1.66 0,-0.964 0.669,-1.66 1.58,-1.66 0.963,0 1.58,0.696 1.58,1.66 0,0.938 -0.617,1.66 -1.58,1.66 z m 0.622,-6.339 c -0.239,0.815 -0.992,0.829 -1.243,0 -0.289,-0.956 -1.316,-4.585 -1.316,-6.942 0,-3.11 3.891,-3.125 3.891,0 -0.001,2.371 -1.083,6.094 -1.332,6.942 z"
|
||||
style="fill:url(#linearGradient1210);fill-opacity:1" />
|
||||
</g><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1198"
|
||||
d="m 1.3648508,-2.489113 c -0.250891,-0.124189 -0.327144,-0.271469 -0.55064598,-1.063559 -0.664465,-2.354862 -1.04293,-4.2896531 -1.147198,-5.8647013 -0.0767,-1.1585747 0.09689,-1.7887227 0.643137,-2.3346987 0.4799,-0.479662 1.07478698,-0.648108 1.71268798,-0.48496 0.564701,0.144426 0.973861,0.498107 1.24114,1.072852 0.194111,0.41741 0.235782,0.660945 0.231159,1.3509478 -0.0094,1.4036771 -0.421836,3.6124492 -1.172557,6.2796362 -0.174505,0.619988 -0.250011,0.795473 -0.406612,0.94501 -0.186151,0.177754 -0.337702,0.205108 -0.551111,0.09947 z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.03125" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1200"
|
||||
d="m 1.5625068,-12.296875 c -0.133701,-4.9e-5 -0.257218,0.01288 -0.375,0.03711 -0.01713,0.0034 -0.04774,0.0019 -0.0625,0.0059 -0.04019,0.01083 -0.07595,0.03503 -0.115235,0.04883 -0.07496,0.02544 -0.14937098,0.05778 -0.22070298,0.0957 -0.0693,0.03572 -0.136178,0.07245 -0.201172,0.117187 -0.395912,0.272524 -0.712194,0.695841 -0.861328,1.210938 -0.06573,0.22717 -0.07016,0.309243 -0.06836,0.9374996 2.45e-4,0.086621 0.01357,0.1776107 0.01563,0.2636719 0.0078,0.2791513 0.0217,0.567286 0.05469,0.8886719 0.02567,0.2619407 0.07197,0.5785227 0.117188,0.8730468 0.02898,0.1904904 0.0596,0.3838721 0.0957,0.5859376 0.02975,0.1646911 0.04058,0.2865674 0.07617,0.4667968 0.02253,0.1140684 0.06671,0.2792068 0.09375,0.40625 0.08083,0.3833354 0.176637,0.7912044 0.279296,1.2089844 0.246077,1.01458 0.501767,1.987896 0.61914098,2.261719 0.03892,0.0908 0.09578,0.1787 0.160156,0.253906 0.0136,0.01632 0.0326,0.02725 0.04687,0.04102 0.04125,0.0418 0.08219,0.08717 0.125,0.113281 0.06319,0.03853 0.132973,0.05138 0.205078,0.05273 0.05796,0.0011 0.116036,-0.008 0.173829,-0.0293 0.0075,-0.0027 0.01406,-0.0086 0.02148,-0.01172 0.05163,-0.02164 0.101553,-0.04945 0.148437,-0.08789 0.0063,-0.0052 0.01142,-0.01207 0.01758,-0.01758 0.03276,-0.02895 0.06728,-0.05485 0.0957,-0.0918 0.0047,-0.0061 0.01259,-0.03336 0.01758,-0.04102 0.0052,-0.0076 0.01256,-0.01166 0.01758,-0.01953 0.0081,-0.01277 0.02602,-0.07759 0.03516,-0.0957 0.06526,-0.134622 0.143353,-0.353611 0.236328,-0.652344 0.0061,-0.02016 0.01142,-0.03393 0.01758,-0.05469 0.08547,-0.278648 0.179338,-0.659826 0.277344,-1.03711 0.07187,-0.280521 0.135865,-0.545447 0.207032,-0.847656 0.07372,-0.310588 0.144002,-0.546795 0.216796,-0.882812 0.07915,-0.3653757 0.116018,-0.6348283 0.173828,-0.9511722 0.04874,-0.2610293 0.108943,-0.5530308 0.140626,-0.7675782 10e-4,-0.00687 9.46e-4,-0.012662 0.002,-0.019531 0.07245,-0.4988018 0.120186,-0.9630243 0.136718,-1.3847656 0.004,-0.069734 0.01867,-0.1529162 0.02149,-0.2207032 0.01305,-0.3147671 -0.006,-0.5821898 -0.04102,-0.8300778 -0.0308,-0.279799 -0.08807,-0.50458 -0.222656,-0.773438 -0.01126,-0.02248 -0.0271,-0.0406 -0.03906,-0.0625 -0.02477,-0.04414 -0.05401,-0.08682 -0.08203,-0.128906 -0.06991,-0.10808 -0.147597,-0.206648 -0.234375,-0.296875 -0.0099,-0.01034 -0.01524,-0.02297 -0.02539,-0.0332 -0.0097,-0.0098 -0.02143,-0.01589 -0.03125,-0.02539 -0.06451,-0.06161 -0.13129,-0.118543 -0.203124,-0.169922 -0.03372,-0.02443 -0.06852,-0.0466 -0.103516,-0.06836 -0.06898,-0.04263 -0.138762,-0.08215 -0.212891,-0.115234 -0.03375,-0.01482 -0.06876,-0.02643 -0.103515,-0.03906 -0.05821,-0.02181 -0.113151,-0.0506 -0.173828,-0.06641 -0.01977,-0.0052 -0.057,-0.0035 -0.08008,-0.0078 -0.124433,-0.02492 -0.253549,-0.03901 -0.388671,-0.03906 z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.03125" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1205"
|
||||
d="m 1.5800848,0.015625 c -0.0178,0 -0.03152,0.0036 -0.04883,0.0039 -0.08654,0.002 -0.170637,0.0024 -0.25586,0.01758 -0.13064,0.01899 -0.248148,0.05582 -0.35742198,0.105469 -0.01495,0.0066 -0.03215,0.0066 -0.04687,0.01367 -0.01917,0.0092 -0.03902,0.03191 -0.05859,0.04297 -0.08499,0.04925 -0.168809,0.110204 -0.25,0.183594 -0.07098,0.06223 -0.123346,0.120203 -0.183594,0.191406 -0.04461,0.05354 -0.08918,0.107632 -0.125,0.164063 -0.01932,0.0304 -0.05333,0.06019 -0.06836,0.08984 -0.02046,0.04038 -0.03184,0.09021 -0.04883,0.134765 -0.007,0.01713 -0.01317,0.03525 -0.01953,0.05273 -0.02632,0.07746 -0.04829,0.155268 -0.06445,0.240234 -0.0059,0.03085 -0.0093,0.06368 -0.01367,0.0957 -0.0137,0.09626 -0.02276,0.191001 -0.02344,0.289063 -1.3e-5,0.0034 0,0.0063 0,0.0098 0,0.0038 0.0019,0.0078 0.002,0.01172 4.07e-4,0.136442 0.01441,0.266964 0.04101,0.392578 0.0035,0.01807 0.0021,0.04995 0.0059,0.06445 0.0034,0.01335 0.01187,0.02392 0.01563,0.03711 0.0062,0.0218 0.0066,0.04736 0.01367,0.06836 0.02672,0.07959 0.06612,0.147112 0.101562,0.21875 0.01461,0.02886 0.02478,0.06019 0.04102,0.08789 0.202316,0.355898 0.515811,0.606046 0.92578098,0.71875 0.114715,0.03154 0.285952,0.03886 0.457031,0.03516 0.03918,-0.0012 0.07647,-0.0058 0.115234,-0.0098 0.06575,-0.005 0.140201,-0.0026 0.19336,-0.01367 0.06811,-0.0142 0.134222,-0.04299 0.201172,-0.06836 0.333189,-0.126241 0.641516,-0.374039 0.800781,-0.669922 0.02144,-0.03983 0.0249,-0.08731 0.04297,-0.128906 0.0434,-0.09308 0.07854,-0.19749 0.103515,-0.304688 0.01416,-0.06169 0.02721,-0.12056 0.03516,-0.183593 0.02001,-0.144005 0.02205,-0.286726 0.0098,-0.427735 -0.0047,-0.05246 -0.01464,-0.100691 -0.02344,-0.152343 -0.0201,-0.117318 -0.05021,-0.229314 -0.0918,-0.337891 -0.02117,-0.05719 -0.03975,-0.112112 -0.06641,-0.166016 -0.04827,-0.0948 -0.11061,-0.177917 -0.175782,-0.259765 -0.03204,-0.04093 -0.04978,-0.09412 -0.08594,-0.13086 -0.02601,-0.02643 -0.06342,-0.04035 -0.0918,-0.06445 -0.08406,-0.07533 -0.172768,-0.138308 -0.265625,-0.1875 -0.01534,-0.0078 -0.02927,-0.01619 -0.04492,-0.02344 -0.118257,-0.0564 -0.246131,-0.09834 -0.390625,-0.119141 -0.08008,-0.01479 -0.160229,-0.01418 -0.242187,-0.01758 -0.02205,-5.53e-4 -0.03973,-0.0039 -0.0625,-0.0039 z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.03125" /></g></svg>
|
||||
id="g1633">
|
||||
</g>
|
||||
<g
|
||||
id="g1635">
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 2.3 KiB |
830
bauh/view/resources/img/logo.svg
Executable file → Normal file
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 17 KiB |
965
bauh/view/resources/img/logo_update.svg
Executable file → Normal file
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 25 KiB |
9
bauh/view/resources/locale/about/ca
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=Quant a
|
||||
about.info.desc=Interfície gràfica per a gestionar les vostres aplicacions per a Linux
|
||||
about.info.link=Trobareu més informació a
|
||||
about.info.license=Llicència lliure
|
||||
about.info.rate.question=Us agrada aquesta eina?
|
||||
about.info.rate.answer=Poseu-li una estrella al GitHub perquè el projecte sigui més fort
|
||||
about.info.trouble.question=Problemes?
|
||||
about.info.trouble.answer=Obriu un issue en GitHub perquè els desenvolupadors us puguin ajudar
|
||||
about.version=versió
|
||||
9
bauh/view/resources/locale/about/de
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=Über
|
||||
about.info.desc=Grafisches Interface, um Linux-Anwendungen zu verwalten
|
||||
about.info.link=Mehr Informationen unter
|
||||
about.info.license=Freie Lizenz
|
||||
about.info.rate.question=Gefällt Ihnen diese Anwendung?
|
||||
about.info.rate.answer=Unterstützen Sie uns auf GitHub mit einem Stern.
|
||||
about.info.trouble.question=Probleme?
|
||||
about.info.trouble.answer=Eröffnen Sie ein GitHub-Issue, damit die Entwickler Ihnen helfen können.
|
||||
about.version=Ausführung
|
||||
9
bauh/view/resources/locale/about/en
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=about
|
||||
about.info.desc=Graphical interface for managing your Linux applications
|
||||
about.info.link=More information at
|
||||
about.info.license=Free license
|
||||
about.info.rate.question=Like this tool ?
|
||||
about.info.rate.answer=Give it a star on GitHub to strengthen the project
|
||||
about.info.trouble.question=Any trouble ?
|
||||
about.info.trouble.answer=Open a GitHub issue so the developers can help you
|
||||
about.version=version
|
||||
9
bauh/view/resources/locale/about/es
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=Acerca de
|
||||
about.info.desc=Interfaz grafica para administración de aplicaciones para Linux
|
||||
about.info.link=Mas información en
|
||||
about.info.license=Licencia gratuita
|
||||
about.info.rate.question=¿Le gusta esta herramienta?
|
||||
about.info.rate.answer=Dele una estrella en GitHub para fortalecer el proyecto
|
||||
about.info.trouble.question=¿Problemas?
|
||||
about.info.trouble.answer=Abra un issue en GitHub para que los desarrolladores puedan ayudarlo
|
||||
about.version=versión
|
||||
9
bauh/view/resources/locale/about/it
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=Informazioni su
|
||||
about.info.desc=Interfaccia grafica per la gestione delle tue applicazioni Linux
|
||||
about.info.link=Maggiori informazioni su
|
||||
about.info.license=Free license
|
||||
about.info.rate.question=Ti piace questo strumento?
|
||||
about.info.rate.answer=Dagli una stella su GitHub per rafforzare il progetto
|
||||
about.info.trouble.question=Problemas?
|
||||
about.info.trouble.answer=Apri un issue in GitHub in modo che gli sviluppatori possano aiutarti
|
||||
about.version=versione
|
||||
9
bauh/view/resources/locale/about/pt
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=sobre
|
||||
about.info.desc=Interface gráfica para gerenciamento de aplicativos Linux
|
||||
about.info.link=Mais informações em
|
||||
about.info.license=Licença gratuita
|
||||
about.info.rate.question=Gosta desta ferramenta ?
|
||||
about.info.rate.answer=Dê a ela uma estrela no GitHub para fortalecer o projeto
|
||||
about.info.trouble.question=Problemas ?
|
||||
about.info.trouble.answer=Abra uma issue no GitHub para que os desenvolvedores possam ajudá-lo
|
||||
about.version=versão
|
||||
9
bauh/view/resources/locale/about/ru
Normal file
@@ -0,0 +1,9 @@
|
||||
about.title=О программе
|
||||
about.info.desc=Графический интерфейс для управления приложениями Linux
|
||||
about.info.link=Ещё информация на
|
||||
about.info.license=Свободная лицензия
|
||||
about.info.rate.question=Понравилось это приложеие ?
|
||||
about.info.rate.answer=Поставьте ему звезду на GitHub, чтобы поддержать проект
|
||||
about.info.trouble.question=Возникли проблемы ?
|
||||
about.info.trouble.answer=Откройте GitHub, чтобы разработчики могли вам помочь
|
||||
about.version=версия
|
||||
@@ -1,281 +1,378 @@
|
||||
manage_window.title=les meves aplicacions
|
||||
manage_window.columns.latest_version=Versió més recent
|
||||
manage_window.columns.update=Voleu actualitzar?
|
||||
manage_window.apps_table.row.actions.info=Informació
|
||||
manage_window.apps_table.row.actions.history=Historial
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Desinstal·la
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Voleu desinstal·lar «{}» de l’ordinador?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Instal·lació
|
||||
manage_window.apps_table.row.actions.install.popup.body=Voleu instal·lar «{}» a l’ordinador?
|
||||
manage_window.apps_table.row.actions.downgrade=Reverteix
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Voleu revertir «{}»?
|
||||
manage_window.apps_table.row.actions.install=Instal·la
|
||||
manage_window.apps_table.row.actions.refresh=Refresca
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Hi ha una actualització d’aquesta aplicació. Feu clic aquí per a marcar o desmarcar l’actualització
|
||||
manage_window.checkbox.only_apps=Aplicacions
|
||||
window_manage.input_search.placeholder=Cerca
|
||||
window_manage.input_search.tooltip=Escriviu i premeu Intro per a cercar aplicacions
|
||||
manage_window.label.updates=Actualitzacions
|
||||
manage_window.status.refreshing=S’està refrescant
|
||||
manage_window.status.upgrading=S’està actualitzant
|
||||
manage_window.status.uninstalling=S’està desinstal·lant
|
||||
manage_window.status.downgrading=S’està revertint
|
||||
manage_window.status.info=S’està recuperant la informació
|
||||
manage_window.status.history=S’està recuperant l’historial
|
||||
manage_window.status.searching=S’està cercant
|
||||
manage_window.status.installing=S’està instal·lant
|
||||
manage_window.status.refreshing_app=S’està refrescant
|
||||
manage_window.status.running_app=S’està iniciant «{}»
|
||||
manage_window.status.filtering=S’està filtrant
|
||||
manage_window.status.screenshots=S’estan recuperant {} captures de pantalla
|
||||
manage_window.status.suggestions=S’estan buscant suggeriments
|
||||
manage_window.bt.refresh.text=Refresca
|
||||
manage_window.bt.refresh.tooltip=Carrega novament les dades quant a les aplicacions instal·lades
|
||||
manage_window.bt.upgrade.text=Actualitza
|
||||
manage_window.bt.upgrade.tooltip=Actualitza totes les aplicacions marcades
|
||||
manage_window.bt.installed.text=instal·lada
|
||||
manage_window.bt.installed.tooltip=Feu clic aquí per a mostrar les aplicacions instal·lades
|
||||
manage_window.bt.suggestions.text=Suggeriments
|
||||
manage_window.bt.suggestions.tooltip=Feu clic aquí per a mostrar alguns suggeriments d’aplicacions
|
||||
manage_window.checkbox.show_details=Mostra detalls
|
||||
popup.root.title=Requireix la vostra contrasenya per a continuar
|
||||
popup.root.continue=continuar
|
||||
popup.root.bad_password.title=Error
|
||||
popup.root.bad_password.body=La contrasenya és incorrecta
|
||||
popup.root.bad_password.last_try=S’han acabat els intents. S’ha cancel·lat l’operació.
|
||||
popup.history.title=Historial
|
||||
popup.history.selected.tooltip=Versió actual
|
||||
popup.button.yes=Sí
|
||||
popup.button.no=No
|
||||
popup.button.cancel=Cancel·la
|
||||
tray.action.manage=Aplicacions
|
||||
tray.action.exit=Surt
|
||||
tray.action.about=Quant a
|
||||
tray.action.refreshing=Refrescant
|
||||
Australia=Australia
|
||||
Austria=Austria
|
||||
Bangladesh=Bangladesh
|
||||
Belarus=Belarus
|
||||
Belgium=Belgium
|
||||
Brazil=Brazil
|
||||
Bulgaria=Bulgaria
|
||||
Canada=Canada
|
||||
Chile=Chile
|
||||
China=China
|
||||
Costa Rica=Costa Rica
|
||||
Czech=Czech
|
||||
Denmark=Denmark
|
||||
Ecuador=Ecuador
|
||||
France=France
|
||||
Georgia=Georgia
|
||||
Germany=Germany
|
||||
Greece=Greece
|
||||
Hong Kong=Hong Kong
|
||||
Hungary=Hungary
|
||||
Iceland=Iceland
|
||||
India=India
|
||||
Indonesia=Indonesia
|
||||
Iran=Iran
|
||||
Italy=Italy
|
||||
Japan=Japan
|
||||
Kenya=Kenya
|
||||
Netherlands=Netherlands
|
||||
New Zealand=New Zealand
|
||||
Norway=Norway
|
||||
Philippines=Philippines
|
||||
Poland=Poland
|
||||
Portugal=Portugal
|
||||
Russia=Russia
|
||||
Singapore=Singapore
|
||||
South Africa=South Africa
|
||||
South Korea=South Korea
|
||||
Spain=Spain
|
||||
Sweden=Sweden
|
||||
Switzerland=Switzerland
|
||||
Taiwan=Taiwan
|
||||
Thailand=Thailand
|
||||
Turkey=Turkey
|
||||
Ukraine=Ukraine
|
||||
United Kingdom=United Kingdom
|
||||
United States=United States
|
||||
action.backup.error.create=It was not possible to generate a new system copy
|
||||
action.backup.error.delete=It was not possible to delete the old system copies
|
||||
action.backup.error.proceed=Proceed anyway ?
|
||||
action.backup.invalid_mode=Invalid backup mode
|
||||
action.backup.msg=Do you want to generate a system copy before proceeding ?
|
||||
action.backup.substatus.create=Generating a new system backup
|
||||
action.backup.substatus.delete=Removing old system backups
|
||||
action.cancelled=l’usuari ha cancel·lat l’operació
|
||||
action.disk_trim=Optimizing disc ( TRIM )
|
||||
action.disk_trim.error=There was a problem while optimizing the disk
|
||||
action.failed=L'acció ha fallat
|
||||
action.history.no_history.body=There is no available history for {}
|
||||
action.history.no_history.title=No history
|
||||
action.info.tooltip=Feu clic aquí per a veure informació sobre aquesta aplicació
|
||||
action.not_allowed=Action not allowed
|
||||
action.request_reboot.title=System restart
|
||||
action.run.tooltip=Feu clic aquí per a iniciar l’aplicació
|
||||
action.screenshots.tooltip=Feu clic aquí per a veure imatges d’aquesta aplicació
|
||||
action.settings.tooltip=Feu clic aquí per a obrir accions addicionals
|
||||
notification.update={} actualització disponible
|
||||
notification.updates={} actualitzacions disponibles
|
||||
notification.update_selected.success=aplicacions actualitzades correctament
|
||||
notification.update_selected.failed=Ha fallat l’actualització
|
||||
notification.install.failed=ha fallat la instal·lació
|
||||
notification.uninstall.failed=ha fallat la desinstal·lació
|
||||
notification.downgrade.failed=Ha fallat la reversió
|
||||
about.info.desc=Interfície gràfica per a gestionar les vostres aplicacions per a Linux
|
||||
about.info.link=Trobareu més informació a
|
||||
about.info.license=Llicència lliure
|
||||
about.info.rate.question=Us agrada aquesta eina?
|
||||
about.info.rate.answer=Poseu-li una estrella al GitHub perquè el projecte sigui més fort
|
||||
about.info.trouble.question=Problemes?
|
||||
about.info.trouble.answer=Obriu un issue en GitHub perquè els desenvolupadors us puguin ajudar
|
||||
yes=sí
|
||||
no=no
|
||||
version.updated=actualitzada
|
||||
version.outdated=no actualitzada
|
||||
name=nom
|
||||
version=versió
|
||||
latest_version=versió més recent
|
||||
description=descripció
|
||||
type=tipus
|
||||
installed=instal·lada
|
||||
uninstalled=desinstal·lada
|
||||
not_installed=no instal·lada
|
||||
downgraded=revertida
|
||||
others=altres
|
||||
internet.required=Us cal una connexió a Internet
|
||||
updates=actualitzacions
|
||||
version.installed=versió instal·lada
|
||||
version.latest=versió més recent
|
||||
version.installed_outdated=la versió instal·lada no està actualitzada
|
||||
version.unknown=no informat
|
||||
app.name=nom de l’aplicació
|
||||
warning=avís
|
||||
install=instal·la
|
||||
uninstall=desinstal·la
|
||||
bt.app_upgrade=Actualita
|
||||
bt.app_not_upgrade=No actualitzis
|
||||
manage_window.upgrade_all.popup.title=Actualitza
|
||||
manage_window.upgrade_all.popup.body=Voleu actualitzar totes les aplicacions seleccionades?
|
||||
manage_window.settings.about=Quant a
|
||||
confirmation=confirmació
|
||||
and=i
|
||||
error=error
|
||||
action.cancelled=l’usuari ha cancel·lat l’operació
|
||||
copy=copia
|
||||
back=enrere
|
||||
show=mostra
|
||||
ask.continue=Voleu continuar?
|
||||
cancel=cancel·la
|
||||
status.caching_data=S’estan emmagatzemant {} dades a la memòria cau al disc
|
||||
action.run.tooltip=Feu clic aquí per a iniciar l’aplicació
|
||||
any=qualsevol
|
||||
manage_window.name_filter.tooltip=Escriviu aquí per a filtrar aplicacions per nom
|
||||
manage_window.name_filter.placeholder=Filtra per nom
|
||||
publisher=proveïdor
|
||||
unknown=desconegut
|
||||
welcome=us donem la benvinguda
|
||||
gem_selector.title=Tipus d’aplicacions
|
||||
gem_selector.question=Quins tipus d’aplicacions voleu que es mostrin aquí?
|
||||
proceed=continua
|
||||
change=modifica
|
||||
exit=surt
|
||||
style=estil
|
||||
manage_window.bt_settings.tooltip=Feu clic aquí per mostrar la configuració
|
||||
downloading=S’està baixant
|
||||
console.install_logs.path=Trobareu registres d’instal·lació a {}
|
||||
author=autor
|
||||
source=font
|
||||
size=mida
|
||||
category=categoria
|
||||
categories=categories
|
||||
summary=resum
|
||||
popup.screenshots.no_screenshot.body=no s’han pogut recuperar captures de pantalla del {}
|
||||
games=jocs
|
||||
game=joc
|
||||
videoeditor=editor de vídeo
|
||||
browser=navegador
|
||||
music=música
|
||||
development=desenvolupament
|
||||
network=xarxa
|
||||
networks=xarxes
|
||||
graphics=gràfics
|
||||
system=sistema
|
||||
utility=utilitat
|
||||
terminalemulator=terminal
|
||||
database=base de dades
|
||||
databases=bases de dades
|
||||
text editor=editor de text
|
||||
movies=pel·lícules
|
||||
movie=pel·lícula
|
||||
media=mitjans
|
||||
library=biblioteca
|
||||
books=llibres
|
||||
applications=aplicacions
|
||||
social=social
|
||||
productivity=productivitat
|
||||
utilities=utilitats
|
||||
photo=foto
|
||||
video=vídeo
|
||||
entertainment=entreteniment
|
||||
art=art
|
||||
design=disseny
|
||||
reference=referència
|
||||
personalisation=personalització
|
||||
education=educació
|
||||
health=salut
|
||||
fitness=condició física
|
||||
science=ciència
|
||||
news=notícies
|
||||
weather=el temps
|
||||
finance=finances
|
||||
desktopsettings=paràmetres de l’escriptori
|
||||
texteditor=editor de text
|
||||
server=servidor
|
||||
cloud=núvol
|
||||
instantmessaging=missatgeria
|
||||
messaging=missatgeria
|
||||
2dgraphics=gràfics 2d
|
||||
vectorgraphics=gràfics vectorials
|
||||
office=oficina
|
||||
devices=dispositius
|
||||
security=seguretat
|
||||
audiovideo=àudio/vídeo
|
||||
audio=àudio
|
||||
amusement=diversió
|
||||
webdevelopment=desenvolupament web
|
||||
filetransfer=transferència de fitxers
|
||||
viewer=visor
|
||||
packagemanager=gestor de paquets
|
||||
sportsgame=joc d’esport
|
||||
arcadegame=joc «arcade»
|
||||
player=jugador
|
||||
fonts=tipus de lletra
|
||||
screenshots.bt_next.label=següent
|
||||
screenshots.bt_back.label=anterior
|
||||
screenshots,download.running=s’està baixant la imatge
|
||||
screenshots.download.no_content=No hi ha contingut a mostrar
|
||||
screenshots.download.no_response=No s’ha trobat la imatge
|
||||
continue=continua
|
||||
stable=estable
|
||||
close=tanca
|
||||
publisher.verified=verificat
|
||||
mirror=mirall
|
||||
emulator=emulador
|
||||
do_not.install=no instal·leu
|
||||
repository=dipòsit
|
||||
details=detalls
|
||||
communication=comunicació
|
||||
administration=administració
|
||||
settings=configuració
|
||||
action.update.cannot_update_label=Cannot be upgraded
|
||||
action.update.install_req.fail.body=No s'ha pogut instal·lar {}
|
||||
action.update.install_req.fail.title=Ha fallat la instal·lació
|
||||
action.update.label_to_remove=Must be uninstalled
|
||||
action.update.label_to_upgrade=Will be upgraded
|
||||
action.update.pkg.required_size=Requires
|
||||
action.update.required_label=Must be installed
|
||||
action.update.required_size=Disk space required (download)
|
||||
action.update.requirements.body=Abans d’actualitzar cal instal·lar les següents {} dependències
|
||||
action.update.requirements.status=Verificant els requisits
|
||||
action.update.requirements.title=Requisits d’actualització
|
||||
action.update.status.checking_sizes=Calculating upgrade size
|
||||
action.update.success.reboot.line1=Upgrades successfully applied !
|
||||
action.update.success.reboot.line2=Some changes may require a system restart to take effect.
|
||||
action.update.success.reboot.line3=Restart now ?
|
||||
action.update.summary=Upgrade summary
|
||||
action.update.total_size=Update size
|
||||
action.trim_disk.ask=Optimize disc (trim) ?
|
||||
address=adreça
|
||||
view.components.file_chooser.placeholder=Feu clic aquí per seleccionar
|
||||
files=fitxers
|
||||
all_files=tots els fitxers
|
||||
file_chooser.title=Selector de fitxers
|
||||
message.file.not_exist=Fitxer no existeix
|
||||
message.file.not_exist.body=El fitxer {} sembla no existir
|
||||
icon_button.tooltip.disabled=Aquesta acció no està disponible
|
||||
user=usuari
|
||||
example.short=e.g
|
||||
core.config.tab.advanced=Advanced
|
||||
core.config.tab.general=General
|
||||
core.config.tab.ui=Interface
|
||||
core.config.tab.tray=Tray
|
||||
core.config.tab.types=Types
|
||||
core.config.locale.label=language
|
||||
core.config.disk_cache=Disk cache
|
||||
core.config.disk_cache.tip=Some data about the installed applications will be stored into the disk so they can be quickly loaded in the next initializations
|
||||
core.config.updates.interval=Updates interval
|
||||
core.config.updates.interval.tip=Defines the time interval in which the update-checking for the installed applications will happen ( in SECONDS )
|
||||
core.config.downloads=downloads
|
||||
amount=amount
|
||||
and=i
|
||||
any=qualsevol
|
||||
app.name=nom de l’aplicació
|
||||
applications=aplicacions
|
||||
ask=ask
|
||||
ask.continue=Voleu continuar?
|
||||
author=autor
|
||||
back=enrere
|
||||
bt.app_not_upgrade=No actualitzis
|
||||
bt.app_upgrade=Actualita
|
||||
bt.not_now=Not now
|
||||
cancel=cancel·la
|
||||
categories=categories
|
||||
category=categoria
|
||||
category.2dgraphics=gràfics 2d
|
||||
category.administration=administració
|
||||
category.amusement=diversió
|
||||
category.arcadegame=joc «arcade»
|
||||
category.art=art
|
||||
category.audio=àudio
|
||||
category.audiovideo=àudio/vídeo
|
||||
category.books=llibres
|
||||
category.browser=navegador
|
||||
category.cloud=núvol
|
||||
category.communication=comunicació
|
||||
category.database=base de dades
|
||||
category.databases=bases de dades
|
||||
category.design=disseny
|
||||
category.desktopsettings=paràmetres de l’escriptori
|
||||
category.development=desenvolupament
|
||||
category.devices=dispositius
|
||||
category.education=educació
|
||||
category.emulator=emulador
|
||||
category.entertainment=entreteniment
|
||||
category.filetransfer=transferència de fitxers
|
||||
category.finance=finances
|
||||
category.fitness=condició física
|
||||
category.fonts=tipus de lletra
|
||||
category.game=joc
|
||||
category.games=jocs
|
||||
category.graphics=gràfics
|
||||
category.health=salut
|
||||
category.instantmessaging=missatgeria
|
||||
category.library=biblioteca
|
||||
category.media=mitjans
|
||||
category.messaging=missatgeria
|
||||
category.movie=pel·lícula
|
||||
category.movies=pel·lícules
|
||||
category.music=música
|
||||
category.network=xarxa
|
||||
category.networks=xarxes
|
||||
category.news=notícies
|
||||
category.none=None
|
||||
category.office=oficina
|
||||
category.packagemanager=gestor de paquets
|
||||
category.personalisation=personalització
|
||||
category.photo=foto
|
||||
category.player=jugador
|
||||
category.productivity=productivitat
|
||||
category.reference=referència
|
||||
category.science=ciència
|
||||
category.security=seguretat
|
||||
category.server=servidor
|
||||
category.settings=configuració
|
||||
category.social=social
|
||||
category.sportsgame=joc d’esport
|
||||
category.system=sistema
|
||||
category.terminalemulator=terminal
|
||||
category.text editor=editor de text
|
||||
category.texteditor=editor de text
|
||||
category.utilities=utilitats
|
||||
category.utility=utilitat
|
||||
category.vectorgraphics=gràfics vectorials
|
||||
category.video=vídeo
|
||||
category.videoeditor=editor de vídeo
|
||||
category.viewer=visor
|
||||
category.weather=el temps
|
||||
category.web=web
|
||||
category.webdevelopment=desenvolupament web
|
||||
change=modifica
|
||||
clean=netejar
|
||||
close=tanca
|
||||
confirmation=confirmació
|
||||
console.install_logs.path=Trobareu registres d’instal·lació a {}
|
||||
continue=continua
|
||||
copy=copia
|
||||
core.config.backup=Enabled
|
||||
core.config.backup.downgrade=Before downgrading
|
||||
core.config.backup.install=Before installing
|
||||
core.config.backup.mode=Mode
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.incremental.tip=A new system backup will be generated containing only the changed files since the latest copy.
|
||||
core.config.backup.mode.only_one=Single
|
||||
core.config.backup.mode.only_one.tip=Only one system backup will be kept. Pre-existing backups will be erased.
|
||||
core.config.backup.uninstall=Before uninstalling
|
||||
core.config.backup.upgrade=Before upgrading
|
||||
core.config.download.icons=Download icons
|
||||
core.config.download.icons.tip=If the application icons should be downloaded and displayed on the table
|
||||
core.config.download.multithreaded=Multithreaded download
|
||||
core.config.download.multithreaded.tip=Whether applications, packages and files should be downloaded with a tool that works with threads ( faster ). At the moment this setting will only work if the aria2 package is installed
|
||||
core.config.downloads=downloads
|
||||
core.config.locale.label=language
|
||||
core.config.mem_cache=Memory storage
|
||||
core.config.mem_cache.data_exp=Data expiration
|
||||
core.config.mem_cache.data_exp.tip=Defines the in-memory data lifetime ( in SECONDS )
|
||||
core.config.mem_cache.icon_exp=Icons expiration
|
||||
core.config.mem_cache.icon_exp.tip=Defines the in-memory icons lifetime ( in SECONDS )
|
||||
core.config.store_password=Single password request
|
||||
core.config.store_password.tip=Requests the root user password only once
|
||||
core.config.suggestions.activated=Suggestions
|
||||
core.config.suggestions.activated.tip=If new applications can be suggested for installation
|
||||
core.config.suggestions.by_type=Suggestions by type
|
||||
core.config.suggestions.by_type.tip=Maximum number of suggestions that should be displayed by application type
|
||||
core.config.system.dep_checking=Single system checking
|
||||
core.config.system.dep_checking.tip=If the availability checking of your system technologies should happen only once
|
||||
core.config.system.notifications=Notifications
|
||||
core.config.system.notifications.tip=If notifications should be displayed when an action is finished or there are updates
|
||||
core.config.tab.advanced=Advanced
|
||||
core.config.tab.backup=Backup
|
||||
core.config.tab.general=General
|
||||
core.config.tab.tray=Tray
|
||||
core.config.tab.types=Types
|
||||
core.config.tab.ui=Interface
|
||||
core.config.trim_after_update=Optimize disc after upgrading
|
||||
core.config.trim_after_update.tip=It optimizes the disc after a successful upgrade using "trim". Do not enable this option if your disk is not a SSD that allows trim.
|
||||
core.config.types.tip=Check the application types you want to manage
|
||||
core.config.ui.auto_scale=Auto scale
|
||||
core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ). It fixes scaling issues for some desktop environments.
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
|
||||
core.config.ui.max_displayed=Applications displayed
|
||||
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
|
||||
core.config.ui.tray.default_icon=Default icon
|
||||
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
|
||||
core.config.ui.tray.updates_icon=Update icon
|
||||
core.config.system.dep_checking=Single system checking
|
||||
core.config.system.dep_checking.tip=If the availability checking of your system technologies should happen only once
|
||||
core.config.suggestions.by_type=Suggestions by type
|
||||
core.config.suggestions.by_type.tip=Maximum number of suggestions that should be displayed by application type
|
||||
core.config.types.tip=Check the application types you want to manage
|
||||
core.config.ui.auto_scale=Auto scale
|
||||
core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ). It fixes scaling issues for some desktop environments.
|
||||
core.config.updates.sort_pkgs=Sort updates
|
||||
core.config.updates.sort_pkgs.tip=Defines the best update order for the selected applications / packages to avoid issues
|
||||
core.config.updates.dep_check=Mostra els requisits d’actualització
|
||||
core.config.updates.dep_check.tip=Mostra tots les dependències addicionals que cal instal·lar abans de començar a actualitzar els seleccionats
|
||||
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
|
||||
settings.changed.success.reboot=Restart now ?
|
||||
settings.error=It was not possible to properly change all the settings
|
||||
locale.en=anglès
|
||||
locale.es=castellà
|
||||
locale.pt=portuguès
|
||||
core.config.ui.tray.updates_icon.tip=The displayed icon when there are updates available
|
||||
core.config.updates.interval=Updates interval
|
||||
core.config.updates.interval.tip=Defines the time interval in which the update-checking for the installed applications will happen ( in SECONDS )
|
||||
custom_action.proceed_with=Proceed with {} ?
|
||||
description=descripció
|
||||
details=detalls
|
||||
devices=devices
|
||||
do_not.install=no instal·leu
|
||||
downgraded=revertida
|
||||
download=download
|
||||
downloading=S’està baixant
|
||||
error=error
|
||||
example.short=e.g
|
||||
exit=surt
|
||||
file=file
|
||||
file_chooser.title=Selector de fitxers
|
||||
files=fitxers
|
||||
finishing=finishing
|
||||
gem_selector.question=Quins tipus d’aplicacions voleu que es mostrin aquí?
|
||||
gem_selector.title=Tipus d’aplicacions
|
||||
general=general
|
||||
icon_button.tooltip.disabled=Aquesta acció no està disponible
|
||||
imported=imported
|
||||
initialization=inicialització
|
||||
install=instal·la
|
||||
installation=instal·lació
|
||||
installed=instal·lada
|
||||
internet.required=Us cal una connexió a Internet
|
||||
interval=interval
|
||||
latest_version=versió més recent
|
||||
license=license
|
||||
locale.ca=català
|
||||
locale.de=alemany
|
||||
locale.en=anglès
|
||||
locale.es=castellà
|
||||
locale.it=italià
|
||||
locale.pt=portuguès
|
||||
locale.ru=rus
|
||||
interval=interval
|
||||
installation=instal·lació
|
||||
download=download
|
||||
clean=netejar
|
||||
action.update.status.sorting=Determinant el millor ordre d’actualització
|
||||
action.update.requirements.title=Requisits d’actualització
|
||||
action.update.requirements.body=Abans d’actualitzar cal instal·lar les següents {} dependències
|
||||
action.update.install_req.fail.title=Ha fallat la instal·lació
|
||||
action.update.install_req.fail.body=No s'ha pogut instal·lar {}
|
||||
action.update.requirements.status=Verificant els requisits
|
||||
action.update.order.title=Ordre d'actualització
|
||||
action.update.order.body=L'actualització es realitzarà en l'ordre següent
|
||||
manage_window.apps_table.row.actions.downgrade=Reverteix
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Voleu revertir «{}»?
|
||||
manage_window.apps_table.row.actions.history=Historial
|
||||
manage_window.apps_table.row.actions.info=Informació
|
||||
manage_window.apps_table.row.actions.install=Instal·la
|
||||
manage_window.apps_table.row.actions.install.popup.body=Voleu instal·lar «{}» a l’ordinador?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Instal·lació
|
||||
manage_window.apps_table.row.actions.refresh=Refresca
|
||||
manage_window.apps_table.row.actions.uninstall=Uninstall
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Voleu desinstal·lar «{}» de l’ordinador?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Desinstal·la
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=But it is not possible to upgrade it.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Feu clic aquí per a marcar o desmarcar l’actualització.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Hi ha una actualització d’aquesta aplicació.
|
||||
manage_window.bt.installed.text=instal·lada
|
||||
manage_window.bt.installed.tooltip=Feu clic aquí per a mostrar les aplicacions instal·lades
|
||||
manage_window.bt.refresh.text=Refresca
|
||||
manage_window.bt.refresh.tooltip=Carrega novament les dades quant a les aplicacions instal·lades
|
||||
manage_window.bt.suggestions.text=Suggeriments
|
||||
manage_window.bt.suggestions.tooltip=Feu clic aquí per a mostrar alguns suggeriments d’aplicacions
|
||||
manage_window.bt.upgrade.text=Actualitza
|
||||
manage_window.bt.upgrade.tooltip=Actualitza totes les aplicacions marcades
|
||||
manage_window.bt_custom_actions.tip=Click here to show more actions
|
||||
manage_window.bt_settings.tooltip=Feu clic aquí per mostrar la configuració
|
||||
manage_window.checkbox.only_apps=Aplicacions
|
||||
manage_window.checkbox.show_details=Mostra detalls
|
||||
manage_window.columns.installed=Installed
|
||||
manage_window.columns.latest_version=Versió més recent
|
||||
manage_window.columns.update=Voleu actualitzar?
|
||||
manage_window.label.updates=Actualitzacions
|
||||
manage_window.name_filter.placeholder=Filtra per nom
|
||||
manage_window.name_filter.tooltip=Escriviu aquí per a filtrar aplicacions per nom
|
||||
manage_window.settings.about=Quant a
|
||||
manage_window.status.downgrading=S’està revertint
|
||||
manage_window.status.filtering=S’està filtrant
|
||||
manage_window.status.history=S’està recuperant l’historial
|
||||
manage_window.status.info=S’està recuperant la informació
|
||||
manage_window.status.installed=Loading installed
|
||||
manage_window.status.installing=S’està instal·lant
|
||||
manage_window.status.refreshing=S’està refrescant
|
||||
manage_window.status.refreshing_app=S’està refrescant
|
||||
manage_window.status.running_app=S’està iniciant «{}»
|
||||
manage_window.status.screenshots=S’estan recuperant {} captures de pantalla
|
||||
manage_window.status.searching=S’està cercant
|
||||
manage_window.status.suggestions=S’estan buscant suggeriments
|
||||
manage_window.status.uninstalling=S’està desinstal·lant
|
||||
manage_window.status.upgrading=S’està actualitzant
|
||||
manage_window.title=les meves aplicacions
|
||||
manage_window.upgrade_all.popup.body=Voleu actualitzar totes les aplicacions seleccionades?
|
||||
manage_window.upgrade_all.popup.title=Actualitza
|
||||
message.file.not_exist=Fitxer no existeix
|
||||
message.file.not_exist.body=El fitxer {} sembla no existir
|
||||
mirror=mirall
|
||||
name=nom
|
||||
no=no
|
||||
not_installed=no instal·lada
|
||||
notification.downgrade.failed=Ha fallat la reversió
|
||||
notification.install.failed=ha fallat la instal·lació
|
||||
notification.uninstall.failed=ha fallat la desinstal·lació
|
||||
notification.update_selected.failed=Ha fallat l’actualització
|
||||
notification.update_selected.success=aplicacions actualitzades correctament
|
||||
ok=ok
|
||||
others=altres
|
||||
popup.button.cancel=Cancel·la
|
||||
popup.button.no=No
|
||||
popup.button.yes=Sí
|
||||
popup.history.selected.tooltip=Versió actual
|
||||
popup.history.title=Historial
|
||||
popup.root.bad_password.body=La contrasenya és incorrecta
|
||||
popup.root.bad_password.last_try=S’han acabat els intents. S’ha cancel·lat l’operació.
|
||||
popup.root.bad_password.title=Error
|
||||
popup.root.continue=continuar
|
||||
popup.root.title=Requireix la vostra contrasenya per a continuar
|
||||
popup.screenshots.no_screenshot.body=no s’han pogut recuperar captures de pantalla del {}
|
||||
prepare_panel.bt_skip.label=saltar
|
||||
prepare_panel.title.finish=Llest
|
||||
prepare_panel.title.start=Iniciando
|
||||
proceed=continua
|
||||
publisher=proveïdor
|
||||
publisher.verified=verificat
|
||||
repository=dipòsit
|
||||
screenshots.bt_back.label=anterior
|
||||
screenshots.bt_next.label=següent
|
||||
screenshots.download.no_content=No hi ha contingut a mostrar
|
||||
screenshots.download.no_response=No s’ha trobat la imatge
|
||||
screenshots.download.running=s’està baixant la imatge
|
||||
settings=configuració
|
||||
settings.changed.success.reboot=Restart now ?
|
||||
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
|
||||
settings.error=It was not possible to properly change all the settings
|
||||
show=mostra
|
||||
size=mida
|
||||
source=font
|
||||
stable=estable
|
||||
status.caching_data=S’estan emmagatzemant {} dades a la memòria cau al disc
|
||||
style=estil
|
||||
success=success
|
||||
summary=resum
|
||||
task.download_categories=Download de categories [ {} ]
|
||||
type=tipus
|
||||
uninstall=desinstal·la
|
||||
uninstalled=desinstal·lada
|
||||
unknown=desconegut
|
||||
updates=actualitzacions
|
||||
user=usuari
|
||||
version=versió
|
||||
version.installed=versió instal·lada
|
||||
version.installed_outdated=la versió instal·lada no està actualitzada
|
||||
version.latest=versió més recent
|
||||
version.outdated=no actualitzada
|
||||
version.unknown=no informat
|
||||
version.updated=actualitzada
|
||||
view.components.file_chooser.placeholder=Feu clic aquí per seleccionar
|
||||
warning=avís
|
||||
warning.update_available=There is a new {} update available ({}). Checkout the news at {}.
|
||||
welcome=us donem la benvinguda
|
||||
window_manage.input_search.placeholder=Cerca
|
||||
window_manage.input_search.tooltip=Escriviu i premeu Intro per a cercar aplicacions
|
||||
yes=sí
|
||||
@@ -1,236 +1,377 @@
|
||||
manage_window.title=Meine Anwendungen
|
||||
manage_window.columns.latest_version=Neueste Version
|
||||
manage_window.columns.update=Upgraden?
|
||||
manage_window.apps_table.row.actions.info=Information
|
||||
manage_window.apps_table.row.actions.history=Verlauf
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Deinstallieren
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body={} deinstallieren?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Installation
|
||||
manage_window.apps_table.row.actions.install.popup.body={} installieren?
|
||||
manage_window.apps_table.row.actions.downgrade=Downgraden
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body={} wirklich downgraden?
|
||||
manage_window.apps_table.row.actions.install=Installieren
|
||||
manage_window.apps_table.row.actions.refresh=Aktualisieren
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Für diese Anwendung ist ein Update verfügbar. Klicken Sie hier, um das Update zur Auswahl hinzuzufügen oder es zu entfernen.
|
||||
manage_window.checkbox.only_apps=Apps
|
||||
window_manage.input_search.placeholder=Suchbegriff
|
||||
window_manage.input_search.tooltip=Suchbegriff eingeben und Enter drücken, um zu suchen
|
||||
manage_window.label.updates=Updates
|
||||
manage_window.status.refreshing=Aktualisieren
|
||||
manage_window.status.upgrading=Upgraden
|
||||
manage_window.status.uninstalling=Deinstallieren
|
||||
manage_window.status.downgrading=Downgraden
|
||||
manage_window.status.info=Informationen laden
|
||||
manage_window.status.history=Verlauf laden
|
||||
manage_window.status.searching=Suchen
|
||||
manage_window.status.installing=Installieren
|
||||
manage_window.status.refreshing_app=Aktualisieren
|
||||
manage_window.status.running_app={} wird gestartet
|
||||
manage_window.status.filtering=Filtern
|
||||
manage_window.status.screenshots={} Screenshots laden
|
||||
manage_window.status.suggestions=Retrieving suggestions
|
||||
manage_window.bt.refresh.text=Aktualisieren
|
||||
manage_window.bt.refresh.tooltip=Informationen über installierte Anwendungen aktualisieren
|
||||
manage_window.bt.upgrade.text=Upgraden
|
||||
manage_window.bt.upgrade.tooltip=Alle ausgewählten Anwendungen upgraden
|
||||
manage_window.bt.installed.text=installiert
|
||||
manage_window.bt.installed.tooltip=Installierte Anwendungen anzeigen
|
||||
manage_window.bt.suggestions.text=Vorschläge
|
||||
manage_window.bt.suggestions.tooltip=Vorschläge für Apps anzeigen
|
||||
manage_window.checkbox.show_details=Details anzeigen
|
||||
popup.root.title=Zum Fortfahren wird das Passwort benötigt.
|
||||
popup.root.continue=Fortfahren
|
||||
popup.root.bad_password.title=Fehler
|
||||
popup.root.bad_password.body=Ungültiges Passwort
|
||||
popup.root.bad_password.last_try=Zu viele Fehlversuche. Aktion abgebrochen.
|
||||
popup.history.title=Verlauf
|
||||
popup.history.selected.tooltip=Aktuelle Version
|
||||
popup.button.yes=Ja
|
||||
popup.button.no=Nein
|
||||
popup.button.cancel=Abbrechen
|
||||
tray.action.manage=Anwendungen
|
||||
tray.action.exit=Beenden
|
||||
tray.action.about=Über
|
||||
tray.action.refreshing=Aktualisieren
|
||||
Australia=Australia
|
||||
Austria=Austria
|
||||
Bangladesh=Bangladesh
|
||||
Belarus=Belarus
|
||||
Belgium=Belgium
|
||||
Brazil=Brazil
|
||||
Bulgaria=Bulgaria
|
||||
Canada=Canada
|
||||
Chile=Chile
|
||||
China=China
|
||||
Costa Rica=Costa Rica
|
||||
Czech=Czech
|
||||
Denmark=Denmark
|
||||
Ecuador=Ecuador
|
||||
France=France
|
||||
Georgia=Georgia
|
||||
Germany=Germany
|
||||
Greece=Greece
|
||||
Hong Kong=Hong Kong
|
||||
Hungary=Hungary
|
||||
Iceland=Iceland
|
||||
India=India
|
||||
Indonesia=Indonesia
|
||||
Iran=Iran
|
||||
Italy=Italy
|
||||
Japan=Japan
|
||||
Kenya=Kenya
|
||||
Netherlands=Netherlands
|
||||
New Zealand=New Zealand
|
||||
Norway=Norway
|
||||
Philippines=Philippines
|
||||
Poland=Poland
|
||||
Portugal=Portugal
|
||||
Russia=Russia
|
||||
Singapore=Singapore
|
||||
South Africa=South Africa
|
||||
South Korea=South Korea
|
||||
Spain=Spain
|
||||
Sweden=Sweden
|
||||
Switzerland=Switzerland
|
||||
Taiwan=Taiwan
|
||||
Thailand=Thailand
|
||||
Turkey=Turkey
|
||||
Ukraine=Ukraine
|
||||
United Kingdom=United Kingdom
|
||||
United States=United States
|
||||
action.backup.error.create=It was not possible to generate a new system copy
|
||||
action.backup.error.delete=It was not possible to delete the old system copies
|
||||
action.backup.error.proceed=Proceed anyway ?
|
||||
action.backup.invalid_mode=Invalid backup mode
|
||||
action.backup.msg=Do you want to generate a system copy before proceeding ?
|
||||
action.backup.substatus.create=Generating a new system backup
|
||||
action.backup.substatus.delete=Removing old system backups
|
||||
action.cancelled=Aktion vom Nutzer abgebrochen
|
||||
action.disk_trim=Optimizing disc ( TRIM )
|
||||
action.disk_trim.error=There was a problem while optimizing the disk
|
||||
action.failed=Aktion fehlgeschlagen
|
||||
action.history.no_history.body=There is no available history for {}
|
||||
action.history.no_history.title=No history
|
||||
action.info.tooltip=Informationen über diese Anwendung anzeigen
|
||||
action.not_allowed=Action not allowed
|
||||
action.request_reboot.title=System restart
|
||||
action.run.tooltip=Die Anwendung ausführen
|
||||
action.screenshots.tooltip=Fotos der Anwendung anzeigen
|
||||
action.settings.tooltip=Weitere Optionen anzeigen
|
||||
notification.update={} Update verfügbar
|
||||
notification.updates={} Updates verfügbar
|
||||
notification.update_selected.success=Anwendung(en) erfolgreich aktualisiert
|
||||
notification.update_selected.failed=Aktualisierung fehlgeschlagen
|
||||
notification.install.failed=Installation fehlgeschlagen
|
||||
notification.uninstall.failed=Deinstallation fehlgeschlagen
|
||||
notification.downgrade.failed=Downgrade fehlgeschlagen
|
||||
about.info.desc=Grafisches Interface, um Linux-Anwendungen zu verwalten
|
||||
about.info.link=Mehr Informationen unter
|
||||
about.info.license=Freie Lizenz
|
||||
about.info.rate.question=Gefällt Ihnen diese Anwendung?
|
||||
about.info.rate.answer=Unterstützen Sie uns auf GitHub mit einem Stern.
|
||||
about.info.trouble.question=Probleme?
|
||||
about.info.trouble.answer=Eröffnen Sie ein GitHub-Issue, damit die Entwickler Ihnen helfen können.
|
||||
yes=Ja
|
||||
no=Nein
|
||||
version.updated=geupdated
|
||||
version.outdated=veraltet
|
||||
name=Name
|
||||
version=Version
|
||||
latest_version=Aktuellste Version
|
||||
description=Beschreibung
|
||||
type=Typ
|
||||
installed=installiert
|
||||
uninstalled=deinstalliert
|
||||
not_installed=nicht installiert
|
||||
downgraded=gedowngraded
|
||||
others=Weitere
|
||||
internet.required=Internet Verbindung benötigt
|
||||
updates=Updates
|
||||
version.installed=Installierte Version
|
||||
version.latest=Aktuellste Version
|
||||
version.installed_outdated=Die installierte Version ist veraltet
|
||||
version.unknown=unbekannt
|
||||
app.name=Anwendungsname
|
||||
warning=Warnung
|
||||
install=Installation
|
||||
uninstall=Deinstallation
|
||||
bt.app_upgrade=Upgrade
|
||||
bt.app_not_upgrade=Kein Upgrade
|
||||
manage_window.upgrade_all.popup.title=Upgrade
|
||||
manage_window.upgrade_all.popup.body=Alle ausgewählten Anwendungen upgraden
|
||||
manage_window.settings.about=Über
|
||||
confirmation=Bestätigung
|
||||
and=und
|
||||
error=Fehler
|
||||
action.cancelled=Aktion vom Nutzer abgebrochen
|
||||
copy=Kopieren
|
||||
back=Zurück
|
||||
show=Anzeigen
|
||||
ask.continue=Fortfahren?
|
||||
cancel=Abbrechen
|
||||
status.caching_data={} Daten auf der Festplatte zwischenspeichern
|
||||
action.run.tooltip=Die Anwendung ausführen
|
||||
any=Alle
|
||||
manage_window.name_filter.tooltip=Apps nach Name filtern
|
||||
manage_window.name_filter.placeholder=Nach Name filtern
|
||||
publisher=Herausgeber
|
||||
unknown=unbekannt
|
||||
welcome=Willkommen
|
||||
gem_selector.title=Anwendungstypen
|
||||
gem_selector.question=Welche Typen von Anwendungen sollen verwaltet werden?
|
||||
proceed=Fortfahren
|
||||
change=Anwenden
|
||||
exit=Beenden
|
||||
style=Stil
|
||||
manage_window.bt_settings.tooltip=Einstellungen anpassen
|
||||
downloading=Download
|
||||
console.install_logs.path=Die Installationslogs befinden sich unter {}
|
||||
author=Autor
|
||||
source=Herkunft
|
||||
size=Größe
|
||||
category=Kategorie
|
||||
categories=Kategorien
|
||||
summary=Zusammenfassung
|
||||
popup.screenshots.no_screenshot.body={} Screenshots konnten nicht heruntergeladen werden.
|
||||
terminalemulator=Terminal
|
||||
desktopsettings=Desktop-Einstellungen
|
||||
texteditor=Texteditor
|
||||
screenshots.bt_next.label=Fortfahren
|
||||
screenshots.bt_back.label=Zurück
|
||||
instantmessaging=Kommunikation
|
||||
messaging=messaging
|
||||
2dgraphics=2D-Grafik
|
||||
vectorgraphics=Vektorgrafik
|
||||
audiovideo=Audio/Video
|
||||
audio=Audio
|
||||
webdevelopment=Web-Entwicklung
|
||||
filetransfer=Dateiübertragung
|
||||
packagemanager=Paketmanager
|
||||
sportsgame=Sportspiel
|
||||
arcadegame=Arcade-Spiel
|
||||
player=Spieler
|
||||
screenshots,download.running=Screenshot herunterladen
|
||||
screenshots.download.no_content=Kein Inhalt
|
||||
screenshots.download.no_response=Screenshot nicht gefunden
|
||||
continue=Fortfahren
|
||||
stable=Stabil
|
||||
close=Schließen
|
||||
publisher.verified=Geprüft
|
||||
emulator=Emulator
|
||||
do_not.install=nicht installieren
|
||||
repository=Repository
|
||||
details=Details
|
||||
communication=Kommunikation
|
||||
administration=Verwaltung
|
||||
settings=Einstellungen
|
||||
action.update.cannot_update_label=Cannot be upgraded
|
||||
action.update.install_req.fail.body={} konnte nicht erfolgreich installiert werden
|
||||
action.update.install_req.fail.title=Installation fehlgeschlagen
|
||||
action.update.label_to_remove=Must be uninstalled
|
||||
action.update.label_to_upgrade=Will be upgraded
|
||||
action.update.pkg.required_size=Requires
|
||||
action.update.required_label=Must be installed
|
||||
action.update.required_size=Disk space required (download)
|
||||
action.update.requirements.body=Die folgenden {} Abhängigkeiten müssen zusätzlich installiert werden
|
||||
action.update.requirements.status=Prüfe Voraussetzungen
|
||||
action.update.requirements.title=Upgrade-Voraussetzungen
|
||||
action.update.status.checking_sizes=Calculating upgrade size
|
||||
action.update.success.reboot.line1=Upgrades successfully applied !
|
||||
action.update.success.reboot.line2=Some changes may require a system restart to take effect.
|
||||
action.update.success.reboot.line3=Restart now ?
|
||||
action.update.summary=Upgrade summary
|
||||
action.update.total_size=Update size
|
||||
action.trim_disk.ask=Optimize disc (trim) ?
|
||||
address=Adresse
|
||||
view.components.file_chooser.placeholder=Auswählen
|
||||
files=Dateien
|
||||
all_files=Alle Dateien
|
||||
file_chooser.title=Dateiauswahl
|
||||
message.file.not_exist=Datei existiert nicht
|
||||
message.file.not_exist.body=Die Datei {} scheint nicht zu existieren
|
||||
development=Entwicklung
|
||||
icon_button.tooltip.disabled=Diese Aktion ist nicht verfügbar
|
||||
user=Benutzer
|
||||
example.short=z.B.
|
||||
core.config.tab.advanced=Erweitert
|
||||
core.config.tab.general=Allgemein
|
||||
core.config.tab.ui=Oberfläche
|
||||
core.config.tab.tray=Statusleiste
|
||||
core.config.tab.types=Typen
|
||||
core.config.locale.label=Sprache
|
||||
core.config.disk_cache=Festplatten-Cache
|
||||
core.config.disk_cache.tip=Informationen über die instsallierten Anwendungen werden auf der Festplatte zwischengespeichert, um die Anwendung zu beschleunigen.
|
||||
core.config.updates.interval=Update-Intervall
|
||||
core.config.updates.interval.tip=Das Intervall (in Sekunden), in dem nach Updates für die installierten Anwendungen gesucht wird.
|
||||
core.config.downloads=Downloads
|
||||
amount=amount
|
||||
and=und
|
||||
any=Alle
|
||||
app.name=Anwendungsname
|
||||
applications=applications
|
||||
ask=ask
|
||||
ask.continue=Fortfahren?
|
||||
author=Autor
|
||||
back=Zurück
|
||||
bt.app_not_upgrade=Kein Upgrade
|
||||
bt.app_upgrade=Upgrade
|
||||
bt.not_now=Not now
|
||||
cancel=Abbrechen
|
||||
categories=Kategorien
|
||||
category=Kategorie
|
||||
category.2dgraphics=2D-Grafik
|
||||
category.administration=Verwaltung
|
||||
category.amusement=amusement
|
||||
category.arcadegame=Arcade-Spiel
|
||||
category.art=art
|
||||
category.audio=Audio
|
||||
category.audiovideo=Audio/Video
|
||||
category.books=books
|
||||
category.browser=browser
|
||||
category.cloud=cloud
|
||||
category.communication=Kommunikation
|
||||
category.database=database
|
||||
category.databases=databases
|
||||
category.design=design
|
||||
category.desktopsettings=Desktop-Einstellungen
|
||||
category.development=Entwicklung
|
||||
category.education=education
|
||||
category.emulator=Emulator
|
||||
category.entertainment=entertainment
|
||||
category.filetransfer=Dateiübertragung
|
||||
category.finance=finance
|
||||
category.fitness=fitness
|
||||
category.fonts=fonts
|
||||
category.game=game
|
||||
category.games=games
|
||||
category.graphics=graphics
|
||||
category.health=health
|
||||
category.instantmessaging=Kommunikation
|
||||
category.library=library
|
||||
category.media=media
|
||||
category.messaging=messaging
|
||||
category.movie=movie
|
||||
category.movies=movies
|
||||
category.music=music
|
||||
category.network=network
|
||||
category.networks=networks
|
||||
category.news=news
|
||||
category.none=None
|
||||
category.office=office
|
||||
category.packagemanager=Paketmanager
|
||||
category.personalisation=personalization
|
||||
category.photo=photo
|
||||
category.player=Spieler
|
||||
category.productivity=productivity
|
||||
category.reference=reference
|
||||
category.science=science
|
||||
category.security=security
|
||||
category.server=server
|
||||
category.settings=Einstellungen
|
||||
category.social=social
|
||||
category.sportsgame=Sportspiel
|
||||
category.system=system
|
||||
category.terminalemulator=Terminal
|
||||
category.text editor=text editor
|
||||
category.texteditor=Texteditor
|
||||
category.utilities=utilities
|
||||
category.utility=utility
|
||||
category.vectorgraphics=Vektorgrafik
|
||||
category.video=video
|
||||
category.videoeditor=video editor
|
||||
category.viewer=viewer
|
||||
category.weather=weather
|
||||
category.web=web
|
||||
category.webdevelopment=Web-Entwicklung
|
||||
change=Anwenden
|
||||
clean=Bereinigen
|
||||
close=Schließen
|
||||
confirmation=Bestätigung
|
||||
console.install_logs.path=Die Installationslogs befinden sich unter {}
|
||||
continue=Fortfahren
|
||||
copy=Kopieren
|
||||
core.config.backup=Enabled
|
||||
core.config.backup.downgrade=Before downgrading
|
||||
core.config.backup.install=Before installing
|
||||
core.config.backup.mode=Mode
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.incremental.tip=A new system backup will be generated containing only the changed files since the latest copy.
|
||||
core.config.backup.mode.only_one=Single
|
||||
core.config.backup.mode.only_one.tip=Only one system backup will be kept. Pre-existing backups will be erased.
|
||||
core.config.backup.uninstall=Before uninstalling
|
||||
core.config.backup.upgrade=Before upgrading
|
||||
core.config.download.icons=Download Icons
|
||||
core.config.download.icons.tip=Falls aktiviert werden die Anwendungs-Icons in der Tabelle angezeigt
|
||||
core.config.download.multithreaded=Paralleler Download
|
||||
core.config.download.multithreaded.tip=Falls aktiviert werden Downloads parallel (mit mehreren Threads) heruntergeladen. Dazu muss aria installiert sein.
|
||||
core.config.downloads=Downloads
|
||||
core.config.locale.label=Sprache
|
||||
core.config.mem_cache=RAM Cache
|
||||
core.config.mem_cache.data_exp=Ablauf des Caches
|
||||
core.config.mem_cache.data_exp.tip=Bestimmt die Dauer des In-Memory-Caches
|
||||
core.config.mem_cache.icon_exp=Icons expiration
|
||||
core.config.mem_cache.icon_exp.tip=Defines the in-memory icons lifetime ( in SECONDS )
|
||||
core.config.store_password=Single password request
|
||||
core.config.store_password.tip=Requests the root user password only once
|
||||
core.config.suggestions.activated=Vorschläge
|
||||
core.config.suggestions.activated.tip=Falls aktiviert werden Anwendungsvorschläge angezeigt
|
||||
core.config.suggestions.by_type=Vorschläge pro Typ
|
||||
core.config.suggestions.by_type.tip=Maximale Anzahl an Vorschlägen pro Anwendungstyp
|
||||
core.config.system.dep_checking=Einmaliger System-Check
|
||||
core.config.system.dep_checking.tip=Falls aktiviert wird die Verfügbakeitsprüfung für Systemkomponenten nur einmal ausgeführt
|
||||
core.config.system.notifications=Benachrichtigungen
|
||||
core.config.system.notifications.tip=Falls aktiviert werden Benachrichtigungen für Updates und beendete Vorgänge angezeigt
|
||||
core.config.tab.advanced=Erweitert
|
||||
core.config.tab.backup=Backup
|
||||
core.config.tab.general=Allgemein
|
||||
core.config.tab.tray=Statusleiste
|
||||
core.config.tab.types=Typen
|
||||
core.config.tab.ui=Oberfläche
|
||||
core.config.trim_after_update=Optimize disc after upgrading
|
||||
core.config.trim_after_update.tip=It optimizes the disc after a successful upgrade using "trim". Do not enable this option if your disk is not a SSD that allows trim.
|
||||
core.config.types.tip=Wählen Sie die Anwendungstypen, die Sie verwalten wollen
|
||||
core.config.ui.auto_scale=Automatische Skalierung
|
||||
core.config.ui.auto_scale.tip=Aktiviert den automatischen Skalierungsfaktor ({}), welcher bei einigen Umgebungen Skalierungsprobleme behebt
|
||||
core.config.ui.hdpi=HiDPI
|
||||
core.config.ui.hdpi.tip=Falls aktiviert werden Optimierungen für hochauflösende Displays vorgenommen
|
||||
core.config.ui.max_displayed=Anzahl der Anwendungen
|
||||
core.config.ui.max_displayed.tip=Maximale Anzahl von Anwendungen, die in der Tabelle angezeigt werden
|
||||
core.config.ui.tray.default_icon=Anwendungs-Icon
|
||||
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
|
||||
core.config.ui.tray.updates_icon=Icon bei Updates
|
||||
core.config.system.dep_checking=Einmaliger System-Check
|
||||
core.config.system.dep_checking.tip=Falls aktiviert wird die Verfügbakeitsprüfung für Systemkomponenten nur einmal ausgeführt
|
||||
core.config.suggestions.by_type=Vorschläge pro Typ
|
||||
core.config.suggestions.by_type.tip=Maximale Anzahl an Vorschlägen pro Anwendungstyp
|
||||
core.config.types.tip=Wählen Sie die Anwendungstypen, die Sie verwalten wollen
|
||||
core.config.ui.auto_scale=Automatische Skalierung
|
||||
core.config.ui.auto_scale.tip=Aktiviert den automatischen Skalierungsfaktor ({}), welcher bei einigen Umgebungen Skalierungsprobleme behebt
|
||||
core.config.updates.sort_pkgs=Updates sortieren
|
||||
core.config.updates.sort_pkgs.tip=Sortierreihenfolge für ausgewählte Anwendungen/Pakete zur Vermeidung von Problemen
|
||||
core.config.updates.dep_check=Update-Voraussetzungen anzeigen
|
||||
core.config.updates.dep_check.tip=Zeigt alle Voraussetzungen an, damit das Update der ausgewählten Anwendungen erfolgen kann
|
||||
settings.changed.success.warning=Einstellungen gespeichert. Einige werden erst beim nächsten Anwedungsstart sichtbar.
|
||||
settings.changed.success.reboot=Anwendung neustarten?
|
||||
settings.error=Es konnten nicht alle Einstellungen übernommen werden.
|
||||
locale.en=Englisch
|
||||
locale.es=Spanisch
|
||||
locale.pt=Portugiesisch
|
||||
core.config.ui.tray.updates_icon.tip=The displayed icon when there are updates available
|
||||
core.config.updates.interval=Update-Intervall
|
||||
core.config.updates.interval.tip=Das Intervall (in Sekunden), in dem nach Updates für die installierten Anwendungen gesucht wird.
|
||||
custom_action.proceed_with=Proceed with {} ?
|
||||
description=Beschreibung
|
||||
details=Details
|
||||
devices=devices
|
||||
do_not.install=nicht installieren
|
||||
downgraded=gedowngraded
|
||||
download=Download
|
||||
downloading=Download
|
||||
error=Fehler
|
||||
example.short=z.B.
|
||||
exit=Beenden
|
||||
file=file
|
||||
file_chooser.title=Dateiauswahl
|
||||
files=Dateien
|
||||
finishing=finishing
|
||||
gem_selector.question=Welche Typen von Anwendungen sollen verwaltet werden?
|
||||
gem_selector.title=Anwendungstypen
|
||||
general=Allgemein
|
||||
icon_button.tooltip.disabled=Diese Aktion ist nicht verfügbar
|
||||
imported=imported
|
||||
initialization=Initialisierung
|
||||
install=Installation
|
||||
installation=Installation
|
||||
installed=installiert
|
||||
internet.required=Internet Verbindung benötigt
|
||||
interval=Intervall
|
||||
latest_version=Aktuellste Version
|
||||
license=license
|
||||
locale.ca=Katalanisch
|
||||
locale.de=Deutsch
|
||||
locale.en=Englisch
|
||||
locale.es=Spanisch
|
||||
locale.it=Italienisch
|
||||
locale.pt=Portugiesisch
|
||||
locale.ru=Russisch
|
||||
interval=Intervall
|
||||
installation=Installation
|
||||
download=Download
|
||||
clean=Bereinigen
|
||||
action.update.status.sorting=Sortierreihenfolge
|
||||
action.update.requirements.title=Upgrade-Voraussetzungen
|
||||
action.update.requirements.body=Die folgenden {} Abhängigkeiten müssen zusätzlich installiert werden
|
||||
action.update.install_req.fail.title=Installation fehlgeschlagen
|
||||
action.update.install_req.fail.body={} konnte nicht erfolgreich installiert werden
|
||||
action.update.requirements.status=Prüfe Voraussetzungen
|
||||
action.update.order.title=Upgrade-Reihenfolge
|
||||
action.update.order.body=Das Upgrade in der folgenden Reihenfolge durchgeführt
|
||||
manage_window.apps_table.row.actions.downgrade=Downgraden
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body={} wirklich downgraden?
|
||||
manage_window.apps_table.row.actions.history=Verlauf
|
||||
manage_window.apps_table.row.actions.info=Information
|
||||
manage_window.apps_table.row.actions.install=Installieren
|
||||
manage_window.apps_table.row.actions.install.popup.body={} installieren?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Installation
|
||||
manage_window.apps_table.row.actions.refresh=Aktualisieren
|
||||
manage_window.apps_table.row.actions.uninstall=Uninstall
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body={} deinstallieren?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Deinstallieren
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=But it is not possible to upgrade it.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Klicken Sie hier, um das Update zur Auswahl hinzuzufügen oder es zu entfernen.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Für diese Anwendung ist ein Update verfügbar.
|
||||
manage_window.bt.installed.text=installiert
|
||||
manage_window.bt.installed.tooltip=Installierte Anwendungen anzeigen
|
||||
manage_window.bt.refresh.text=Aktualisieren
|
||||
manage_window.bt.refresh.tooltip=Informationen über installierte Anwendungen aktualisieren
|
||||
manage_window.bt.suggestions.text=Vorschläge
|
||||
manage_window.bt.suggestions.tooltip=Vorschläge für Apps anzeigen
|
||||
manage_window.bt.upgrade.text=Upgraden
|
||||
manage_window.bt.upgrade.tooltip=Alle ausgewählten Anwendungen upgraden
|
||||
manage_window.bt_custom_actions.tip=Click here to show more actions
|
||||
manage_window.bt_settings.tooltip=Einstellungen anpassen
|
||||
manage_window.checkbox.only_apps=Apps
|
||||
manage_window.checkbox.show_details=Details anzeigen
|
||||
manage_window.columns.installed=Installed
|
||||
manage_window.columns.latest_version=Neueste Version
|
||||
manage_window.columns.update=Upgraden?
|
||||
manage_window.label.updates=Updates
|
||||
manage_window.name_filter.placeholder=Nach Name filtern
|
||||
manage_window.name_filter.tooltip=Apps nach Name filtern
|
||||
manage_window.settings.about=Über
|
||||
manage_window.status.downgrading=Downgraden
|
||||
manage_window.status.filtering=Filtern
|
||||
manage_window.status.history=Verlauf laden
|
||||
manage_window.status.info=Informationen laden
|
||||
manage_window.status.installed=Loading installed
|
||||
manage_window.status.installing=Installieren
|
||||
manage_window.status.refreshing=Aktualisieren
|
||||
manage_window.status.refreshing_app=Aktualisieren
|
||||
manage_window.status.running_app={} wird gestartet
|
||||
manage_window.status.screenshots={} Screenshots laden
|
||||
manage_window.status.searching=Suchen
|
||||
manage_window.status.suggestions=Retrieving suggestions
|
||||
manage_window.status.uninstalling=Deinstallieren
|
||||
manage_window.status.upgrading=Upgraden
|
||||
manage_window.title=Meine Anwendungen
|
||||
manage_window.upgrade_all.popup.body=Alle ausgewählten Anwendungen upgraden
|
||||
manage_window.upgrade_all.popup.title=Upgrade
|
||||
message.file.not_exist=Datei existiert nicht
|
||||
message.file.not_exist.body=Die Datei {} scheint nicht zu existieren
|
||||
mirror=mirror
|
||||
name=Name
|
||||
no=Nein
|
||||
not_installed=nicht installiert
|
||||
notification.downgrade.failed=Downgrade fehlgeschlagen
|
||||
notification.install.failed=Installation fehlgeschlagen
|
||||
notification.uninstall.failed=Deinstallation fehlgeschlagen
|
||||
notification.update_selected.failed=Aktualisierung fehlgeschlagen
|
||||
notification.update_selected.success=Anwendung(en) erfolgreich aktualisiert
|
||||
ok=ok
|
||||
others=Weitere
|
||||
popup.button.cancel=Abbrechen
|
||||
popup.button.no=Nein
|
||||
popup.button.yes=Ja
|
||||
popup.history.selected.tooltip=Aktuelle Version
|
||||
popup.history.title=Verlauf
|
||||
popup.root.bad_password.body=Ungültiges Passwort
|
||||
popup.root.bad_password.last_try=Zu viele Fehlversuche. Aktion abgebrochen.
|
||||
popup.root.bad_password.title=Fehler
|
||||
popup.root.continue=Fortfahren
|
||||
popup.root.title=Zum Fortfahren wird das Passwort benötigt.
|
||||
popup.screenshots.no_screenshot.body={} Screenshots konnten nicht heruntergeladen werden.
|
||||
prepare_panel.bt_skip.label=skip
|
||||
prepare_panel.title.finish=Bereit
|
||||
prepare_panel.title.start=Initialisierung
|
||||
proceed=Fortfahren
|
||||
publisher=Herausgeber
|
||||
publisher.verified=Geprüft
|
||||
repository=Repository
|
||||
screenshots.bt_back.label=Zurück
|
||||
screenshots.bt_next.label=Fortfahren
|
||||
screenshots.download.no_content=Kein Inhalt
|
||||
screenshots.download.no_response=Screenshot nicht gefunden
|
||||
screenshots.download.running=Screenshot herunterladen
|
||||
settings=Einstellungen
|
||||
settings.changed.success.reboot=Anwendung neustarten?
|
||||
settings.changed.success.warning=Einstellungen gespeichert. Einige werden erst beim nächsten Anwedungsstart sichtbar.
|
||||
settings.error=Es konnten nicht alle Einstellungen übernommen werden.
|
||||
show=Anzeigen
|
||||
size=Größe
|
||||
source=Herkunft
|
||||
stable=Stabil
|
||||
status.caching_data={} Daten auf der Festplatte zwischenspeichern
|
||||
style=Stil
|
||||
success=success
|
||||
summary=Zusammenfassung
|
||||
task.download_categories=Downloading categories [ {} ]
|
||||
type=Typ
|
||||
uninstall=Deinstallation
|
||||
uninstalled=deinstalliert
|
||||
unknown=unbekannt
|
||||
updates=Updates
|
||||
user=Benutzer
|
||||
version=Version
|
||||
version.installed=Installierte Version
|
||||
version.installed_outdated=Die installierte Version ist veraltet
|
||||
version.latest=Aktuellste Version
|
||||
version.outdated=veraltet
|
||||
version.unknown=unbekannt
|
||||
version.updated=geupdated
|
||||
view.components.file_chooser.placeholder=Auswählen
|
||||
warning=Warnung
|
||||
warning.update_available=There is a new {} update available ({}). Checkout the news at {}.
|
||||
welcome=Willkommen
|
||||
window_manage.input_search.placeholder=Suchbegriff
|
||||
window_manage.input_search.tooltip=Suchbegriff eingeben und Enter drücken, um zu suchen
|
||||
yes=Ja
|
||||
@@ -1,243 +1,377 @@
|
||||
manage_window.title=my applications
|
||||
manage_window.columns.latest_version=Latest Version
|
||||
manage_window.columns.update=Upgrade ?
|
||||
manage_window.apps_table.row.actions.info=Information
|
||||
manage_window.apps_table.row.actions.history=History
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Uninstall
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Remove {} from your device ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Installation
|
||||
manage_window.apps_table.row.actions.install.popup.body=Install {} on your device ?
|
||||
manage_window.apps_table.row.actions.downgrade=Downgrade
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Do you really want to downgrade {} ?
|
||||
manage_window.apps_table.row.actions.install=Install
|
||||
manage_window.apps_table.row.actions.refresh=Refresh
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=There is an update for this application. Click here to check or uncheck the update
|
||||
manage_window.checkbox.only_apps=Apps
|
||||
window_manage.input_search.placeholder=Search
|
||||
window_manage.input_search.tooltip=Type and press ENTER to search for applications
|
||||
manage_window.label.updates=Updates
|
||||
manage_window.status.refreshing=Refreshing
|
||||
manage_window.status.upgrading=Upgrading
|
||||
manage_window.status.uninstalling=Uninstalling
|
||||
manage_window.status.downgrading=Downgrading
|
||||
manage_window.status.info=Retrieving information
|
||||
manage_window.status.history=Retrieving history
|
||||
manage_window.status.searching=Searching
|
||||
manage_window.status.installing=Installing
|
||||
manage_window.status.refreshing_app=Refreshing
|
||||
manage_window.status.running_app=Launching {}
|
||||
manage_window.status.filtering=Filtering
|
||||
manage_window.status.screenshots=Retrieving {} screenshots
|
||||
manage_window.status.suggestions=Looking for suggestions
|
||||
manage_window.bt.refresh.text=Refresh
|
||||
manage_window.bt.refresh.tooltip=Reload the data about installed applications
|
||||
manage_window.bt.upgrade.text=Upgrade
|
||||
manage_window.bt.upgrade.tooltip=Upgrade all checked applications
|
||||
manage_window.bt.installed.text=installed
|
||||
manage_window.bt.installed.tooltip=Click here to show the installed applications
|
||||
manage_window.bt.suggestions.text=Suggestions
|
||||
manage_window.bt.suggestions.tooltip=Click here to show some applications suggestions
|
||||
manage_window.checkbox.show_details=Show details
|
||||
popup.root.title=Requires your password to continue
|
||||
popup.root.continue=continue
|
||||
popup.root.bad_password.title=Error
|
||||
popup.root.bad_password.body=Wrong password
|
||||
popup.root.bad_password.last_try=Attempts finished. Action cancelled.
|
||||
popup.history.title=History
|
||||
popup.history.selected.tooltip=Current version
|
||||
popup.button.yes=Yes
|
||||
popup.button.no=No
|
||||
popup.button.cancel=Cancel
|
||||
tray.action.manage=Applications
|
||||
tray.action.exit=Quit
|
||||
tray.action.about=About
|
||||
tray.action.refreshing=Refreshing
|
||||
Australia=Australia
|
||||
Austria=Austria
|
||||
Bangladesh=Bangladesh
|
||||
Belarus=Belarus
|
||||
Belgium=Belgium
|
||||
Brazil=Brazil
|
||||
Bulgaria=Bulgaria
|
||||
Canada=Canada
|
||||
Chile=Chile
|
||||
China=China
|
||||
Costa Rica=Costa Rica
|
||||
Czech=Czech
|
||||
Denmark=Denmark
|
||||
Ecuador=Ecuador
|
||||
France=France
|
||||
Georgia=Georgia
|
||||
Germany=Germany
|
||||
Greece=Greece
|
||||
Hong Kong=Hong Kong
|
||||
Hungary=Hungary
|
||||
Iceland=Iceland
|
||||
India=India
|
||||
Indonesia=Indonesia
|
||||
Iran=Iran
|
||||
Italy=Italy
|
||||
Japan=Japan
|
||||
Kenya=Kenya
|
||||
Netherlands=Netherlands
|
||||
New Zealand=New Zealand
|
||||
Norway=Norway
|
||||
Philippines=Philippines
|
||||
Poland=Poland
|
||||
Portugal=Portugal
|
||||
Russia=Russia
|
||||
Singapore=Singapore
|
||||
South Africa=South Africa
|
||||
South Korea=South Korea
|
||||
Spain=Spain
|
||||
Sweden=Sweden
|
||||
Switzerland=Switzerland
|
||||
Taiwan=Taiwan
|
||||
Thailand=Thailand
|
||||
Turkey=Turkey
|
||||
Ukraine=Ukraine
|
||||
United Kingdom=United Kingdom
|
||||
United States=United States
|
||||
action.backup.error.create=It was not possible to generate a new system copy
|
||||
action.backup.error.delete=It was not possible to delete the old system copies
|
||||
action.backup.error.proceed=Proceed anyway ?
|
||||
action.backup.invalid_mode=Invalid backup mode
|
||||
action.backup.msg=Do you want to generate a system copy before proceeding ?
|
||||
action.backup.substatus.create=Generating a new system backup
|
||||
action.backup.substatus.delete=Removing old system backups
|
||||
action.cancelled=operation cancelled by the user
|
||||
action.disk_trim.error=There was a problem while optimizing the disk
|
||||
action.disk_trim=Optimizing disc ( TRIM )
|
||||
action.failed=Action failed
|
||||
action.history.no_history.body=There is no available history for {}
|
||||
action.history.no_history.title=No history
|
||||
action.info.tooltip=Click here to see information about this application
|
||||
action.not_allowed=Action not allowed
|
||||
action.request_reboot.title=System restart
|
||||
action.run.tooltip=Click here to launch this application
|
||||
action.screenshots.tooltip=Click here to see some pictures of this application
|
||||
action.settings.tooltip=Click here to open extra actions
|
||||
notification.update={} available update
|
||||
notification.updates={} available updates
|
||||
notification.update_selected.success=app(s) updated successfully
|
||||
notification.update_selected.failed=Update failed
|
||||
notification.install.failed=installation failed
|
||||
notification.uninstall.failed=uninstallation failed
|
||||
notification.downgrade.failed=Failed to downgrade
|
||||
about.info.desc=Graphical interface for managing your Linux applications
|
||||
about.info.link=More information at
|
||||
about.info.license=Free license
|
||||
about.info.rate.question=Like this tool ?
|
||||
about.info.rate.answer=Give it a star on GitHub to strengthen the project
|
||||
about.info.trouble.question=Any trouble ?
|
||||
about.info.trouble.answer=Open a GitHub issue so the developers can help you
|
||||
yes=yes
|
||||
no=no
|
||||
version.updated=updated
|
||||
version.outdated=outdated
|
||||
name=name
|
||||
version=version
|
||||
latest_version=latest version
|
||||
description=description
|
||||
type=type
|
||||
installed=installed
|
||||
uninstalled=uninstalled
|
||||
not_installed=not installed
|
||||
downgraded=downgraded
|
||||
others=others
|
||||
internet.required=Internet connection is required
|
||||
updates=updates
|
||||
version.installed=installed version
|
||||
version.latest=latest version
|
||||
version.installed_outdated=the installed version is outdated
|
||||
version.unknown=not informed
|
||||
app.name=application name
|
||||
warning=warning
|
||||
install=install
|
||||
uninstall=uninstall
|
||||
bt.app_upgrade=Upgrade
|
||||
bt.app_not_upgrade=Don't upgrade
|
||||
manage_window.upgrade_all.popup.title=Upgrade
|
||||
manage_window.upgrade_all.popup.body=Upgrade all selected applications ?
|
||||
manage_window.settings.about=About
|
||||
confirmation=confirmation
|
||||
and=and
|
||||
error=error
|
||||
action.cancelled=operation cancelled by the user
|
||||
copy=copy
|
||||
back=back
|
||||
show=show
|
||||
ask.continue=Continue ?
|
||||
cancel=cancel
|
||||
status.caching_data=Caching {} data to disk
|
||||
action.run.tooltip=Click here to launch this application
|
||||
any=any
|
||||
manage_window.name_filter.tooltip=Type here to filter apps by name
|
||||
manage_window.name_filter.placeholder=Filter by name
|
||||
publisher=publisher
|
||||
unknown=unknown
|
||||
welcome=welcome
|
||||
gem_selector.title=Application types
|
||||
gem_selector.question=What types of applications do you want to find here ?
|
||||
proceed=proceed
|
||||
change=change
|
||||
exit=exit
|
||||
style=style
|
||||
manage_window.bt_settings.tooltip=Click here to display the settings
|
||||
downloading=Downloading
|
||||
console.install_logs.path=Installation logs can be found at {}
|
||||
author=author
|
||||
source=source
|
||||
size=size
|
||||
category=category
|
||||
categories=categories
|
||||
summary=summary
|
||||
popup.screenshots.no_screenshot.body=it was not possible to retrieve {} screenshots
|
||||
terminalemulator=terminal
|
||||
desktopsettings=desktop settings
|
||||
texteditor=text editor
|
||||
screenshots.bt_next.label=next
|
||||
screenshots.bt_back.label=previous
|
||||
instantmessaging=messaging
|
||||
2dgraphics=2d graphics
|
||||
vectorgraphics=vector graphics
|
||||
audiovideo=audio / video
|
||||
webdevelopment=web development
|
||||
filetransfer=file transfer
|
||||
packagemanager=package manager
|
||||
sportsgame=sports game
|
||||
arcadegame=arcade game
|
||||
player=player
|
||||
screenshots,download.running=downloading image
|
||||
screenshots.download.no_content=No content to display
|
||||
screenshots.download.no_response=Image not found
|
||||
continue=continue
|
||||
stable=stable
|
||||
close=close
|
||||
publisher.verified=verified
|
||||
mirror=mirror
|
||||
emulator=emulator
|
||||
do_not.install=don't install
|
||||
repository=repository
|
||||
details=details
|
||||
communication=communication
|
||||
web=web
|
||||
office=office
|
||||
messaging=messaging
|
||||
administration=administration
|
||||
audio=audio
|
||||
video=video
|
||||
settings=settings
|
||||
action.update.cannot_update_label=Cannot be upgraded
|
||||
action.update.install_req.fail.body=It was not possible to install {}
|
||||
action.update.install_req.fail.title=Installation failed
|
||||
action.update.label_to_remove=Must be uninstalled
|
||||
action.update.label_to_upgrade=Will be upgraded
|
||||
action.update.pkg.required_size=Requires
|
||||
action.update.required_label=Must be installed
|
||||
action.update.required_size=Disk space required (download)
|
||||
action.update.requirements.body=The following {} dependencies must be installed before upgrading
|
||||
action.update.requirements.status=Checking requirements
|
||||
action.update.requirements.title=Upgrade requirements
|
||||
action.update.status.checking_sizes=Calculating the upgrades size
|
||||
action.update.success.reboot.line1=Upgrades successfully applied !
|
||||
action.update.success.reboot.line2=Some changes may require a system restart to take effect.
|
||||
action.update.success.reboot.line3=Restart now ?
|
||||
action.update.summary=Upgrade summary
|
||||
action.update.total_size=Update size
|
||||
action.trim_disk.ask=Optimize disc (trim) ?
|
||||
address=address
|
||||
view.components.file_chooser.placeholder=Click here to select
|
||||
files=files
|
||||
all_files=all files
|
||||
file_chooser.title=File selector
|
||||
message.file.not_exist=File does not exist
|
||||
message.file.not_exist.body=The file {} seems not to exist
|
||||
development=development
|
||||
icon_button.tooltip.disabled=This action is unavailable
|
||||
user=user
|
||||
example.short=e.g
|
||||
amount=amount
|
||||
and=and
|
||||
any=any
|
||||
app.name=application name
|
||||
applications=applications
|
||||
ask.continue=Continue ?
|
||||
ask=ask
|
||||
author=author
|
||||
back=back
|
||||
bt.app_not_upgrade=Don't upgrade
|
||||
bt.app_upgrade=Upgrade
|
||||
bt.not_now=Not now
|
||||
cancel=cancel
|
||||
categories=categories
|
||||
category.2dgraphics=2d graphics
|
||||
category.administration=administration
|
||||
category.amusement=amusement
|
||||
category.arcadegame=arcade game
|
||||
category.art=art
|
||||
category.audio=audio
|
||||
category.audiovideo=audio / video
|
||||
category.books=books
|
||||
category.browser=browser
|
||||
category.cloud=cloud
|
||||
category.communication=communication
|
||||
category.database=database
|
||||
category.databases=databases
|
||||
category.design=design
|
||||
category.desktopsettings=desktop settings
|
||||
category.development=development
|
||||
category.education=education
|
||||
category.emulator=emulator
|
||||
category.entertainment=entertainment
|
||||
category.filetransfer=file transfer
|
||||
category.finance=finance
|
||||
category.fitness=fitness
|
||||
category.fonts=fonts
|
||||
category.game=game
|
||||
category.games=games
|
||||
category.graphics=graphics
|
||||
category.health=health
|
||||
category.instantmessaging=messaging
|
||||
category.library=library
|
||||
category.media=media
|
||||
category.messaging=messaging
|
||||
category.movie=movie
|
||||
category.movies=movies
|
||||
category.music=music
|
||||
category.network=network
|
||||
category.networks=networks
|
||||
category.news=news
|
||||
category.none=None
|
||||
category.office=office
|
||||
category.packagemanager=package manager
|
||||
category.personalisation=personalization
|
||||
category.photo=photo
|
||||
category.player=player
|
||||
category.productivity=productivity
|
||||
category.reference=reference
|
||||
category.science=science
|
||||
category.security=security
|
||||
category.server=server
|
||||
category.settings=settings
|
||||
category.social=social
|
||||
category.sportsgame=sports game
|
||||
category.system=system
|
||||
category.terminalemulator=terminal
|
||||
category.text editor=text editor
|
||||
category.texteditor=text editor
|
||||
category.utilities=utilities
|
||||
category.utility=utility
|
||||
category.vectorgraphics=vector graphics
|
||||
category.video=video
|
||||
category.videoeditor=video editor
|
||||
category.viewer=viewer
|
||||
category.weather=weather
|
||||
category.web=web
|
||||
category.webdevelopment=web development
|
||||
category=category
|
||||
change=change
|
||||
clean=clean
|
||||
close=close
|
||||
confirmation=confirmation
|
||||
console.install_logs.path=Installation logs can be found at {}
|
||||
continue=continue
|
||||
copy=copy
|
||||
core.config.backup.downgrade=Before downgrading
|
||||
core.config.backup.install=Before installing
|
||||
core.config.backup.mode.incremental.tip=A new system backup will be generated containing only the changed files since the latest copy.
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.only_one.tip=Only one system backup will be kept. Pre-existing backups will be erased.
|
||||
core.config.backup.mode.only_one=Single
|
||||
core.config.backup.mode=Mode
|
||||
core.config.backup.uninstall=Before uninstalling
|
||||
core.config.backup.upgrade=Before upgrading
|
||||
core.config.backup=Enabled
|
||||
core.config.download.icons.tip=If the application icons should be downloaded and displayed on the table
|
||||
core.config.download.icons=Download icons
|
||||
core.config.download.multithreaded.tip=Whether applications, packages and files should be downloaded with a tool that works with threads ( faster ). At the moment this setting will only work if the aria2 package is installed
|
||||
core.config.download.multithreaded=Multithreaded download
|
||||
core.config.downloads=downloads
|
||||
core.config.locale.label=language
|
||||
core.config.mem_cache.data_exp.tip=Defines the in-memory data lifetime ( in SECONDS )
|
||||
core.config.mem_cache.data_exp=Data expiration
|
||||
core.config.mem_cache.icon_exp.tip=Defines the in-memory icons lifetime ( in SECONDS )
|
||||
core.config.mem_cache.icon_exp=Icons expiration
|
||||
core.config.mem_cache=Memory storage
|
||||
core.config.store_password.tip=It requests the root user password only once
|
||||
core.config.store_password=Single password request
|
||||
core.config.suggestions.activated.tip=If new applications can be suggested for installation
|
||||
core.config.suggestions.activated=Suggestions
|
||||
core.config.suggestions.by_type.tip=Maximum number of suggestions that should be displayed by application type
|
||||
core.config.suggestions.by_type=Suggestions by type
|
||||
core.config.system.dep_checking.tip=If the availability checking of your system technologies should happen only once
|
||||
core.config.system.dep_checking=Single system checking
|
||||
core.config.system.notifications.tip=If notifications should be displayed when an action is finished or there are updates
|
||||
core.config.system.notifications=Notifications
|
||||
core.config.tab.advanced=Advanced
|
||||
core.config.tab.backup=Backup
|
||||
core.config.tab.general=General
|
||||
core.config.tab.ui=Interface
|
||||
core.config.tab.tray=Tray
|
||||
core.config.tab.types=Types
|
||||
core.config.locale.label=language
|
||||
core.config.disk_cache=Disk cache
|
||||
core.config.disk_cache.tip=Some data about the installed applications will be stored into the disk so they can be quickly loaded in the next initializations
|
||||
core.config.updates.interval=Updates interval
|
||||
core.config.updates.interval.tip=Defines the time interval in which the update-checking for the installed applications will happen ( in SECONDS )
|
||||
core.config.download.icons=Download icons
|
||||
core.config.download.icons.tip=If the application icons should be downloaded and displayed on the table
|
||||
core.config.download.multithreaded=Multithreaded download
|
||||
core.config.download.multithreaded.tip=Whether applications, packages and files should be downloaded with a tool that works with threads ( faster ). At the moment this setting will only work if the aria2 package is installed
|
||||
core.config.mem_cache=Memory storage
|
||||
core.config.mem_cache.data_exp=Data expiration
|
||||
core.config.mem_cache.data_exp.tip=Defines the in-memory data lifetime ( in SECONDS )
|
||||
core.config.mem_cache.icon_exp=Icons expiration
|
||||
core.config.mem_cache.icon_exp.tip=Defines the in-memory icons lifetime ( in SECONDS )
|
||||
core.config.suggestions.activated=Suggestions
|
||||
core.config.suggestions.activated.tip=If new applications can be suggested for installation
|
||||
core.config.system.notifications=Notifications
|
||||
core.config.system.notifications.tip=If notifications should be displayed when an action is finished or there are updates
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
|
||||
core.config.ui.max_displayed=Applications displayed
|
||||
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
|
||||
core.config.ui.tray.default_icon=Default icon
|
||||
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
|
||||
core.config.ui.tray.updates_icon=Update icon
|
||||
core.config.ui.tray.updates_icon.tip=The displayed icon when there are updates available
|
||||
core.config.system.dep_checking=Single system checking
|
||||
core.config.system.dep_checking.tip=If the availability checking of your system technologies should happen only once
|
||||
core.config.suggestions.by_type=Suggestions by type
|
||||
core.config.suggestions.by_type.tip=Maximum number of suggestions that should be displayed by application type
|
||||
core.config.tab.ui=Interface
|
||||
core.config.trim_after_update.tip=It optimizes the disc after a successfull upgrade using "trim". Do not enable this option if your disk is not a SSD that allows trim.
|
||||
core.config.trim_after_update=Optimize disc after upgrading
|
||||
core.config.types.tip=Check the application types you want to manage
|
||||
core.config.ui.auto_scale=Auto scale
|
||||
core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ). It fixes scaling issues for some desktop environments.
|
||||
core.config.updates.sort_pkgs=Sort updates
|
||||
core.config.updates.sort_pkgs.tip=Defines the best update order for the selected applications / packages to avoid issues
|
||||
core.config.updates.dep_check=Show update requirements
|
||||
core.config.updates.dep_check.tip=Displays all dependencies that need to be installed before starting to update selected ones
|
||||
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
|
||||
settings.changed.success.reboot=Restart now ?
|
||||
settings.error=It was not possible to properly change all the settings
|
||||
locale.en=english
|
||||
locale.es=spanish
|
||||
locale.pt=portuguese
|
||||
core.config.ui.auto_scale=Auto scale
|
||||
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
|
||||
core.config.ui.max_displayed=Applications displayed
|
||||
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
|
||||
core.config.ui.tray.default_icon=Default icon
|
||||
core.config.ui.tray.updates_icon.tip=The displayed icon when there are updates available
|
||||
core.config.ui.tray.updates_icon=Update icon
|
||||
core.config.updates.interval.tip=Defines the time interval in which the update-checking for the installed applications will happen ( in SECONDS )
|
||||
core.config.updates.interval=Updates interval
|
||||
custom_action.proceed_with=Proceed with {} ?
|
||||
description=description
|
||||
details=details
|
||||
devices=devices
|
||||
do_not.install=don't install
|
||||
downgraded=downgraded
|
||||
download=download
|
||||
downloading=Downloading
|
||||
error=error
|
||||
example.short=e.g
|
||||
exit=exit
|
||||
file=file
|
||||
file_chooser.title=File selector
|
||||
files=files
|
||||
finishing=finishing
|
||||
gem_selector.question=What types of applications do you want to find here ?
|
||||
gem_selector.title=Application types
|
||||
general=general
|
||||
icon_button.tooltip.disabled=This action is unavailable
|
||||
imported=imported
|
||||
initialization=initialization
|
||||
install=install
|
||||
installation=installation
|
||||
installed=installed
|
||||
internet.required=Internet connection is required
|
||||
interval=interval
|
||||
latest_version=latest version
|
||||
license=license
|
||||
locale.ca=catalan
|
||||
locale.de=german
|
||||
locale.en=english
|
||||
locale.es=spanish
|
||||
locale.it=italian
|
||||
locale.pt=portuguese
|
||||
locale.ru=russian
|
||||
interval=interval
|
||||
installation=installation
|
||||
download=download
|
||||
clean=clean
|
||||
action.update.status.sorting=Determining the best update order
|
||||
action.update.requirements.title=Upgrade requirements
|
||||
action.update.requirements.body=The following {} dependencies must be installed before upgrading
|
||||
action.update.install_req.fail.title=Installation failed
|
||||
action.update.install_req.fail.body=It was not possible to install {}
|
||||
action.update.requirements.status=Checking requirements
|
||||
action.update.order.title=Upgrade order
|
||||
action.update.order.body=The upgrade will be performed in the following order
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Do you really want to downgrade {} ?
|
||||
manage_window.apps_table.row.actions.downgrade=Downgrade
|
||||
manage_window.apps_table.row.actions.history=History
|
||||
manage_window.apps_table.row.actions.info=Information
|
||||
manage_window.apps_table.row.actions.install.popup.body=Install {} on your device ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Installation
|
||||
manage_window.apps_table.row.actions.install=Install
|
||||
manage_window.apps_table.row.actions.refresh=Refresh
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Remove {} from your device ?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Uninstall
|
||||
manage_window.apps_table.row.actions.uninstall=Uninstall
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=But it is not possible to upgrade it.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Click here to check or uncheck the update.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=There is an update for this application.
|
||||
manage_window.bt.installed.text=installed
|
||||
manage_window.bt.installed.tooltip=Click here to show the installed applications
|
||||
manage_window.bt.refresh.text=Refresh
|
||||
manage_window.bt.refresh.tooltip=Reload the data about installed applications
|
||||
manage_window.bt.suggestions.text=Suggestions
|
||||
manage_window.bt.suggestions.tooltip=Click here to show some applications suggestions
|
||||
manage_window.bt.upgrade.text=Upgrade
|
||||
manage_window.bt.upgrade.tooltip=Upgrade all checked applications
|
||||
manage_window.bt_custom_actions.tip=Click here to show more actions
|
||||
manage_window.bt_settings.tooltip=Click here to display the settings
|
||||
manage_window.checkbox.only_apps=Apps
|
||||
manage_window.checkbox.show_details=Show details
|
||||
manage_window.columns.installed=Installed
|
||||
manage_window.columns.latest_version=Latest Version
|
||||
manage_window.columns.update=Upgrade ?
|
||||
manage_window.label.updates=Updates
|
||||
manage_window.name_filter.placeholder=Filter by name
|
||||
manage_window.name_filter.tooltip=Type here to filter apps by name
|
||||
manage_window.settings.about=About
|
||||
manage_window.status.downgrading=Downgrading
|
||||
manage_window.status.filtering=Filtering
|
||||
manage_window.status.history=Retrieving history
|
||||
manage_window.status.info=Retrieving information
|
||||
manage_window.status.installed=Loading installed
|
||||
manage_window.status.installing=Installing
|
||||
manage_window.status.refreshing=Refreshing
|
||||
manage_window.status.refreshing_app=Refreshing
|
||||
manage_window.status.running_app=Launching {}
|
||||
manage_window.status.screenshots=Retrieving {} screenshots
|
||||
manage_window.status.searching=Searching
|
||||
manage_window.status.suggestions=Looking for suggestions
|
||||
manage_window.status.uninstalling=Uninstalling
|
||||
manage_window.status.upgrading=Upgrading
|
||||
manage_window.title=my applications
|
||||
manage_window.upgrade_all.popup.body=Upgrade all selected applications ?
|
||||
manage_window.upgrade_all.popup.title=Upgrade
|
||||
message.file.not_exist.body=The file {} seems not to exist
|
||||
message.file.not_exist=File does not exist
|
||||
mirror=mirror
|
||||
name=name
|
||||
no=no
|
||||
not_installed=not installed
|
||||
notification.downgrade.failed=Failed to downgrade
|
||||
notification.install.failed=installation failed
|
||||
notification.uninstall.failed=uninstallation failed
|
||||
notification.update_selected.failed=Update failed
|
||||
notification.update_selected.success=app(s) updated successfully
|
||||
ok=ok
|
||||
others=others
|
||||
popup.button.cancel=Cancel
|
||||
popup.button.no=No
|
||||
popup.button.yes=Yes
|
||||
popup.history.selected.tooltip=Current version
|
||||
popup.history.title=History
|
||||
popup.root.bad_password.body=Wrong password
|
||||
popup.root.bad_password.last_try=Attempts finished. Action cancelled.
|
||||
popup.root.bad_password.title=Error
|
||||
popup.root.continue=continue
|
||||
popup.root.title=Requires your password to continue
|
||||
popup.screenshots.no_screenshot.body=it was not possible to retrieve {} screenshots
|
||||
prepare_panel.bt_skip.label=skip
|
||||
prepare_panel.title.finish=Ready
|
||||
prepare_panel.title.start=Initializing
|
||||
proceed=proceed
|
||||
publisher.verified=verified
|
||||
publisher=publisher
|
||||
repository=repository
|
||||
screenshots.bt_back.label=previous
|
||||
screenshots.bt_next.label=next
|
||||
screenshots.download.no_content=No content to display
|
||||
screenshots.download.no_response=Image not found
|
||||
screenshots.download.running=downloading image
|
||||
settings.changed.success.reboot=Restart now ?
|
||||
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
|
||||
settings.error=It was not possible to properly change all the settings
|
||||
settings=settings
|
||||
show=show
|
||||
size=size
|
||||
source=source
|
||||
stable=stable
|
||||
status.caching_data=Caching {} data to disk
|
||||
style=style
|
||||
success=success
|
||||
summary=summary
|
||||
task.download_categories=Downloading categories [ {} ]
|
||||
type=type
|
||||
uninstall=uninstall
|
||||
uninstalled=uninstalled
|
||||
unknown=unknown
|
||||
updates=updates
|
||||
user=user
|
||||
version.installed=installed version
|
||||
version.installed_outdated=the installed version is outdated
|
||||
version.latest=latest version
|
||||
version.outdated=outdated
|
||||
version.unknown=not informed
|
||||
version.updated=updated
|
||||
version=version
|
||||
view.components.file_chooser.placeholder=Click here to select
|
||||
warning=warning
|
||||
welcome=welcome
|
||||
warning.update_available=There is a new {} update available ({}). Checkout the news at {}.
|
||||
window_manage.input_search.placeholder=Search
|
||||
window_manage.input_search.tooltip=Type and press ENTER to search for applications
|
||||
yes=yes
|
||||
@@ -1,246 +1,217 @@
|
||||
manage_window.title=Mis aplicaciones
|
||||
manage_window.columns.latest_version=Versión más reciente
|
||||
manage_window.columns.update=¿Quiere actualizar?
|
||||
manage_window.columns.installed=Instaladas
|
||||
manage_window.apps_table.row.actions.info=Información
|
||||
manage_window.apps_table.row.actions.history=Histórico
|
||||
manage_window.apps_table.row.actions.uninstall=Desinstalar
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Desinstalación
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=¿Quiere desinstalar {} del equipo?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Instalación
|
||||
manage_window.apps_table.row.actions.install.popup.body=¿Quiere instalar {} en el equipo?
|
||||
manage_window.apps_table.row.actions.downgrade=Revertir versión
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=¿Realmente quiere revertir la versión actual de {}?
|
||||
manage_window.apps_table.row.actions.install=Instalar
|
||||
manage_window.apps_table.row.actions.refresh=Actualizar
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Pulse aquí para marcar o desmarcar la actualización
|
||||
manage_window.checkbox.only_apps=Aplicaciones
|
||||
window_manage.input_search.placeholder=Buscar
|
||||
window_manage.input_search.tooltip=Escriba y oprima Intro para buscar aplicaciones
|
||||
manage_window.label.updates=Actualizaciones
|
||||
manage_window.status.refreshing=Recargando
|
||||
manage_window.status.upgrading=Actualizando
|
||||
manage_window.status.uninstalling=Desinstalando
|
||||
manage_window.status.downgrading=Revirtiendo
|
||||
manage_window.status.info=Obteniendo información
|
||||
manage_window.status.history=Obteniendo el histórico
|
||||
manage_window.status.searching=Buscando
|
||||
manage_window.status.installing=Instalando
|
||||
manage_window.status.refreshing_app=Actualizando
|
||||
manage_window.status.running_app=Ejecutando {}
|
||||
manage_window.status.filtering=Filtrando
|
||||
manage_window.status.suggestions=Buscando sugerencias
|
||||
manage_window.bt.refresh.text=Recargar
|
||||
manage_window.bt.refresh.tooltip=Recarga los datos sobre las aplicaciones instaladas
|
||||
manage_window.bt.upgrade.text=Actualizar
|
||||
manage_window.bt.upgrade.tooltip=Actualiza todas las aplicaciones marcadas
|
||||
manage_window.bt.installed.text=instaladas
|
||||
manage_window.bt.installed.tooltip==Pulse aquí para mostrar las aplicaciones instaladas
|
||||
manage_window.bt.suggestions.text=Sugerencias
|
||||
manage_window.bt.suggestions.tooltip=Pulse aquí para mostrar algunas sugerencias de aplicaciones
|
||||
manage_window.checkbox.show_details=Mostrar detalles
|
||||
popup.root.title=Proporcione su contraseña para continuar
|
||||
popup.root.continue=continuar
|
||||
popup.root.bad_password.title=Error
|
||||
popup.root.bad_password.body=Contraseña incorrecta
|
||||
popup.root.bad_password.last_try=Intentos finalizados. Acción cancelada.
|
||||
popup.history.title=Histórico
|
||||
popup.history.selected.tooltip=Versión actual
|
||||
popup.button.yes=Sí
|
||||
popup.button.no=No
|
||||
popup.button.cancel=Cancelar
|
||||
tray.action.manage=Aplicaciones
|
||||
tray.action.exit=Cerrar
|
||||
tray.action.about=Acerca de
|
||||
tray.action.refreshing=Recargando
|
||||
action.info.tooltip=Pulse aquí para ver información sobre esta aplicación
|
||||
action.settings.tooltip=Pulse aquí para abrir acciones adicionales
|
||||
notification.update={} actualización disponible
|
||||
notification.updates={} actualizaciones disponibles
|
||||
notification.update_selected.success=aplicación(es) actualizada(s) correctamente
|
||||
notification.update_selected.failed=La actualización ha fallado
|
||||
notification.install.failed=la instalación ha fallado
|
||||
notification.uninstall.failed=la desinstalación ha fallado
|
||||
notification.downgrade.failed=Error al revertir la versión
|
||||
about.info.desc=Interfaz grafica para administración de aplicaciones para Linux
|
||||
about.info.link=Mas información en
|
||||
about.info.license=Licencia gratuita
|
||||
about.info.rate.question=¿Le gusta esta herramienta?
|
||||
about.info.rate.answer=Dele una estrella en GitHub para fortalecer el proyecto
|
||||
about.info.trouble.question=¿Problemas?
|
||||
about.info.trouble.answer=Abra un issue en GitHub para que los desarrolladores puedan ayudarlo
|
||||
yes=sí
|
||||
no=no
|
||||
version.updated=actualizada
|
||||
version.outdated=desactualizada
|
||||
name=nombre
|
||||
version=versión
|
||||
latest_version=versión más reciente
|
||||
description=descripción
|
||||
type=tipo
|
||||
installed=instalada
|
||||
uninstalled=desinstalada
|
||||
not_installed=no instalada
|
||||
downgraded=versión revertida
|
||||
others=otros
|
||||
internet.required=Se requiere conexión a internet
|
||||
updates=actualizaciones
|
||||
version.installed=versión instalada
|
||||
version.latest=versión más reciente
|
||||
version.installed_outdated=la versión instalada está desactualizada
|
||||
version.unknown=versión no informada
|
||||
app.name=nombre de la aplicación
|
||||
warning=aviso
|
||||
install=instalar
|
||||
uninstall=desinstalar
|
||||
bt.app_upgrade=Actualizar
|
||||
bt.app_not_upgrade=No actualizar
|
||||
manage_window.upgrade_all.popup.title=Actualizar
|
||||
manage_window.upgrade_all.popup.body=¿Quiere actualizar todas las aplicaciones seleccionadas?
|
||||
manage_window.settings.about=Acerca de
|
||||
confirmation=confirmación
|
||||
and=y
|
||||
error=error
|
||||
Australia=Australia
|
||||
Austria=Austria
|
||||
Bangladesh=Bangladesh
|
||||
Belarus=Bielorrusia
|
||||
Belgium=Bélgica
|
||||
Brazil=Brasil
|
||||
Bulgaria=Bulgaria
|
||||
Canada=Canadá
|
||||
Chile=Chile
|
||||
China=China
|
||||
Costa Rica=Costa Rica
|
||||
Czech=República Checa
|
||||
Denmark=Dinamarca
|
||||
Ecuador=Ecuador
|
||||
France=Francia
|
||||
Georgia=Georgia
|
||||
Germany=Alemania
|
||||
Greece=Grecia
|
||||
Hong Kong=Hong Kong
|
||||
Hungary=Hungría
|
||||
Iceland=Islandia
|
||||
India=India
|
||||
Indonesia=Indonesia
|
||||
Iran=Irán
|
||||
Italy=Italy
|
||||
Japan=Japón
|
||||
Kenya=Kenya
|
||||
Netherlands=Países Bajos
|
||||
New Zealand=Nueva Zelanda
|
||||
Norway=Noruega
|
||||
Philippines=Filipinas
|
||||
Poland=Polonia
|
||||
Portugal=Portugal
|
||||
Russia=Rusia
|
||||
Singapore=Singapur
|
||||
South Africa=Sudáfrica
|
||||
South Korea=Corea del Sur
|
||||
Spain=España
|
||||
Sweden=Suecia
|
||||
Switzerland=Suiza
|
||||
Taiwan=Taiwán
|
||||
Thailand=Tailandia
|
||||
Turkey=Turquía
|
||||
Ukraine=Ucrania
|
||||
United Kingdom=Reino Unido
|
||||
United States=Estados Unidos
|
||||
action.backup.error.create=No fue posible generar una nueva copia de seguridad
|
||||
action.backup.error.delete=No fue posible eliminar las copias de seguridad antiguas del sistema
|
||||
action.backup.error.proceed=¿Continuar de todos modos?
|
||||
action.backup.invalid_mode=Modo de copia de seguridad inválido
|
||||
action.backup.msg=¿Desea generar una copia de seguridad del sistema antes de continuar?
|
||||
action.backup.substatus.create=Generando una nueva copia de seguridad
|
||||
action.backup.substatus.delete=Eliminando copias de seguridad antiguas
|
||||
action.cancelled=operación cancelada por el usuario
|
||||
copy=copiar
|
||||
back=volver
|
||||
show=mostrar
|
||||
ask.continue=¿Quiere continuar?
|
||||
cancel=cancelar
|
||||
status.caching_data=Almacenando en antememoria los datos de {} para el disco
|
||||
action.disk_trim=Optimizando el disco ( TRIM )
|
||||
action.disk_trim.error=Hubo un problema al optimizar el disco
|
||||
action.failed=Acción fallida
|
||||
action.history.no_history.body=There is no available history for {}
|
||||
action.history.no_history.title=No history
|
||||
action.info.tooltip=Pulse aquí para ver información sobre esta aplicación
|
||||
action.not_allowed=Acción no permitida
|
||||
action.request_reboot.title=Reinicio de sistema
|
||||
action.run.tooltip=Pulse aquí para iniciar la aplicación
|
||||
any=cualquiera
|
||||
manage_window.name_filter.tooltip=Escriba aquí para filtrar aplicaciones por nombre
|
||||
manage_window.name_filter.placeholder=Filtrar por nombre
|
||||
publisher=publicador
|
||||
unknown=desconocido
|
||||
welcome=bienvenido
|
||||
gem_selector.title=Tipos de aplicaciones
|
||||
gem_selector.question=¿Qué tipos de aplicaciones quiere encontrar aquí?
|
||||
proceed=continuar
|
||||
change=cambiar
|
||||
exit=salir
|
||||
style=estilo
|
||||
manage_window.bt_settings.tooltip=Pulse aquí para exhibir las configuraciones
|
||||
downloading=Descargando
|
||||
console.install_logs.path=Los registros de instalación pueden encontrarse en {}
|
||||
author=autor
|
||||
source=origen
|
||||
size=tamaño
|
||||
category=categoría
|
||||
categories=categorías
|
||||
summary=resumen
|
||||
manage_window.status.screenshots=Obteniendo imágenes de {}
|
||||
action.screenshots.tooltip=Pulse aquí para ver algunas fotos de esta aplicación
|
||||
popup.screenshots.no_screenshot.body=No fue posible recuperar las fotos de {}
|
||||
games=juegos
|
||||
game=juego
|
||||
videoeditor=editor de vídeos
|
||||
browser=navegador
|
||||
music=música
|
||||
development=desarrollo
|
||||
network=red
|
||||
networks=redes
|
||||
graphics=gráficos
|
||||
system=sistema
|
||||
utility=utilidad
|
||||
terminalemulator=terminal
|
||||
database=base de datos
|
||||
databases=bases de datos
|
||||
movies=películas
|
||||
movie=película
|
||||
library=biblioteca
|
||||
books=libros
|
||||
applications=aplicaciones
|
||||
social=social
|
||||
productivity=productividad
|
||||
utilities=utilidades
|
||||
photo=foto
|
||||
video=vídeo
|
||||
entertainment=entretenimiento
|
||||
art=arte
|
||||
design=diseño
|
||||
reference=referencia
|
||||
personalisation=personalización
|
||||
education=educación
|
||||
health=salud
|
||||
fitness=condición física
|
||||
science=ciencias
|
||||
news=noticias
|
||||
weather=tiempo
|
||||
finance=finanzas
|
||||
desktopsettings=configuraciones
|
||||
texteditor=editor de texto
|
||||
server=servidor
|
||||
cloud=nube
|
||||
instantmessaging=mensajería
|
||||
messaging=mensajería
|
||||
2dgraphics=gráficos 2d
|
||||
vectorgraphics=gráficos vectoriales
|
||||
office=oficina
|
||||
devices=dispositivos
|
||||
security=seguridad
|
||||
audiovideo=audio y vídeo
|
||||
audio=audio
|
||||
amusement=diversión
|
||||
webdevelopment=desarrollo web
|
||||
filetransfer=transferencia de archivos
|
||||
packagemanager=administrador de paquetes
|
||||
sportsgame=juego de deportes
|
||||
arcadegame=juego de máquina
|
||||
player=jugador
|
||||
fonts=tipos de letra
|
||||
screenshots.bt_next.label=siguiente
|
||||
screenshots.bt_back.label=anterior
|
||||
screenshots,download.running=descargando imagen
|
||||
screenshots.download.no_content=No hay contenido para mostrar
|
||||
screenshots.download.no_response=No se encontró la imagen
|
||||
continue=continuar
|
||||
stable=estable
|
||||
close=cerrar
|
||||
publisher.verified=verificado
|
||||
mirror=espejo
|
||||
emulator=emulador
|
||||
do_not.install=no instalar
|
||||
repository=repositorio
|
||||
details=detalles
|
||||
communication=comunicación
|
||||
administration=administración
|
||||
settings=configuraciones
|
||||
action.settings.tooltip=Pulse aquí para abrir acciones adicionales
|
||||
action.update.cannot_update_label=No se puede actualizar
|
||||
action.update.install_req.fail.body=No fue posible instalar {}
|
||||
action.update.install_req.fail.title=Falló la instalación
|
||||
action.update.label_to_remove=Necesitan ser desinstalados
|
||||
action.update.label_to_upgrade=Serán actualizados
|
||||
action.update.pkg.required_size=Requiere
|
||||
action.update.required_label=Deben instalarse
|
||||
action.update.required_size=Espacio en disco requerido (download)
|
||||
action.update.requirements.body=Las siguientes {} dependencias deben ser instaladas antes de actualizar
|
||||
action.update.requirements.status=Verificando los requisitos
|
||||
action.update.requirements.title=Requisitos de actualización
|
||||
action.update.status.checking_sizes=Calculando el tamaño de las actualizaciónes
|
||||
action.update.success.reboot.line1=¡Sistema actualizado con éxito!
|
||||
action.update.success.reboot.line2=Algunos cambios pueden requerir un reinicio del sistema para que surta efecto.
|
||||
action.update.success.reboot.line3=¿Reiniciar ahora?
|
||||
action.update.summary=Resumen de actualización
|
||||
action.update.total_size=Tamaño de la actualización
|
||||
action.trim_disk.ask=¿Optimizar el disco (trim)?
|
||||
address=dirección
|
||||
view.components.file_chooser.placeholder=Pulse aquí para seleccionar
|
||||
files=archivos
|
||||
all_files=todos los archivos
|
||||
file_chooser.title=Selector de archivos
|
||||
message.file.not_exist=Archivo no existe
|
||||
message.file.not_exist.body=El archivo {} parece no existir
|
||||
icon_button.tooltip.disabled=This action is unavailable
|
||||
user=usuario
|
||||
example.short=p.ej
|
||||
core.config.tab.advanced=Avanzadas
|
||||
core.config.tab.general=Generales
|
||||
core.config.tab.ui=Interfaz
|
||||
core.config.tab.tray=Bandeja
|
||||
core.config.tab.types=Tipos
|
||||
core.config.locale.label=idioma
|
||||
core.config.disk_cache=Cache de disco
|
||||
core.config.disk_cache.tip=Algunos datos sobre las aplicaciones instaladas serán almacenados en el disco para que puedan cargarse rápidamente en las siguientes inicializaciones
|
||||
core.config.updates.interval=Intervalo de actualizaciones
|
||||
core.config.updates.interval.tip=Define el intervalo de tiempo en el que se realizará la verificación de actualizaciones para las aplicaciones instaladas ( en SEGUNDOS )
|
||||
core.config.downloads=downloads
|
||||
amount=cantidad
|
||||
and=y
|
||||
any=cualquiera
|
||||
app.name=nombre de la aplicación
|
||||
applications=applications
|
||||
ask=preguntar
|
||||
ask.continue=¿Quiere continuar?
|
||||
author=autor
|
||||
back=volver
|
||||
bt.app_not_upgrade=No actualizar
|
||||
bt.app_upgrade=Actualizar
|
||||
bt.not_now=Ahora no
|
||||
cancel=cancelar
|
||||
categories=categorías
|
||||
category=categoría
|
||||
category.2dgraphics=gráficos 2d
|
||||
category.administration=administración
|
||||
category.amusement=diversión
|
||||
category.applications=aplicaciones
|
||||
category.arcadegame=juego de máquina
|
||||
category.art=arte
|
||||
category.audio=audio
|
||||
category.audiovideo=audio y vídeo
|
||||
category.books=libros
|
||||
category.browser=navegador
|
||||
category.cloud=nube
|
||||
category.communication=comunicación
|
||||
category.database=base de datos
|
||||
category.databases=bases de datos
|
||||
category.design=diseño
|
||||
category.desktopsettings=configuraciones
|
||||
category.development=desarrollo
|
||||
category.education=educación
|
||||
category.emulator=emulador
|
||||
category.entertainment=entretenimiento
|
||||
category.filetransfer=transferencia de archivos
|
||||
category.finance=finanzas
|
||||
category.fitness=condición física
|
||||
category.fonts=tipos de letra
|
||||
category.game=juego
|
||||
category.games=juegos
|
||||
category.graphics=gráficos
|
||||
category.health=salud
|
||||
category.instantmessaging=mensajería
|
||||
category.library=biblioteca
|
||||
category.media=media
|
||||
category.messaging=mensajería
|
||||
category.movie=película
|
||||
category.movies=películas
|
||||
category.music=música
|
||||
category.network=red
|
||||
category.networks=redes
|
||||
category.news=noticias
|
||||
category.none=ninguna
|
||||
category.office=oficina
|
||||
category.packagemanager=administrador de paquetes
|
||||
category.personalisation=personalización
|
||||
category.photo=foto
|
||||
category.player=jugador
|
||||
category.productivity=productividad
|
||||
category.reference=referencia
|
||||
category.science=ciencias
|
||||
category.security=seguridad
|
||||
category.server=servidor
|
||||
category.settings=configuraciones
|
||||
category.social=social
|
||||
category.sportsgame=juego de deportes
|
||||
category.system=sistema
|
||||
category.terminalemulator=terminal
|
||||
category.text editor=text editor
|
||||
category.texteditor=editor de texto
|
||||
category.utilities=utilidades
|
||||
category.utility=utilidad
|
||||
category.vectorgraphics=gráficos vectoriales
|
||||
category.video=vídeo
|
||||
category.videoeditor=editor de vídeos
|
||||
category.viewer=viewer
|
||||
category.weather=tiempo
|
||||
category.web=web
|
||||
category.webdevelopment=desarrollo web
|
||||
change=cambiar
|
||||
clean=limpiar
|
||||
close=cerrar
|
||||
confirmation=confirmación
|
||||
console.install_logs.path=Los registros de instalación pueden encontrarse en {}
|
||||
continue=continuar
|
||||
copy=copiar
|
||||
core.config.backup=Habilitada
|
||||
core.config.backup.downgrade=Antes de revertir versión
|
||||
core.config.backup.install=Antes de instalar
|
||||
core.config.backup.mode=Modo
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.incremental.tip=Se generará una nueva copia de seguridad del sistema que contenga solo los archivos modificados desde la última copia.
|
||||
core.config.backup.mode.only_one=Única
|
||||
core.config.backup.mode.only_one.tip=Solo se guardará una copia de seguridad del sistema. Las copias preexistentes serán borradas.
|
||||
core.config.backup.uninstall=Antes de desinstalar
|
||||
core.config.backup.upgrade=Antes de actualizar
|
||||
core.config.download.icons=Descargar iconos
|
||||
core.config.download.icons.tip=Si los íconos de las aplicaciones se deben descargar y mostrar en la tabla
|
||||
core.config.download.multithreaded=Descarga segmentada
|
||||
core.config.download.multithreaded.tip=Si las aplicaciones, paquetes y archivos deben descargarse con una herramienta que usa segmentación / threads ( más rápido ). Por el momento, esta configuración solo funcionará si el paquete aria2 esté instalado
|
||||
core.config.downloads=downloads
|
||||
core.config.locale.label=idioma
|
||||
core.config.mem_cache=Almacenamiento de memoria
|
||||
core.config.mem_cache.data_exp=Expiración de datos
|
||||
core.config.mem_cache.data_exp.tip=Define la vida útil de los datos en memoria ( en SEGUNDOS )
|
||||
core.config.mem_cache.icon_exp=Expiración de íconos
|
||||
core.config.mem_cache.icon_exp.tip=Define la vida útil de los íconos en memoria ( en SEGUNDOS )
|
||||
core.config.store_password=Solicitud de contraseña única
|
||||
core.config.store_password.tip=Solicita la contraseña de usuario root solo una vez
|
||||
core.config.suggestions.activated=Suggestions
|
||||
core.config.suggestions.activated.tip=Si se pueden sugerir nuevas aplicaciones para instalación
|
||||
core.config.suggestions.by_type=Sugerencias por tipo
|
||||
core.config.suggestions.by_type.tip=Número máximo de sugerencias que deberían mostrarse por tipo de aplicación
|
||||
core.config.system.dep_checking=Verificación única de sistema
|
||||
core.config.system.dep_checking.tip=Si la verificación de disponibilidad de las tecnologías de su sistema debe ocurrir solo una vez
|
||||
core.config.system.notifications=Notificaciones
|
||||
core.config.system.notifications.tip=Si notificaciones deben mostrarse cuando finaliza una acción o hay actualizaciones
|
||||
core.config.tab.advanced=Avanzadas
|
||||
core.config.tab.backup=Copia de Seguridad
|
||||
core.config.tab.general=Generales
|
||||
core.config.tab.tray=Bandeja
|
||||
core.config.tab.types=Tipos
|
||||
core.config.tab.ui=Interfaz
|
||||
core.config.trim_after_update=Optimizar disco después de actualizar
|
||||
core.config.trim_after_update.tip=Optimiza el disco después de una actualización exitosa usando "trim". No habilite esta opción si su disco no es un SSD que permita trim.
|
||||
core.config.types.tip=Marque los tipos de aplicaciones que desea administrar
|
||||
core.config.ui.auto_scale=Escala automática
|
||||
core.config.ui.auto_scale.tip=Activa el factor de escala de pantalla automática ( {} ). Soluciona problemas de escala para algunos ambientes desktop.
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.hdpi.tip=Si se deben activar las mejoras relacionadas con las resoluciones HDPI
|
||||
core.config.ui.max_displayed=Aplicaciones mostradas
|
||||
@@ -249,36 +220,159 @@ core.config.ui.tray.default_icon=Ícono predeterminado
|
||||
core.config.ui.tray.default_icon.tip=El icono predeterminado que se muestra en la bandeja
|
||||
core.config.ui.tray.updates_icon=Icono de actualización
|
||||
core.config.ui.tray.updates_icon.tip=El icono que se muestra cuando hay actualizaciones disponibles
|
||||
core.config.system.dep_checking=Verificación única de sistema
|
||||
core.config.system.dep_checking.tip=Si la verificación de disponibilidad de las tecnologías de su sistema debe ocurrir solo una vez
|
||||
core.config.suggestions.by_type=Sugerencias por tipo
|
||||
core.config.suggestions.by_type.tip=Número máximo de sugerencias que deberían mostrarse por tipo de aplicación
|
||||
core.config.types.tip=Marque los tipos de aplicaciones que desea administrar
|
||||
core.config.ui.auto_scale=Escala automática
|
||||
core.config.ui.auto_scale.tip=Activa el factor de escala de pantalla automática ( {} ). Soluciona problemas de escala para algunos ambientes desktop.
|
||||
core.config.updates.sort_pkgs=Ordenar actualizaciones
|
||||
core.config.updates.sort_pkgs.tip=Define el mejor orden de actualización para las aplicaciones / paquetes seleccionados para evitar problemas
|
||||
core.config.updates.dep_check=Mostrar requisitos de actualización
|
||||
core.config.updates.dep_check.tip=Muestra todos las dependencias que deben instalarse antes de comenzar a actualizar los seleccionados
|
||||
settings.changed.success.warning=Las configuraciones se cambiaron con éxito. Algunas solo tendrán efecto después del reinicio.
|
||||
settings.changed.success.reboot=¿Reiniciar ahora?
|
||||
settings.error=No fue posible cambiar correctamente todas las configuraciones
|
||||
locale.es=inglés
|
||||
locale.es=español
|
||||
locale.pt=portugués
|
||||
core.config.updates.interval=Intervalo de actualizaciones
|
||||
core.config.updates.interval.tip=Define el intervalo de tiempo en el que se realizará la verificación de actualizaciones para las aplicaciones instaladas ( en SEGUNDOS )
|
||||
custom_action.proceed_with=¿Continuar con {}?
|
||||
description=descripción
|
||||
details=detalles
|
||||
devices=dispositivos
|
||||
do_not.install=no instalar
|
||||
downgraded=versión revertida
|
||||
download=descarga
|
||||
downloading=Descargando
|
||||
error=error
|
||||
example.short=p.ej
|
||||
exit=salir
|
||||
file=archivo
|
||||
file_chooser.title=Selector de archivos
|
||||
files=archivos
|
||||
finishing=finalizando
|
||||
gem_selector.question=¿Qué tipos de aplicaciones quiere encontrar aquí?
|
||||
gem_selector.title=Tipos de aplicaciones
|
||||
general=general
|
||||
icon_button.tooltip.disabled=This action is unavailable
|
||||
imported=importado
|
||||
initialization=inicialización
|
||||
install=instalar
|
||||
installation=instalación
|
||||
installed=instalada
|
||||
internet.required=Se requiere conexión a internet
|
||||
interval=intervalo
|
||||
latest_version=versión más reciente
|
||||
license=licencia
|
||||
locale.ca=catalán
|
||||
locale.de=alemán
|
||||
locale.en=inglés
|
||||
locale.es=español
|
||||
locale.it=italiano
|
||||
locale.pt=portugués
|
||||
locale.ru=ruso
|
||||
interval=intervalo
|
||||
installation=instalación
|
||||
download=descarga
|
||||
clean=limpiar
|
||||
action.update.status.sorting=Determinando el mejor orden de actualización
|
||||
action.update.requirements.title=Requisitos de actualización
|
||||
action.update.requirements.body=Las siguientes {} dependencias deben ser instaladas antes de actualizar
|
||||
action.update.install_req.fail.title=Falló la instalación
|
||||
action.update.install_req.fail.body=No fue posible instalar {}
|
||||
action.update.requirements.status=Verificando los requisitos
|
||||
action.update.order.title=Orden de actualización
|
||||
action.update.order.body=La actualización se realizará en el siguiente orden
|
||||
manage_window.apps_table.row.actions.downgrade=Revertir versión
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=¿Realmente quiere revertir la versión actual de {}?
|
||||
manage_window.apps_table.row.actions.history=Histórico
|
||||
manage_window.apps_table.row.actions.info=Información
|
||||
manage_window.apps_table.row.actions.install=Instalar
|
||||
manage_window.apps_table.row.actions.install.popup.body=¿Quiere instalar {} en el equipo?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Instalación
|
||||
manage_window.apps_table.row.actions.refresh=Actualizar
|
||||
manage_window.apps_table.row.actions.uninstall=Desinstalar
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=¿Quiere desinstalar {} del equipo?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Desinstalación
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=Pero no es posible actualizarla.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Pulse aquí para marcar o desmarcar la actualización.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Hay una actualización para esta aplicación.
|
||||
manage_window.bt.installed.text=instaladas
|
||||
manage_window.bt.installed.tooltip=Pulse aquí para mostrar las aplicaciones instaladas
|
||||
manage_window.bt.refresh.text=Recargar
|
||||
manage_window.bt.refresh.tooltip=Recarga los datos sobre las aplicaciones instaladas
|
||||
manage_window.bt.suggestions.text=Sugerencias
|
||||
manage_window.bt.suggestions.tooltip=Pulse aquí para mostrar algunas sugerencias de aplicaciones
|
||||
manage_window.bt.upgrade.text=Actualizar
|
||||
manage_window.bt.upgrade.tooltip=Actualiza todas las aplicaciones marcadas
|
||||
manage_window.bt_custom_actions.tip=Pulse aquí para mostrar más acciones
|
||||
manage_window.bt_settings.tooltip=Pulse aquí para exhibir las configuraciones
|
||||
manage_window.checkbox.only_apps=Aplicaciones
|
||||
manage_window.checkbox.show_details=Mostrar detalles
|
||||
manage_window.columns.installed=Instaladas
|
||||
manage_window.columns.latest_version=Versión más reciente
|
||||
manage_window.columns.update=¿Quiere actualizar?
|
||||
manage_window.label.updates=Actualizaciones
|
||||
manage_window.name_filter.placeholder=Filtrar por nombre
|
||||
manage_window.name_filter.tooltip=Escriba aquí para filtrar aplicaciones por nombre
|
||||
manage_window.settings.about=Acerca de
|
||||
manage_window.status.downgrading=Revirtiendo
|
||||
manage_window.status.filtering=Filtrando
|
||||
manage_window.status.history=Obteniendo el histórico
|
||||
manage_window.status.info=Obteniendo información
|
||||
manage_window.status.installed=Cargando instalados
|
||||
manage_window.status.installing=Instalando
|
||||
manage_window.status.refreshing=Recargando
|
||||
manage_window.status.refreshing_app=Actualizando
|
||||
manage_window.status.running_app=Ejecutando {}
|
||||
manage_window.status.screenshots=Obteniendo imágenes de {}
|
||||
manage_window.status.searching=Buscando
|
||||
manage_window.status.suggestions=Buscando sugerencias
|
||||
manage_window.status.uninstalling=Desinstalando
|
||||
manage_window.status.upgrading=Actualizando
|
||||
manage_window.title=Mis aplicaciones
|
||||
manage_window.upgrade_all.popup.body=¿Quiere actualizar todas las aplicaciones seleccionadas?
|
||||
manage_window.upgrade_all.popup.title=Actualizar
|
||||
message.file.not_exist=Archivo no existe
|
||||
message.file.not_exist.body=El archivo {} parece no existir
|
||||
mirror=espejo
|
||||
name=nombre
|
||||
no=no
|
||||
not_installed=no instalada
|
||||
notification.downgrade.failed=Error al revertir la versión
|
||||
notification.install.failed=la instalación ha fallado
|
||||
notification.uninstall.failed=la desinstalación ha fallado
|
||||
notification.update_selected.failed=La actualización ha fallado
|
||||
notification.update_selected.success=aplicación(es) actualizada(s) correctamente
|
||||
ok=ok
|
||||
others=otros
|
||||
popup.button.cancel=Cancelar
|
||||
popup.button.no=No
|
||||
popup.button.yes=Sí
|
||||
popup.history.selected.tooltip=Versión actual
|
||||
popup.history.title=Histórico
|
||||
popup.root.bad_password.body=Contraseña incorrecta
|
||||
popup.root.bad_password.last_try=Intentos finalizados. Acción cancelada.
|
||||
popup.root.bad_password.title=Error
|
||||
popup.root.continue=continuar
|
||||
popup.root.title=Proporcione su contraseña para continuar
|
||||
popup.screenshots.no_screenshot.body=No fue posible recuperar las fotos de {}
|
||||
prepare_panel.bt_skip.label=omitir
|
||||
prepare_panel.title.finish=Listo
|
||||
prepare_panel.title.start=Inicializando
|
||||
proceed=continuar
|
||||
publisher=publicador
|
||||
publisher.verified=verificado
|
||||
repository=repositorio
|
||||
screenshots.bt_back.label=anterior
|
||||
screenshots.bt_next.label=siguiente
|
||||
screenshots.download.no_content=No hay contenido para mostrar
|
||||
screenshots.download.no_response=No se encontró la imagen
|
||||
screenshots.download.running=descargando imagen
|
||||
settings=configuraciones
|
||||
settings.changed.success.reboot=¿Reiniciar ahora?
|
||||
settings.changed.success.warning=Las configuraciones se cambiaron con éxito. Algunas solo tendrán efecto después del reinicio.
|
||||
settings.error=No fue posible cambiar correctamente todas las configuraciones
|
||||
show=mostrar
|
||||
size=tamaño
|
||||
source=origen
|
||||
stable=estable
|
||||
status.caching_data=Almacenando en antememoria los datos de {} para el disco
|
||||
style=estilo
|
||||
success=éxito
|
||||
summary=resumen
|
||||
task.download_categories=Descargando categorías [ {} ]
|
||||
type=tipo
|
||||
uninstall=desinstalar
|
||||
uninstalled=desinstalada
|
||||
unknown=desconocido
|
||||
updates=actualizaciones
|
||||
user=usuario
|
||||
version=versión
|
||||
version.installed=versión instalada
|
||||
version.installed_outdated=la versión instalada está desactualizada
|
||||
version.latest=versión más reciente
|
||||
version.outdated=desactualizada
|
||||
version.unknown=versión no informada
|
||||
version.updated=actualizada
|
||||
view.components.file_chooser.placeholder=Pulse aquí para seleccionar
|
||||
warning=aviso
|
||||
warning.update_available=Hay una nueva actualización de {} disponible ({}). Vea las novedades en {}.
|
||||
welcome=bienvenido
|
||||
window_manage.input_search.placeholder=Buscar
|
||||
window_manage.input_search.tooltip=Escriba y oprima Intro para buscar aplicaciones
|
||||
yes=sí
|
||||
@@ -1,236 +1,380 @@
|
||||
manage_window.title=Le mie applicazioni
|
||||
manage_window.columns.latest_version=Ultima Versione
|
||||
manage_window.columns.update=Upgrade ?
|
||||
manage_window.apps_table.row.actions.info=Informazioni
|
||||
manage_window.apps_table.row.actions.history=Cronologia
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Disinstalla
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Remuovi {} dal tuo dispositivo ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Installazione
|
||||
manage_window.apps_table.row.actions.install.popup.body=Installa {} nel tuo dispositivo ?
|
||||
manage_window.apps_table.row.actions.downgrade=Downgrade
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Vuoi veramente fare il downgrade {} ?
|
||||
manage_window.apps_table.row.actions.install=Installa
|
||||
manage_window.apps_table.row.actions.refresh=Ricarica
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=C'è un aggiornamento per questa applicazione. Fai clic qui per selezionare o deselezionare l'aggiornamento
|
||||
manage_window.checkbox.only_apps=Apps
|
||||
window_manage.input_search.placeholder=Cerca
|
||||
window_manage.input_search.tooltip=Digitare e premere INVIO per cercare applicazioni
|
||||
manage_window.label.updates=Aggiornamenti
|
||||
manage_window.status.refreshing=Riaggiornamento
|
||||
manage_window.status.upgrading=Aggiornamento
|
||||
manage_window.status.uninstalling=Disinstallare
|
||||
manage_window.status.downgrading=Downgrading
|
||||
manage_window.status.info=Recupero di informazioni
|
||||
manage_window.status.history=Recupero della cronologia
|
||||
manage_window.status.searching=Ricerca
|
||||
manage_window.status.installing=Installazione
|
||||
manage_window.status.refreshing_app=Refreshing
|
||||
manage_window.status.running_app=Avvio {}
|
||||
manage_window.status.filtering=Filtraggio
|
||||
manage_window.status.screenshots=Recupero {} schermate
|
||||
manage_window.status.suggestions=Cercando suggerimenti
|
||||
manage_window.bt.refresh.text=Refresh
|
||||
manage_window.bt.refresh.tooltip=Ricarica i dati sulle applicazioni installate
|
||||
manage_window.bt.upgrade.text=Aggiorna
|
||||
manage_window.bt.upgrade.tooltip=Aggiorna tutte le applicazioni controllate
|
||||
manage_window.bt.installed.text=installato
|
||||
manage_window.bt.installed.tooltip=Clicca qui per mostrare le applicazioni installate
|
||||
manage_window.bt.suggestions.text=Suggerimenti
|
||||
manage_window.bt.suggestions.tooltip=Clicca qui per mostrare alcuni suggerimenti sulle applicazioni
|
||||
manage_window.checkbox.show_details=Mostra dettagli
|
||||
popup.root.title=Richiede la tua password per continuare
|
||||
popup.root.continue=continuare
|
||||
popup.root.bad_password.title=Errore
|
||||
popup.root.bad_password.body=Password errata
|
||||
popup.root.bad_password.last_try=Tentativi conclusi. Azione annullata.
|
||||
popup.history.title=Cronlogia
|
||||
popup.history.selected.tooltip=Version corrente
|
||||
popup.button.yes=Si
|
||||
popup.button.no=No
|
||||
popup.button.cancel=Cancella
|
||||
tray.action.manage=Applicazioni
|
||||
tray.action.exit=Abbandona
|
||||
tray.action.about=Informazioni su
|
||||
tray.action.refreshing=Refreshing
|
||||
Australia=Australia
|
||||
Austria=Austria
|
||||
Bangladesh=Bangladesh
|
||||
Belarus=Belarus
|
||||
Belgium=Belgium
|
||||
Brazil=Brazil
|
||||
Bulgaria=Bulgaria
|
||||
Canada=Canada
|
||||
Chile=Chile
|
||||
China=China
|
||||
Costa Rica=Costa Rica
|
||||
Czech=Czech
|
||||
Denmark=Denmark
|
||||
Ecuador=Ecuador
|
||||
France=France
|
||||
Georgia=Georgia
|
||||
Germany=Germany
|
||||
Greece=Greece
|
||||
Hong Kong=Hong Kong
|
||||
Hungary=Hungary
|
||||
Iceland=Iceland
|
||||
India=India
|
||||
Indonesia=Indonesia
|
||||
Iran=Iran
|
||||
Italy=Italy
|
||||
Japan=Japan
|
||||
Kenya=Kenya
|
||||
Netherlands=Netherlands
|
||||
New Zealand=New Zealand
|
||||
Norway=Norway
|
||||
Philippines=Philippines
|
||||
Poland=Poland
|
||||
Portugal=Portugal
|
||||
Russia=Russia
|
||||
Singapore=Singapore
|
||||
South Africa=South Africa
|
||||
South Korea=South Korea
|
||||
Spain=Spain
|
||||
Sweden=Sweden
|
||||
Switzerland=Switzerland
|
||||
Taiwan=Taiwan
|
||||
Thailand=Thailand
|
||||
Turkey=Turkey
|
||||
Ukraine=Ukraine
|
||||
United Kingdom=United Kingdom
|
||||
United States=United States
|
||||
action.backup.error.create=It was not possible to generate a new system copy
|
||||
action.backup.error.delete=It was not possible to delete the old system copies
|
||||
action.backup.error.proceed=Proceed anyway ?
|
||||
action.backup.invalid_mode=Invalid backup mode
|
||||
action.backup.msg=Do you want to generate a system copy before proceeding ?
|
||||
action.backup.substatus.create=Generating a new system backup
|
||||
action.backup.substatus.delete=Removing old system backups
|
||||
action.cancelled=operazione annullata dall'utente
|
||||
action.disk_trim=Optimizing disc ( TRIM )
|
||||
action.disk_trim.error=There was a problem while optimizing the disk
|
||||
action.failed=Azione non riuscita
|
||||
action.history.no_history.body=There is no available history for {}
|
||||
action.history.no_history.title=No history
|
||||
action.info.tooltip=Clicca qui per vedere informazioni su questa applicazione
|
||||
action.not_allowed=Action not allowed
|
||||
action.request_reboot.title=System restart
|
||||
action.run.tooltip=Fai clic qui per avviare questa applicazione
|
||||
action.screenshots.tooltip=Clicca qui per vedere alcune immagini di questa applicazione
|
||||
action.settings.tooltip=Fai clic qui per aprire ulteriori azioni
|
||||
notification.update={} aggiornamento disponibile
|
||||
notification.updates={} aggiornamenti disponibile
|
||||
notification.update_selected.success=app aggiornate correttamente
|
||||
notification.update_selected.failed=Aggiornamento non riuscito
|
||||
notification.install.failed=installazione fallita
|
||||
notification.uninstall.failed=disinstallazione non riuscita
|
||||
notification.downgrade.failed=Impossibile eseguire il downgrade
|
||||
about.info.desc=Interfaccia grafica per la gestione delle tue applicazioni Linux
|
||||
about.info.link=Maggiori informazioni su
|
||||
about.info.license=Free license
|
||||
about.info.rate.question=Ti piace questo strumento?
|
||||
about.info.rate.answer=Dagli una stella su GitHub per rafforzare il progetto
|
||||
about.info.trouble.question=Problemas?
|
||||
about.info.trouble.answer=Apri un issue in GitHub in modo che gli sviluppatori possano aiutarti
|
||||
yes=si
|
||||
no=no
|
||||
version.updated=aggiornata
|
||||
version.outdated=obsoleta
|
||||
name=nome
|
||||
version=versione
|
||||
latest_version=ultima versione
|
||||
description=descrizione
|
||||
type=tipe
|
||||
installed=installato
|
||||
uninstalled=disinstallato
|
||||
not_installed=non installato
|
||||
downgraded=downgraded
|
||||
others=altre
|
||||
internet.required=È richiesta una connessione a Internet
|
||||
updates=aggiornamenti
|
||||
version.installed=versione installata
|
||||
version.latest=ultima versione
|
||||
version.installed_outdated=la versione installata è obsoleta
|
||||
version.unknown=non informato
|
||||
app.name=Name applicazione
|
||||
warning=Avviso
|
||||
install=installa
|
||||
uninstall=Disinstalla
|
||||
bt.app_upgrade=Upgrade
|
||||
bt.app_not_upgrade=Non aggiornare
|
||||
manage_window.upgrade_all.popup.title=Aggiorna
|
||||
manage_window.upgrade_all.popup.body=Aggiornare tutte le applicazioni selezionate ?
|
||||
manage_window.settings.about=Informazione su
|
||||
confirmation=conferma
|
||||
and=e
|
||||
error=errore
|
||||
action.cancelled=operazione annullata dall'utente
|
||||
copy=copia
|
||||
back=indietro
|
||||
show=mostra
|
||||
ask.continue=Continuare ?
|
||||
cancel=cancella
|
||||
status.caching_data=Memorizza {} dati sul disco
|
||||
action.run.tooltip=Fai clic qui per avviare questa applicazione
|
||||
any=qualunque
|
||||
manage_window.name_filter.tooltip=Digita qui per filtrare le app per nome
|
||||
manage_window.name_filter.placeholder=Filtra per nome
|
||||
publisher=editore
|
||||
unknown=sconosciuto
|
||||
welcome=benvenuto
|
||||
gem_selector.title=Tipi di applicazione
|
||||
gem_selector.question=Quali tipi di applicazioni vuoi trovare qui ?
|
||||
proceed=procedere
|
||||
change=Cambia
|
||||
exit=esci
|
||||
style=stile
|
||||
manage_window.bt_settings.tooltip=Fai clic qui per visualizzare le impostazioni
|
||||
downloading=Scaricamento
|
||||
console.install_logs.path=I registri di installazione sono disponibili all'indirizzo {}
|
||||
author=autore
|
||||
source=sorgente
|
||||
size=dimensione
|
||||
category=categoria
|
||||
categories=categorie
|
||||
summary=riepilogo
|
||||
popup.screenshots.no_screenshot.body=non è stato possibile recuperare {} schermate
|
||||
terminalemulator=terminale
|
||||
desktopsettings=impostazioni del desktop
|
||||
texteditor=editor di testo
|
||||
screenshots.bt_next.label=prossimo
|
||||
screenshots.bt_back.label=precedente
|
||||
instantmessaging=messaggistica
|
||||
messaging=messaggistica
|
||||
2dgraphics=Grafica 2D
|
||||
vectorgraphics=grafica vettoriale
|
||||
audiovideo=audio / video
|
||||
audio=audio
|
||||
webdevelopment=sviluppo web
|
||||
filetransfer=trasferimento di file
|
||||
packagemanager=gestore pacchetti
|
||||
sportsgame=gioco di sport
|
||||
arcadegame=Gioco arcade
|
||||
player=giocatore
|
||||
screenshots,download.running=scaricare l'immagine
|
||||
screenshots.download.no_content=Nessun contenuto da visualizzare
|
||||
screenshots.download.no_response=Immagine non trovata
|
||||
continue=continua
|
||||
stable=stabile
|
||||
close=vicino
|
||||
publisher.verified=verificato
|
||||
mirror=specchio
|
||||
emulator=emulatore
|
||||
do_not.install=non installare
|
||||
repository=deposito
|
||||
details=dettagli
|
||||
communication=comunicazione
|
||||
administration=amministrazione
|
||||
settings=impostazioni
|
||||
action.update.cannot_update_label=Cannot be upgraded
|
||||
action.update.install_req.fail.body=Non è stato possibile installare {}
|
||||
action.update.install_req.fail.title=Installazione non riuscita
|
||||
action.update.label_to_remove=Must be uninstalled
|
||||
action.update.label_to_upgrade=Will be upgraded
|
||||
action.update.pkg.required_size=Requires
|
||||
action.update.required_label=Must be installed
|
||||
action.update.required_size=Disk space required (download)
|
||||
action.update.requirements.body=Le seguenti {} dipendenze devono essere installati prima dell'aggiornamento
|
||||
action.update.requirements.status=Verificando i requisiti
|
||||
action.update.requirements.title=Requisiti di aggiornamento
|
||||
action.update.status.checking_sizes=Calculating upgrade size
|
||||
action.update.success.reboot.line1=Upgrades successfully applied !
|
||||
action.update.success.reboot.line2=Some changes may require a system restart to take effect.
|
||||
action.update.success.reboot.line3=Restart now ?
|
||||
action.update.summary=Upgrade summary
|
||||
action.update.total_size=Update size
|
||||
action.trim_disk.ask=Optimize disc (trim) ?
|
||||
address=indirizzo
|
||||
view.components.file_chooser.placeholder=Fai clic qui per selezionare
|
||||
files=files
|
||||
all_files=tutti i files
|
||||
file_chooser.title=Selettore file
|
||||
message.file.not_exist=File non esiste
|
||||
message.file.not_exist.body=Il file {} sembra non esistere
|
||||
development=sviluppo
|
||||
icon_button.tooltip.disabled=Questa azione non è disponibile
|
||||
user=utente
|
||||
example.short=e.g
|
||||
core.config.tab.advanced=Advanced
|
||||
core.config.tab_label=general
|
||||
core.config.tab.ui=Interface
|
||||
core.config.tab.types=Types
|
||||
core.config.locale.label=language
|
||||
core.config.disk_cache=Disk cache
|
||||
core.config.disk_cache.tip=Some data about the installed applications will be stored into the disk so they can be quickly loaded in the next initializations
|
||||
core.config.updates.interval=Updates interval
|
||||
core.config.updates.interval.tip=Defines the time interval in which the update-checking for the installed applications will happen ( in SECONDS )
|
||||
core.config.downloads=downloads
|
||||
amount=amount
|
||||
and=e
|
||||
any=qualunque
|
||||
app.name=Name applicazione
|
||||
applications=applications
|
||||
ask=ask
|
||||
ask.continue=Continuare ?
|
||||
author=autore
|
||||
back=indietro
|
||||
bt.app_not_upgrade=Non aggiornare
|
||||
bt.app_upgrade=Upgrade
|
||||
bt.not_now=Not now
|
||||
cancel=cancella
|
||||
categories=categorie
|
||||
category=categoria
|
||||
category.2dgraphics=Grafica 2D
|
||||
category.administration=amministrazione
|
||||
category.amusement=amusement
|
||||
category.arcadegame=Gioco arcade
|
||||
category.art=art
|
||||
category.audio=audio
|
||||
category.audiovideo=audio / video
|
||||
category.books=books
|
||||
category.browser=browser
|
||||
category.cloud=cloud
|
||||
category.communication=comunicazione
|
||||
category.database=database
|
||||
category.databases=databases
|
||||
category.design=design
|
||||
category.desktopsettings=impostazioni del desktop
|
||||
category.development=development
|
||||
category.education=education
|
||||
category.emulator=emulatore
|
||||
category.entertainment=entertainment
|
||||
category.filetransfer=trasferimento di file
|
||||
category.finance=finance
|
||||
category.fitness=fitness
|
||||
category.fonts=fonts
|
||||
category.game=game
|
||||
category.games=games
|
||||
category.graphics=graphics
|
||||
category.health=health
|
||||
category.instantmessaging=messaggistica
|
||||
category.library=library
|
||||
category.media=media
|
||||
category.messaging=messaggistica
|
||||
category.movie=movie
|
||||
category.movies=movies
|
||||
category.music=music
|
||||
category.network=network
|
||||
category.networks=networks
|
||||
category.news=news
|
||||
category.none=None
|
||||
category.office=office
|
||||
category.packagemanager=gestore pacchetti
|
||||
category.personalisation=personalization
|
||||
category.photo=photo
|
||||
category.player=giocatore
|
||||
category.productivity=productivity
|
||||
category.reference=reference
|
||||
category.science=science
|
||||
category.security=security
|
||||
category.server=server
|
||||
category.settings=impostazioni
|
||||
category.social=social
|
||||
category.sportsgame=gioco di sport
|
||||
category.system=system
|
||||
category.terminalemulator=terminale
|
||||
category.text editor=text editor
|
||||
category.texteditor=editor di testo
|
||||
category.utilities=utilities
|
||||
category.utility=utility
|
||||
category.vectorgraphics=grafica vettoriale
|
||||
category.video=video
|
||||
category.videoeditor=video editor
|
||||
category.viewer=viewer
|
||||
category.weather=weather
|
||||
category.web=web
|
||||
category.webdevelopment=sviluppo web
|
||||
change=Cambia
|
||||
clean=pulire
|
||||
close=vicino
|
||||
confirmation=conferma
|
||||
console.install_logs.path=I registri di installazione sono disponibili all'indirizzo {}
|
||||
continue=continua
|
||||
copy=copia
|
||||
core.config.backup=Enabled
|
||||
core.config.backup.downgrade=Before downgrading
|
||||
core.config.backup.install=Before installing
|
||||
core.config.backup.mode=Mode
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.incremental.tip=A new system backup will be generated containing only the changed files since the latest copy.
|
||||
core.config.backup.mode.only_one=Single
|
||||
core.config.backup.mode.only_one.tip=Only one system backup will be kept. Pre-existing backups will be erased.
|
||||
core.config.backup.uninstall=Before uninstalling
|
||||
core.config.backup.upgrade=Before upgrading
|
||||
core.config.download.icons=Download icons
|
||||
core.config.download.icons.tip=If the application icons should be downloaded and displayed on the table
|
||||
core.config.download.multithreaded=Multithreaded download
|
||||
core.config.download.multithreaded.tip=Whether applications, packages and files should be downloaded with a tool that works with threads ( faster ). At the moment this setting will only work if the aria2 package is installed
|
||||
core.config.downloads=downloads
|
||||
core.config.locale.label=language
|
||||
core.config.mem_cache=Memory storage
|
||||
core.config.mem_cache.data_exp=Data expiration
|
||||
core.config.mem_cache.data_exp.tip=Defines the in-memory data lifetime ( in SECONDS )
|
||||
core.config.mem_cache.icon_exp=Icons expiration
|
||||
core.config.mem_cache.icon_exp.tip=Defines the in-memory icons lifetime ( in SECONDS )
|
||||
core.config.store_password=Single password request
|
||||
core.config.store_password.tip=Requests the root user password only once
|
||||
core.config.suggestions.activated=Suggestions
|
||||
core.config.suggestions.activated.tip=If new applications can be suggested for installation
|
||||
core.config.suggestions.by_type=Suggestions by type
|
||||
core.config.suggestions.by_type.tip=Maximum number of suggestions that should be displayed by application type
|
||||
core.config.system.dep_checking=Single system checking
|
||||
core.config.system.dep_checking.tip=If the availability checking of your system technologies should happen only once
|
||||
core.config.system.notifications=Notifications
|
||||
core.config.system.notifications.tip=If notifications should be displayed when an action is finished or there are updates
|
||||
core.config.tab.advanced=Advanced
|
||||
core.config.tab.backup=Backup
|
||||
core.config.tab.general=General
|
||||
core.config.tab.tray=Tray
|
||||
core.config.tab.types=Types
|
||||
core.config.tab.ui=Interface
|
||||
core.config.tab_label=general
|
||||
core.config.trim_after_update=Optimize disc after upgrading
|
||||
core.config.trim_after_update.tip=It optimizes the disc after a successfull upgrade using "trim". Do not enable this option if your disk is not a SSD that allows trim.
|
||||
core.config.types.tip=Check the application types you want to manage
|
||||
core.config.ui.auto_scale=Auto scale
|
||||
core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ). It fixes scaling issues for some desktop environments.
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
|
||||
core.config.ui.max_displayed=Applications displayed
|
||||
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
|
||||
core.config.ui.tray.default_icon=Default icon
|
||||
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
|
||||
core.config.ui.tray.updates_icon=Update icon
|
||||
core.config.system.dep_checking=Single system checking
|
||||
core.config.system.dep_checking.tip=If the availability checking of your system technologies should happen only once
|
||||
core.config.suggestions.by_type=Suggestions by type
|
||||
core.config.suggestions.by_type.tip=Maximum number of suggestions that should be displayed by application type
|
||||
core.config.types.tip=Check the application types you want to manage
|
||||
core.config.ui.auto_scale=Auto scale
|
||||
core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ). It fixes scaling issues for some desktop environments.
|
||||
core.config.updates.sort_pkgs=Sort updates
|
||||
core.config.updates.sort_pkgs.tip=Defines the best update order for the selected applications / packages to avoid issues
|
||||
core.config.updates.dep_check=Mostra i requisiti di aggiornamento
|
||||
core.config.updates.dep_check.tip=Visualizza tutti i dipendenze aggiuntivi che devono essere installati prima di iniziare ad aggiornare quelli selezionati
|
||||
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
|
||||
settings.changed.success.reboot=Restart now ?
|
||||
settings.error=It was not possible to properly change all the settings
|
||||
locale.en=inglese
|
||||
locale.es=spagnolo
|
||||
locale.pt=portoghese
|
||||
core.config.ui.tray.updates_icon.tip=The displayed icon when there are updates available
|
||||
core.config.updates.interval=Updates interval
|
||||
core.config.updates.interval.tip=Defines the time interval in which the update-checking for the installed applications will happen ( in SECONDS )
|
||||
custom_action.proceed_with=Proceed with {} ?
|
||||
description=descrizione
|
||||
details=dettagli
|
||||
development=sviluppo
|
||||
devices=devices
|
||||
do_not.install=non installare
|
||||
downgraded=downgraded
|
||||
download=download
|
||||
downloading=Scaricamento
|
||||
error=errore
|
||||
example.short=e.g
|
||||
exit=esci
|
||||
file=file
|
||||
file_chooser.title=Selettore file
|
||||
files=files
|
||||
finishing=finishing
|
||||
gem_selector.question=Quali tipi di applicazioni vuoi trovare qui ?
|
||||
gem_selector.title=Tipi di applicazione
|
||||
general=generale
|
||||
icon_button.tooltip.disabled=Questa azione non è disponibile
|
||||
imported=imported
|
||||
initialization=inizializzazione
|
||||
install=installa
|
||||
installation=installazione
|
||||
installed=installato
|
||||
internet.required=È richiesta una connessione a Internet
|
||||
interval=intervallo
|
||||
latest_version=ultima versione
|
||||
license=license
|
||||
locale.ca=catalan
|
||||
locale.de=tedesco
|
||||
locale.en=inglese
|
||||
locale.es=spagnolo
|
||||
locale.it=italiano
|
||||
locale.pt=portoghese
|
||||
locale.ru=russo
|
||||
interval=intervallo
|
||||
installation=installazione
|
||||
download=download
|
||||
clean=pulire
|
||||
action.update.status.sorting=Sto determinando il miglior ordine di aggiornamento
|
||||
action.update.requirements.title=Requisiti di aggiornamento
|
||||
action.update.requirements.body=Le seguenti {} dipendenze devono essere installati prima dell'aggiornamento
|
||||
action.update.install_req.fail.title=Installazione non riuscita
|
||||
action.update.install_req.fail.body=Non è stato possibile installare {}
|
||||
action.update.requirements.status=Verificando i requisiti
|
||||
action.update.order.title=Ordine di aggiornamento
|
||||
action.update.order.body=L'aggiornamento verrà eseguito nel seguente ordine
|
||||
manage_window.apps_table.row.actions.downgrade=Downgrade
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Vuoi veramente fare il downgrade {} ?
|
||||
manage_window.apps_table.row.actions.history=Cronologia
|
||||
manage_window.apps_table.row.actions.info=Informazioni
|
||||
manage_window.apps_table.row.actions.install=Installa
|
||||
manage_window.apps_table.row.actions.install.popup.body=Installa {} nel tuo dispositivo ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Installazione
|
||||
manage_window.apps_table.row.actions.refresh=Ricarica
|
||||
manage_window.apps_table.row.actions.uninstall=Uninstall
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Remuovi {} dal tuo dispositivo ?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Disinstalla
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=But it is not possible to upgrade it.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Fai clic qui per selezionare o deselezionare l'aggiornamento.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=C'è un aggiornamento per questa applicazione.
|
||||
manage_window.bt.installed.text=installato
|
||||
manage_window.bt.installed.tooltip=Clicca qui per mostrare le applicazioni installate
|
||||
manage_window.bt.refresh.text=Refresh
|
||||
manage_window.bt.refresh.tooltip=Ricarica i dati sulle applicazioni installate
|
||||
manage_window.bt.suggestions.text=Suggerimenti
|
||||
manage_window.bt.suggestions.tooltip=Clicca qui per mostrare alcuni suggerimenti sulle applicazioni
|
||||
manage_window.bt.upgrade.text=Aggiorna
|
||||
manage_window.bt.upgrade.tooltip=Aggiorna tutte le applicazioni controllate
|
||||
manage_window.bt_custom_actions.tip=Click here to show more actions
|
||||
manage_window.bt_settings.tooltip=Fai clic qui per visualizzare le impostazioni
|
||||
manage_window.checkbox.only_apps=Apps
|
||||
manage_window.checkbox.show_details=Mostra dettagli
|
||||
manage_window.columns.installed=Installed
|
||||
manage_window.columns.latest_version=Ultima Versione
|
||||
manage_window.columns.update=Upgrade ?
|
||||
manage_window.label.updates=Aggiornamenti
|
||||
manage_window.name_filter.placeholder=Filtra per nome
|
||||
manage_window.name_filter.tooltip=Digita qui per filtrare le app per nome
|
||||
manage_window.settings.about=Informazione su
|
||||
manage_window.status.downgrading=Downgrading
|
||||
manage_window.status.filtering=Filtraggio
|
||||
manage_window.status.history=Recupero della cronologia
|
||||
manage_window.status.info=Recupero di informazioni
|
||||
manage_window.status.installed=Loading installed
|
||||
manage_window.status.installing=Installazione
|
||||
manage_window.status.refreshing=Riaggiornamento
|
||||
manage_window.status.refreshing_app=Refreshing
|
||||
manage_window.status.running_app=Avvio {}
|
||||
manage_window.status.screenshots=Recupero {} schermate
|
||||
manage_window.status.searching=Ricerca
|
||||
manage_window.status.suggestions=Cercando suggerimenti
|
||||
manage_window.status.uninstalling=Disinstallare
|
||||
manage_window.status.upgrading=Aggiornamento
|
||||
manage_window.title=Le mie applicazioni
|
||||
manage_window.upgrade_all.popup.body=Aggiornare tutte le applicazioni selezionate ?
|
||||
manage_window.upgrade_all.popup.title=Aggiorna
|
||||
message.file.not_exist=File non esiste
|
||||
message.file.not_exist.body=Il file {} sembra non esistere
|
||||
mirror=specchio
|
||||
name=nome
|
||||
no=no
|
||||
not_installed=non installato
|
||||
notification.downgrade.failed=Impossibile eseguire il downgrade
|
||||
notification.install.failed=installazione fallita
|
||||
notification.uninstall.failed=disinstallazione non riuscita
|
||||
notification.update_selected.failed=Aggiornamento non riuscito
|
||||
notification.update_selected.success=app aggiornate correttamente
|
||||
ok=ok
|
||||
others=altre
|
||||
popup.button.cancel=Cancella
|
||||
popup.button.no=No
|
||||
popup.button.yes=Si
|
||||
popup.history.selected.tooltip=Version corrente
|
||||
popup.history.title=Cronlogia
|
||||
popup.root.bad_password.body=Password errata
|
||||
popup.root.bad_password.last_try=Tentativi conclusi. Azione annullata.
|
||||
popup.root.bad_password.title=Errore
|
||||
popup.root.continue=continuare
|
||||
popup.root.title=Richiede la tua password per continuare
|
||||
popup.screenshots.no_screenshot.body=non è stato possibile recuperare {} schermate
|
||||
prepar_panel.bt_skip.label=saltare
|
||||
prepare_panel.bt_skip.label=skip
|
||||
prepare_panel.title.finish=Pronto
|
||||
prepare_panel.title.start=Inizializzazione
|
||||
proceed=procedere
|
||||
publisher=editore
|
||||
publisher.verified=verificato
|
||||
repository=deposito
|
||||
screenshots.bt_back.label=precedente
|
||||
screenshots.bt_next.label=prossimo
|
||||
screenshots.download.no_content=Nessun contenuto da visualizzare
|
||||
screenshots.download.no_response=Immagine non trovata
|
||||
screenshots.download.running=scaricare l'immagine
|
||||
settings=impostazioni
|
||||
settings.changed.success.reboot=Restart now ?
|
||||
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
|
||||
settings.error=It was not possible to properly change all the settings
|
||||
show=mostra
|
||||
size=dimensione
|
||||
source=sorgente
|
||||
stable=stabile
|
||||
status.caching_data=Memorizza {} dati sul disco
|
||||
style=stile
|
||||
success=success
|
||||
summary=riepilogo
|
||||
task.download_categories=Download delle categorie [ {} ]
|
||||
type=tipe
|
||||
uninstall=Disinstalla
|
||||
uninstalled=disinstallato
|
||||
unknown=sconosciuto
|
||||
updates=aggiornamenti
|
||||
user=utente
|
||||
version=versione
|
||||
version.installed=versione installata
|
||||
version.installed_outdated=la versione installata è obsoleta
|
||||
version.latest=ultima versione
|
||||
version.outdated=obsoleta
|
||||
version.unknown=non informato
|
||||
version.updated=aggiornata
|
||||
view.components.file_chooser.placeholder=Fai clic qui per selezionare
|
||||
warning=Avviso
|
||||
warning.update_available=There is a new {} update available ({}). Checkout the news at {}.
|
||||
welcome=benvenuto
|
||||
window_manage.input_search.placeholder=Cerca
|
||||
window_manage.input_search.tooltip=Digitare e premere INVIO per cercare applicazioni
|
||||
yes=si
|
||||
@@ -1,287 +1,377 @@
|
||||
manage_window.title=meus aplicativos
|
||||
manage_window.columns.latest_version=Última Versão
|
||||
manage_window.columns.update=Atualizar ?
|
||||
manage_window.columns.installed=Instalado
|
||||
manage_window.apps_table.row.actions.info=Informação
|
||||
manage_window.apps_table.row.actions.history=Histórico
|
||||
manage_window.apps_table.row.actions.uninstall=Desinstalar
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Desinstalação
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Remover {} do seu dispositivo ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Instalação
|
||||
manage_window.apps_table.row.actions.install.popup.body=Instalar {} no seu dispositivo ?
|
||||
manage_window.apps_table.row.actions.downgrade=Reverter versão
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Você realmente quer reverter a versão atual de {} ?
|
||||
manage_window.apps_table.row.actions.install=Instalar
|
||||
manage_window.apps_table.row.actions.refresh=Atualizar
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Existe um atualização para esse aplicativo. Clique aqui para marcar ou desmarcar a atualização
|
||||
manage_window.checkbox.only_apps=Aplicativos
|
||||
window_manage.input_search.placeholder=Buscar
|
||||
window_manage.input_search.tooltip=Digite e pressione ENTER para buscar aplicativos
|
||||
manage_window.label.updates=Atualizações
|
||||
manage_window.status.refreshing=Recarregando
|
||||
manage_window.status.upgrading=Atualizando
|
||||
manage_window.status.uninstalling=Desinstalando
|
||||
manage_window.status.downgrading=Revertendo
|
||||
manage_window.status.info=Obtendo informação
|
||||
manage_window.status.history=Obtendo histórico
|
||||
manage_window.status.searching=Buscando
|
||||
manage_window.status.installing=Instalando
|
||||
manage_window.status.refreshing_app=Atualizando
|
||||
manage_window.status.running_app=Iniciando {}
|
||||
manage_window.status.filtering=Filtrando
|
||||
manage_window.status.suggestions=Procurando sugestões
|
||||
manage_window.bt.refresh.text=Recarregar
|
||||
manage_window.bt.refresh.tooltip=Recarrega os dados sobre os aplicativos instalados
|
||||
manage_window.bt.upgrade.text=Atualizar
|
||||
manage_window.bt.upgrade.tooltip=Atualiza todos os aplicativos marcados
|
||||
manage_window.bt.installed.text=instalados
|
||||
manage_window.bt.installed.tooltip=Clique aqui para exibir os aplicativos instalados
|
||||
manage_window.bt.suggestions.text=Sugestões
|
||||
manage_window.bt.suggestions.tooltip=Clique aqui para exibir algumas sugestões de aplicativos
|
||||
manage_window.checkbox.show_details=Mostrar detalhes
|
||||
popup.root.title=Requer sua senha para prosseguir
|
||||
popup.root.continue=prosseguir
|
||||
popup.root.bad_password.title=Erro
|
||||
popup.root.bad_password.body=Senha incorreta
|
||||
popup.root.bad_password.last_try=Tentativas finalizadas. Ação cancelada.
|
||||
popup.history.title=Histórico
|
||||
popup.history.selected.tooltip=Versão atual
|
||||
popup.button.yes=Sim
|
||||
popup.button.no=Não
|
||||
popup.button.cancel=Cancelar
|
||||
tray.action.manage=Aplicativos
|
||||
tray.action.exit=Fechar
|
||||
tray.action.about=Sobre
|
||||
tray.action.refreshing=Recarregando
|
||||
notification.update={} atualização disponível
|
||||
notification.updates={} atualizações disponíveis
|
||||
notification.update_selected.success=aplicativo(s) atualizado(s) com sucesso
|
||||
notification.update_selected.failed=Erro ao atualizar
|
||||
notification.install.failed=instalação falhou
|
||||
notification.uninstall.failed=desinstalação falhou
|
||||
notification.downgrade.failed=Erro ao reverter versão
|
||||
about.info.desc=Interface gráfica para gerenciamento de aplicativos Linux
|
||||
about.info.link=Mais informações em
|
||||
about.info.license=Licença gratuita
|
||||
about.info.rate.question=Gosta desta ferramenta ?
|
||||
about.info.rate.answer=Dê a ela uma estrela no GitHub para fortalecer o projeto
|
||||
about.info.trouble.question=Problemas ?
|
||||
about.info.trouble.answer=Abra uma issue no GitHub para que os desenvolvedores possam ajudá-lo
|
||||
yes=sim
|
||||
no=não
|
||||
version.updated=atualizada
|
||||
version.outdated=desatualizada
|
||||
name=nome
|
||||
version=versão
|
||||
latest_version=última versão
|
||||
description=descrição
|
||||
type=tipo
|
||||
installed=instalado
|
||||
uninstalled=desinstalado
|
||||
not_installed=não instalado
|
||||
downgraded=versão revertida
|
||||
others=outros
|
||||
internet.required=É necessário estar conectado a Internet
|
||||
updates=atualizações
|
||||
version.installed=versão instalada
|
||||
version.latest=versão mais recente
|
||||
version.installed_outdated=a versão instalada está desatualizada
|
||||
version.unknown=versão não informada
|
||||
app.name=nome do aplicativo
|
||||
warning=aviso
|
||||
install=instalar
|
||||
uninstall=desinstalar
|
||||
bt.app_upgrade=Atualizar
|
||||
bt.app_not_upgrade=Não atualizar
|
||||
manage_window.upgrade_all.popup.title=Atualizar
|
||||
manage_window.upgrade_all.popup.body=Atualizar todos os aplicativos selecionados ?
|
||||
manage_window.settings.about=Sobre
|
||||
confirmation=confirmação
|
||||
and=e
|
||||
error=erro
|
||||
Australia=Austrália
|
||||
Austria=Áustria
|
||||
Bangladesh=Bangladesh
|
||||
Belarus=Bielorrússia
|
||||
Belgium=Bélgica
|
||||
Brazil=Brasil
|
||||
Bulgaria=Bulgária
|
||||
Canada=Canadá
|
||||
Chile=Chile
|
||||
China=China
|
||||
Costa Rica=Costa Rica
|
||||
Czech=República Tcheca
|
||||
Denmark=Dinamarca
|
||||
Ecuador=Equador
|
||||
France=França
|
||||
Georgia=Georgia
|
||||
Germany=Alemanha
|
||||
Greece=Grécia
|
||||
Hong Kong=Hong Kong
|
||||
Hungary=Hungria
|
||||
Iceland=Islândia
|
||||
India=Índia
|
||||
Indonesia=Indonésia
|
||||
Iran=Irã
|
||||
Italy=Itália
|
||||
Japan=Japão
|
||||
Kenya=Quênia
|
||||
Netherlands=Holanda
|
||||
New Zealand=Nova Zelândia
|
||||
Norway=Noriega
|
||||
Philippines=Filipinas
|
||||
Poland=Polônia
|
||||
Portugal=Portugal
|
||||
Russia=Rússia
|
||||
Singapore=Singapura
|
||||
South Africa=África do Sul
|
||||
South Korea=Coréia do Sul
|
||||
Spain=Espanha
|
||||
Sweden=Suécia
|
||||
Switzerland=Suíça
|
||||
Taiwan=Taiwan
|
||||
Thailand=Tailândia
|
||||
Turkey=Turquia
|
||||
Ukraine=Ucrânia
|
||||
United Kingdom=Reino Unido
|
||||
United States=Estados Unidos
|
||||
action.backup.error.create=Não foi possível gerar uma nova cópia de segurança do sistema
|
||||
action.backup.error.delete=Não foi possível remover as cópias de segurança antigas do sistema
|
||||
action.backup.error.proceed=Continuar mesmo assim ?
|
||||
action.backup.invalid_mode=Modo de cópia de segurança inválido
|
||||
action.backup.msg=Você deseja gerar uma cópia de segurança do sistema antes de proceder ?
|
||||
action.backup.substatus.create=Gerando uma nova cópia de segurança
|
||||
action.backup.substatus.delete=Removendo cópias de segurança antigas
|
||||
action.cancelled=operação cancelada pelo usuário
|
||||
copy=copiar
|
||||
back=voltar
|
||||
show=mostrar
|
||||
ask.continue=Continuar ?
|
||||
cancel=cancelar
|
||||
status.caching_data=Cacheando dados de {} para o disco
|
||||
action.run.tooltip=Clique aqui para iniciar esse aplicativo
|
||||
action.disk_trim.error=Ocorreu um problema ao otimizar o disco
|
||||
action.disk_trim=Otimizando disco ( TRIM )
|
||||
action.failed=Ação falhou
|
||||
action.history.no_history.body=Não existe histórico disponível para {}
|
||||
action.history.no_history.title=Sem histórico
|
||||
action.info.tooltip=Clique aqui para ver informações sobre este aplicativo
|
||||
action.settings.tooltip=Clique aqui para abrir ações adicionais
|
||||
any=qualquer
|
||||
manage_window.name_filter.tooltip=Digite aqui para filtrar aplicativos pelo nome
|
||||
manage_window.name_filter.placeholder=Filtrar por nome
|
||||
publisher=publicador
|
||||
unknown=desconhecido
|
||||
welcome=bem vindo
|
||||
gem_selector.title=Tipos de aplicativos
|
||||
gem_selector.question=Quais tipos de aplicativos você quer encontrar por aqui ?
|
||||
proceed=continuar
|
||||
change=alterar
|
||||
exit=sair
|
||||
style=estilo
|
||||
manage_window.bt_settings.tooltip=Clique aqui para exibir as configurações
|
||||
downloading=Baixando
|
||||
console.install_logs.path=Os registros de instalação podem ser encontrados em {}
|
||||
author=autor
|
||||
source=fonte
|
||||
size=tamanho
|
||||
category=categoria
|
||||
categories=categorias
|
||||
summary=resumo
|
||||
manage_window.status.screenshots=Obtendo imagens de {}
|
||||
action.not_allowed=Ação não permitida
|
||||
action.request_reboot.title=Reinicialização de sistema
|
||||
action.run.tooltip=Clique aqui para iniciar esse aplicativo
|
||||
action.screenshots.tooltip=Clique aqui para ver algumas fotos desse aplicativo
|
||||
popup.screenshots.no_screenshot.body=Não foi possível obter as fotos de {}
|
||||
games=jogos
|
||||
game=jogo
|
||||
videoeditor=edito de vídeo
|
||||
browser=navegador
|
||||
music=música
|
||||
development=desenvolvimento
|
||||
network=rede
|
||||
networks=redes
|
||||
graphics=gráficos
|
||||
system=sistema
|
||||
utility=utilidade
|
||||
terminalemulator=terminal
|
||||
database=banco de dados
|
||||
databases=bancos de dados
|
||||
text editor=editor de texto
|
||||
movies=filmes
|
||||
movie=filme
|
||||
media=mídia
|
||||
library=biblioteca
|
||||
books=livros
|
||||
applications=aplicativos
|
||||
social=social
|
||||
productivity=produtividade
|
||||
utilities=utilidades
|
||||
photo=foto
|
||||
video=vídeo
|
||||
entertainment=entretenimento
|
||||
art=arte
|
||||
design=desenho
|
||||
reference=referência
|
||||
personalisation=personalização
|
||||
education=educação
|
||||
health=saúde
|
||||
fitness=fitness
|
||||
science=ciências
|
||||
news=notícias
|
||||
weather=tempo
|
||||
finance=finanças
|
||||
desktopsettings=configurações
|
||||
settings=configurações
|
||||
texteditor=editor de texto
|
||||
server=servidor
|
||||
cloud=nuvem
|
||||
instantmessaging=mensagem
|
||||
2dgraphics=gŕaficos 2d
|
||||
vectorgraphics=gráficos vetoriais
|
||||
office=escritório
|
||||
devices=dispositivos
|
||||
security=segurança
|
||||
audiovideo=áudio / vídeo
|
||||
audio=áudio
|
||||
amusement=diversão
|
||||
webdevelopment=desenvolvimento web
|
||||
filetransfer=transferência de arquivos
|
||||
viewer=visualizador
|
||||
packagemanager=gerenciador de pacotes
|
||||
sportsgame=jogo de esportes
|
||||
arcadegame=jogo arcade
|
||||
player=jogador
|
||||
fonts=fontes
|
||||
screenshots.bt_next.label=próxima
|
||||
screenshots.bt_back.label=anterior
|
||||
screenshots,download.running=baixando imagem
|
||||
screenshots.download.no_content=Sem conteúdo para exibir
|
||||
screenshots.download.no_response=Imagem não encontrada
|
||||
continue=continuar
|
||||
stable=estável
|
||||
close=fechar
|
||||
publisher.verified=verificado
|
||||
mirror=espelho
|
||||
emulator=emulador
|
||||
do_not.install=não instalar
|
||||
repository=repositório
|
||||
details=detalhes
|
||||
communication=comunicação
|
||||
messaging=mensagem
|
||||
administration=administração
|
||||
action.settings.tooltip=Clique aqui para abrir ações adicionais
|
||||
action.update.cannot_update_label=Não podem ser atualizados
|
||||
action.update.install_req.fail.body=Não foi possível instalar {}
|
||||
action.update.install_req.fail.title=Instalação falhou
|
||||
action.update.label_to_remove=Precisam ser desinstalados
|
||||
action.update.label_to_upgrade=Serão atualizados
|
||||
action.update.pkg.required_size=Requer
|
||||
action.update.required_label=Precisam ser instalados
|
||||
action.update.required_size=Espaço necessário em disco (Download)
|
||||
action.update.requirements.body=As seguintes {} dependências precisam ser instaladas antes de atualizar
|
||||
action.update.requirements.status=Verificando requisitos
|
||||
action.update.requirements.title=Requisitos de atualização
|
||||
action.update.status.checking_sizes=Calculando o tamanho das atualizações
|
||||
action.update.success.reboot.line1=Atualizações aplicadas com sucesso !
|
||||
action.update.success.reboot.line2=Algumas alterações podem exigir a reinicialização do sistem para que surtam efeito.
|
||||
action.update.success.reboot.line3=Reiniciar agora ?
|
||||
action.update.summary=Resumo de atualização
|
||||
action.update.total_size=Tamanho da atualização
|
||||
action.trim_disk.ask=Otimizar disco (trim) ?
|
||||
address=endereço
|
||||
view.components.file_chooser.placeholder=Clique aqui para selecionar
|
||||
files=arquivos
|
||||
all_files=todos os arquivos
|
||||
file_chooser.title=Seletor arquivos
|
||||
message.file.not_exist=Arquivo não existe
|
||||
message.file.not_exist.body=O arquivo {} parece não existir
|
||||
icon_button.tooltip.disabled=Esta ação está indisponível
|
||||
user=usuário
|
||||
example.short=ex
|
||||
amount=quantidade
|
||||
and=e
|
||||
any=qualquer
|
||||
app.name=nome do aplicativo
|
||||
applications=aplicativos
|
||||
ask.continue=Continuar ?
|
||||
ask=perguntar
|
||||
author=autor
|
||||
back=voltar
|
||||
bt.app_not_upgrade=Não atualizar
|
||||
bt.app_upgrade=Atualizar
|
||||
bt.not_now=Agora não
|
||||
cancel=cancelar
|
||||
categories=categorias
|
||||
category.2dgraphics=gŕaficos 2d
|
||||
category.administration=administração
|
||||
category.amusement=diversão
|
||||
category.arcadegame=jogo arcade
|
||||
category.art=arte
|
||||
category.audio=áudio
|
||||
category.audiovideo=áudio / vídeo
|
||||
category.books=livros
|
||||
category.browser=navegador
|
||||
category.cloud=nuvem
|
||||
category.communication=comunicação
|
||||
category.database=banco de dados
|
||||
category.databases=bancos de dados
|
||||
category.design=desenho
|
||||
category.desktopsettings=configurações
|
||||
category.development=desenvolvimento
|
||||
category.education=educação
|
||||
category.emulator=emulador
|
||||
category.entertainment=entretenimento
|
||||
category.filetransfer=transferência de arquivos
|
||||
category.finance=finanças
|
||||
category.fitness=fitness
|
||||
category.fonts=fontes
|
||||
category.game=jogo
|
||||
category.games=jogos
|
||||
category.graphics=gráficos
|
||||
category.health=saúde
|
||||
category.instantmessaging=mensagem
|
||||
category.library=biblioteca
|
||||
category.media=mídia
|
||||
category.messaging=mensagem
|
||||
category.movie=filme
|
||||
category.movies=filmes
|
||||
category.music=música
|
||||
category.network=rede
|
||||
category.networks=redes
|
||||
category.news=notícias
|
||||
category.none=Nenhuma
|
||||
category.office=escritório
|
||||
category.packagemanager=gerenciador de pacotes
|
||||
category.personalisation=personalização
|
||||
category.photo=foto
|
||||
category.player=jogador
|
||||
category.productivity=produtividade
|
||||
category.reference=referência
|
||||
category.science=ciências
|
||||
category.security=segurança
|
||||
category.server=servidor
|
||||
category.settings=configuração
|
||||
category.social=social
|
||||
category.sportsgame=jogo de esportes
|
||||
category.system=sistema
|
||||
category.terminalemulator=terminal
|
||||
category.text editor=editor de texto
|
||||
category.texteditor=editor de texto
|
||||
category.utilities=utilidades
|
||||
category.utility=utilidade
|
||||
category.vectorgraphics=gráficos vetoriais
|
||||
category.video=vídeo
|
||||
category.videoeditor=edito de vídeo
|
||||
category.viewer=visualizador
|
||||
category.weather=tempo
|
||||
category.web=web
|
||||
category.webdevelopment=desenvolvimento web
|
||||
category=categoria
|
||||
change=alterar
|
||||
clean=limpar
|
||||
close=fechar
|
||||
confirmation=confirmação
|
||||
console.install_logs.path=Os registros de instalação podem ser encontrados em {}
|
||||
continue=continuar
|
||||
copy=copiar
|
||||
core.config.backup.downgrade=Antes de reverter versão
|
||||
core.config.backup.install=Antes de instalar
|
||||
core.config.backup.mode.incremental.tip=Uma nova cópia de segurança do sistema será gerada contendo somente os arquivos que foram alterados a partir da última cópia existente
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.only_one.tip=Somente uma cópia de segurança do sistema será mantida. Pré-existentes serão apagadas
|
||||
core.config.backup.mode.only_one=Única
|
||||
core.config.backup.mode=Modo
|
||||
core.config.backup.uninstall=Antes de desinstalar
|
||||
core.config.backup.upgrade=Antes de atualizar
|
||||
core.config.backup=Habilitada
|
||||
core.config.download.icons.tip=Se os ícones dos aplicativos devem ser baixados e exibidos na tabela
|
||||
core.config.download.icons=Baixar ícones
|
||||
core.config.download.multithreaded.tip=Se os aplicativos, pacotes e arquivos devem ser baixados através de uma ferramenta que trabalha com segmentação / threads ( mais rápido ). No momento esta propriedade somente funcionará se o pacote aria2 estiver instalado.
|
||||
core.config.download.multithreaded=Download segmentado
|
||||
core.config.downloads=downloads
|
||||
core.config.locale.label=idioma
|
||||
core.config.mem_cache.data_exp.tip=Define o tempo de vida dos dados em memória ( em SEGUNDOS )
|
||||
core.config.mem_cache.data_exp=Expiração dos dados
|
||||
core.config.mem_cache.icon_exp.tip=Define o tempo de vida dos ícones em memória ( em SEGUNDOS )
|
||||
core.config.mem_cache.icon_exp=Expiração de ícones
|
||||
core.config.mem_cache=Armazenamento em memória
|
||||
core.config.store_password.tip=Solicita a senha do usuário root somente uma vez
|
||||
core.config.store_password=Solicitação única de senha
|
||||
core.config.suggestions.activated.tip=Se novos aplicativos podem ser sugeridos para instalação
|
||||
core.config.suggestions.activated=Sugestões
|
||||
core.config.suggestions.by_type.tip=Número máximo de sugestões que devem ser exibidas por tipo de aplicativo
|
||||
core.config.suggestions.by_type=Sugestões por tipo
|
||||
core.config.system.dep_checking.tip=Se a verificação da disponibilidade das tecnologias do seu sistema devem ocorrer somente uma vez
|
||||
core.config.system.dep_checking=Verificação única de sistema
|
||||
core.config.system.notifications.tip=Se notificações devem ser exibidas quando uma ação é finalizada ou existem atualizações
|
||||
core.config.system.notifications=Notificações
|
||||
core.config.tab.advanced=Avançadas
|
||||
core.config.tab.backup=Cópia de Segurança
|
||||
core.config.tab.general=Gerais
|
||||
core.config.tab.ui=Interface
|
||||
core.config.tab.tray=Bandeja
|
||||
core.config.tab.types=Tipos
|
||||
core.config.locale.label=idioma
|
||||
core.config.disk_cache=Cache em disco
|
||||
core.config.disk_cache.tip=Alguns dados sobre os aplicativos instalados serão armazenados em disco para que os mesmos sejam carregados rapidamente nas próximas inicializações
|
||||
core.config.updates.interval=Intervalo de atualizações
|
||||
core.config.updates.interval.tip=Define o intervalo de tempo em que ocorrerá a verificação de atualizações para os aplicativos instalados ( em SEGUNDOS )
|
||||
core.config.downloads=downloads
|
||||
core.config.download.icons=Baixar ícones
|
||||
core.config.download.icons.tip=Se os ícones dos aplicativos devem ser baixados e exibidos na tabela
|
||||
core.config.download.multithreaded=Download segmentado
|
||||
core.config.download.multithreaded.tip=Se os aplicativos, pacotes e arquivos devem ser baixados através de uma ferramenta que trabalha com segmentação / threads ( mais rápido ). No momento esta propriedade somente funcionará se o pacote aria2 estiver instalado.
|
||||
core.config.mem_cache=Armazenamento em memória
|
||||
core.config.mem_cache.data_exp=Expiração dos dados
|
||||
core.config.mem_cache.data_exp.tip=Define o tempo de vida dos dados em memória ( em SEGUNDOS )
|
||||
core.config.mem_cache.icon_exp=Expiração de ícones
|
||||
core.config.mem_cache.icon_exp.tip=Define o tempo de vida dos ícones em memória ( em SEGUNDOS )
|
||||
core.config.suggestions.activated=Sugestões
|
||||
core.config.suggestions.activated.tip=Se novos aplicativos podem ser sugeridos para instalação
|
||||
core.config.system.notifications=Notificações
|
||||
core.config.system.notifications.tip=Se notificações devem ser exibidas quando uma ação é finalizada ou existem atualizações
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.hdpi.tip=Se melhorias para resoluções HDPI devem ser ativadas
|
||||
core.config.ui.max_displayed=Aplicativos exibidos
|
||||
core.config.ui.max_displayed.tip=Número máximo de aplicativos exibidos na tabela
|
||||
core.config.ui.tray.default_icon=Ícone padrão
|
||||
core.config.ui.tray.default_icon.tip=O ícone padrão exibido na bandeja
|
||||
core.config.ui.tray.updates_icon=Ícone de atualização
|
||||
core.config.ui.tray.updates_icon.tip=O ícone exibido quando há atualizações disponíveis
|
||||
core.config.system.dep_checking=Verificação única de sistema
|
||||
core.config.system.dep_checking.tip=Se a verificação da disponibilidade das tecnologias do seu sistema devem ocorrer somente uma vez
|
||||
core.config.suggestions.by_type=Sugestões por tipo
|
||||
core.config.suggestions.by_type.tip=Número máximo de sugestões que devem ser exibidas por tipo de aplicativo
|
||||
core.config.tab.ui=Interface
|
||||
core.config.trim_after_update.tip=Otimiza o disco após uma atualização bem sucedida utilizando "trim". Não habilite essa opção se o seu disco não for um SSD que permite trim.
|
||||
core.config.trim_after_update=Otimizar disco após atualizar
|
||||
core.config.types.tip=Marque os tipos de aplicativo que você quer gerenciar
|
||||
core.config.ui.auto_scale=Escala automática
|
||||
core.config.ui.auto_scale.tip=Ativa o fator de escala automático ( {} ). Corrige problemas de escala para alguns ambientes desktop.
|
||||
core.config.updates.sort_pkgs=Organizar atualizações
|
||||
core.config.updates.sort_pkgs.tip=Define a melhor ordem de atualização para os aplicativos / pacotes selecionados para evitar problemas
|
||||
core.config.updates.dep_check=Mostrar requisitos de atualização
|
||||
core.config.updates.dep_check.tip=Exibe todos as dependências que precisam ser instaladas antes de iniciar a atualização dos selecionados
|
||||
settings.changed.success.warning=Configurações alteradas com sucesso ! Algumas delas só surtirão após a reinicialização.
|
||||
settings.changed.success.reboot=Reiniciar agora ?
|
||||
settings.error=Não foi possível alterar todas as configurações adequadamente
|
||||
locale.en=inglês
|
||||
locale.es=espanhol
|
||||
locale.pt=português
|
||||
core.config.ui.auto_scale=Escala automática
|
||||
core.config.ui.hdpi.tip=Se melhorias para resoluções HDPI devem ser ativadas
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.max_displayed.tip=Número máximo de aplicativos exibidos na tabela
|
||||
core.config.ui.max_displayed=Aplicativos exibidos
|
||||
core.config.ui.tray.default_icon.tip=O ícone padrão exibido na bandeja
|
||||
core.config.ui.tray.default_icon=Ícone padrão
|
||||
core.config.ui.tray.updates_icon.tip=O ícone exibido quando há atualizações disponíveis
|
||||
core.config.ui.tray.updates_icon=Ícone de atualização
|
||||
core.config.updates.interval.tip=Define o intervalo de tempo em que ocorrerá a verificação de atualizações para os aplicativos instalados ( em SEGUNDOS )
|
||||
core.config.updates.interval=Intervalo de atualizações
|
||||
custom_action.proceed_with=Continuar com {} ?
|
||||
description=descrição
|
||||
details=detalhes
|
||||
devices=dispositivos
|
||||
do_not.install=não instalar
|
||||
downgraded=versão revertida
|
||||
download=download
|
||||
downloading=Baixando
|
||||
error=erro
|
||||
example.short=ex
|
||||
exit=sair
|
||||
file=arquivo
|
||||
file_chooser.title=Seletor arquivos
|
||||
files=arquivos
|
||||
finishing=finalizando
|
||||
gem_selector.question=Quais tipos de aplicativos você quer encontrar por aqui ?
|
||||
gem_selector.title=Tipos de aplicativos
|
||||
general=geral
|
||||
icon_button.tooltip.disabled=Esta ação está indisponível
|
||||
imported=importado
|
||||
initialization=inicialização
|
||||
install=instalar
|
||||
installation=instalação
|
||||
installed=instalado
|
||||
internet.required=É necessário estar conectado a Internet
|
||||
interval=intervalo
|
||||
latest_version=última versão
|
||||
license=licença
|
||||
locale.ca=catalão
|
||||
locale.de=alemão
|
||||
locale.en=inglês
|
||||
locale.es=espanhol
|
||||
locale.it=italiano
|
||||
locale.pt=português
|
||||
locale.ru=russo
|
||||
interval=intervalo
|
||||
installation=instalação
|
||||
download=download
|
||||
clean=limpar
|
||||
action.update.status.sorting=Determinando a melhor ordem de atualização
|
||||
action.update.requirements.title=Requisitos de atualização
|
||||
action.update.requirements.body=As seguintes {} dependências precisam ser instaladas antes de atualizar
|
||||
action.update.install_req.fail.title=Instalação falhou
|
||||
action.update.install_req.fail.body=Não foi possível instalar {}
|
||||
action.update.requirements.status=Verificando requisitos
|
||||
action.update.order.title=Ordem de atualização
|
||||
action.update.order.body=A atualização será realizada na seguinte ordem
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Você realmente quer reverter a versão atual de {} ?
|
||||
manage_window.apps_table.row.actions.downgrade=Reverter versão
|
||||
manage_window.apps_table.row.actions.history=Histórico
|
||||
manage_window.apps_table.row.actions.info=Informação
|
||||
manage_window.apps_table.row.actions.install.popup.body=Instalar {} no seu dispositivo ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Instalação
|
||||
manage_window.apps_table.row.actions.install=Instalar
|
||||
manage_window.apps_table.row.actions.refresh=Atualizar
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Remover {} do seu dispositivo ?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Desinstalação
|
||||
manage_window.apps_table.row.actions.uninstall=Desinstalar
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=Porém não é possível atualiza-lo.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Clique aqui para marcar ou desmarcar a atualização.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Existe um atualização para esse aplicativo.
|
||||
manage_window.bt.installed.text=instalados
|
||||
manage_window.bt.installed.tooltip=Clique aqui para exibir os aplicativos instalados
|
||||
manage_window.bt.refresh.text=Recarregar
|
||||
manage_window.bt.refresh.tooltip=Recarrega os dados sobre os aplicativos instalados
|
||||
manage_window.bt.suggestions.text=Sugestões
|
||||
manage_window.bt.suggestions.tooltip=Clique aqui para exibir algumas sugestões de aplicativos
|
||||
manage_window.bt.upgrade.text=Atualizar
|
||||
manage_window.bt.upgrade.tooltip=Atualiza todos os aplicativos marcados
|
||||
manage_window.bt_custom_actions.tip=Clique aqui para exibir mais ações
|
||||
manage_window.bt_settings.tooltip=Clique aqui para exibir as configurações
|
||||
manage_window.checkbox.only_apps=Aplicativos
|
||||
manage_window.checkbox.show_details=Mostrar detalhes
|
||||
manage_window.columns.installed=Instalado
|
||||
manage_window.columns.latest_version=Última Versão
|
||||
manage_window.columns.update=Atualizar ?
|
||||
manage_window.label.updates=Atualizações
|
||||
manage_window.name_filter.placeholder=Filtrar por nome
|
||||
manage_window.name_filter.tooltip=Digite aqui para filtrar aplicativos pelo nome
|
||||
manage_window.settings.about=Sobre
|
||||
manage_window.status.downgrading=Revertendo
|
||||
manage_window.status.filtering=Filtrando
|
||||
manage_window.status.history=Obtendo histórico
|
||||
manage_window.status.info=Obtendo informação
|
||||
manage_window.status.installed=Carregando instalados
|
||||
manage_window.status.installing=Instalando
|
||||
manage_window.status.refreshing=Recarregando
|
||||
manage_window.status.refreshing_app=Atualizando
|
||||
manage_window.status.running_app=Iniciando {}
|
||||
manage_window.status.screenshots=Obtendo imagens de {}
|
||||
manage_window.status.searching=Buscando
|
||||
manage_window.status.suggestions=Procurando sugestões
|
||||
manage_window.status.uninstalling=Desinstalando
|
||||
manage_window.status.upgrading=Atualizando
|
||||
manage_window.title=meus aplicativos
|
||||
manage_window.upgrade_all.popup.body=Atualizar todos os aplicativos selecionados ?
|
||||
manage_window.upgrade_all.popup.title=Atualizar
|
||||
message.file.not_exist.body=O arquivo {} parece não existir
|
||||
message.file.not_exist=Arquivo não existe
|
||||
mirror=espelho
|
||||
name=nome
|
||||
no=não
|
||||
not_installed=não instalado
|
||||
notification.downgrade.failed=Erro ao reverter versão
|
||||
notification.install.failed=instalação falhou
|
||||
notification.uninstall.failed=desinstalação falhou
|
||||
notification.update_selected.failed=Erro ao atualizar
|
||||
notification.update_selected.success=aplicativo(s) atualizado(s) com sucesso
|
||||
ok=ok
|
||||
others=outros
|
||||
popup.button.cancel=Cancelar
|
||||
popup.button.no=Não
|
||||
popup.button.yes=Sim
|
||||
popup.history.selected.tooltip=Versão atual
|
||||
popup.history.title=Histórico
|
||||
popup.root.bad_password.body=Senha incorreta
|
||||
popup.root.bad_password.last_try=Tentativas finalizadas. Ação cancelada.
|
||||
popup.root.bad_password.title=Erro
|
||||
popup.root.continue=prosseguir
|
||||
popup.root.title=Requer sua senha para prosseguir
|
||||
popup.screenshots.no_screenshot.body=Não foi possível obter as fotos de {}
|
||||
prepare_panel.bt_skip.label=Pular
|
||||
prepare_panel.title.finish=Pronto
|
||||
prepare_panel.title.start=Iniciando
|
||||
proceed=continuar
|
||||
publisher.verified=verificado
|
||||
publisher=publicador
|
||||
repository=repositório
|
||||
screenshots.download.running=baixando imagem
|
||||
screenshots.bt_back.label=anterior
|
||||
screenshots.bt_next.label=próxima
|
||||
screenshots.download.no_content=Sem conteúdo para exibir
|
||||
screenshots.download.no_response=Imagem não encontrada
|
||||
settings.changed.success.reboot=Reiniciar agora ?
|
||||
settings.changed.success.warning=Configurações alteradas com sucesso ! Algumas delas só surtirão após a reinicialização.
|
||||
settings.error=Não foi possível alterar todas as configurações adequadamente
|
||||
settings=configurações
|
||||
show=mostrar
|
||||
size=tamanho
|
||||
source=fonte
|
||||
stable=estável
|
||||
status.caching_data=Cacheando dados de {} para o disco
|
||||
style=estilo
|
||||
success=sucesso
|
||||
summary=resumo
|
||||
task.download_categories=Baixando categorias [ {} ]
|
||||
type=tipo
|
||||
uninstall=desinstalar
|
||||
uninstalled=desinstalado
|
||||
unknown=desconhecido
|
||||
updates=atualizações
|
||||
user=usuário
|
||||
version.installed=versão instalada
|
||||
version.installed_outdated=a versão instalada está desatualizada
|
||||
version.latest=versão mais recente
|
||||
version.outdated=desatualizada
|
||||
version.unknown=versão não informada
|
||||
version.updated=atualizada
|
||||
version=versão
|
||||
view.components.file_chooser.placeholder=Clique aqui para selecionar
|
||||
warning=aviso
|
||||
warning.update_available=Há uma nova atualização do {} disponível ({}). Confira as novidades em {}
|
||||
welcome=bem vindo
|
||||
window_manage.input_search.placeholder=Buscar
|
||||
window_manage.input_search.tooltip=Digite e pressione ENTER para buscar aplicativos
|
||||
yes=sim
|
||||
@@ -1,205 +1,216 @@
|
||||
manage_window.title=Мои приложения
|
||||
manage_window.columns.latest_version=Последняя версия
|
||||
manage_window.columns.update=Обновить ?
|
||||
manage_window.apps_table.row.actions.info=Информация
|
||||
manage_window.apps_table.row.actions.history=История версий
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Удаление
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Удалить {} с Вашего устройства ?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Установка
|
||||
manage_window.apps_table.row.actions.install.popup.body=Установить {} на Ваше устройство ?
|
||||
manage_window.apps_table.row.actions.downgrade=Откат версии
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Вы действительно хотите откатить версию {} ?
|
||||
manage_window.apps_table.row.actions.install=Установка
|
||||
manage_window.apps_table.row.actions.refresh=Обновить список
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Есть обновление для этого приложения. Нажмите здесь, чтобы поставить или снять флажок обновления
|
||||
manage_window.checkbox.only_apps=Приложения
|
||||
window_manage.input_search.placeholder=Поиск
|
||||
window_manage.input_search.tooltip=Введите и нажмите ENTER для поиска приложений
|
||||
manage_window.label.updates=Обновления
|
||||
manage_window.status.refreshing=Обновляется
|
||||
manage_window.status.upgrading=Обновление
|
||||
manage_window.status.uninstalling=Удалить
|
||||
manage_window.status.downgrading=Откатить
|
||||
manage_window.status.info=Извлечение информации
|
||||
manage_window.status.history=Извлечение истории
|
||||
manage_window.status.searching=Поиск
|
||||
manage_window.status.installing=Установить
|
||||
manage_window.status.refreshing_app=Обновляется
|
||||
manage_window.status.running_app=Запускается {}
|
||||
manage_window.status.filtering=Фильтрация
|
||||
manage_window.status.screenshots=Получение скриншотов {}
|
||||
manage_window.status.suggestions=Поиск рекомендаций
|
||||
manage_window.bt.refresh.text=Обновить список
|
||||
manage_window.bt.refresh.tooltip=Перезагрузите данные об установленных приложениях
|
||||
manage_window.bt.upgrade.text=Обновление
|
||||
manage_window.bt.upgrade.tooltip=Обновить все выбранные приложения
|
||||
manage_window.bt.installed.text=Установленные
|
||||
manage_window.bt.installed.tooltip=Нажмите здесь, чтобы показать установленные приложения
|
||||
manage_window.bt.suggestions.text=Рекомендации
|
||||
manage_window.bt.suggestions.tooltip=Нажмите здесь, чтобы показать некоторые рекомендаваные приложения
|
||||
manage_window.checkbox.show_details=Показать детали
|
||||
popup.root.title=Требуется ваш пароль, чтобы продолжить
|
||||
popup.root.continue=Продолжить
|
||||
popup.root.bad_password.title=Ошибка
|
||||
popup.root.bad_password.body=Неправильный пароль
|
||||
popup.root.bad_password.last_try=Закончились попытки. Отмена действия.
|
||||
popup.history.title=История версий
|
||||
popup.history.selected.tooltip=Текущая версия
|
||||
popup.button.yes=Да
|
||||
popup.button.no=Нет
|
||||
popup.button.cancel=Отмена
|
||||
tray.action.manage=Приложения
|
||||
tray.action.exit=Выход
|
||||
tray.action.about=О программе
|
||||
tray.action.refreshing=Обновляется
|
||||
Australia=Австралия
|
||||
Austria=Австрия
|
||||
Bangladesh=Бангладеш
|
||||
Belarus=Беларусь
|
||||
Belgium=Бельгия
|
||||
Brazil=Бразилия
|
||||
Bulgaria=Болгария
|
||||
Canada=Канада
|
||||
Chile=Чили
|
||||
China=Китай
|
||||
Costa Rica=Коста-Рика
|
||||
Czech=Чехия
|
||||
Denmark=Дания
|
||||
Ecuador=Эквадор
|
||||
France=Франция
|
||||
Georgia=Грузия
|
||||
Germany=Германия
|
||||
Greece=Греция
|
||||
Hong Kong=Гонконг
|
||||
Hungary=Венгрия
|
||||
Iceland=Исландия
|
||||
India=Индия
|
||||
Indonesia=Индонезия
|
||||
Iran=Иран
|
||||
Italy=Италия
|
||||
Japan=Япония
|
||||
Kenya=Кения
|
||||
Netherlands=Нидерланды
|
||||
New Zealand=Новая Зеландия
|
||||
Norway=Норвегия
|
||||
Philippines=Филиппины
|
||||
Poland=Польша
|
||||
Portugal=Португалия
|
||||
Russia=Российская Федерация
|
||||
Singapore=Сингапур
|
||||
South Africa=Южно-Африканская Республика
|
||||
South Korea=Южная Корея
|
||||
Spain=Испания
|
||||
Sweden=Швеция
|
||||
Switzerland=Швейцария
|
||||
Taiwan=Тайвань
|
||||
Thailand=Тайланд
|
||||
Turkey=Турция
|
||||
Ukraine=Украина
|
||||
United Kingdom=Великобритания
|
||||
United States=Соединённые Штаты Америки
|
||||
action.backup.error.create=It was not possible to generate a new system copy
|
||||
action.backup.error.delete=It was not possible to delete the old system copies
|
||||
action.backup.error.proceed=Proceed anyway ?
|
||||
action.backup.invalid_mode=Invalid backup mode
|
||||
action.backup.msg=Do you want to generate a system copy before proceeding ?
|
||||
action.backup.substatus.create=Generating a new system backup
|
||||
action.backup.substatus.delete=Removing old system backups
|
||||
action.cancelled=Операция отменена пользователем
|
||||
action.disk_trim=Optimizing disc ( TRIM )
|
||||
action.disk_trim.error=There was a problem while optimizing the disk
|
||||
action.failed=Действие не удалось
|
||||
action.history.no_history.body=There is no available history for {}
|
||||
action.history.no_history.title=No history
|
||||
action.info.tooltip=Нажмите здесь, чтобы посмотреть информацию об этом приложении
|
||||
action.not_allowed=Действие не допускается
|
||||
action.request_reboot.title=System restart
|
||||
action.run.tooltip=Нажмите здесь, чтобы запустить это приложение
|
||||
action.screenshots.tooltip=Нажмите здесь, чтобы увидеть некоторые скриншоты этого приложения
|
||||
action.settings.tooltip=Нажмите здесь, чтобы открыть дополнительные действия
|
||||
notification.update={} обновления доступно
|
||||
notification.updates={} обновлений доступно
|
||||
notification.update_selected.success=Приложение(я) успешно обновлено(ы)
|
||||
notification.update_selected.failed=Обновление не удалось
|
||||
notification.install.failed=Установка не удалась
|
||||
notification.uninstall.failed=Удаление не удалось
|
||||
notification.downgrade.failed=Откат не удался
|
||||
about.info.desc=Графический интерфейс для управления приложениями Linux
|
||||
about.info.link=Ещё информация на
|
||||
about.info.license=Свободная лицензия
|
||||
about.info.rate.question=Понравилось это приложеие ?
|
||||
about.info.rate.answer=Поставьте ему звезду на GitHub, чтобы поддержать проект
|
||||
about.info.trouble.question=Возникли проблемы ?
|
||||
about.info.trouble.answer=Откройте GitHub, чтобы разработчики могли вам помочь
|
||||
yes=Да
|
||||
no=Нет
|
||||
version.updated=Обновленная
|
||||
version.outdated=Устаревшая
|
||||
name=Имя
|
||||
version=Версия
|
||||
latest_version=Последняя версия
|
||||
description=Описание
|
||||
type=Тип
|
||||
installed=Установлено
|
||||
uninstalled=Деинсталлировано
|
||||
not_installed=Не установлено
|
||||
downgraded=Произведён откат
|
||||
others=Другие
|
||||
internet.required=Требуется подключение к интернету
|
||||
updates=Обновления
|
||||
version.installed=Установленная версия
|
||||
version.latest=Последняя версия
|
||||
version.installed_outdated=Установленная версия устарела
|
||||
version.unknown=не сообщать
|
||||
app.name=Название приложения
|
||||
warning=Предупреждение
|
||||
install=Установка
|
||||
uninstall=Деинсталляция
|
||||
bt.app_upgrade=Обновить
|
||||
bt.app_not_upgrade=Не обновлять
|
||||
manage_window.upgrade_all.popup.title=Обновление
|
||||
manage_window.upgrade_all.popup.body=Обновить все выбранные приложения ?
|
||||
manage_window.settings.about=О программе
|
||||
confirmation=Подтверждение
|
||||
and=и
|
||||
error=Ошибка
|
||||
action.cancelled=Операция отменена пользователем
|
||||
copy=Копировать
|
||||
back=Назад
|
||||
show=Показать
|
||||
ask.continue=Продолжить ?
|
||||
cancel=Отмена
|
||||
status.caching_data=Кэширование данных {} на диск
|
||||
action.run.tooltip=Нажмите здесь, чтобы запустить это приложение
|
||||
any=несколько
|
||||
manage_window.name_filter.tooltip=Введите здесь, чтобы фильтровать приложения по имени
|
||||
manage_window.name_filter.placeholder=Фильтр по имени
|
||||
publisher=издатель
|
||||
unknown=неизвестный
|
||||
welcome=Добро пожаловать!
|
||||
gem_selector.title=Типы приложений
|
||||
gem_selector.question=Какие типы приложений вы хотите здесь найти ?
|
||||
proceed=Продолжить
|
||||
change=Изменить
|
||||
exit=Выход
|
||||
style=Стиль
|
||||
manage_window.bt_settings.tooltip=Нажмите здесь, чтобы отобразить настройки
|
||||
downloading=Загрузка
|
||||
console.install_logs.path=Журналы установки можно найти по адресу {}
|
||||
author=Автор
|
||||
source=Источник
|
||||
size=Размер
|
||||
category=Категория
|
||||
categories=Категории
|
||||
summary=Суммарно
|
||||
popup.screenshots.no_screenshot.body=не удалось получить скриншоты {}
|
||||
terminalemulator=Эмулятор терминала
|
||||
desktopsettings=Настройки рабочего стола
|
||||
texteditor=Текстовый редактор
|
||||
screenshots.bt_next.label=Следующий
|
||||
screenshots.bt_back.label=Предыдущий
|
||||
instantmessaging=Мессенджер
|
||||
2dgraphics=2D-графика
|
||||
vectorgraphics=Векторная графика
|
||||
audiovideo=Аудио/Видео
|
||||
webdevelopment=Web-разработка
|
||||
filetransfer=Передача файлов
|
||||
packagemanager=Пакетный менеджер
|
||||
sportsgame=Спортивная игра
|
||||
arcadegame=Аркада
|
||||
player=Проигрыватель
|
||||
screenshots,download.running=Загрузка изображения
|
||||
screenshots.download.no_content=Нет материалов для отображени
|
||||
screenshots.download.no_response=Изображение не найдено
|
||||
continue=Продолжить
|
||||
stable=Стабильная
|
||||
close=Закрыть
|
||||
publisher.verified=Проверенный
|
||||
mirror=Зеркало
|
||||
emulator=Эмуляторы
|
||||
do_not.install=не устанавливать
|
||||
repository=Репозиторий
|
||||
details=Детали
|
||||
communication=Общение
|
||||
web=Сеть
|
||||
office=Офис
|
||||
messaging=Сообщения
|
||||
administration=Администрирование
|
||||
audio=Аудио
|
||||
video=Видео
|
||||
settings=Настройки
|
||||
action.update.cannot_update_label=Cannot be upgraded
|
||||
action.update.install_req.fail.body=Невозможно установить {}
|
||||
action.update.install_req.fail.title=Установка не удалась
|
||||
action.update.label_to_remove=Must be uninstalled
|
||||
action.update.label_to_upgrade=Will be upgraded
|
||||
action.update.pkg.required_size=Requires
|
||||
action.update.required_label=Должен быть установлен
|
||||
action.update.required_size=Disk space required (download)
|
||||
action.update.requirements.body=Перед обновлением необходимо установить следующие зависимости {}
|
||||
action.update.requirements.status=Проверка требований
|
||||
action.update.requirements.title=Требования к обновлению
|
||||
action.update.status.checking_sizes=Расчет размера обновления
|
||||
action.update.success.reboot.line1=Upgrades successfully applied !
|
||||
action.update.success.reboot.line2=Some changes may require a system restart to take effect.
|
||||
action.update.success.reboot.line3=Restart now ?
|
||||
action.update.summary=Сводка обновления
|
||||
action.update.total_size=Update size
|
||||
action.trim_disk.ask=Optimize disc (trim) ?
|
||||
address=Адрес
|
||||
view.components.file_chooser.placeholder=Нажмите здесь, чтобы выбрать
|
||||
files=Файлы
|
||||
all_files=Все файлы
|
||||
file_chooser.title=Выбор файлов
|
||||
message.file.not_exist=Файл не существует
|
||||
message.file.not_exist.body=Файл {}, кажется, не существует
|
||||
development=Разработка
|
||||
icon_button.tooltip.disabled=Это действие недоступно
|
||||
user=Пользователь
|
||||
example.short=к примеру
|
||||
core.config.tab.advanced=Продвинутые
|
||||
core.config.tab.general=Основные
|
||||
core.config.tab.ui=Интерфейс
|
||||
core.config.tab.tray=Трей
|
||||
core.config.tab.types=Типы
|
||||
core.config.locale.label=Язык
|
||||
core.config.disk_cache=Дисковый кэш
|
||||
core.config.disk_cache.tip=Некоторые данные об установленных приложениях будут сохранены на диске, так что они могут быть быстро загружены в следующих инициализациях
|
||||
core.config.updates.interval=Интервал обновления
|
||||
core.config.updates.interval.tip=Определяет интервал времени, в течение которого будет происходить проверка обновлений для установленных приложений ( в секундах )
|
||||
amount=amount
|
||||
and=и
|
||||
any=несколько
|
||||
app.name=Название приложения
|
||||
applications=applications
|
||||
ask=Спросить
|
||||
ask.continue=Продолжить ?
|
||||
author=Автор
|
||||
back=Назад
|
||||
bt.app_not_upgrade=Не обновлять
|
||||
bt.app_upgrade=Обновить
|
||||
bt.not_now=Не сейчас
|
||||
cancel=Отмена
|
||||
categories=Категории
|
||||
category=Категория
|
||||
category.2dgraphics=2D-графика
|
||||
category.administration=Администрирование
|
||||
category.amusement=amusement
|
||||
category.arcadegame=Аркада
|
||||
category.art=art
|
||||
category.audio=Аудио
|
||||
category.audiovideo=Аудио/Видео
|
||||
category.books=books
|
||||
category.browser=browser
|
||||
category.cloud=cloud
|
||||
category.communication=Общение
|
||||
category.database=database
|
||||
category.databases=databases
|
||||
category.design=design
|
||||
category.desktopsettings=Настройки рабочего стола
|
||||
category.development=Разработка
|
||||
category.education=education
|
||||
category.emulator=Эмуляторы
|
||||
category.entertainment=entertainment
|
||||
category.filetransfer=Передача файлов
|
||||
category.finance=finance
|
||||
category.fitness=fitness
|
||||
category.fonts=fonts
|
||||
category.game=game
|
||||
category.games=games
|
||||
category.graphics=graphics
|
||||
category.health=health
|
||||
category.instantmessaging=Мессенджер
|
||||
category.library=library
|
||||
category.media=media
|
||||
category.messaging=Сообщения
|
||||
category.movie=movie
|
||||
category.movies=movies
|
||||
category.music=music
|
||||
category.network=network
|
||||
category.networks=networks
|
||||
category.news=news
|
||||
category.none=нет
|
||||
category.office=Офис
|
||||
category.packagemanager=Пакетный менеджер
|
||||
category.personalisation=personalization
|
||||
category.photo=photo
|
||||
category.player=Проигрыватель
|
||||
category.productivity=productivity
|
||||
category.reference=reference
|
||||
category.science=science
|
||||
category.security=security
|
||||
category.server=server
|
||||
category.settings=Настройки
|
||||
category.social=social
|
||||
category.sportsgame=Спортивная игра
|
||||
category.system=system
|
||||
category.terminalemulator=Эмулятор терминала
|
||||
category.text editor=text editor
|
||||
category.texteditor=Текстовый редактор
|
||||
category.utilities=utilities
|
||||
category.utility=utility
|
||||
category.vectorgraphics=Векторная графика
|
||||
category.video=Видео
|
||||
category.videoeditor=video editor
|
||||
category.viewer=viewer
|
||||
category.weather=weather
|
||||
category.web=Сеть
|
||||
category.webdevelopment=Web-разработка
|
||||
change=Изменить
|
||||
clean=Очистка
|
||||
close=Закрыть
|
||||
confirmation=Подтверждение
|
||||
console.install_logs.path=Журналы установки можно найти по адресу {}
|
||||
continue=Продолжить
|
||||
copy=Копировать
|
||||
core.config.backup=Enabled
|
||||
core.config.backup.downgrade=Before downgrading
|
||||
core.config.backup.install=Before installing
|
||||
core.config.backup.mode=Mode
|
||||
core.config.backup.mode.incremental=Incremental
|
||||
core.config.backup.mode.incremental.tip=A new system backup will be generated containing only the changed files since the latest copy.
|
||||
core.config.backup.mode.only_one=Single
|
||||
core.config.backup.mode.only_one.tip=Only one system backup will be kept. Pre-existing backups will be erased.
|
||||
core.config.backup.uninstall=Before uninstalling
|
||||
core.config.backup.upgrade=Before upgrading
|
||||
core.config.download.icons=Скачать иконки
|
||||
core.config.download.icons.tip=Загружать иконки приложения для отображаения на рабочем столе
|
||||
core.config.download.multithreaded=Многопоточная загрузка
|
||||
core.config.download.multithreaded.tip=Следует ли загружать приложения, пакеты и файлы с помощью инструмента, который работает с потоками ( быстрее ). На данный момент эта настройка будет работать только в том случае, если установлен пакет aria2
|
||||
core.config.downloads=downloads
|
||||
core.config.locale.label=Язык
|
||||
core.config.mem_cache=Запоминающее устройство
|
||||
core.config.mem_cache.data_exp=Истечение срока действия данных
|
||||
core.config.mem_cache.data_exp.tip=Определяет время жизни данных в памяти ( в секундах )
|
||||
core.config.mem_cache.icon_exp=Истечение срока действия иконок
|
||||
core.config.mem_cache.icon_exp.tip=Определяет время жизни значков в памяти (в секундах )
|
||||
core.config.store_password=Однократный запрос пароля
|
||||
core.config.store_password.tip=Запрашивать пароль пользователя root только один раз
|
||||
core.config.suggestions.activated=Рекомендации
|
||||
core.config.suggestions.activated.tip=Отображать рекомендумые к установке приложения.
|
||||
core.config.suggestions.by_type=Рекомендации по типу
|
||||
core.config.suggestions.by_type.tip=Максимальное количество рекомендаций, которые должны отображаться по типу приложения
|
||||
core.config.system.dep_checking=Одкократная проверка системы.
|
||||
core.config.system.dep_checking.tip=Если проверка доступности ваших системных техноллгий должна происходить только один раз
|
||||
core.config.system.notifications=Уведомления
|
||||
core.config.system.notifications.tip=Отображать уведомления о завершении операции или об имеющихся обновлниях
|
||||
core.config.tab.advanced=Продвинутые
|
||||
core.config.tab.backup=Backup
|
||||
core.config.tab.general=Основные
|
||||
core.config.tab.tray=Трей
|
||||
core.config.tab.types=Типы
|
||||
core.config.tab.ui=Интерфейс
|
||||
core.config.trim_after_update=Optimize disc after upgrading
|
||||
core.config.trim_after_update.tip=It optimizes the disc after a successfull upgrade using "trim". Do not enable this option if your disk is not a SSD that allows trim.
|
||||
core.config.types.tip=Отметьте типы приложений, которыми вы хотите управлять
|
||||
core.config.ui.auto_scale=Автоматическое масштабирование
|
||||
core.config.ui.auto_scale.tip=Он активирует автоматический коэффициент масштабирования экрана ({}),тем самым устраняет проблемы масштабирования для некоторых сред рабочего стола
|
||||
core.config.ui.hdpi=HDPI
|
||||
core.config.ui.hdpi.tip=Если улучшения, связанные с разрешением HDPI должны быть активированы
|
||||
core.config.ui.max_displayed=Отображаемые приложения
|
||||
@@ -208,36 +219,159 @@ core.config.ui.tray.default_icon=Значок по умолчанию
|
||||
core.config.ui.tray.default_icon.tip=Значок по умолчанию для {app}, отображаемый в трее
|
||||
core.config.ui.tray.updates_icon=Значок обновления
|
||||
core.config.ui.tray.updates_icon.tip=Значок, отображаемый при наличии доступных обновлений
|
||||
core.config.system.dep_checking=Одкократная проверка системы.
|
||||
core.config.system.dep_checking.tip=Если проверка доступности ваших системных техноллгий должна происходить только один раз
|
||||
core.config.suggestions.by_type=Рекомендации по типу
|
||||
core.config.suggestions.by_type.tip=Максимальное количество рекомендаций, которые должны отображаться по типу приложения
|
||||
core.config.types.tip=Отметьте типы приложений, которыми вы хотите управлять
|
||||
core.config.ui.auto_scale=Автоматическое масштабирование
|
||||
core.config.ui.auto_scale.tip=Он активирует автоматический коэффициент масштабирования экрана ({}),тем самым устраняет проблемы масштабирования для некоторых сред рабочего стола
|
||||
core.config.updates.sort_pkgs=Обновление сортировки
|
||||
core.config.updates.sort_pkgs.tip=Определяет оптимальный порядок обновления для выбранных приложений / пакетов, чтобы избежать проблем
|
||||
core.config.updates.dep_check=Показать требования к обновлению
|
||||
core.config.updates.dep_check.tip=Отображает все зависимости, которые необходимо установить перед началом обновления выбранных
|
||||
settings.changed.success.warning=Настройки успешно изменены. Некоторые из них вступят в силу только после перезагрузки.
|
||||
settings.changed.success.reboot=Перезапустить сейчас ?
|
||||
settings.error=Невозможно было правильно изменить все настройки
|
||||
locale.en=Английский
|
||||
locale.es=Испанский
|
||||
locale.pt=Поргтугальский
|
||||
core.config.updates.interval=Интервал обновления
|
||||
core.config.updates.interval.tip=Определяет интервал времени, в течение которого будет происходить проверка обновлений для установленных приложений ( в секундах )
|
||||
custom_action.proceed_with=Proceed with {} ?
|
||||
description=Описание
|
||||
details=Детали
|
||||
devices=devices
|
||||
do_not.install=не устанавливать
|
||||
downgraded=Произведён откат
|
||||
download=Загрузка
|
||||
downloading=Загрузка
|
||||
error=Ошибка
|
||||
example.short=К примеру
|
||||
exit=Выход
|
||||
file=файл
|
||||
file_chooser.title=Выбор файлов
|
||||
files=Файлы
|
||||
finishing=finishing
|
||||
gem_selector.question=Какие типы приложений вы хотите здесь найти ?
|
||||
gem_selector.title=Типы приложений
|
||||
general=general
|
||||
icon_button.tooltip.disabled=Это действие недоступно
|
||||
imported=импортировано
|
||||
initialization=инициализация
|
||||
install=Установка
|
||||
installation=Установка
|
||||
installed=Установлено
|
||||
internet.required=Требуется подключение к интернету
|
||||
interval=Интервал
|
||||
latest_version=Последняя версия
|
||||
license=лизензия
|
||||
locale.ca=Каталонский
|
||||
locale.de=Немецкий
|
||||
locale.en=Английский
|
||||
locale.es=Испанский
|
||||
locale.it=Итальянский
|
||||
locale.pt=Поргтугальский
|
||||
locale.ru=Русский
|
||||
interval=Интервал
|
||||
installation=Установка
|
||||
download=Загрузка
|
||||
clean=Очистка
|
||||
action.update.status.sorting=Определение наилучшего порядка обновления
|
||||
action.update.requirements.title=Требования к обновлению
|
||||
action.update.requirements.body=Перед обновлением необходимо установить следующие зависимости {}
|
||||
action.update.install_req.fail.title=Установка не удалась
|
||||
action.update.install_req.fail.body=Невозможно установить {}
|
||||
action.update.requirements.status=Проверка требований
|
||||
action.update.order.title=Порядок обновления
|
||||
action.update.order.body=Обновление будет выполнено в следующем порядке
|
||||
manage_window.apps_table.row.actions.downgrade=Откат версии
|
||||
manage_window.apps_table.row.actions.downgrade.popup.body=Вы действительно хотите откатить версию {}?
|
||||
manage_window.apps_table.row.actions.history=История версий
|
||||
manage_window.apps_table.row.actions.info=Информация
|
||||
manage_window.apps_table.row.actions.install=Установка
|
||||
manage_window.apps_table.row.actions.install.popup.body=Установить {} на Ваше устройство?
|
||||
manage_window.apps_table.row.actions.install.popup.title=Установка
|
||||
manage_window.apps_table.row.actions.refresh=Обновить список
|
||||
manage_window.apps_table.row.actions.uninstall=Uninstall
|
||||
manage_window.apps_table.row.actions.uninstall.popup.body=Удалить {} с Вашего устройства?
|
||||
manage_window.apps_table.row.actions.uninstall.popup.title=Удаление
|
||||
manage_window.apps_table.upgrade_toggle.disabled.tooltip=Но обновить его невозможно.
|
||||
manage_window.apps_table.upgrade_toggle.enabled.tooltip=Нажмите здесь, чтобы поставить или снять флажок обновления.
|
||||
manage_window.apps_table.upgrade_toggle.tooltip=Есть обновление для этого приложения.
|
||||
manage_window.bt.installed.text=Установленные
|
||||
manage_window.bt.installed.tooltip=Нажмите здесь, чтобы показать установленные приложения
|
||||
manage_window.bt.refresh.text=Обновить список
|
||||
manage_window.bt.refresh.tooltip=Перезагрузите данные об установленных приложениях
|
||||
manage_window.bt.suggestions.text=Рекомендации
|
||||
manage_window.bt.suggestions.tooltip=Нажмите здесь, чтобы показать некоторые рекомендаваные приложения
|
||||
manage_window.bt.upgrade.text=Обновление
|
||||
manage_window.bt.upgrade.tooltip=Обновить все выбранные приложения
|
||||
manage_window.bt_custom_actions.tip=Нажмите здесь, чтобы показать больше действий
|
||||
manage_window.bt_settings.tooltip=Нажмите здесь, чтобы отобразить настройки
|
||||
manage_window.checkbox.only_apps=Приложения
|
||||
manage_window.checkbox.show_details=Показать детали
|
||||
manage_window.columns.installed=Installed
|
||||
manage_window.columns.latest_version=Последняя версия
|
||||
manage_window.columns.update=Обновить?
|
||||
manage_window.label.updates=Обновления
|
||||
manage_window.name_filter.placeholder=Фильтр по имени
|
||||
manage_window.name_filter.tooltip=Введите здесь, чтобы фильтровать приложения по имени
|
||||
manage_window.settings.about=О программе
|
||||
manage_window.status.downgrading=Откатить
|
||||
manage_window.status.filtering=Фильтрация
|
||||
manage_window.status.history=Извлечение истории
|
||||
manage_window.status.info=Извлечение информации
|
||||
manage_window.status.installed=Загрузка установленных
|
||||
manage_window.status.installing=Установить
|
||||
manage_window.status.refreshing=Обновляется
|
||||
manage_window.status.refreshing_app=Обновляется
|
||||
manage_window.status.running_app=Запускается {}
|
||||
manage_window.status.screenshots=Получение скриншотов {}
|
||||
manage_window.status.searching=Поиск
|
||||
manage_window.status.suggestions=Поиск рекомендаций
|
||||
manage_window.status.uninstalling=Удалить
|
||||
manage_window.status.upgrading=Обновление
|
||||
manage_window.title=Мои приложения
|
||||
manage_window.upgrade_all.popup.body=Обновить все выбранные приложения ?
|
||||
manage_window.upgrade_all.popup.title=Обновление
|
||||
message.file.not_exist=Файл не существует
|
||||
message.file.not_exist.body=Файл {}, кажется, не существует
|
||||
mirror=Зеркало
|
||||
name=Имя
|
||||
no=Нет
|
||||
not_installed=Не установлено
|
||||
notification.downgrade.failed=Откат не удался
|
||||
notification.install.failed=Установка не удалась
|
||||
notification.uninstall.failed=Удаление не удалось
|
||||
notification.update_selected.failed=Обновление не удалось
|
||||
notification.update_selected.success=Приложение(я) успешно обновлено(ы)
|
||||
ok=ok
|
||||
others=Другие
|
||||
popup.button.cancel=Отмена
|
||||
popup.button.no=Нет
|
||||
popup.button.yes=Да
|
||||
popup.history.selected.tooltip=Текущая версия
|
||||
popup.history.title=История версий
|
||||
popup.root.bad_password.body=Неправильный пароль
|
||||
popup.root.bad_password.last_try=Закончились попытки. Отмена действия.
|
||||
popup.root.bad_password.title=Ошибка
|
||||
popup.root.continue=Продолжить
|
||||
popup.root.title=Требуется ваш пароль, чтобы продолжить
|
||||
popup.screenshots.no_screenshot.body=не удалось получить скриншоты {}
|
||||
prepare_panel.bt_skip.label=Пропустить
|
||||
prepare_panel.title.finish=Ready
|
||||
prepare_panel.title.start=Initializing
|
||||
proceed=Продолжить
|
||||
publisher=издатель
|
||||
publisher.verified=Проверенный
|
||||
repository=Репозиторий
|
||||
screenshots.bt_back.label=Предыдущий
|
||||
screenshots.bt_next.label=Следующий
|
||||
screenshots.download.no_content=Нет материалов для отображени
|
||||
screenshots.download.no_response=Изображение не найдено
|
||||
screenshots.download.running=Загрузка изображения
|
||||
settings=Настройки
|
||||
settings.changed.success.reboot=Перезапустить сейчас?
|
||||
settings.changed.success.warning=Настройки успешно изменены. Некоторые из них вступят в силу только после перезагрузки.
|
||||
settings.error=Не удалось правильно изменить все настройки
|
||||
show=Показать
|
||||
size=Размер
|
||||
source=Источник
|
||||
stable=Стабильная
|
||||
status.caching_data=Кэширование данных {} на диск
|
||||
style=Стиль
|
||||
success=success
|
||||
summary=Суммарно
|
||||
task.download_categories=Downloading categories [ {} ]
|
||||
type=Тип
|
||||
uninstall=Деинсталляция
|
||||
uninstalled=Деинсталлировано
|
||||
unknown=неизвестный
|
||||
updates=Обновления
|
||||
user=Пользователь
|
||||
version=Версия
|
||||
version.installed=Установленная версия
|
||||
version.installed_outdated=Установленная версия устарела
|
||||
version.latest=Последняя версия
|
||||
version.outdated=Устаревшая
|
||||
version.unknown=не сообщать
|
||||
version.updated=Обновленная
|
||||
view.components.file_chooser.placeholder=Нажмите здесь, чтобы выбрать
|
||||
warning=Предупреждение
|
||||
warning.update_available=There is a new {} update available ({}). Checkout the news at {}.
|
||||
welcome=Добро пожаловать!
|
||||
window_manage.input_search.placeholder=Поиск
|
||||
window_manage.input_search.tooltip=Введите и нажмите ENTER для поиска приложений
|
||||
yes=Да
|
||||
7
bauh/view/resources/locale/tray/ca
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Aplicacions
|
||||
tray.action.exit=Surt
|
||||
tray.action.about=Quant a
|
||||
tray.action.refreshing=Refrescant
|
||||
tray.settings=configuració
|
||||
notification.update={} actualització disponible
|
||||
notification.updates={} actualitzacions disponibles
|
||||
7
bauh/view/resources/locale/tray/de
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Anwendungen
|
||||
tray.action.exit=Beenden
|
||||
tray.action.about=Über
|
||||
tray.action.refreshing=Aktualisieren
|
||||
tray.settings=Einstellungen
|
||||
notification.update={} Update verfügbar
|
||||
notification.updates={} Updates verfügbar
|
||||
7
bauh/view/resources/locale/tray/en
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Applications
|
||||
tray.action.exit=Quit
|
||||
tray.action.about=About
|
||||
tray.action.refreshing=Refreshing
|
||||
tray.settings=Settings
|
||||
notification.update={} available update
|
||||
notification.updates={} available updates
|
||||
7
bauh/view/resources/locale/tray/es
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Aplicaciones
|
||||
tray.action.exit=Cerrar
|
||||
tray.action.about=Acerca de
|
||||
tray.action.refreshing=Recargando
|
||||
tray.settings=configuraciones
|
||||
notification.update={} actualización disponible
|
||||
notification.updates={} actualizaciones disponibles
|
||||
7
bauh/view/resources/locale/tray/it
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Applicazioni
|
||||
tray.action.exit=Abbandona
|
||||
tray.action.about=Informazioni su
|
||||
tray.action.refreshing=Refreshing
|
||||
tray.settings=impostazioni
|
||||
notification.update={} aggiornamento disponibile
|
||||
notification.updates={} aggiornamenti disponibile
|
||||
7
bauh/view/resources/locale/tray/pt
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Aplicativos
|
||||
tray.action.exit=Fechar
|
||||
tray.action.about=Sobre
|
||||
tray.action.refreshing=Recarregando
|
||||
tray.settings=Configurações
|
||||
notification.update={} atualização disponível
|
||||
notification.updates={} atualizações disponíveis
|
||||
7
bauh/view/resources/locale/tray/ru
Normal file
@@ -0,0 +1,7 @@
|
||||
tray.action.manage=Приложения
|
||||
tray.action.exit=Выход
|
||||
tray.action.about=О программе
|
||||
tray.action.refreshing=Обновляется
|
||||
tray.settings=Настройки
|
||||
notification.update={} обновления доступно
|
||||
notification.updates={} обновлений доступно
|
||||
@@ -97,7 +97,7 @@ class CacheCleaner(Thread):
|
||||
|
||||
class DefaultMemoryCacheFactory(MemoryCacheFactory):
|
||||
|
||||
def __init__(self, expiration_time: int, cleaner: CacheCleaner):
|
||||
def __init__(self, expiration_time: int, cleaner: CacheCleaner = None):
|
||||
"""
|
||||
:param expiration_time: default expiration time for all instantiated caches
|
||||
:param cleaner
|
||||
@@ -108,5 +108,8 @@ class DefaultMemoryCacheFactory(MemoryCacheFactory):
|
||||
|
||||
def new(self, expiration: int = None) -> MemoryCache:
|
||||
instance = DefaultMemoryCache(expiration if expiration is not None else self.expiration_time)
|
||||
self.cleaner.register(instance)
|
||||
|
||||
if self.cleaner:
|
||||
self.cleaner.register(instance)
|
||||
|
||||
return instance
|
||||
|
||||
@@ -14,13 +14,12 @@ from bauh.api.abstract.model import SoftwarePackage
|
||||
|
||||
class AsyncDiskCacheLoader(Thread, DiskCacheLoader):
|
||||
|
||||
def __init__(self, enabled: bool, cache_map: Dict[Type[SoftwarePackage], MemoryCache], logger: logging.Logger):
|
||||
def __init__(self, cache_map: Dict[Type[SoftwarePackage], MemoryCache], logger: logging.Logger):
|
||||
super(AsyncDiskCacheLoader, self).__init__(daemon=True)
|
||||
self.pkgs = []
|
||||
self._work = True
|
||||
self.lock = Lock()
|
||||
self.cache_map = cache_map
|
||||
self.enabled = enabled
|
||||
self.logger = logger
|
||||
self.processed = 0
|
||||
|
||||
@@ -30,64 +29,62 @@ class AsyncDiskCacheLoader(Thread, DiskCacheLoader):
|
||||
:param pkg:
|
||||
:return:
|
||||
"""
|
||||
if self.enabled and pkg and pkg.supports_disk_cache():
|
||||
if pkg and pkg.supports_disk_cache():
|
||||
self.pkgs.append(pkg)
|
||||
|
||||
def stop_working(self):
|
||||
self._work = False
|
||||
|
||||
def run(self):
|
||||
if self.enabled:
|
||||
last = 0
|
||||
last = 0
|
||||
|
||||
while True:
|
||||
time.sleep(0.00001)
|
||||
if len(self.pkgs) > self.processed:
|
||||
pkg = self.pkgs[last]
|
||||
while True:
|
||||
time.sleep(0.00001)
|
||||
if len(self.pkgs) > self.processed:
|
||||
pkg = self.pkgs[last]
|
||||
|
||||
self._fill_cached_data(pkg)
|
||||
self.processed += 1
|
||||
last += 1
|
||||
elif not self._work:
|
||||
break
|
||||
self._fill_cached_data(pkg)
|
||||
self.processed += 1
|
||||
last += 1
|
||||
elif not self._work:
|
||||
break
|
||||
|
||||
def _fill_cached_data(self, pkg: SoftwarePackage) -> bool:
|
||||
if self.enabled:
|
||||
if os.path.exists(pkg.get_disk_data_path()):
|
||||
disk_path = pkg.get_disk_data_path()
|
||||
ext = disk_path.split('.')[-1]
|
||||
if os.path.exists(pkg.get_disk_data_path()):
|
||||
disk_path = pkg.get_disk_data_path()
|
||||
ext = disk_path.split('.')[-1]
|
||||
|
||||
with open(disk_path) as f:
|
||||
if ext == 'json':
|
||||
cached_data = json.loads(f.read())
|
||||
elif ext in {'yml', 'yaml'}:
|
||||
cached_data = yaml.load(f.read())
|
||||
else:
|
||||
raise Exception('The cached data file {} has an unsupported format'.format(disk_path))
|
||||
with open(disk_path) as f:
|
||||
if ext == 'json':
|
||||
cached_data = json.loads(f.read())
|
||||
elif ext in {'yml', 'yaml'}:
|
||||
cached_data = yaml.load(f.read())
|
||||
else:
|
||||
raise Exception('The cached data file {} has an unsupported format'.format(disk_path))
|
||||
|
||||
if cached_data:
|
||||
pkg.fill_cached_data(cached_data)
|
||||
cache = self.cache_map.get(pkg.__class__)
|
||||
if cached_data:
|
||||
pkg.fill_cached_data(cached_data)
|
||||
cache = self.cache_map.get(pkg.__class__)
|
||||
|
||||
if cache:
|
||||
cache.add_non_existing(pkg.id, cached_data)
|
||||
if cache:
|
||||
cache.add_non_existing(str(pkg.id), cached_data)
|
||||
|
||||
return True
|
||||
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
class DefaultDiskCacheLoaderFactory(DiskCacheLoaderFactory):
|
||||
|
||||
def __init__(self, disk_cache_enabled: bool, logger: logging.Logger):
|
||||
def __init__(self, logger: logging.Logger):
|
||||
super(DefaultDiskCacheLoaderFactory, self).__init__()
|
||||
self.disk_cache_enabled = disk_cache_enabled
|
||||
self.logger = logger
|
||||
self.cache_map = {}
|
||||
|
||||
def map(self, pkg_type: Type[SoftwarePackage], cache: MemoryCache):
|
||||
if pkg_type:
|
||||
if pkg_type not in self.cache_map:
|
||||
self.cache_map[pkg_type] = cache
|
||||
self.cache_map[pkg_type] = cache
|
||||
|
||||
def new(self) -> AsyncDiskCacheLoader:
|
||||
return AsyncDiskCacheLoader(enabled=self.disk_cache_enabled, cache_map=self.cache_map, logger=self.logger)
|
||||
return AsyncDiskCacheLoader(cache_map=self.cache_map, logger=self.logger)
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import glob
|
||||
import locale
|
||||
import traceback
|
||||
import os
|
||||
from typing import Tuple, Set
|
||||
|
||||
from colorama import Fore
|
||||
|
||||
from bauh.view.util import resource
|
||||
|
||||
|
||||
@@ -43,7 +41,7 @@ class I18n(dict):
|
||||
|
||||
def get_available_keys() -> Set[str]:
|
||||
locale_dir = resource.get_path('locale')
|
||||
return {file.split('/')[-1] for file in glob.glob(locale_dir + '/*')}
|
||||
return {file.split('/')[-1] for file in glob.glob(locale_dir + '/*') if os.path.isfile(file)}
|
||||
|
||||
|
||||
def get_locale_keys(key: str = None, locale_dir: str = resource.get_path('locale')) -> Tuple[str, dict]:
|
||||
|
||||
@@ -25,25 +25,22 @@ def notify_user(msg: str, icon_path: str = None):
|
||||
os.system("notify-send -a {} {} '{}'".format(__app_name__, "-i {}".format(icon_id) if icon_id else '', msg))
|
||||
|
||||
|
||||
def get_default_icon() -> Tuple[str, QIcon]:
|
||||
system_icon = QIcon.fromTheme(__app_name__)
|
||||
if not system_icon.isNull():
|
||||
return system_icon.name(), system_icon
|
||||
else:
|
||||
path = resource.get_path('img/logo.svg')
|
||||
return path, QIcon(path)
|
||||
def get_default_icon(system: bool = True) -> Tuple[str, QIcon]:
|
||||
if system:
|
||||
system_icon = QIcon.fromTheme(__app_name__)
|
||||
if not system_icon.isNull():
|
||||
return system_icon.name(), system_icon
|
||||
|
||||
path = resource.get_path('img/logo.svg')
|
||||
return path, QIcon(path)
|
||||
|
||||
|
||||
def restart_app(show_panel: bool):
|
||||
def restart_app():
|
||||
"""
|
||||
:param show_panel: if the panel should be displayed after the app restart
|
||||
:return:
|
||||
"""
|
||||
restart_cmd = [sys.executable, *sys.argv]
|
||||
|
||||
if show_panel:
|
||||
restart_cmd.append('--show-panel')
|
||||
|
||||
subprocess.Popen(restart_cmd)
|
||||
QCoreApplication.exit()
|
||||
|
||||
|
||||