mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-07 02:24:16 +02:00
AUR bearhub: fix stale source cache collision (pkgrel=10)
Use tag-specific tarball name bearhub-0.10.7-bearhub.6.tar.gz so makepkg and AUR helpers do not reuse an outdated bearhub-0.10.7.tar.gz from cache. Ignore makepkg artifacts under packaging/aur/.
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
import os
|
||||
|
||||
from bauh import __app_name__
|
||||
from bauh.api.paths import DESKTOP_ENTRIES_DIR, CONFIG_DIR, TEMP_DIR, CACHE_DIR, SHARED_FILES_DIR
|
||||
from bauh.commons import resource
|
||||
from bauh.commons.util import map_timestamp_file
|
||||
|
||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
WEB_SHARED_DIR = f'{SHARED_FILES_DIR}/web'
|
||||
WEB_CACHE_DIR = f'{CACHE_DIR}/web'
|
||||
INSTALLED_PATH = f'{WEB_SHARED_DIR}/installed'
|
||||
ENV_PATH = f'{WEB_SHARED_DIR}/env'
|
||||
FIX_FILE_PATH = WEB_SHARED_DIR + '/fixes/{electron_branch}/{app_id}.js'
|
||||
NODE_DIR_PATH = f'{ENV_PATH}/node'
|
||||
NODE_PATHS = {f'{NODE_DIR_PATH}/bin'}
|
||||
NODE_BIN_PATH = f'{NODE_DIR_PATH}/bin/node'
|
||||
NPM_BIN_PATH = f'{NODE_DIR_PATH}/bin/npm'
|
||||
NODE_MODULES_PATH = f'{ENV_PATH}/node_modules'
|
||||
NATIVEFIER_BIN_PATH = f'{NODE_MODULES_PATH}/.bin/nativefier'
|
||||
ELECTRON_CACHE_DIR = f'{ENV_PATH}/electron'
|
||||
URL_ENVIRONMENT_SETTINGS = f'https://raw.githubusercontent.com/vinifmor/bauh-files/master/web/env/v2/environment.yml'
|
||||
DESKTOP_ENTRY_PATH_PATTERN = f'{DESKTOP_ENTRIES_DIR}/{__app_name__}.web.' + '{name}.desktop'
|
||||
URL_FIX_PATTERN = "https://raw.githubusercontent.com/vinifmor/bauh-files/master/web/env/v2/fix/{domain}/{electron_branch}/fix.js"
|
||||
URL_PROPS_PATTERN = "https://raw.githubusercontent.com/vinifmor/bauh-files/master/web/env/v2/fix/{domain}/{electron_branch}/properties"
|
||||
UA_CHROME = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
|
||||
TEMP_PATH = f'{TEMP_DIR}/web'
|
||||
SEARCH_INDEX_FILE = f'{WEB_CACHE_DIR}/index.yml'
|
||||
CONFIG_FILE = f'{CONFIG_DIR}/web.yml'
|
||||
ENVIRONMENT_SETTINGS_CACHED_FILE = f'{WEB_CACHE_DIR}/environment.yml'
|
||||
ENVIRONMENT_SETTINGS_TS_FILE = f'{WEB_CACHE_DIR}/environment.ts'
|
||||
|
||||
|
||||
def get_icon_path() -> str:
|
||||
return resource.get_path('img/web.svg', ROOT_DIR)
|
||||
@@ -1,20 +0,0 @@
|
||||
from bauh.commons.config import YAMLConfigManager
|
||||
from bauh.gems.web import CONFIG_FILE
|
||||
|
||||
|
||||
class WebConfigManager(YAMLConfigManager):
|
||||
|
||||
def __init__(self):
|
||||
super(WebConfigManager, self).__init__(config_file_path=CONFIG_FILE)
|
||||
|
||||
def get_default_config(self) -> dict:
|
||||
return {
|
||||
'environment': {
|
||||
'system': False,
|
||||
'electron': {'version': None},
|
||||
'cache_exp': 24
|
||||
},
|
||||
'suggestions': {
|
||||
'cache_exp': 24
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,459 +0,0 @@
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import tarfile
|
||||
import traceback
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
from threading import Thread
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
import requests
|
||||
import yaml
|
||||
|
||||
from bauh.api.abstract.download import FileDownloader
|
||||
from bauh.api.abstract.handler import ProcessWatcher, TaskManager
|
||||
from bauh.api.abstract.view import MessageType
|
||||
from bauh.api.http import HttpClient
|
||||
from bauh.commons import system
|
||||
from bauh.commons.html import bold
|
||||
from bauh.commons.system import SimpleProcess, ProcessHandler
|
||||
from bauh.gems.web import ENV_PATH, NODE_DIR_PATH, NODE_BIN_PATH, NODE_MODULES_PATH, NATIVEFIER_BIN_PATH, \
|
||||
ELECTRON_CACHE_DIR, URL_ENVIRONMENT_SETTINGS, NPM_BIN_PATH, NODE_PATHS, \
|
||||
nativefier, ENVIRONMENT_SETTINGS_CACHED_FILE, ENVIRONMENT_SETTINGS_TS_FILE, get_icon_path
|
||||
from bauh.gems.web.model import WebApplication
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class EnvironmentComponent:
|
||||
|
||||
def __init__(self, id: str, name: str, size: str, version: str, url: str, update: bool = False, properties: Optional[dict] = None):
|
||||
self.id = id
|
||||
self.name = name
|
||||
self.size = size
|
||||
self.version = version
|
||||
self.url = url
|
||||
self.update = update
|
||||
self.properties = properties
|
||||
|
||||
|
||||
class EnvironmentUpdater:
|
||||
|
||||
def __init__(self, logger: logging.Logger, http_client: HttpClient, file_downloader: FileDownloader, i18n: I18n, taskman: Optional[TaskManager] = None):
|
||||
self.logger = logger
|
||||
self.file_downloader = file_downloader
|
||||
self.i18n = i18n
|
||||
self.http_client = http_client
|
||||
self.task_read_settings_id = 'web_read_settings'
|
||||
self.taskman = taskman
|
||||
|
||||
def _install_nodejs(self, version: str, version_url: str, watcher: ProcessWatcher) -> bool:
|
||||
self.logger.info(f"Downloading NodeJS {version}: {version_url}")
|
||||
|
||||
tarf_path = f"{ENV_PATH}/{version_url.split('/')[-1]}"
|
||||
downloaded = self.file_downloader.download(version_url, watcher=watcher, output_path=tarf_path, cwd=ENV_PATH)
|
||||
|
||||
if not downloaded:
|
||||
self.logger.error(f"Could not download '{version_url}'. Aborting...")
|
||||
return False
|
||||
else:
|
||||
try:
|
||||
tf = tarfile.open(tarf_path)
|
||||
tf.extractall(path=ENV_PATH)
|
||||
|
||||
extracted_file = f'{ENV_PATH}/{tf.getnames()[0]}'
|
||||
|
||||
if os.path.exists(NODE_DIR_PATH):
|
||||
self.logger.info(f"Removing old NodeJS version installation dir -> {NODE_DIR_PATH}")
|
||||
try:
|
||||
shutil.rmtree(NODE_DIR_PATH)
|
||||
except Exception:
|
||||
self.logger.error(f"Could not delete old NodeJS version dir -> {NODE_DIR_PATH}")
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
try:
|
||||
os.rename(extracted_file, NODE_DIR_PATH)
|
||||
except Exception:
|
||||
self.logger.error(f"Could not rename the NodeJS version file {extracted_file} as {NODE_DIR_PATH}")
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
if os.path.exists(NODE_MODULES_PATH):
|
||||
self.logger.info(f'Deleting {NODE_MODULES_PATH}')
|
||||
try:
|
||||
shutil.rmtree(NODE_MODULES_PATH)
|
||||
except Exception:
|
||||
self.logger.error(f"Could not delete the directory {NODE_MODULES_PATH}")
|
||||
return False
|
||||
|
||||
return True
|
||||
except Exception:
|
||||
self.logger.error(f'Could not extract {tarf_path}')
|
||||
traceback.print_exc()
|
||||
return False
|
||||
finally:
|
||||
if os.path.exists(tarf_path):
|
||||
try:
|
||||
os.remove(tarf_path)
|
||||
except Exception:
|
||||
self.logger.error(f'Could not delete file {tarf_path}')
|
||||
|
||||
def check_node_installed(self, version: str) -> bool:
|
||||
if not os.path.exists(NODE_DIR_PATH):
|
||||
return False
|
||||
else:
|
||||
installed_version = system.run_cmd(f'{NODE_BIN_PATH} --version', print_error=False)
|
||||
|
||||
if installed_version:
|
||||
installed_version = installed_version.strip()
|
||||
|
||||
if installed_version.startswith('v'):
|
||||
installed_version = installed_version[1:]
|
||||
|
||||
self.logger.info(f'Node versions: installed ({installed_version}), cloud ({version})')
|
||||
|
||||
if version != installed_version:
|
||||
self.logger.info("The NodeJs installed version is different from the Cloud.")
|
||||
return False
|
||||
else:
|
||||
self.logger.info("Node is already up to date")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning("Could not determine the current NodeJS installed version")
|
||||
return False
|
||||
|
||||
def update_node(self, version: str, version_url: str, watcher: ProcessWatcher = None) -> bool:
|
||||
Path(ENV_PATH).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if not os.path.exists(NODE_DIR_PATH):
|
||||
return self._install_nodejs(version=version, version_url=version_url, watcher=watcher)
|
||||
else:
|
||||
installed_version = system.run_cmd('{} --version'.format(NODE_BIN_PATH), print_error=False)
|
||||
|
||||
if installed_version:
|
||||
installed_version = installed_version.strip()
|
||||
|
||||
if installed_version.startswith('v'):
|
||||
installed_version = installed_version[1:]
|
||||
|
||||
self.logger.info(f'Node versions: installed ({installed_version}), cloud ({version})')
|
||||
|
||||
if version != installed_version:
|
||||
self.logger.info("The NodeJs installed version is different from the Cloud.")
|
||||
return self._install_nodejs(version=version, version_url=version_url, watcher=watcher)
|
||||
else:
|
||||
self.logger.info("Node is already up to date")
|
||||
return True
|
||||
else:
|
||||
self.logger.warning("Could not determine the current NodeJS installed version")
|
||||
self.logger.info(f"Removing {NODE_DIR_PATH}")
|
||||
try:
|
||||
shutil.rmtree(NODE_DIR_PATH)
|
||||
return self._install_nodejs(version=version, version_url=version_url, watcher=watcher)
|
||||
except Exception:
|
||||
self.logger.error(f'Could not delete the dir {NODE_DIR_PATH}')
|
||||
return False
|
||||
|
||||
def _install_node_lib(self, name: str, version: str, handler: ProcessHandler):
|
||||
lib_repr = f"{name}{'@{}'.format(version) if version else ''}"
|
||||
self.logger.info(f"Installing {lib_repr}")
|
||||
|
||||
if handler and handler.watcher:
|
||||
handler.watcher.change_substatus(self.i18n['web.environment.install'].format(bold(lib_repr)))
|
||||
|
||||
proc = SimpleProcess([NPM_BIN_PATH, 'install', lib_repr], cwd=ENV_PATH, extra_paths=NODE_PATHS)
|
||||
|
||||
installed = handler.handle_simple(proc)[0]
|
||||
|
||||
if installed:
|
||||
self.logger.info(f"{lib_repr} successfully installed")
|
||||
|
||||
return installed
|
||||
|
||||
def _install_nativefier(self, version: str, url: str, handler: ProcessHandler) -> bool:
|
||||
self.logger.info(f"Checking if nativefier@{version} exists")
|
||||
|
||||
if not url or not self.http_client.exists(url):
|
||||
self.logger.warning(f"The file {url} seems not to exist")
|
||||
handler.watcher.show_message(title=self.i18n['message.file.not_exist'],
|
||||
body=self.i18n['message.file.not_exist.body'].format(bold(url)),
|
||||
type_=MessageType.ERROR)
|
||||
return False
|
||||
|
||||
success = self._install_node_lib('nativefier', version, handler)
|
||||
|
||||
if success:
|
||||
return self._is_nativefier_installed()
|
||||
|
||||
def _is_nativefier_installed(self) -> bool:
|
||||
return os.path.exists(NATIVEFIER_BIN_PATH)
|
||||
|
||||
def _get_electron_url(self, version: str, base_url: str, is_x86_x64_arch: bool) -> str:
|
||||
return base_url.format(version=version, arch='x64' if is_x86_x64_arch else 'ia32')
|
||||
|
||||
def check_electron_installed(self, version: str, base_url: str, is_x86_x64_arch: bool, widevine: bool) -> Dict[str, bool]:
|
||||
self.logger.info(f"Checking if Electron {version} (widevine={widevine}) is installed")
|
||||
res = {'electron': False, 'sha256': False}
|
||||
|
||||
if not os.path.exists(ELECTRON_CACHE_DIR):
|
||||
self.logger.info(f"Electron cache directory {ELECTRON_CACHE_DIR} not found")
|
||||
else:
|
||||
files = {os.path.basename(f) for f in glob.glob(f'{ELECTRON_CACHE_DIR}/**', recursive=True) if os.path.isfile(f)}
|
||||
|
||||
if files:
|
||||
electron_url = self._get_electron_url(version=version, base_url=base_url, is_x86_x64_arch=is_x86_x64_arch)
|
||||
res['electron'] = os.path.basename(electron_url) in files
|
||||
res['sha256'] = res['electron']
|
||||
else:
|
||||
self.logger.info(f"No Electron file found in '{ELECTRON_CACHE_DIR}'")
|
||||
|
||||
for att in ('electron', 'sha256'):
|
||||
if res[att]:
|
||||
self.logger.info(f'{att} ({version}) already downloaded')
|
||||
|
||||
return res
|
||||
|
||||
def _finish_task_download_settings(self):
|
||||
if self.taskman:
|
||||
self.taskman.update_progress(self.task_read_settings_id, 100, None)
|
||||
self.taskman.finish_task(self.task_read_settings_id)
|
||||
|
||||
def should_download_settings(self, web_config: dict) -> bool:
|
||||
try:
|
||||
settings_exp = int(web_config['environment']['cache_exp'])
|
||||
except ValueError:
|
||||
self.logger.error(f"Could not parse settings property 'environment.cache_exp': {web_config['environment']['cache_exp']}")
|
||||
return True
|
||||
|
||||
if settings_exp <= 0:
|
||||
self.logger.info("No expiration time configured for the environment settings cache file.")
|
||||
return True
|
||||
|
||||
self.logger.info("Checking cached environment settings file")
|
||||
|
||||
if not os.path.exists(ENVIRONMENT_SETTINGS_CACHED_FILE):
|
||||
self.logger.warning("Environment settings file not cached.")
|
||||
return True
|
||||
|
||||
if not os.path.exists(ENVIRONMENT_SETTINGS_TS_FILE):
|
||||
self.logger.warning("Environment settings file has no timestamp associated with it.")
|
||||
return True
|
||||
|
||||
with open(ENVIRONMENT_SETTINGS_TS_FILE) as f:
|
||||
env_ts_str = f.read()
|
||||
|
||||
try:
|
||||
env_timestamp = datetime.fromtimestamp(float(env_ts_str), tz=timezone.utc)
|
||||
except Exception:
|
||||
self.logger.error(f"Could not parse environment settings file timestamp: {env_ts_str}")
|
||||
return True
|
||||
|
||||
expired = env_timestamp + timedelta(hours=settings_exp) <= datetime.now(timezone.utc)
|
||||
|
||||
if expired:
|
||||
self.logger.info("Environment settings file has expired. It should be re-downloaded")
|
||||
return True
|
||||
else:
|
||||
self.logger.info("Cached environment settings file is up to date")
|
||||
return False
|
||||
|
||||
def read_cached_settings(self, web_config: dict) -> Optional[dict]:
|
||||
if not self.should_download_settings(web_config):
|
||||
with open(ENVIRONMENT_SETTINGS_CACHED_FILE) as f:
|
||||
cached_settings_str = f.read()
|
||||
|
||||
try:
|
||||
return yaml.safe_load(cached_settings_str)
|
||||
except yaml.YAMLError:
|
||||
self.logger.error(f'Could not parse the cache environment settings file: {cached_settings_str}')
|
||||
|
||||
def read_settings(self, web_config: dict, cache: bool = True) -> Optional[dict]:
|
||||
if self.taskman:
|
||||
self.taskman.register_task(self.task_read_settings_id, self.i18n['web.task.download_settings'], get_icon_path())
|
||||
self.taskman.update_progress(self.task_read_settings_id, 1, None)
|
||||
|
||||
cached_settings = self.read_cached_settings(web_config) if cache else None
|
||||
|
||||
if cached_settings:
|
||||
return cached_settings
|
||||
|
||||
try:
|
||||
if self.taskman:
|
||||
self.taskman.update_progress(self.task_read_settings_id, 10, None)
|
||||
|
||||
self.logger.info("Downloading environment settings")
|
||||
res = self.http_client.get(URL_ENVIRONMENT_SETTINGS)
|
||||
|
||||
if not res:
|
||||
self.logger.warning('Could not retrieve the environments settings from the cloud')
|
||||
self._finish_task_download_settings()
|
||||
return
|
||||
|
||||
try:
|
||||
settings = yaml.safe_load(res.content)
|
||||
nodejs_settings = settings.get('nodejs')
|
||||
|
||||
if nodejs_settings:
|
||||
nodejs_settings['url'] = nodejs_settings['url'].format(version=nodejs_settings['version'])
|
||||
|
||||
except yaml.YAMLError:
|
||||
self.logger.error(f'Could not parse environment settings: {res.text}')
|
||||
self._finish_task_download_settings()
|
||||
return
|
||||
|
||||
self.logger.info("Caching environment settings to disk")
|
||||
cache_dir = os.path.dirname(ENVIRONMENT_SETTINGS_CACHED_FILE)
|
||||
|
||||
try:
|
||||
Path(cache_dir).mkdir(parents=True, exist_ok=True)
|
||||
except OSError:
|
||||
self.logger.error(f"Could not create Web cache directory: {cache_dir}")
|
||||
self.logger.info('Finished')
|
||||
self._finish_task_download_settings()
|
||||
return
|
||||
|
||||
cache_timestamp = datetime.now(timezone.utc).timestamp()
|
||||
with open(ENVIRONMENT_SETTINGS_CACHED_FILE, 'w+') as f:
|
||||
f.write(yaml.safe_dump(settings))
|
||||
|
||||
with open(ENVIRONMENT_SETTINGS_TS_FILE, 'w+') as f:
|
||||
f.write(str(cache_timestamp))
|
||||
|
||||
self._finish_task_download_settings()
|
||||
self.logger.info("Finished")
|
||||
return settings
|
||||
|
||||
except requests.exceptions.ConnectionError:
|
||||
self._finish_task_download_settings()
|
||||
return
|
||||
|
||||
def _check_and_fill_electron(self, pkg: WebApplication, env: dict, local_config: dict, x86_x64: bool, widevine: bool, output: List[EnvironmentComponent]):
|
||||
electron_settings = env['electron-wvvmp' if widevine else 'electron']
|
||||
electron_version = electron_settings['version']
|
||||
|
||||
if not widevine and pkg.version and pkg.version != electron_version: # this feature does not support custom widevine electron at the moment
|
||||
self.logger.info(f'A preset Electron version is defined for {pkg.url}: {pkg.version}')
|
||||
electron_version = pkg.version
|
||||
|
||||
if not widevine and local_config['environment']['electron']['version']:
|
||||
self.logger.warning(f"A custom Electron version will be used {electron_version} to install {pkg.url}")
|
||||
electron_version = local_config['environment']['electron']['version']
|
||||
|
||||
electron_status = self.check_electron_installed(version=electron_version, base_url=electron_settings['url'],
|
||||
is_x86_x64_arch=x86_x64, widevine=widevine)
|
||||
|
||||
electron_url = self._get_electron_url(version=electron_version, base_url=electron_settings['url'], is_x86_x64_arch=x86_x64)
|
||||
|
||||
output.append(EnvironmentComponent(name=electron_url.split('/')[-1],
|
||||
version=electron_version,
|
||||
url=electron_url,
|
||||
size=self.http_client.get_content_length(electron_url),
|
||||
id='electron',
|
||||
update=not electron_status['electron'],
|
||||
properties={'widevine': widevine}))
|
||||
|
||||
sha_url = electron_settings['sha_url'].format(version=electron_version)
|
||||
|
||||
output.append(EnvironmentComponent(name=sha_url.split('/')[-1],
|
||||
version=electron_version,
|
||||
url=sha_url,
|
||||
size=self.http_client.get_content_length(sha_url),
|
||||
id='electron_sha256',
|
||||
update=not electron_status['electron'] or not electron_status['sha256'],
|
||||
properties={'widevine': widevine}))
|
||||
|
||||
def _check_and_fill_node(self, env: dict, output: List[EnvironmentComponent]):
|
||||
node = EnvironmentComponent(name=env['nodejs']['url'].split('/')[-1],
|
||||
url=env['nodejs']['url'],
|
||||
size=self.http_client.get_content_length(env['nodejs']['url']),
|
||||
version=env['nodejs']['version'],
|
||||
id='nodejs')
|
||||
output.append(node)
|
||||
|
||||
native = self._map_nativefier_file(env['nativefier'])
|
||||
output.append(native)
|
||||
|
||||
if not self.check_node_installed(env['nodejs']['version']):
|
||||
node.update, native.update = True, True
|
||||
else:
|
||||
if not self._check_nativefier_installed(env['nativefier']):
|
||||
native.update = True
|
||||
|
||||
def _check_nativefier_installed(self, nativefier_settings: dict) -> bool:
|
||||
if not os.path.exists(NODE_MODULES_PATH):
|
||||
self.logger.info(f'Node modules path {NODE_MODULES_PATH} not found')
|
||||
return False
|
||||
else:
|
||||
if not self._is_nativefier_installed():
|
||||
return False
|
||||
|
||||
installed_version = nativefier.get_version()
|
||||
|
||||
if installed_version:
|
||||
installed_version = installed_version.strip()
|
||||
|
||||
self.logger.info(f"Nativefier versions: installed ({installed_version}), cloud ({nativefier_settings['version']})")
|
||||
|
||||
if nativefier_settings['version'] != installed_version:
|
||||
self.logger.info("Installed nativefier version is different from cloud's. Changing version.")
|
||||
return False
|
||||
|
||||
self.logger.info("Nativefier is already installed and up to date")
|
||||
return True
|
||||
|
||||
def _map_nativefier_file(self, nativefier_settings: dict) -> EnvironmentComponent:
|
||||
url = nativefier_settings['url'].format(version=nativefier_settings['version'])
|
||||
return EnvironmentComponent(name=f"nativefier@{nativefier_settings['version']}",
|
||||
url=url,
|
||||
size=self.http_client.get_content_length(url),
|
||||
version=nativefier_settings['version'],
|
||||
id='nativefier')
|
||||
|
||||
def check_environment(self, env: dict, local_config: dict, app: WebApplication,
|
||||
is_x86_x64_arch: bool, widevine: bool) -> List[EnvironmentComponent]:
|
||||
|
||||
components, check_threads = [], []
|
||||
|
||||
system_env = local_config['environment'].get('system', False)
|
||||
|
||||
if system_env:
|
||||
self.logger.warning(f"Using system's nativefier to install {app.url}")
|
||||
else:
|
||||
node_check = Thread(target=self._check_and_fill_node, args=(env, components), daemon=True)
|
||||
node_check.start()
|
||||
check_threads.append(node_check)
|
||||
|
||||
elec_check = Thread(target=self._check_and_fill_electron,
|
||||
args=(app, env, local_config, is_x86_x64_arch, widevine, components),
|
||||
daemon=True)
|
||||
elec_check.start()
|
||||
check_threads.append(elec_check)
|
||||
|
||||
for t in check_threads:
|
||||
t.join()
|
||||
|
||||
return components
|
||||
|
||||
def update(self, components: List[EnvironmentComponent], handler: ProcessHandler) -> bool:
|
||||
self.logger.info('Updating environment')
|
||||
Path(ENV_PATH).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
comp_map = {c.id: c for c in components}
|
||||
|
||||
node_data = comp_map.get('nodejs')
|
||||
nativefier_data = comp_map.get('nativefier')
|
||||
|
||||
if node_data:
|
||||
if not self._install_nodejs(version=node_data.version, version_url=node_data.url, watcher=handler.watcher):
|
||||
return False
|
||||
|
||||
if not self._install_nativefier(version=nativefier_data.version, url=nativefier_data.url, handler=handler):
|
||||
return False
|
||||
else:
|
||||
if nativefier_data and not self._install_nativefier(version=nativefier_data.version, url=nativefier_data.url, handler=handler):
|
||||
return False
|
||||
|
||||
self.logger.info('Environment successfully updated')
|
||||
return True
|
||||
@@ -1,162 +0,0 @@
|
||||
import glob
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import List, Optional
|
||||
|
||||
from bauh import __app_name__
|
||||
from bauh.api import user
|
||||
from bauh.api.abstract.model import SoftwarePackage
|
||||
from bauh.api.paths import AUTOSTART_DIR
|
||||
from bauh.commons import resource
|
||||
from bauh.gems.web import ROOT_DIR
|
||||
|
||||
|
||||
class WebApplication(SoftwarePackage):
|
||||
|
||||
def __init__(self, id: Optional[str] = None, url: Optional[str] = None, name: Optional[str] = None, description: Optional[str] = None,
|
||||
icon_url: Optional[str] = None, installation_dir: Optional[str] = None, desktop_entry: Optional[str] = None,
|
||||
installed: bool = False, version: Optional[str] = None, categories: Optional[List[str]] = None,
|
||||
custom_icon: Optional[str] = None, preset_options: Optional[List[str]] = None, save_icon: bool = True,
|
||||
options_set: Optional[List[str]] = None, package_name: Optional[str] = None, source_url: Optional[str] = None,
|
||||
user_agent: Optional[str] = None):
|
||||
super(WebApplication, self).__init__(id=id if id else url, name=name, description=description,
|
||||
icon_url=icon_url, installed=installed, version=version,
|
||||
categories=categories)
|
||||
self.url = url
|
||||
self.source_url = source_url if source_url else url
|
||||
self.installation_dir = installation_dir
|
||||
self.desktop_entry = desktop_entry
|
||||
self.preset_options = preset_options
|
||||
self.save_icon = save_icon # if the icon_url should be used instead of the one retrieved by nativefier
|
||||
self.options_set = options_set
|
||||
self.package_name = package_name
|
||||
self.custom_icon = custom_icon
|
||||
self.set_custom_icon(custom_icon)
|
||||
self.user_agent = user_agent
|
||||
|
||||
def get_source_url(self):
|
||||
if self.source_url:
|
||||
return self.source_url
|
||||
|
||||
return self.url
|
||||
|
||||
def set_version(self, version: str):
|
||||
self.version = str(version) if version else None
|
||||
self.latest_version = version
|
||||
|
||||
def has_history(self):
|
||||
return False
|
||||
|
||||
def has_info(self):
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def _get_cached_attrs() -> tuple:
|
||||
return 'id', 'name', 'version', 'url', 'description', 'icon_url', 'installation_dir', \
|
||||
'desktop_entry', 'categories', 'custom_icon', 'options_set', 'save_icon', 'package_name', 'source_url', \
|
||||
'user_agent'
|
||||
|
||||
def can_be_downgraded(self):
|
||||
return False
|
||||
|
||||
def get_exec_path(self) -> str:
|
||||
if self.installation_dir:
|
||||
return f'{self.installation_dir}/{self.id}'
|
||||
|
||||
def get_command(self) -> str:
|
||||
if self.installation_dir:
|
||||
return f"{self.get_exec_path()}{' --no-sandbox' if user.is_root() else ''}"
|
||||
|
||||
def get_type(self):
|
||||
return 'web'
|
||||
|
||||
def get_type_icon_path(self) -> str:
|
||||
return self.get_default_icon_path()
|
||||
|
||||
def get_default_icon_path(self) -> str:
|
||||
return resource.get_path('img/web.svg', ROOT_DIR)
|
||||
|
||||
def get_disk_data_path(self) -> str:
|
||||
return f'{self.get_disk_cache_path()}/data.yml'
|
||||
|
||||
def get_disk_icon_path(self) -> str:
|
||||
if self.custom_icon:
|
||||
return self.custom_icon
|
||||
|
||||
if self.installation_dir:
|
||||
return f'{self.installation_dir}/resources/app/icon.png'
|
||||
|
||||
def is_application(self):
|
||||
return True
|
||||
|
||||
def supports_disk_cache(self):
|
||||
return self.installed
|
||||
|
||||
def get_disk_cache_path(self):
|
||||
return self.installation_dir
|
||||
|
||||
def get_data_to_cache(self) -> dict:
|
||||
data = {}
|
||||
|
||||
for attr in self._get_cached_attrs():
|
||||
if hasattr(self, attr):
|
||||
val = getattr(self, attr)
|
||||
|
||||
if val is not None:
|
||||
data[attr] = val
|
||||
|
||||
return data
|
||||
|
||||
def fill_cached_data(self, data: dict):
|
||||
for attr in self._get_cached_attrs():
|
||||
val = data.get(attr)
|
||||
|
||||
if val and hasattr(self, attr):
|
||||
setattr(self, attr, val)
|
||||
|
||||
self.set_custom_icon(self.custom_icon)
|
||||
|
||||
def can_be_run(self) -> bool:
|
||||
return self.installed and bool(self.installation_dir)
|
||||
|
||||
def is_trustable(self) -> bool:
|
||||
return False
|
||||
|
||||
def get_publisher(self) -> str:
|
||||
return __app_name__
|
||||
|
||||
def has_screenshots(self) -> bool:
|
||||
return False
|
||||
|
||||
def get_autostart_path(self) -> str:
|
||||
if self.desktop_entry:
|
||||
return f"{AUTOSTART_DIR}/{self.desktop_entry.split('/')[-1]}"
|
||||
|
||||
def set_custom_icon(self, custom_icon: str):
|
||||
self.custom_icon = custom_icon
|
||||
|
||||
if custom_icon:
|
||||
self.icon_url = custom_icon
|
||||
|
||||
def get_config_dir(self) -> str:
|
||||
if self.package_name:
|
||||
config_dir = f'{Path.home()}/.config/{self.package_name}'
|
||||
|
||||
if os.path.exists(config_dir):
|
||||
return config_dir
|
||||
else:
|
||||
if self.installation_dir:
|
||||
config_path = f'{Path.home()}/.config'
|
||||
|
||||
if os.path.exists(config_path):
|
||||
config_dirs = glob.glob(f"{config_path}/{self.installation_dir.split('/')[-1]}-nativefier-*")
|
||||
|
||||
if config_dirs:
|
||||
return config_dirs[0]
|
||||
|
||||
def supports_backup(self) -> bool:
|
||||
return False
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, WebApplication):
|
||||
return self.name == other.name and self.url == other.url
|
||||
@@ -1,33 +0,0 @@
|
||||
import os
|
||||
import shutil
|
||||
from typing import List, Optional
|
||||
|
||||
from bauh.commons.system import SimpleProcess, run_cmd
|
||||
from bauh.gems.web import NATIVEFIER_BIN_PATH, NODE_PATHS, ELECTRON_CACHE_DIR
|
||||
|
||||
|
||||
def install(url: str, name: str, output_dir: str, electron_version: Optional[str], cwd: str, system: bool,
|
||||
user_agent: Optional[str] = None, extra_options: List[str] = None) -> SimpleProcess:
|
||||
cmd = [NATIVEFIER_BIN_PATH if not system else 'nativefier', url, '--name', name, output_dir]
|
||||
|
||||
if electron_version:
|
||||
cmd.append('-e')
|
||||
cmd.append(electron_version)
|
||||
|
||||
if user_agent:
|
||||
cmd.extend(('--user-agent', user_agent))
|
||||
|
||||
if extra_options:
|
||||
cmd.extend(extra_options)
|
||||
|
||||
extra_env = {'XDG_CACHE_HOME': os.path.dirname(ELECTRON_CACHE_DIR)} if not os.getenv('XDG_CACHE_HOME') else None
|
||||
return SimpleProcess(cmd, cwd=cwd, extra_paths=NODE_PATHS if not system else None,
|
||||
extra_env=extra_env)
|
||||
|
||||
|
||||
def is_available() -> bool:
|
||||
return bool(shutil.which('nativefier'))
|
||||
|
||||
|
||||
def get_version() -> str:
|
||||
return run_cmd('{} --version'.format(NATIVEFIER_BIN_PATH), print_error=False, extra_paths=NODE_PATHS)
|
||||
@@ -1,112 +0,0 @@
|
||||
<?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"
|
||||
width="512"
|
||||
height="512"
|
||||
version="1.1"
|
||||
viewBox="0 0 512 512"
|
||||
id="svg2382"
|
||||
sodipodi:docname="web.svg"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
|
||||
<metadata
|
||||
id="metadata2388">
|
||||
<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="defs2386" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="731"
|
||||
id="namedview2384"
|
||||
showgrid="false"
|
||||
showborder="true"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="0.23046875"
|
||||
inkscape:cx="-206.58349"
|
||||
inkscape:cy="27.685718"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2382" />
|
||||
<g
|
||||
id="g2943"
|
||||
transform="matrix(18.983042,0,0,18.80225,-47.728672,-665.31025)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2362"
|
||||
d="M 16,37.421053 A 12,11.789474 0 0 0 4,49.210526 12,11.789474 0 0 0 16,61 12,11.789474 0 0 0 28,49.210526 12,11.789474 0 0 0 16,37.421053 Z"
|
||||
style="opacity:0.2;stroke-width:0.42479539" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2364"
|
||||
d="M 16,37 A 12,11.789474 0 0 0 4,48.789474 12,11.789474 0 0 0 16,60.578947 12,11.789474 0 0 0 28,48.789474 12,11.789474 0 0 0 16,37 Z"
|
||||
style="fill:#74bfcc;stroke-width:0.42479539" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2366"
|
||||
d="m 22.437143,48.435789 c 0,0 1.616426,-2.123624 0.618857,-4.169263 -0.997569,-2.045638 -5.839234,-0.583175 -9.561408,1.970905 -2.679624,1.838702 -3.9702527,5.080054 -3.9231634,7.183622"
|
||||
style="fill:none;stroke:#3f3f3f;stroke-width:0.84959078;stroke-linecap:round" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2368"
|
||||
d="m 13,54.263158 c 0,0 0.61247,2.449842 3.33041,2.555789 2.71794,0.105947 3.869899,-4.414886 3.47959,-8.85887 -0.280985,-3.199262 -1.503611,-6.158885 -3.381429,-7.170603"
|
||||
style="fill:none;stroke:#3f3f3f;stroke-width:0.84959078;stroke-linecap:round" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2370"
|
||||
d="m 13.857143,43.4 c 0,0 -3.778942,-2.241926 -4.883143,0.349694 -1.104201,2.591621 2.556418,7.331573 6.938268,8.499148 3.058605,0.814988 6.490017,-0.158277 7.373446,-0.512"
|
||||
style="fill:none;stroke:#3f3f3f;stroke-width:0.84959078;stroke-linecap:round" />
|
||||
<ellipse
|
||||
id="ellipse2372"
|
||||
ry="0.89515787"
|
||||
rx="0.91114283"
|
||||
cy="48.36842"
|
||||
cx="16.428572"
|
||||
style="fill:#3f3f3f;stroke:#3f3f3f;stroke-width:0.74296564" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2374"
|
||||
d="M 16,37 A 12,11.789474 0 0 0 4,48.789474 12,11.789474 0 0 0 4.0092076,48.960526 12,11.789474 0 0 1 16,37.421053 12,11.789474 0 0 1 27.990793,49.032895 12,11.789474 0 0 0 28,48.789474 12,11.789474 0 0 0 16,37 Z"
|
||||
style="opacity:0.2;fill:#ffffff;stroke-width:0.42479539" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2376"
|
||||
d="m 16.368304,39.52796 a 1.2857143,1.2631579 0 0 0 -1.053014,0.629935 1.2857143,1.2631579 0 0 0 0.470424,1.725329 1.2857143,1.2631579 0 0 0 1.756139,-0.462171 1.2857143,1.2631579 0 0 0 -0.470424,-1.725329 1.2857143,1.2631579 0 0 0 -0.703125,-0.167764 z m 6.887277,10.945724 a 1.2857143,1.2631579 0 0 0 -0.612724,0.169408 1.2857143,1.2631579 0 0 0 -0.470424,1.725329 1.2857143,1.2631579 0 0 0 1.756138,0.462171 1.2857143,1.2631579 0 0 0 0.470424,-1.725329 1.2857143,1.2631579 0 0 0 -1.143414,-0.631579 z M 9.5714286,52.157895 a 1.2857143,1.2631579 0 0 0 -1.2857143,1.263158 1.2857143,1.2631579 0 0 0 1.2857143,1.263158 1.2857143,1.2631579 0 0 0 1.2857144,-1.263158 1.2857143,1.2631579 0 0 0 -1.2857144,-1.263158 z"
|
||||
style="fill:#3f3f3f;stroke-width:0.42479539" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2378"
|
||||
d="M 16.428571,40.789474 A 0.42857143,0.42105263 0 0 0 16,41.210526 a 0.42857143,0.42105263 0 0 0 0.428571,0.421053 0.42857143,0.42105263 0 0 0 0.428572,-0.421053 0.42857143,0.42105263 0 0 0 -0.428572,-0.421052 z m 6.857143,10.947368 a 0.42857143,0.42105263 0 0 0 -0.428571,0.421053 0.42857143,0.42105263 0 0 0 0.428571,0.421052 0.42857143,0.42105263 0 0 0 0.428572,-0.421052 0.42857143,0.42105263 0 0 0 -0.428572,-0.421053 z M 9.5714286,53.421053 A 0.42857143,0.42105263 0 0 0 9.1428571,53.842105 0.42857143,0.42105263 0 0 0 9.5714286,54.263158 0.42857143,0.42105263 0 0 0 10,53.842105 0.42857143,0.42105263 0 0 0 9.5714286,53.421053 Z"
|
||||
style="opacity:0.2;stroke-width:0.42479539" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2380"
|
||||
d="M 16.428571,40.368421 A 0.42857143,0.42105263 0 0 0 16,40.789474 a 0.42857143,0.42105263 0 0 0 0.428571,0.421052 0.42857143,0.42105263 0 0 0 0.428572,-0.421052 0.42857143,0.42105263 0 0 0 -0.428572,-0.421053 z m 6.857143,10.947368 a 0.42857143,0.42105263 0 0 0 -0.428571,0.421053 0.42857143,0.42105263 0 0 0 0.428571,0.421053 0.42857143,0.42105263 0 0 0 0.428572,-0.421053 0.42857143,0.42105263 0 0 0 -0.428572,-0.421053 z M 9.5714286,53 A 0.42857143,0.42105263 0 0 0 9.1428571,53.421053 0.42857143,0.42105263 0 0 0 9.5714286,53.842105 0.42857143,0.42105263 0 0 0 10,53.421053 0.42857143,0.42105263 0 0 0 9.5714286,53 Z"
|
||||
style="fill:#74bfcc;stroke-width:0.42479539" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 6.1 KiB |
@@ -1,87 +0,0 @@
|
||||
gem.web.info=It allows to install Web applications on the system through their addresses (URL)
|
||||
gem.web.install.warning=This app it is not officially distributed by its domain owner
|
||||
web.custom_action.clean_env.failed=An error occurred during the installation environment cleaning
|
||||
web.custom_action.clean_env.status=Cleaning the installation environment
|
||||
web.custom_action.clean_env.success=Installation environment cleaned
|
||||
web.custom_action.clean_env=Clean installation environment
|
||||
web.custom_action.clean_env.desc=Removes all software and configuration files from the installation environment
|
||||
web.custom_action.install_app=Install Web application
|
||||
web.custom_action.install_app.desc=Allows to install a Web site as an application
|
||||
web.custom_action.install_app.invalid_url=The address {URL} {url} could not be found. It is not possible to finish the installation.
|
||||
web.custom_action.install_app.status=Installing Web application
|
||||
web.env.checking=Checking the Web installation environment
|
||||
web.env.error=It seems there are issues with the Web installation environment. It will not be possible to install {}.
|
||||
web.environment.install=Installing {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=description
|
||||
web.info.03_version=version
|
||||
web.info.04_categories=categories
|
||||
web.info.05_installation_dir=installation dir
|
||||
web.info.06_desktop_entry=shortcut
|
||||
web.info.07_exec_file=executable
|
||||
web.info.08_icon_path=icon
|
||||
web.info.09_size=size
|
||||
web.info.10_config_dir=configuration dir
|
||||
web.install.env_update.body=The following files must be downloaded and installed
|
||||
web.install.env_update.title=Environment update
|
||||
web.install.error=An error has happened during the {} installation
|
||||
web.install.global_nativefier.unavailable={n} seems not to be installed on your system. It will not be possible to install {app}
|
||||
web.install.nativefier.error.inner_dir=The app installation directory was not found in {}
|
||||
web.install.nativefier.error.unknown=Have a look at the {} to identify the reason
|
||||
web.install.option.allow_urls.label=Allow internal URLs
|
||||
web.install.option.allow_urls.tip=It allows the application to internally open addresses / URLs outside its domain. e.g: outlook.live.com would be able to open account.microsoft.com
|
||||
web.install.option.category.none=none
|
||||
web.install.option.fullscreen.label=Open in fullscreen
|
||||
web.install.option.fullscreen.tip=If the app should always be opened in fullscreen ( the Alt key opens the upper menu )
|
||||
web.install.option.icon.label=Custom icon
|
||||
web.install.option.ignore_certificate.label=Ignore certificate errors
|
||||
web.install.option.ignore_certificate.tip=Certificate related errors will be ignored by the app
|
||||
web.install.option.insecure.label=Allow insecure content
|
||||
web.install.option.insecure.tip=It allows the execution of insecure content within the application
|
||||
web.install.option.max.label=Open maximized
|
||||
web.install.option.max.tip=If the app should always be opened maximized
|
||||
web.install.option.nocache.label=No cache
|
||||
web.install.option.nocache.tip=Session data will not be stored after the app is closed
|
||||
web.install.option.noframe.label=No frame
|
||||
web.install.option.noframe.tip=If the app should not have a frame
|
||||
web.install.option.single.label=Single run
|
||||
web.install.option.single.tip=It will not allow the app to be opened again if it is already opened
|
||||
web.install.option.tray.default.label=Open and attach
|
||||
web.install.option.tray.default.tip=The app icon will be attached to the system tray after being opened
|
||||
web.install.option.tray.label=Tray mode
|
||||
web.install.option.tray.min.label=Start minimized
|
||||
web.install.option.tray.min.tip=The app will be started minimized as an icon in the system tray
|
||||
web.install.option.tray.off.label=Off
|
||||
web.install.option.tray.off.tip=Off
|
||||
web.install.option.wicon.deducted.label=Deducted
|
||||
web.install.option.wicon.deducted.tip=The icon will be deducted by {} during the installation
|
||||
web.install.option.wicon.displayed.label=Displayed
|
||||
web.install.option.wicon.displayed.tip=The icon displayed on the table will be used for the installation
|
||||
web.install.option.wicon.label=Icon
|
||||
web.install.option.widevine.label=Allow protected content
|
||||
web.install.option.widevine.tip=It allows the interaction with protected/encrypted content commonly used by streaming services (like videos, music, ...). It uses and alternative Electron version developed by castLabs.
|
||||
web.install.options.advanced=advanced
|
||||
web.install.options.basic=basic
|
||||
web.install.options_dialog.title=Web installation options
|
||||
web.install.substatus.call_nativefier=Running {}
|
||||
web.install.substatus.checking_fixes=Checking if there are published fixes
|
||||
web.install.substatus.options=Waiting for the installation options
|
||||
web.install.substatus.shortcut=Generating a menu shortcut
|
||||
web.settings.cache_exp=Environment settings expiration
|
||||
web.settings.cache_exp.tip=It defines the period (in HOURS) in which the stored environment settings are considered valid. Use 0 so that they are always updated.
|
||||
web.settings.electron.version.label=Electron version
|
||||
web.settings.electron.version.tooltip=Defines an alternative Electron version to render the new installed apps
|
||||
web.settings.env.nativefier.system.not_installed={} seems not to be installed on your system
|
||||
web.settings.nativefier.env.tooltip=The Nativefier version installed on the isolated {app} environment will be used to install applications
|
||||
web.settings.nativefier.env=environment
|
||||
web.settings.nativefier.system.tooltip=The Nativefier version installed on your system will be used to install applications
|
||||
web.settings.nativefier.system=system
|
||||
web.settings.nativefier.tip=Defines which Nativefier version should be used to generate the Web applications
|
||||
web.settings.suggestions.cache_exp=Suggestions expiration
|
||||
web.settings.suggestions.cache_exp.tip=It defines the period (in HOURS) in which suggestions stored on the disk are considered up to date during the initialization process. Use 0 so that they are always updated
|
||||
web.task.download_settings=Updating environment settings
|
||||
web.task.search_index=Indexing suggestions
|
||||
web.task.suggestions.saving=Saving to disk
|
||||
web.uninstall.error.install_dir.not_found=The installation directory {} was not found
|
||||
web.uninstall.error.remove_dir=It was not possible to remove {}
|
||||
web.waiting.env_updater=Updating environment
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Es ermöglicht die Installation von Webanwendungen auf dem System über deren Adressen (URL)
|
||||
gem.web.install.warning=Diese Anwendung wird nicht offiziell vom Eigentümer der Domain vertrieben.
|
||||
web.custom_action.clean_env.failed=Bei der Bereinigung der Installationsumgebung ist ein Fehler aufgetreten
|
||||
web.custom_action.clean_env.status=Bereinigung der Installationsumgebung
|
||||
web.custom_action.clean_env.success=Installationsumgebung bereinigt
|
||||
web.custom_action.clean_env=Installationsumgebung bereinigen
|
||||
web.custom_action.clean_env.desc=Entfernt alle Software- und Konfigurationsdateien aus der Installationsumgebung
|
||||
web.custom_action.install_app=Webanwendung installieren
|
||||
web.custom_action.install_app.desc=Ermöglicht die Installation einer Website als Anwendung
|
||||
web.custom_action.install_app.invalid_url=Die Adresse {URL} {url} konnte nicht gefunden werden. Es ist nicht möglich, die Installation abzuschließen.
|
||||
web.custom_action.install_app.status=Installation der Webanwendung
|
||||
web.env.checking=Überprüfung der Web-Installationsumgebung
|
||||
web.env.error=Es scheint Probleme mit der Web-Installationsumgebung zu geben. Es ist nicht möglich, {} zu installieren.
|
||||
web.environment.install=Installation von {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=Beschreibung
|
||||
web.info.03_version=Version
|
||||
web.info.04_categories=Kategorien
|
||||
web.info.05_installation_dir=Installationsverzeichnis
|
||||
web.info.06_desktop_entry=Verknüpfung
|
||||
web.info.07_exec_file=Ausführbare Datei
|
||||
web.info.08_icon_path=Symbol
|
||||
web.info.09_size=Größe
|
||||
web.info.10_config_dir=Konfigurationsverzeichnis
|
||||
web.install.env_update.body=Die folgenden Dateien müssen heruntergeladen und installiert werden
|
||||
web.install.env_update.title=Aktualisierung der Umgebung
|
||||
web.install.error=Während der Installation von {} ist ein Fehler aufgetreten
|
||||
web.install.global_nativefier.unavailable={n} scheint nicht auf Ihrem System installiert zu sein. Es ist nicht möglich, {app} zu installieren
|
||||
web.install.nativefier.error.inner_dir=Das App-Installationsverzeichnis wurde nicht in {} gefunden
|
||||
web.install.nativefier.error.unknown=Schauen Sie sich {} an, um die Ursache zu ermitteln
|
||||
web.install.option.allow_urls.label=Interne URLs zulassen
|
||||
web.install.option.allow_urls.tip=Erlaubt der Anwendung, intern Adressen / URLs außerhalb ihrer Domäne zu öffnen. z.B.: outlook.live.com kann account.microsoft.com öffnen
|
||||
web.install.option.category.none=keine
|
||||
web.install.option.fullscreen.label=Im Vollbildmodus öffnen
|
||||
web.install.option.fullscreen.tip=Ob die Anwendung immer im Vollbildmodus geöffnet werden soll (die Alt-Taste öffnet das obere Menü)
|
||||
web.install.option.icon.label=Benutzerdefiniertes Symbol
|
||||
web.install.option.ignore_certificate.label=Zertifikatsfehler ignorieren
|
||||
web.install.option.ignore_certificate.tip=Zertifikatsbezogene Fehler werden von der App ignoriert
|
||||
web.install.option.insecure.label=Unsichere Inhalte zulassen
|
||||
web.install.option.insecure.tip=Erlaubt die Ausführung von unsicheren Inhalten innerhalb der Anwendung
|
||||
web.install.option.max.label=Maximiert öffnen
|
||||
web.install.option.max.tip=Ob die Anwendung immer maximiert geöffnet werden soll
|
||||
web.install.option.nocache.label=Kein Cache
|
||||
web.install.option.nocache.tip=Sitzungsdaten werden nicht gespeichert, nachdem die Anwendung geschlossen wurde
|
||||
web.install.option.noframe.label=Kein Rahmen
|
||||
web.install.option.noframe.tip=Ob die App keinen Rahmen haben soll
|
||||
web.install.option.single.label=Eine Instanz
|
||||
web.install.option.single.tip=Die Anwendung kann nicht erneut geöffnet werden, wenn sie bereits geöffnet ist.
|
||||
web.install.option.tray.default.label=Öffnen und anhängen
|
||||
web.install.option.tray.default.tip=Das Symbol der Anwendung wird nach dem Öffnen in der Taskleiste angezeigt.
|
||||
web.install.option.tray.label=Tray-Modus
|
||||
web.install.option.tray.min.label=Minimiert starten
|
||||
web.install.option.tray.min.tip=Die Anwendung wird minimiert als Symbol in der Taskleiste gestartet
|
||||
web.install.option.tray.off.label=Aus
|
||||
web.install.option.tray.off.tip=Aus
|
||||
web.install.option.wicon.deducted.label=Abgeleitet
|
||||
web.install.option.wicon.deducted.tip=Das Symbol wird bei der Installation um {} abgeleitet
|
||||
web.install.option.wicon.displayed.label=Angezeigt
|
||||
web.install.option.wicon.displayed.tip=Das in der Tabelle angezeigte Symbol wird für die Installation verwendet.
|
||||
web.install.option.wicon.label=Symbol
|
||||
web.install.option.widevine.label=Geschützte Inhalte zulassen
|
||||
web.install.option.widevine.tip=Erlaubt die Interaktion mit geschützten/verschlüsselten Inhalten, die häufig von Streaming-Diensten verwendet werden (wie Videos, Musik, ...). Es wird eine alternative Electron-Version verwendet, die von castLabs entwickelt wurde.
|
||||
web.install.options.advanced=erweitert
|
||||
web.install.options.basic=einfach
|
||||
web.install.options_dialog.title=Optionen für die Web-Installation
|
||||
web.install.substatus.call_nativefier=Ausführen {}
|
||||
web.install.substatus.checking_fixes=Prüfen, ob es veröffentlichte Fehlerbehebungen gibt
|
||||
web.install.substatus.options=Warten auf die Installationsoptionen
|
||||
web.install.substatus.shortcut=Erzeugen einer Menüverknüpfung
|
||||
web.settings.cache_exp=Gültigkeitszeitraum der Umgebungseinstellungen
|
||||
web.settings.cache_exp.tip=Legt den Gültigkeitszeitraum (in Stunden) fest, in dem die gespeicherten Umgebungseinstellungen als gültig angesehen werden. Verwenden Sie 0, damit sie immer aktualisiert werden.
|
||||
web.settings.electron.version.label=Electron-Version
|
||||
web.settings.electron.version.tooltip=Definiert eine alternative Electron-Version zum Rendern der neu installierten Anwendungen
|
||||
web.settings.env.nativefier.system.not_installed={} scheint nicht auf Ihrem System installiert zu sein
|
||||
web.settings.nativefier.env.tooltip=Die Nativefier-Version, die in der isolierten {app}-Umgebung installiert ist, wird für die Installation von Anwendungen verwendet
|
||||
web.settings.nativefier.env=Umgebung
|
||||
web.settings.nativefier.system.tooltip=Die auf Ihrem System installierte Nativefier-Version wird für die Installation von Anwendungen verwendet
|
||||
web.settings.nativefier.system=System
|
||||
web.settings.nativefier.tip=Legt fest, welche Nativefier-Version für die Erstellung der Webanwendungen verwendet werden soll
|
||||
web.settings.suggestions.cache_exp=Gültigkeitszeitraum der Vorschläge
|
||||
web.settings.suggestions.cache_exp.tip=Legt den Gültigkeitszeitraum (in Stunden) fest, in dem die, auf dem Datenträger gespeicherten, Vorschläge als aktuell angesehen werden. Verwenden Sie 0, wenn Sie sie immer aktualisieren wollen.
|
||||
web.task.download_settings=Aktualisierung der Umgebungseinstellungen
|
||||
web.task.search_index=Indizierung von Vorschlägen
|
||||
web.task.suggestions.saving=Speichern auf der Festplatte
|
||||
web.uninstall.error.install_dir.not_found=Das Installationsverzeichnis {} wurde nicht gefunden
|
||||
web.uninstall.error.remove_dir=Es war nicht möglich, {} zu entfernen
|
||||
web.waiting.env_updater=Aktualisierung der Umgebung
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=It allows to install Web applications on the system through their addresses (URL)
|
||||
gem.web.install.warning=This app it is not officially distributed by its domain owner
|
||||
web.custom_action.clean_env.failed=An error occurred during the installation environment cleaning
|
||||
web.custom_action.clean_env.status=Cleaning the installation environment
|
||||
web.custom_action.clean_env.success=Installation environment cleaned
|
||||
web.custom_action.clean_env=Clean installation environment
|
||||
web.custom_action.clean_env.desc=Removes all software and configuration files from the installation environment
|
||||
web.custom_action.install_app=Install Web application
|
||||
web.custom_action.install_app.desc=Allows to install a Web site as an application
|
||||
web.custom_action.install_app.invalid_url=The address {URL} {url} could not be found. It is not possible to finish the installation.
|
||||
web.custom_action.install_app.status=Installing Web application
|
||||
web.env.checking=Checking the Web installation environment
|
||||
web.env.error=It seems there are issues with the Web installation environment. It will not be possible to install {}.
|
||||
web.environment.install=Installing {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=description
|
||||
web.info.03_version=version
|
||||
web.info.04_categories=categories
|
||||
web.info.05_installation_dir=installation dir
|
||||
web.info.06_desktop_entry=shortcut
|
||||
web.info.07_exec_file=executable
|
||||
web.info.08_icon_path=icon
|
||||
web.info.09_size=size
|
||||
web.info.10_config_dir=configuration dir
|
||||
web.install.env_update.body=The following files must be downloaded and installed
|
||||
web.install.env_update.title=Environment update
|
||||
web.install.error=An error has happened during the {} installation
|
||||
web.install.global_nativefier.unavailable={n} seems not to be installed on your system. It will not be possible to install {app}
|
||||
web.install.nativefier.error.inner_dir=The app installation directory was not found in {}
|
||||
web.install.nativefier.error.unknown=Have a look at the {} to identify the reason
|
||||
web.install.option.allow_urls.label=Allow internal URLs
|
||||
web.install.option.allow_urls.tip=It allows the application to internally open addresses / URLs outside its domain. e.g: outlook.live.com would be able to open account.microsoft.com
|
||||
web.install.option.category.none=none
|
||||
web.install.option.fullscreen.label=Open in fullscreen
|
||||
web.install.option.fullscreen.tip=If the app should always be opened in fullscreen (the Alt key opens the upper menu)
|
||||
web.install.option.icon.label=Custom icon
|
||||
web.install.option.ignore_certificate.label=Ignore certificate errors
|
||||
web.install.option.ignore_certificate.tip=Certificate related errors will be ignored by the app
|
||||
web.install.option.insecure.label=Allow insecure content
|
||||
web.install.option.insecure.tip=It allows the execution of insecure content within the application
|
||||
web.install.option.max.label=Open maximized
|
||||
web.install.option.max.tip=If the app should always be opened maximized
|
||||
web.install.option.nocache.label=No cache
|
||||
web.install.option.nocache.tip=Session data will not be stored after the app is closed
|
||||
web.install.option.noframe.label=No frame
|
||||
web.install.option.noframe.tip=If the app should not have a frame
|
||||
web.install.option.single.label=Single run
|
||||
web.install.option.single.tip=It will not allow the app to be opened again if it is already opened
|
||||
web.install.option.tray.default.label=Open and attach
|
||||
web.install.option.tray.default.tip=The app icon will be attached to the system tray after being opened
|
||||
web.install.option.tray.label=Tray mode
|
||||
web.install.option.tray.min.label=Start minimized
|
||||
web.install.option.tray.min.tip=The app will be started minimized as an icon in the system tray
|
||||
web.install.option.tray.off.label=Off
|
||||
web.install.option.tray.off.tip=Off
|
||||
web.install.option.wicon.deducted.label=Deducted
|
||||
web.install.option.wicon.deducted.tip=The icon will be deducted by {} during the installation
|
||||
web.install.option.wicon.displayed.label=Displayed
|
||||
web.install.option.wicon.displayed.tip=The icon displayed on the table will be used for the installation
|
||||
web.install.option.wicon.label=Icon
|
||||
web.install.option.widevine.label=Allow protected content
|
||||
web.install.option.widevine.tip=It allows the interaction with protected/encrypted content commonly used by streaming services (like videos, music, ...). It uses and alternative Electron version developed by castLabs.
|
||||
web.install.options.advanced=advanced
|
||||
web.install.options.basic=basic
|
||||
web.install.options_dialog.title=Web installation options
|
||||
web.install.substatus.call_nativefier=Running {}
|
||||
web.install.substatus.checking_fixes=Checking if there are published fixes
|
||||
web.install.substatus.options=Waiting for the installation options
|
||||
web.install.substatus.shortcut=Generating a menu shortcut
|
||||
web.settings.cache_exp=Environment settings expiration
|
||||
web.settings.cache_exp.tip=It defines the period (in HOURS) in which the stored environment settings are considered valid. Use 0 so that they are always updated.
|
||||
web.settings.electron.version.label=Electron version
|
||||
web.settings.electron.version.tooltip=Defines an alternative Electron version to render the new installed apps
|
||||
web.settings.env.nativefier.system.not_installed={} seems not to be installed on your system
|
||||
web.settings.nativefier.env.tooltip=The Nativefier version installed on the isolated {app} environment will be used to install applications
|
||||
web.settings.nativefier.env=environment
|
||||
web.settings.nativefier.system.tooltip=The Nativefier version installed on your system will be used to install applications
|
||||
web.settings.nativefier.system=system
|
||||
web.settings.nativefier.tip=Defines which Nativefier version should be used to generate the Web applications
|
||||
web.settings.suggestions.cache_exp=Suggestions expiration
|
||||
web.settings.suggestions.cache_exp.tip=It defines the period (in HOURS) in which suggestions stored on the disk are considered up to date during the initialization process. Use 0 so that they are always updated.
|
||||
web.task.download_settings=Updating environment settings
|
||||
web.task.search_index=Indexing suggestions
|
||||
web.task.suggestions.saving=Saving to disk
|
||||
web.uninstall.error.install_dir.not_found=The installation directory {} was not found
|
||||
web.uninstall.error.remove_dir=It was not possible to remove {}
|
||||
web.waiting.env_updater=Updating environment
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Le permite instalar aplicaciones web a través de sus direcciones (URL)
|
||||
gem.web.install.warning=Esta aplicación no es distribuida oficialmente por el propietario del dominio
|
||||
web.custom_action.clean_env.failed=Se produjo un error durante la limpieza del ambiente de instalación
|
||||
web.custom_action.clean_env.status=Limpiando el ambiente de instalación
|
||||
web.custom_action.clean_env.success=Ambiente de instalación limpio
|
||||
web.custom_action.clean_env=Limpiar ambiente de instalación
|
||||
web.custom_action.clean_env.desc=Elimina todo los softwares y archivos de configuración del ambiente de instalación
|
||||
web.custom_action.install_app=Instalar aplicación Web
|
||||
web.custom_action.install_app.desc=Permite instalar un Web site como una aplicación
|
||||
web.custom_action.install_app.invalid_url=No se pudo encontrar la dirección {URL} {url}. No es posible finalizar la instalación.
|
||||
web.custom_action.install_app.status=Instalando aplicación Web
|
||||
web.env.checking=Verificando el ambiente de instalación web
|
||||
web.env.error=Parece que hay problemas con el ambiente de instalación web. No será posible instalar {}.
|
||||
web.environment.install=Instalando {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=descripción
|
||||
web.info.03_version=versión
|
||||
web.info.04_categories=categorías
|
||||
web.info.05_installation_dir=directorio de instalación
|
||||
web.info.06_desktop_entry=atajo
|
||||
web.info.07_exec_file=ejecutable
|
||||
web.info.08_icon_path=icono
|
||||
web.info.09_size=tamaño
|
||||
web.info.10_config_dir=directorio de configuración
|
||||
web.install.env_update.body=Los siguientes archivos deben descargarse e instalarse
|
||||
web.install.env_update.title=Actualización del ambiente
|
||||
web.install.error=Ha ocurrido un error durante la instalación de {}
|
||||
web.install.global_nativefier.unavailable={n} parece no estar instalado en su sistema. No será posible instalar {app}
|
||||
web.install.nativefier.error.inner_dir=El directorio de instalación de la aplicación no se encontró en {}
|
||||
web.install.nativefier.error.unknown=Mire el {} para identificar la razón
|
||||
web.install.option.allow_urls.label=Permitir URL internas
|
||||
web.install.option.allow_urls.tip=Permite que la aplicación abra internamente direcciones / URLs fuera de su dominio. Por ejemplo: outlook.live.com podría abrir account.microsoft.com
|
||||
web.install.option.category.none=ninguna
|
||||
web.install.option.fullscreen.label=Abrir en pantalla completa
|
||||
web.install.option.fullscreen.tip=Si la aplicación siempre debe abrirse en pantalla completa ( la tecla Alt abre el menú superior )
|
||||
web.install.option.icon.label=Icono personalizado
|
||||
web.install.option.ignore_certificate.label=Ignorar errores de certificado
|
||||
web.install.option.ignore_certificate.tip=Los errores relacionados con certificados serán ignorados por la aplicación
|
||||
web.install.option.insecure.label=Permitir contenido inseguro
|
||||
web.install.option.insecure.tip=Permite la ejecución de contenido inseguro dentro de la aplicación
|
||||
web.install.option.max.label=Abrir maximizado
|
||||
web.install.option.max.tip=Si la aplicación siempre debe abrirse maximizada
|
||||
web.install.option.nocache.label=Sin cache
|
||||
web.install.option.nocache.tip=Los datos de la sesión no se almacenarán después de cerrar la aplicación
|
||||
web.install.option.noframe.label=Sin marco
|
||||
web.install.option.noframe.tip=Si la aplicación no debe tener un marco
|
||||
web.install.option.single.label=Ejecución única
|
||||
web.install.option.single.tip=No permitirá que la aplicación se abra nuevamente si ya está abierta
|
||||
web.install.option.tray.default.label=Abrir y adjuntar
|
||||
web.install.option.tray.default.tip=El icono de la aplicación se adjuntará a la bandeja del sistema después de abrirlo
|
||||
web.install.option.tray.label=Modo bandeja
|
||||
web.install.option.tray.min.label=Iniciar minimizado
|
||||
web.install.option.tray.min.tip=La aplicación se iniciará minimizada como un ícono en la bandeja del sistema
|
||||
web.install.option.tray.off.label=Apagado
|
||||
web.install.option.tray.off.tip=Apagado
|
||||
web.install.option.wicon.deducted.label=Deducido
|
||||
web.install.option.wicon.deducted.tip=El {} deducirá el icono durante la instalación
|
||||
web.install.option.wicon.displayed.label=Mostrado
|
||||
web.install.option.wicon.displayed.tip=El icono mostrado en la tabla será utilizado para la instalación
|
||||
web.install.option.wicon.label=Icono
|
||||
web.install.option.widevine.label=Permitir contenido protegido
|
||||
web.install.option.widevine.tip=Permite la interacción con contenido protegido/encriptado comúnmente utilizado por los servicios de transmisión (como videos, música, ...). Utiliza una versión alternativa de Electron desarrollada por castLabs.
|
||||
web.install.options.advanced=avanzadas
|
||||
web.install.options.basic=básicas
|
||||
web.install.options_dialog.title=Opciones de instalación Web
|
||||
web.install.substatus.call_nativefier=Ejecutando {}
|
||||
web.install.substatus.checking_fixes=Verificando si hay correcciones publicadas
|
||||
web.install.substatus.options=Esperando las opciones de instalación
|
||||
web.install.substatus.shortcut=Generando un atajo de menú
|
||||
web.settings.cache_exp=Expiración de configuraciones de ambiente
|
||||
web.settings.cache_exp.tip=Define el período (en HORAS) en el que las configuraciones del ambiente almacenadas son consideradas válidas. Utilice 0 para que siempre sean actualizadas.
|
||||
web.settings.electron.version.label=Versión del Electron
|
||||
web.settings.electron.version.tooltip=Define una versión alternativa del Electron para renderizar las nuevas aplicaciones instaladas
|
||||
web.settings.env.nativefier.system.not_installed={} parece no estar instalado en su sistema
|
||||
web.settings.nativefier.env.tooltip=Se utilizará la versión de Nativefier instalada en el ambiente aislado de {app} para instalar aplicaciones
|
||||
web.settings.nativefier.env=ambiente
|
||||
web.settings.nativefier.system.tooltip=Se utilizará la versión de Nativefier instalada en su sistema para instalar aplicaciones
|
||||
web.settings.nativefier.system=sistema
|
||||
web.settings.nativefier.tip=Define qué versión de Nativefier debe usarse para generar las aplicaciones Web
|
||||
web.settings.suggestions.cache_exp=Expiración de sugerencias
|
||||
web.settings.suggestions.cache_exp.tip=Define el período (en HORAS) en el que las sugerencias almacenadas en el disco son consideradas actualizadas durante el proceso de inicialización. Utilice 0 para que siempre sean actualizadas.
|
||||
web.task.download_settings=Actualizando configuraciones de ambiente
|
||||
web.task.search_index=Indexando sugerencias
|
||||
web.task.suggestions.saving=Guardando en disco
|
||||
web.uninstall.error.install_dir.not_found=No se encontró el directorio de instalación {}
|
||||
web.uninstall.error.remove_dir=No fue posible eliminar {}
|
||||
web.waiting.env_updater=Actualizando el ambiente
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Permet d'installer des applications Web sur le système depuis leur adresses (URL)
|
||||
gem.web.install.warning=Cette application n'est pas officiellement distribué par le propiétaire de son domaine
|
||||
web.custom_action.clean_env.failed=Une erreur est survenue lors du nettoyage de l'environnement d'installation
|
||||
web.custom_action.clean_env.status=Nettoyage de l'environnement d'installation
|
||||
web.custom_action.clean_env.success=Environnement d'installation nettoyé
|
||||
web.custom_action.clean_env=Nettoyage de l'environnement d'installation Web
|
||||
web.custom_action.clean_env.desc=Removes all software and configuration files from the installation environment
|
||||
web.custom_action.install_app=Install Web application
|
||||
web.custom_action.install_app.desc=Allows to install a Web site as an application
|
||||
web.custom_action.install_app.invalid_url=The address {URL} {url} could not be found. It is not possible to finish the installation.
|
||||
web.custom_action.install_app.status=Installing Web application
|
||||
web.env.checking=Verification de l'environnement d'installation Web.
|
||||
web.env.error=Il y a des problèmes avec l'environnement d'installation Web. {} ne pourra pas être installé.
|
||||
web.environment.install=Intallation de {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=description
|
||||
web.info.03_version=version
|
||||
web.info.04_categories=catégories
|
||||
web.info.05_installation_dir=dossier d'installation
|
||||
web.info.06_desktop_entry=raccourci
|
||||
web.info.07_exec_file=éxecutable
|
||||
web.info.08_icon_path=icône
|
||||
web.info.09_size=taille
|
||||
web.info.10_config_dir=dossier de configuration
|
||||
web.install.env_update.body=Ces fichiers doivent être téléchargés et installés
|
||||
web.install.env_update.title=Mise à jour d'environnement
|
||||
web.install.error=Une erreur est survenue durant l'installation de {}
|
||||
web.install.global_nativefier.unavailable={n} n'est pas intallé sur votre système. {app} ne pourra être installé
|
||||
web.install.nativefier.error.inner_dir=Le dossier d'installation de l'application n'a pas été trouvé à {}
|
||||
web.install.nativefier.error.unknown=Regardez {} pour trouver la raison
|
||||
web.install.option.allow_urls.label=Autorise les URLs internes
|
||||
web.install.option.allow_urls.tip=Permet à l'application d'ouvrir des adresses en interne / les URLs hors de son domaine. i.e: outlook.live.com pourront ouvrir account.microsoft.com
|
||||
web.install.option.category.none=aucun
|
||||
web.install.option.fullscreen.label=Ouvrir en plein écran
|
||||
web.install.option.fullscreen.tip=Si l'application doit toujours être ouverte en plein écran ( Alt ouvre le menu )
|
||||
web.install.option.icon.label=Icône personnalisée
|
||||
web.install.option.ignore_certificate.label=Ignorer les erreurs de certificats
|
||||
web.install.option.ignore_certificate.tip=Les erreurs liées aux certificats seront ignorées par l'application
|
||||
web.install.option.insecure.label=Autoriser le contenu non sécurisé
|
||||
web.install.option.insecure.tip=Autorise l'éxécution de contenu non sécurisé dans l'application
|
||||
web.install.option.max.label=Ouvrir aggrandi
|
||||
web.install.option.max.tip=Si l'application doit toujours être ouverte fenêtre aggrandi
|
||||
web.install.option.nocache.label=Pas de cache
|
||||
web.install.option.nocache.tip=Les données de session ne seront pas stockées après fermeture de l'application
|
||||
web.install.option.noframe.label=Sans bords
|
||||
web.install.option.noframe.tip=Pour une application sans bords
|
||||
web.install.option.single.label=Éxecution unique
|
||||
web.install.option.single.tip=Empêchera l'application de s'ouvrir si elle l'est déjà
|
||||
web.install.option.tray.default.label=Ouvrir et attacher
|
||||
web.install.option.tray.default.tip=L'icône sera attachée à la barre système après ouverture de l'application
|
||||
web.install.option.tray.label=Mode barre système
|
||||
web.install.option.tray.min.label=Démarrer minimizé
|
||||
web.install.option.tray.min.tip=L'application va démarrer minimisée dans la barre système
|
||||
web.install.option.tray.off.label=Off
|
||||
web.install.option.tray.off.tip=Off
|
||||
web.install.option.wicon.deducted.label=Déduite
|
||||
web.install.option.wicon.deducted.tip=L'icône sera déduite par {} durant l'installation
|
||||
web.install.option.wicon.displayed.label=Affichée
|
||||
web.install.option.wicon.displayed.tip=L'icône affichée sur la table sera utilisée pour l'installation
|
||||
web.install.option.wicon.label=Icône
|
||||
web.install.option.widevine.label=Allow protected content
|
||||
web.install.option.widevine.tip=It allows the interaction with protected/encrypted content commonly used by streaming services (like videos, music, ...). It uses and alternative Electron version developed by castLabs.
|
||||
web.install.options.advanced=avancée
|
||||
web.install.options.basic=basique
|
||||
web.install.options_dialog.title=Options d'installation Web
|
||||
web.install.substatus.call_nativefier=Lancement {}
|
||||
web.install.substatus.checking_fixes=Verification de nouveaux correctifs disponibles
|
||||
web.install.substatus.options=En attente des options d'installation
|
||||
web.install.substatus.shortcut=Génération d'un raccourci menu
|
||||
web.settings.cache_exp=Environment settings expiration
|
||||
web.settings.cache_exp.tip=It defines the period (in HOURS) in which the stored environment settings are considered valid. Use 0 so that they are always updated.
|
||||
web.settings.electron.version.label=Version d'Electron
|
||||
web.settings.electron.version.tooltip=Definit une version alternativde d'Electron pour le rendu des dernières apps installées
|
||||
web.settings.env.nativefier.system.not_installed={} n'a pas l'air d'être installé sur votre système
|
||||
web.settings.nativefier.env.tooltip=La version de Nativefier installée dans l'environnement isolé {app} va être utilisée pour installer des applications
|
||||
web.settings.nativefier.env=environnement
|
||||
web.settings.nativefier.system.tooltip=La version de Nativefier installée sur votre système va être utilisée pour installer des applications
|
||||
web.settings.nativefier.system=système
|
||||
web.settings.nativefier.tip=Definit quelle version de Nativefier doit être utilisée pour géner les applications Web
|
||||
web.settings.suggestions.cache_exp=Suggestions expiration
|
||||
web.settings.suggestions.cache_exp.tip=It defines the period (in HOURS) in which suggestions stored on the disk are considered up to date during the initialization process. Use 0 so that they are always updated
|
||||
web.task.download_settings=Mise à jour des paramètres d'environnement
|
||||
web.task.search_index=Indexing suggestions
|
||||
web.task.suggestions.saving=Saving to disk
|
||||
web.uninstall.error.install_dir.not_found=Impossible de trouver le dossier d'installation {}
|
||||
web.uninstall.error.remove_dir=Impossible d'enlever {}
|
||||
web.waiting.env_updater=Mise à jour de l'environnement
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Permette di installare applicazioni Web sul sistema attraverso i loro indirizzi (URL)
|
||||
gem.web.install.warning=Questa app non è distribuita ufficialmente dal proprietario del dominio
|
||||
web.custom_action.clean_env.failed=Si è verificato un errore durante la pulizia dell'ambiente di installazione
|
||||
web.custom_action.clean_env.status=Pulizia dell'ambiente di installazione
|
||||
web.custom_action.clean_env.success=Ambiente di installazione pulito
|
||||
web.custom_action.clean_env=Ambiente di installazione pulito
|
||||
web.custom_action.clean_env.desc=Rimuove tutto il software e i file di configurazione dall'ambiente di installazione
|
||||
web.custom_action.install_app=Installa applicazione Web
|
||||
web.custom_action.install_app.desc=Consente di installare un sito Web come applicazione
|
||||
web.custom_action.install_app.invalid_url=Impossibile trovare l'indirizzo {URL} {url}. Non è possibile completare l'installazione.
|
||||
web.custom_action.install_app.status=Installazione dell'applicazione Web
|
||||
web.env.checking=Verifica dell'ambiente di installazione Web
|
||||
web.env.error=Sembra che ci siano problemi con l'ambiente di installazione Web. Non sarà possibile installare {}.
|
||||
web.environment.install=Installazione {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=descrizione
|
||||
web.info.03_version=versione
|
||||
web.info.04_categories=categorie
|
||||
web.info.05_installation_dir=installazione dir
|
||||
web.info.06_desktop_entry=scorciatoia
|
||||
web.info.07_exec_file=eseguibile
|
||||
web.info.08_icon_path=icona
|
||||
web.info.09_size=dimensione
|
||||
web.info.10_config_dir=configurazione dir
|
||||
web.install.env_update.body=È necessario scaricare e installare i seguenti file
|
||||
web.install.env_update.title=Aggiornamento dell'ambiente
|
||||
web.install.error=Si è verificato un errore durante l'installazione di {}
|
||||
web.install.global_nativefier.unavailable={n} sembra non essere installato sul tuo sistema. Non sarà possibile installare {app}
|
||||
web.install.nativefier.error.inner_dir=La directory di installazione dell'app non è stata trovata in {}
|
||||
web.install.nativefier.error.unknown=Dai un'occhiata a {} per identificare il motivo
|
||||
web.install.option.allow_urls.label=Consenti URL interni
|
||||
web.install.option.allow_urls.tip=Consente all'applicazione di aprire internamente indirizzi/URL esterni al proprio dominio. ad esempio: outlook.live.com sarebbe in grado di aprire account.microsoft.com
|
||||
web.install.option.category.none=nessuna
|
||||
web.install.option.fullscreen.label=Apri a schermo intero
|
||||
web.install.option.fullscreen.tip=Se l'app deve essere sempre aperta a schermo intero (il tasto Alt apre il menu superiore)
|
||||
web.install.option.icon.label=Icona personalizzata
|
||||
web.install.option.ignore_certificate.label=Ignora gli errori del certificato
|
||||
web.install.option.ignore_certificate.tip=Gli errori relativi al certificato verranno ignorati dall'app
|
||||
web.install.option.insecure.label=Consenti contenuti non sicuri
|
||||
web.install.option.insecure.tip=Consente l'esecuzione di contenuti non sicuri all'interno dell'applicazione
|
||||
web.install.option.max.label=Aprire ingrandito
|
||||
web.install.option.max.tip=Se l'app dovrebbe essere sempre aperta ingrandita
|
||||
web.install.option.nocache.label=Nessuna cache
|
||||
web.install.option.nocache.tip=I dati della sessione non verranno archiviati dopo la chiusura dell'app
|
||||
web.install.option.noframe.label=Senza bordi
|
||||
web.install.option.noframe.tip=Se l'app non deve avere un bordo
|
||||
web.install.option.single.label=Esecuzione singola
|
||||
web.install.option.single.tip=Non consentirà di riaprire l'app se è già aperta
|
||||
web.install.option.tray.default.label=Aprire e allegare
|
||||
web.install.option.tray.default.tip=L'icona dell'app verrà allegata alla barra delle applicazioni dopo essere stata aperta
|
||||
web.install.option.tray.label=Modalità barra di sistema
|
||||
web.install.option.tray.min.label=Inizia minimizzato
|
||||
web.install.option.tray.min.tip=L'app verrà avviata ridotta a icona nella barra delle applicazioni
|
||||
web.install.option.tray.off.label=Off
|
||||
web.install.option.tray.off.tip=Off
|
||||
web.install.option.wicon.deducted.label=Detratto
|
||||
web.install.option.wicon.deducted.tip=L'icona verrà detratta da {} durante l'installazione
|
||||
web.install.option.wicon.displayed.label=Visualizzata
|
||||
web.install.option.wicon.displayed.tip=L'icona visualizzata sulla tabella verrà utilizzata per l'installazione
|
||||
web.install.option.wicon.label=Icona
|
||||
web.install.option.widevine.label=Consenti contenuto protetto
|
||||
web.install.option.widevine.tip=Consente l'interazione con contenuti protetti/crittografati comunemente utilizzati dai servizi di streaming (come video, musica, ...). Utilizza una versione alternativa di Electron sviluppata da castLabs.
|
||||
web.install.options.advanced=avanzato
|
||||
web.install.options.basic=basico
|
||||
web.install.options_dialog.title=Opzioni di installazione Web
|
||||
web.install.substatus.call_nativefier=In esecuzione {}
|
||||
web.install.substatus.checking_fixes=Verifica se sono presenti correzioni pubblicate
|
||||
web.install.substatus.options=In attesa delle opzioni di installazione
|
||||
web.install.substatus.shortcut=Generazione di un collegamento al menu
|
||||
web.settings.cache_exp=Scadenza delle impostazioni dell'ambiente
|
||||
web.settings.cache_exp.tip=Definisce il periodo (in ORE) in cui le impostazioni dell'ambiente memorizzate sono considerate valide. Utilizzare 0 in modo che siano sempre aggiornate.
|
||||
web.settings.electron.version.label=Versione di electron
|
||||
web.settings.electron.version.tooltip=Definisce una versione Electron alternativa per eseguire il rendering delle nuove app installate
|
||||
web.settings.env.nativefier.system.not_installed={} sembra non essere installato sul tuo sistema
|
||||
web.settings.nativefier.env.tooltip=La versione di Nativefier installata nell'ambiente {app} isolato verrà utilizzata per installare le applicazioni
|
||||
web.settings.nativefier.env=ambiente
|
||||
web.settings.nativefier.system.tooltip=La versione di Nativefier installata sul tuo sistema verrà utilizzata per installare le applicazioni
|
||||
web.settings.nativefier.system=sistema
|
||||
web.settings.nativefier.tip=Definisce quale versione di Nativefier deve essere utilizzata per generare le applicazioni Web
|
||||
web.settings.suggestions.cache_exp=Scadenza dei suggerimenti
|
||||
web.settings.suggestions.cache_exp.tip=Definisce il periodo (in ORE) in cui i suggerimenti memorizzati sul disco vengono considerati aggiornati durante il processo di inizializzazione. Utilizzare 0 in modo che siano sempre aggiornati
|
||||
web.task.download_settings=Aggiornamento delle impostazioni dell'ambiente
|
||||
web.task.search_index=Suggerimenti per l'indicizzazione
|
||||
web.task.suggestions.saving=Salvataggio su disco
|
||||
web.uninstall.error.install_dir.not_found=La directory di installazione {} non è stata trovata
|
||||
web.uninstall.error.remove_dir=Non è stato possibile rimuovere {}
|
||||
web.waiting.env_updater=Aggiornamento dell'ambiente
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Permite instalar aplicações Web através dos seus endereços (URL)
|
||||
gem.web.install.warning=Esse aplicativo não é oficialmente distribuído pelo proprietário do domínio
|
||||
web.custom_action.clean_env.failed=Ocorreu um problema durante a limpeza do ambiente de instalação
|
||||
web.custom_action.clean_env.status=Limpando ambiente de instalação
|
||||
web.custom_action.clean_env.success=Ambiente de instalação limpo
|
||||
web.custom_action.clean_env=Limpar ambiente de instalação
|
||||
web.custom_action.clean_env.desc=Remove todos os softwares e arquivos de configuração do ambiente instalação
|
||||
web.custom_action.install_app=Instalar aplicação Web
|
||||
web.custom_action.install_app.desc=Permite instalar um Web site como uma aplicação
|
||||
web.custom_action.install_app.invalid_url=O endereço {URL} {url} não foi encontrado. Não é possível finalizar a instalação.
|
||||
web.custom_action.install_app.status=Instalando aplicação Web
|
||||
web.env.checking=Verificando o ambiente de instalação Web
|
||||
web.env.error=Parce que existem problemas com o ambiente de instalação Web. Não será possível instalar {}.
|
||||
web.environment.nativefier=Instalando {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=descrição
|
||||
web.info.03_version=versão
|
||||
web.info.04_categories=categorias
|
||||
web.info.05_installation_dir=diretório de instalação
|
||||
web.info.06_desktop_entry=atalho
|
||||
web.info.07_exec_file=executável
|
||||
web.info.08_icon_path=ícone
|
||||
web.info.09_size=tamanho
|
||||
web.info.10_config_dir=diretório de configuração
|
||||
web.install.env_update.body=Os seguintes arquivo precisam ser baixados e instalados
|
||||
web.install.env_update.title=Atualização de ambiente
|
||||
web.install.global_nativefier.unavailable={n} não parece estar instalado no seu sistema. Não será possível instalar {app}
|
||||
web.install.nativefier.error.inner_dir=O diretório de instalação do aplicativo não foi encontrado em {}
|
||||
web.install.nativefier.error.unknown=Dê uma olhada em {} para identificar o motivo
|
||||
web.install.option.allow_urls.label=Permitir URLs internas
|
||||
web.install.option.allow_urls.tip=Permite que o aplicativo abra internamente endereços / URLs fora do seu domínio. Exemplo: outlook.live.com conseguiria abrir account.microsoft.com
|
||||
web.install.option.category.none=nenhuma
|
||||
web.install.option.fullscreen.label=Abrir em tela cheia
|
||||
web.install.option.fullscreen.tip=Se o aplicativo sempre deve ser aberto em tela cheia ( a tecla Alt abre o menu superior )
|
||||
web.install.option.icon.label=Ícone alternativo
|
||||
web.install.option.ignore_certificate.label=Ignorar erros de certificado
|
||||
web.install.option.ignore_certificate.tip=Erros associados a certificados serão ignorados pelo aplicativo
|
||||
web.install.option.insecure.label=Permitir conteúdo não confiável
|
||||
web.install.option.insecure.tip=Permite a execução de conteúdo não confiável dentro do aplicativo
|
||||
web.install.option.max.label=Abrir maximizado
|
||||
web.install.option.max.tip=Se o aplicativo deve sempre ser aberto maximizado
|
||||
web.install.option.nocache.label=Sem cache
|
||||
web.install.option.nocache.tip=Dados de sessão não serão armazenados após o aplicativo ser fechado
|
||||
web.install.option.noframe.label=Sem moldura
|
||||
web.install.option.noframe.tip=Se o aplicativo não deve ter uma moldura
|
||||
web.install.option.single.label=Execução única
|
||||
web.install.option.single.tip=Não permitirá que o aplicativo seja aberto novamente caso o mesmo já esteja
|
||||
web.install.option.tray.default.label=Abrir e anexar
|
||||
web.install.option.tray.default.tip=O ícone do aplicativo será anexado a bandeja do sistema após aberto
|
||||
web.install.option.tray.label=Modo bandeja
|
||||
web.install.option.tray.min.label=Iniciar minimizado
|
||||
web.install.option.tray.min.tip=O aplicativo será iniciado minimizado como um ícone da bandeja do sistema
|
||||
web.install.option.tray.off.label=Desligado
|
||||
web.install.option.tray.off.tip=Desligado
|
||||
web.install.option.wicon.deducted.label=Deduzido
|
||||
web.install.option.wicon.deducted.tip=O ícone será deduzido pelo {} durante a instalação
|
||||
web.install.option.wicon.displayed.label=Exibido
|
||||
web.install.option.wicon.displayed.tip=O ícone exibido na tabela será utilizado para a instalação
|
||||
web.install.option.wicon.label=Ícone
|
||||
web.install.option.widevine.label=Permitir conteúdo protegido
|
||||
web.install.option.widevine.tip=Permite a interação com conteúdo protegido/criptografado comumente utilizados por serviços de streaming (como videos, música, ...). Utiliza uma versão alternativa do Electron desenvolvida pela castLabs.
|
||||
web.install.options.advanced=avançadas
|
||||
web.install.options.basic=básicas
|
||||
web.install.options_dialog.title=Opções de instalação Web
|
||||
web.install.substatus.call_nativefier=Executando {}
|
||||
web.install.substatus.checking_fixes=Verificando se há correções publicadas
|
||||
web.install.substatus.options=Aguardando as opções de instalação
|
||||
web.install.substatus.shortcut=Criando um atalho no menu
|
||||
web.settings.cache_exp=Expiração das configurações de ambiente
|
||||
web.settings.cache_exp.tip=Define o período (em HORAS) em que as configurações do ambiente de instalação armazenadas são consideradas válidas. Utilize 0 para que elas sejam sempre atualizadas.
|
||||
web.settings.electron.version.label=Versão do Electron
|
||||
web.settings.electron.version.tooltip=Define uma versão alternativa do Electron para renderizar os novos aplicativos instalados
|
||||
web.settings.env.nativefier.system.not_installed={} não parece estar instalado no seu sistema
|
||||
web.settings.nativefier.env.tooltip=A versão do Nativefier instalada no ambiente isolado do {app} será utilizada para instalar aplicativos
|
||||
web.settings.nativefier.env=ambiente
|
||||
web.settings.nativefier.system.tooltip=A versão do Nativefier instalada no seu sistema será utilizada para instalar aplicativos
|
||||
web.settings.nativefier.system=sistema
|
||||
web.settings.nativefier.tip=Define qual versão do Nativefier será utilizada para gerar os aplicativos Web
|
||||
web.settings.suggestions.cache_exp=Expiração de sugestões
|
||||
web.settings.suggestions.cache_exp.tip=Define o período (em HORAS) em que as sugestões armazenadas em disco são consideradas atualizadas durante a inicialização. Use 0 para que elas sejam sempre atualizadas.
|
||||
web.task.download_settings=Atualizando configurações de ambiente
|
||||
web.task.search_index=Indexando sugestões
|
||||
web.task.suggestions.saving=Salvando em disco
|
||||
web.uninstall.error.install_dir.not_found=O diretório de instalação {} não foi encontrado
|
||||
web.uninstall.error.remove=Não foi possível remover {}
|
||||
web.waiting.env_updater=Atualizando ambiente
|
||||
wen.install.error=Ocorreu um erro durante a instalação de {}
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Позволяет устанавливать веб-приложения
|
||||
gem.web.install.warning=Это приложение официально не поддерживается владельцем домена
|
||||
web.custom_action.clean_env=Очистка среды установки
|
||||
web.custom_action.clean_env.failed=Произошла ошибка при очистке среды установки
|
||||
web.custom_action.clean_env.status=Среда установки будет очищена
|
||||
web.custom_action.clean_env.success=Среда установки очищена!
|
||||
web.custom_action.clean_env.desc=Удаление всех программных и конфигурационных файлов из среды установки
|
||||
web.custom_action.install_app=Установить веб-приложение
|
||||
web.custom_action.install_app.desc=Позволяет установить Web-сайт в качестве приложения
|
||||
web.custom_action.install_app.invalid_url=Адрес {URL} {url} не может быть найден. Невозможно завершить установку.
|
||||
web.custom_action.install_app.status=Установка веб-приложения
|
||||
web.env.checking=Проверка Веб-среды
|
||||
web.env.error=Проблемы с Веб-средой. Невозможно установить {}.
|
||||
web.environment.install=Устанавливается {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=описание
|
||||
web.info.03_version=версия
|
||||
web.info.04_categories=категории
|
||||
web.info.05_installation_dir=каталог установки
|
||||
web.info.06_desktop_entry=ярлык
|
||||
web.info.07_exec_file=исполняемый
|
||||
web.info.08_icon_path=значок
|
||||
web.info.09_size=размер
|
||||
web.info.10_config_dir=каталог конфигурационных файлов
|
||||
web.install.env_update.body=Следующие файлы должны быть загружены и установлены
|
||||
web.install.env_update.title=Обновление Веб-среды
|
||||
web.install.error=Произошла ошибка во время установки {}
|
||||
web.install.global_nativefier.unavailable={n} не установлен в вашей системе, что не позволит установить {app}
|
||||
web.install.nativefier.error.inner_dir=Каталог установки приложения не был найден в {}
|
||||
web.install.nativefier.error.unknown=Проверьте {} что-бы определить причину
|
||||
web.install.option.allow_urls.label=Разрешить внутренние URL-адреса
|
||||
web.install.option.allow_urls.tip=Позволяет приложению открывать внешние адреса / URL-адреса за пределами своей области. например: outlook.live.com сможет открыть account.microsoft.com
|
||||
web.install.option.category.none=нет
|
||||
web.install.option.fullscreen.label=Запускать во весь экран
|
||||
web.install.option.fullscreen.tip=Приложение будет запущено во весь экран ( клавиша Alt открывает верхнее меню )
|
||||
web.install.option.icon.label=Пользовательский значок
|
||||
web.install.option.ignore_certificate.label=Игнорировать ошибки сертификата
|
||||
web.install.option.ignore_certificate.tip=Ошибки, связанные с сертификатами, будут игнорироваться
|
||||
web.install.option.insecure.label=Разрешить небезопасное содержимое
|
||||
web.install.option.insecure.tip=Позволяет выполнять незащищенное содержимое внутри приложения
|
||||
web.install.option.max.label=Запускать развернутым
|
||||
web.install.option.max.tip=Окно приложения запустится развернутым
|
||||
web.install.option.nocache.label=без кэша
|
||||
web.install.option.nocache.tip=Данные сессии не будут сохранены после того, как приложение будет закрыто
|
||||
web.install.option.noframe.label=Без рамки
|
||||
web.install.option.noframe.tip=Приложение будет запущено без рамки окна
|
||||
web.install.option.single.label=Не запускать повтороно
|
||||
web.install.option.single.tip=Эта опция не позволит приложению запуститься, если оно уже работает
|
||||
web.install.option.tray.default.label=Запустить и прикрепить
|
||||
web.install.option.tray.default.tip=Значок приложения будет прикреплен к панели задач после запуска
|
||||
web.install.option.tray.label=Режим лотка
|
||||
web.install.option.tray.min.label=Запускать свернутым
|
||||
web.install.option.tray.min.tip=Приложение будет запущено свернутым в значок системного лотка
|
||||
web.install.option.tray.off.label=Выкл
|
||||
web.install.option.tray.off.tip=Выкл
|
||||
web.install.option.wicon.deducted.label=Значок приложения
|
||||
web.install.option.wicon.deducted.tip=Значок будет взят из {} в процессе установки
|
||||
web.install.option.wicon.displayed.label=Отображать
|
||||
web.install.option.wicon.displayed.tip=Значок, отображаемый на столе, будет использоваться для установки
|
||||
web.install.option.wicon.label=Значок
|
||||
web.install.option.widevine.label=Разрешить защищенный контент
|
||||
web.install.option.widevine.tip=Позволяет взаимодействовать с защищенным/зашифрованным контентом, обычно используемым в потоковых сервисах (видео, музыка, ...). Используется альтернативная версия Electron, разработанная компанией castLabs.
|
||||
web.install.options.advanced=расширенные
|
||||
web.install.options.basic=базовые
|
||||
web.install.options_dialog.title=опции установки
|
||||
web.install.substatus.call_nativefier=Работает {}
|
||||
web.install.substatus.checking_fixes=Проверка опубликованных исправлений
|
||||
web.install.substatus.options=Ожидание опций установки
|
||||
web.install.substatus.shortcut=Создается ярлык в меню
|
||||
web.settings.cache_exp=Срок действия настроек среды
|
||||
web.settings.cache_exp.tip=Определяет период (в часах), в течение которого сохраненные настройки среды считаются действительными. Используйте 0, чтобы они всегда обновлялись.
|
||||
web.settings.electron.version.label=Версия Electron
|
||||
web.settings.electron.version.tooltip=Указывает альтернативный вариант Electron для визуализации устанавливаемых приложений
|
||||
web.settings.env.nativefier.system.not_installed={} не установлен в Вашей системе
|
||||
web.settings.nativefier.env=Из Веб-среды
|
||||
web.settings.nativefier.env.tooltip=Будет использоваться версия Nativefier установленная в изолированную Веб-среду {app}
|
||||
web.settings.nativefier.system=Из системы
|
||||
web.settings.nativefier.system.tooltip=Будет использоваться версия Nativefier установленная в Вашей системе
|
||||
web.settings.nativefier.tip=Определяет, какие Nativefier версии должны быдут использованы для установки веб-приложений
|
||||
web.settings.suggestions.cache_exp=Срок действия предложений
|
||||
web.settings.suggestions.cache_exp.tip=Определяет период (в часах), в течение которого предложения, хранящиеся на диске, считаются актуальными в процессе инициализации. Используйте 0, чтобы предложения всегда обновлялись
|
||||
web.task.download_settings=Обновление настроек среды
|
||||
web.task.search_index=Рекомендации для индексации
|
||||
web.task.suggestions.saving=Сохранение на диск
|
||||
web.uninstall.error.install_dir.not_found=Каталог установки {} не найден
|
||||
web.uninstall.error.remove_dir=Не удалось удалить {}
|
||||
web.waiting.env_updater=Обнавляется Веб-среда
|
||||
@@ -1,87 +0,0 @@
|
||||
gem.web.info=Web uygulamalarını adresleri (URL'ler) aracılığıyla sisteme yüklemeye izin verir
|
||||
gem.web.install.warning=Bu uygulama resmi olarak alan adı sahibi tarafından dağıtılmamış
|
||||
web.custom_action.clean_env.failed=Kurulum ortamı temizliği sırasında bir hata oluştu
|
||||
web.custom_action.clean_env.status=Kurulum ortamını temizleme
|
||||
web.custom_action.clean_env.success=Kurulum ortamı temizlendi
|
||||
web.custom_action.clean_env=Temiz kurulum ortamı
|
||||
web.custom_action.clean_env.desc=Removes all software and configuration files from the installation environment
|
||||
web.custom_action.install_app=Install Web application
|
||||
web.custom_action.install_app.desc=Allows to install a Web site as an application
|
||||
web.custom_action.install_app.invalid_url=The address {URL} {url} could not be found. It is not possible to finish the installation.
|
||||
web.custom_action.install_app.status=Installing Web application
|
||||
web.env.checking=Web kurulum ortamını kontrol et
|
||||
web.env.error=Görünüşe göre Web kurulum ortamıyla ilgili sorunlar var. {} kurmak mümkün olmayacak.
|
||||
web.environment.install={} yükleniyor
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=açıklama
|
||||
web.info.03_version=sürüm
|
||||
web.info.04_categories=kategoriler
|
||||
web.info.05_installation_dir=kurulum dizini
|
||||
web.info.06_desktop_entry=kısayol
|
||||
web.info.07_exec_file=çalıştırılabilir
|
||||
web.info.08_icon_path=simge
|
||||
web.info.09_size=boyut
|
||||
web.info.10_config_dir=yapılandırma dizini
|
||||
web.install.env_update.body=Aşağıdaki dosyalar indirilmeli ve kurulmalıdır
|
||||
web.install.env_update.title=Ortam güncellemesi
|
||||
web.install.error={} kurulumu sırasında bir hata oluştu
|
||||
web.install.global_nativefier.unavailable={n} sisteminize kurulmamış gibi görünüyor. {app} yüklemek mümkün olmayacak
|
||||
web.install.nativefier.error.inner_dir=Uygulama yükleme dizini {} içinde bulunamadı
|
||||
web.install.nativefier.error.unknown=Nedeni belirlemek için {}
|
||||
web.install.option.allow_urls.label=Dahili bağlantılara izin ver
|
||||
web.install.option.allow_urls.tip=Uygulamanın kendi etki alanı dışındaki adresleri / bağlantıları dahili olarak açmasına izin verir. örneğin: outlook.live.com account.microsoft.com'u açabilir
|
||||
web.install.option.category.none=hiçbiri
|
||||
web.install.option.fullscreen.label=Tam ekranda aç
|
||||
web.install.option.fullscreen.tip=Uygulamanın her zaman tam ekran açılması gerekiyorsa (Alt tuşu üst menüyü açar)
|
||||
web.install.option.icon.label=Özel simge
|
||||
web.install.option.ignore_certificate.label=Sertifika hatalarını yoksay
|
||||
web.install.option.ignore_certificate.tip=Sertifika ile ilgili hatalar uygulama tarafından yok sayılır
|
||||
web.install.option.insecure.label=Güvenli olmayan içeriğe izin ver
|
||||
web.install.option.insecure.tip=Uygulama içinde güvenli olmayan içeriğin yürütülmesine izin verir
|
||||
web.install.option.max.label= Maksimize açık
|
||||
web.install.option.max.tip=Uygulamanın her zaman maximize düzeye açılması gerekiyorsa
|
||||
web.install.option.nocache.label=Önbellek yok
|
||||
web.install.option.nocache.tip=Oturum verileri uygulama kapatıldıktan sonra saklanmayacak
|
||||
web.install.option.noframe.label=Çerçeve yok
|
||||
web.install.option.noframe.tip=Uygulamanın bir çerçevesi olmamalı
|
||||
web.install.option.single.label=Tek çalıştırma
|
||||
web.install.option.single.tip=Zaten açıksa, uygulamanın tekrar açılmasına izin vermez
|
||||
web.install.option.tray.default.label=Aç ve ekle
|
||||
web.install.option.tray.default.tip=Uygulama simgesi açıldıktan sonra sistem tepsisine eklenecek
|
||||
web.install.option.tray.label=Sistem tepsi modu
|
||||
web.install.option.tray.min.label=Simge durumuna küçült
|
||||
web.install.option.tray.min.tip=Uygulama, sistem tepsisinde bir simge simge durumuna küçültülecek
|
||||
web.install.option.tray.off.label=Kapalı
|
||||
web.install.option.tray.off.tip=Kapalı
|
||||
web.install.option.wicon.deducted.label=Mahsup
|
||||
web.install.option.wicon.deducted.tip=Kurulum sırasında simge {} tarafından kesilecek
|
||||
web.install.option.wicon.displayed.label=Görüntülenen
|
||||
web.install.option.wicon.displayed.tip=Tabloda görüntülenen simge kurulum için kullanılacaktır
|
||||
web.install.option.wicon.label=Simge
|
||||
web.install.option.widevine.label=Allow protected content
|
||||
web.install.option.widevine.tip=It allows the interaction with protected/encrypted content commonly used by streaming services (like videos, music, ...). It uses and alternative Electron version developed by castLabs.
|
||||
web.install.options.advanced=gelişmiş
|
||||
web.install.options.basic=basit
|
||||
web.install.options_dialog.title=Kurulum seçenekleri
|
||||
web.install.substatus.call_nativefier={} çalışıyor
|
||||
web.install.substatus.checking_fixes=Yayınlanmış düzeltmeler olup olmadığını kontrol et
|
||||
web.install.substatus.options=Kurulum seçenekleri bekleniyor
|
||||
web.install.substatus.shortcut=Bir menü kısayolu oluşturuluyor
|
||||
web.settings.cache_exp=Environment settings expiration
|
||||
web.settings.cache_exp.tip=It defines the period (in HOURS) in which the stored environment settings are considered valid. Use 0 so that they are always updated.
|
||||
web.settings.electron.version.label=Electron sürümü
|
||||
web.settings.electron.version.tooltip=Yeni yüklenen uygulamaları oluşturmak için alternatif bir Elektron sürümü tanımlar
|
||||
web.settings.env.nativefier.system.not_installed={} sisteminize kurulu değil gibi görünüyor
|
||||
web.settings.nativefier.env.tooltip=İzole {app} ortamına yüklenen Nativefier sürümü, uygulamaları yüklemek için kullanılacaktır
|
||||
web.settings.nativefier.env=çevre
|
||||
web.settings.nativefier.system.tooltip=Sisteminizde yüklü olan Nativefier sürümü uygulamaları yüklemek için kullanılacaktır
|
||||
web.settings.nativefier.system=sistem
|
||||
web.settings.nativefier.tip=Web uygulamalarını oluşturmak için hangi Nativefier sürümünün kullanılması gerektiğini tanımlar
|
||||
web.settings.suggestions.cache_exp=Suggestions expiration
|
||||
web.settings.suggestions.cache_exp.tip=It defines the period (in HOURS) in which suggestions stored on the disk are considered up to date during the initialization process. Use 0 so that they are always updated
|
||||
web.task.download_settings=Ortam ayarları güncelleniyor
|
||||
web.task.search_index=Indexing suggestions
|
||||
web.task.suggestions.saving=Saving to disk
|
||||
web.uninstall.error.install_dir.not_found={} kurulum dizini bulunamadı
|
||||
web.uninstall.error.remove_dir={} kaldırmak mümkün olmadı
|
||||
web.waiting.env_updater=Ortam güncelleniyor
|
||||
@@ -1,81 +0,0 @@
|
||||
gem.web.info=允许通过其地址(URL)在系统上安装 Web 应用程序
|
||||
gem.web.install.warning=此应用程序未由其域所有者官方分发
|
||||
web.custom_action.clean_env.failed=在安装环境清理期间发生错误
|
||||
web.custom_action.clean_env.status=清理安装环境
|
||||
web.custom_action.clean_env.success=安装环境已清理
|
||||
web.custom_action.clean_env=清理安装环境
|
||||
web.custom_action.clean_env.desc=从安装环境中删除所有软件和配置文件
|
||||
web.custom_action.install_app=安装 Web 应用程序
|
||||
web.custom_action.install_app.desc=允许将 Web 站点安装为应用程序
|
||||
web.custom_action.install_app.invalid_url=找不到地址 {URL} {url}。无法完成安装。
|
||||
web.custom_action.install_app.status=安装 Web 应用程序
|
||||
web.env.checking=检查 Web 安装环境
|
||||
web.env.error=似乎存在 Web 安装环境问题。将无法安装 {}。
|
||||
web.environment.install=安装 {}
|
||||
web.info.01_url=URL
|
||||
web.info.02_description=描述
|
||||
web.info.03_version=版本
|
||||
web.info.04_categories=类别
|
||||
web.info.05_installation_dir=安装目录
|
||||
web.info.06_desktop_entry=快捷方式
|
||||
web.info.07_exec_file=可执行文件
|
||||
web.info.08_icon_path=图标
|
||||
web.info.09_size=大小
|
||||
web.info.10_config_dir=配置目录
|
||||
web.install.env_update.body=必须下载并安装以下文件
|
||||
web.install.env_update.title=环境更新
|
||||
web.install.error=在 {} 安装期间发生错误
|
||||
web.install.global_nativefier.unavailable={} 似乎未安装在您的系统上。将无法安装 {app}
|
||||
web.install.nativefier.error.inner_dir=在 {} 中未找到应用程序安装目录
|
||||
web.install.nativefier.error.unknown=查看 {} 以查明原因
|
||||
web.install.option.allow_urls.label=允许内部 URL
|
||||
web.install.option.allow_urls.tip=允许应用程序在其域之外内部打开地址 / URL。例如:outlook.live.com 将能够打开 account.microsoft.com
|
||||
web.install.option.category.none=无
|
||||
web.install.option.fullscreen.label=全屏打开
|
||||
web.install.option.fullscreen.tip=如果应用程序应始终以全屏打开(Alt 键打开上方菜单)
|
||||
web.install.option.icon.label=自定义图标
|
||||
web.install.option.ignore_certificate.label=忽略证书错误
|
||||
web.install.option.ignore_certificate.tip=应用程序将忽略与证书相关的错误
|
||||
web.install.option.insecure.label=允许不安全内容
|
||||
web.install.option.insecure.tip=允许在应用程序中执行不安全内容
|
||||
web.install.option.max.label=最大化打开
|
||||
web.install.option.max.tip=如果应用程序应始终以最大化打开
|
||||
web.install.option.nocache.label=无缓存
|
||||
web.install.option.nocache.tip=会话数据将在应用程序关闭后不会被存储
|
||||
web.install.option.noframe.label=无框架
|
||||
web.install.option.noframe.tip=应用程序是否应该没有框架
|
||||
web.install.option.single.label=单次运行
|
||||
web.install.option.single.tip=如果已经打开,则不允许再次打开应用程序
|
||||
web.install.option.tray.default.label=打开并附加
|
||||
web.install.option.tray.default.tip=应用程序图标将在打开后附加到系统托盘
|
||||
web.install.option.tray.label=托盘模式
|
||||
web.install.option.tray.min.label=启动时最小化
|
||||
web.install.option.tray.min.tip=应用程序将以最小化的方式作为系统托盘中的图标启动
|
||||
web.install.option.tray.off.label=关闭
|
||||
web.install.option.tray.off.tip=关闭
|
||||
web.install.option.wicon.deducted.label=扣除
|
||||
web.install.option.wicon.deducted.tip=在安装期间将由 {} 扣除图标
|
||||
web.install.option.wicon.displayed.label=显示
|
||||
web.install.option.wicon.displayed.tip=在表上显示的图标将用于安装
|
||||
web.install.option.wicon.label=图标
|
||||
web.install.option.widevine.label=允许受保护的内容
|
||||
web.install.option.widevine.tip=允许与流媒体服务(如视频、音乐等)中常用的受保护 / 加密内容进行交互。它使用 castLabs 开发的替代 Electron 版本。
|
||||
web.install.options.advanced=高级
|
||||
web.install.options.basic=基本
|
||||
web.install.options_dialog.title=Web 安装选项
|
||||
web.install.substatus.call_nativefier=运行 {}
|
||||
web.install.substatus.checking_fixes=检查是否有发布的修复
|
||||
web.install.substatus.options=等待安装选项
|
||||
web.install.substatus.shortcut=生成菜单快捷方式
|
||||
web.settings.cache_exp=环境设置过期时间
|
||||
web.settings.cache_exp.tip=它定义了存储的环境设置在初始化过程中被视为有效的时间段(以小时为单位)。使用 0 使其始终更新。
|
||||
web.settings.electron.version.label=Electron 版本
|
||||
web.settings.electron.version.tooltip=定义用于呈现新安装应用程序的替代 Electron 版本
|
||||
web.settings.env.nativefier.system.not_installed={} 似乎未安装在您的系统上
|
||||
web.settings.nativefier.env.tooltip=将在隔离的 {app} 环境中安装的 Nativefier 版本用于安装应用程序
|
||||
web.settings.nativefier.env=环境
|
||||
web.settings.nativefier.system.tooltip=将在您的系统上安装的 Nativefier 版本用于安装应用程序
|
||||
web.settings.nativefier.system=系统
|
||||
web.settings.nativefier.tip=定义应该用于生成 Web 应用程序的 Nativefier 版本
|
||||
web.settings.suggestions.cache_exp=建议过期时间
|
||||
web.settings.suggestions.cache_exp.tip=它定义了在初始化过程中磁盘上存储的建议被视
|
||||
@@ -1,67 +0,0 @@
|
||||
import os
|
||||
import time
|
||||
import traceback
|
||||
from logging import Logger
|
||||
from typing import Optional
|
||||
|
||||
import yaml
|
||||
|
||||
from bauh.gems.web import SEARCH_INDEX_FILE
|
||||
|
||||
|
||||
class SearchIndexManager:
|
||||
|
||||
def __init__(self, logger: Logger):
|
||||
self.logger = logger
|
||||
|
||||
def generate(self, suggestions: dict) -> Optional[dict]:
|
||||
if suggestions:
|
||||
ti = time.time()
|
||||
index = {}
|
||||
|
||||
for key, sug in suggestions.items():
|
||||
name = sug.get('name')
|
||||
|
||||
if name:
|
||||
split_name = name.lower().strip().split(' ')
|
||||
single_name = ''.join(split_name)
|
||||
|
||||
for word in (*split_name, single_name):
|
||||
mapped = index.get(word)
|
||||
|
||||
if not mapped:
|
||||
mapped = set()
|
||||
index[word] = mapped
|
||||
|
||||
mapped.add(key)
|
||||
|
||||
tf = time.time()
|
||||
self.logger.info("Took {0:.4f} seconds to generate the index".format(tf - ti))
|
||||
|
||||
return index
|
||||
|
||||
def read(self) -> Optional[dict]:
|
||||
if os.path.exists(SEARCH_INDEX_FILE):
|
||||
with open(SEARCH_INDEX_FILE) as f:
|
||||
return yaml.safe_load(f.read())
|
||||
else:
|
||||
self.logger.warning("No search index found at {}".format(SEARCH_INDEX_FILE))
|
||||
|
||||
def write(self, index: dict) -> bool:
|
||||
if index:
|
||||
self.logger.info('Preparing search index for writing') # YAML does not work with 'sets'
|
||||
|
||||
for key in index.keys():
|
||||
index[key] = list(index[key])
|
||||
|
||||
try:
|
||||
self.logger.info('Writing {} indexed keys as {}'.format(len(index), SEARCH_INDEX_FILE))
|
||||
with open(SEARCH_INDEX_FILE, 'w+') as f:
|
||||
f.write(yaml.safe_dump(index))
|
||||
self.logger.info("Search index successfully written at {}".format(SEARCH_INDEX_FILE))
|
||||
return True
|
||||
except Exception:
|
||||
self.logger.error("Could not write the search index to {}".format(SEARCH_INDEX_FILE))
|
||||
traceback.print_exc()
|
||||
|
||||
return False
|
||||
@@ -1,166 +0,0 @@
|
||||
import os
|
||||
import traceback
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from logging import Logger
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
import requests
|
||||
import yaml
|
||||
|
||||
from bauh.api.http import HttpClient
|
||||
from bauh.commons.util import map_timestamp_file
|
||||
from bauh.gems.web import WEB_CACHE_DIR
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class SuggestionsManager:
|
||||
|
||||
def __init__(self, http_client: HttpClient, logger: Logger, i18n: I18n, file_url: Optional[str]):
|
||||
self.http_client = http_client
|
||||
self.logger = logger
|
||||
self.i18n = i18n
|
||||
if file_url:
|
||||
self._file_url = file_url
|
||||
else:
|
||||
self._file_url = "https://raw.githubusercontent.com/vinifmor/bauh-files/master/web/env/v2/suggestions.yml"
|
||||
self._cached_file_path = f'{WEB_CACHE_DIR}/suggestions.yml'
|
||||
self._cached_file_ts_path = map_timestamp_file(self._cached_file_path)
|
||||
|
||||
@property
|
||||
def file_url(self) -> Optional[str]:
|
||||
return self._file_url
|
||||
|
||||
def is_custom_local_file_mapped(self) -> bool:
|
||||
return self._file_url and self._file_url.startswith('/')
|
||||
|
||||
def should_download(self, web_config: dict) -> bool:
|
||||
if not self._file_url:
|
||||
return False
|
||||
|
||||
if self.is_custom_local_file_mapped():
|
||||
return False
|
||||
|
||||
exp = web_config['suggestions']['cache_exp']
|
||||
if web_config['suggestions']['cache_exp'] is None:
|
||||
self.logger.info("No cache expiration defined for suggestions")
|
||||
return True
|
||||
|
||||
try:
|
||||
exp = int(exp)
|
||||
except ValueError:
|
||||
self.logger.error(f"Error while parsing the 'suggestions.cache_exp' ({exp}) settings property")
|
||||
return True
|
||||
|
||||
if exp <= 0:
|
||||
self.logger.info(f"No cache expiration defined for suggestions ({exp})")
|
||||
return True
|
||||
|
||||
if not os.path.exists(self._cached_file_path):
|
||||
self.logger.info(f"No suggestions cached file found '{self._cached_file_path}'")
|
||||
return True
|
||||
|
||||
if not os.path.exists(self._cached_file_ts_path):
|
||||
self.logger.info(f"No suggestions cache file timestamp found '{self._cached_file_ts_path}'")
|
||||
return True
|
||||
|
||||
with open(self._cached_file_ts_path) as f:
|
||||
timestamp_str = f.read()
|
||||
|
||||
try:
|
||||
sugs_timestamp = datetime.fromtimestamp(float(timestamp_str), tz=timezone.utc)
|
||||
except Exception:
|
||||
self.logger.error(f"Could not parse the cached suggestions file timestamp: {timestamp_str}")
|
||||
return True
|
||||
|
||||
expired = sugs_timestamp + timedelta(days=exp) <= datetime.now(timezone.utc)
|
||||
|
||||
if expired:
|
||||
self.logger.info("Cached suggestions file has expired.")
|
||||
return True
|
||||
else:
|
||||
self.logger.info("Cached suggestions file is up to date")
|
||||
return False
|
||||
|
||||
def get_cached_file_path(self) -> str:
|
||||
return self._file_url if self.is_custom_local_file_mapped() else self._cached_file_path
|
||||
|
||||
def read_cached(self, check_file: bool = True) -> dict:
|
||||
if self.is_custom_local_file_mapped():
|
||||
file_path, log_ref = self._file_url, 'local'
|
||||
else:
|
||||
file_path, log_ref = self._cached_file_path, 'cached'
|
||||
|
||||
if check_file and not os.path.exists(file_path):
|
||||
self.logger.warning(f"{log_ref.capitalize()} suggestions file does not exist ({file_path})")
|
||||
return {}
|
||||
|
||||
self.logger.info(f"Reading {log_ref} suggestions file '{file_path}'")
|
||||
with open(file_path) as f:
|
||||
sugs_str = f.read()
|
||||
|
||||
if not sugs_str:
|
||||
self.logger.warning(f"{log_ref.capitalize()} suggestions file '{file_path}' is empty")
|
||||
return {}
|
||||
|
||||
try:
|
||||
return yaml.safe_load(sugs_str)
|
||||
except Exception:
|
||||
self.logger.error("An unexpected exception happened")
|
||||
traceback.print_exc()
|
||||
return {}
|
||||
|
||||
def download(self) -> dict:
|
||||
self.logger.info(f"Reading suggestions from {self._file_url}")
|
||||
try:
|
||||
suggestions = self.http_client.get_yaml(self._file_url, session=False)
|
||||
|
||||
if suggestions:
|
||||
self.logger.info(f"{len(suggestions)} suggestions successfully read")
|
||||
else:
|
||||
self.logger.warning(f"Could not read suggestions from {self._file_url}")
|
||||
|
||||
except (requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout):
|
||||
self.logger.warning("Internet seems to be off: it was not possible to retrieve the suggestions")
|
||||
suggestions = {}
|
||||
|
||||
self.logger.info("Finished")
|
||||
return suggestions
|
||||
|
||||
def save_to_disk(self, suggestions: dict, timestamp: float):
|
||||
if not suggestions:
|
||||
return
|
||||
|
||||
if self.is_custom_local_file_mapped():
|
||||
return
|
||||
|
||||
self.logger.info(f'Caching {len(suggestions)} suggestions to the disk')
|
||||
suggestions_file_dir = os.path.dirname(self._cached_file_path)
|
||||
|
||||
try:
|
||||
Path(suggestions_file_dir).mkdir(parents=True, exist_ok=True)
|
||||
except OSError:
|
||||
self.logger.error(f"Could not generate the directory {suggestions_file_dir}")
|
||||
traceback.print_exc()
|
||||
return
|
||||
|
||||
try:
|
||||
with open(self._cached_file_path, 'w+') as f:
|
||||
f.write(yaml.safe_dump(suggestions))
|
||||
except Exception:
|
||||
self.logger.error(f"Could write to {self._cached_file_path}")
|
||||
traceback.print_exc()
|
||||
return
|
||||
|
||||
self.logger.info(f"{len(suggestions)} suggestions successfully cached to file '{self._cached_file_path}'")
|
||||
|
||||
try:
|
||||
with open(self._cached_file_ts_path, 'w+') as f:
|
||||
f.write(str(timestamp))
|
||||
except Exception:
|
||||
self.logger.error(f"Could not write to {self._cached_file_ts_path}")
|
||||
traceback.print_exc()
|
||||
return
|
||||
|
||||
self.logger.info(f"Suggestions cached file timestamp ({timestamp}) "
|
||||
f"successfully saved at '{self._cached_file_ts_path}'")
|
||||
@@ -1,136 +0,0 @@
|
||||
import logging
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime, timezone
|
||||
from threading import Thread
|
||||
from typing import Optional
|
||||
|
||||
from bauh.api.abstract.handler import TaskManager
|
||||
from bauh.commons.boot import CreateConfigFile
|
||||
from bauh.commons.html import bold
|
||||
from bauh.gems.web import get_icon_path
|
||||
from bauh.gems.web.environment import EnvironmentUpdater
|
||||
from bauh.gems.web.search import SearchIndexManager
|
||||
from bauh.gems.web.suggestions import SuggestionsManager
|
||||
from bauh.view.util.translation import I18n
|
||||
|
||||
|
||||
class SuggestionsLoader(Thread):
|
||||
|
||||
def __init__(self, taskman: TaskManager, manager: SuggestionsManager,
|
||||
i18n: I18n, logger: logging.Logger, suggestions_callback, create_config: CreateConfigFile,
|
||||
internet_connection: bool, suggestions: Optional[dict] = None):
|
||||
super(SuggestionsLoader, self).__init__(daemon=True)
|
||||
self.taskman = taskman
|
||||
self.task_id = 'web_sugs'
|
||||
self.manager = manager
|
||||
self.suggestions_callback = suggestions_callback
|
||||
self.i18n = i18n
|
||||
self.logger = logger
|
||||
self.suggestions = suggestions
|
||||
self.create_config = create_config
|
||||
self.internet_connection = internet_connection
|
||||
self.task_name = self.i18n['task.download_suggestions']
|
||||
self.taskman.register_task(self.task_id, self.task_name, get_icon_path())
|
||||
|
||||
def run(self):
|
||||
ti = time.time()
|
||||
if self.manager.is_custom_local_file_mapped():
|
||||
self.taskman.update_progress(self.task_id, 50, None)
|
||||
self.logger.info(f"Local Web suggestions file mapped: {self.manager.file_url}")
|
||||
self.suggestions = self.manager.read_cached()
|
||||
else:
|
||||
wait_msg = self.i18n['task.waiting_task'].format(bold(self.create_config.task_name))
|
||||
self.taskman.update_progress(self.task_id, 0, wait_msg)
|
||||
self.create_config.join()
|
||||
|
||||
self.taskman.update_progress(self.task_id, 10, None)
|
||||
|
||||
if not self.internet_connection:
|
||||
self.logger.warning("No internet connection. Only cached suggestions can be loaded")
|
||||
self.suggestions = self.manager.read_cached()
|
||||
elif not self.manager.should_download(self.create_config.config):
|
||||
self.suggestions = self.manager.read_cached(check_file=False)
|
||||
else:
|
||||
try:
|
||||
timestamp = datetime.now(timezone.utc).timestamp()
|
||||
self.suggestions = self.manager.download()
|
||||
|
||||
if self.suggestions:
|
||||
self.taskman.update_progress(self.task_id, 50, self.i18n['web.task.suggestions.saving'])
|
||||
self.manager.save_to_disk(self.suggestions, timestamp)
|
||||
except Exception:
|
||||
self.logger.error("Unexpected exception")
|
||||
traceback.print_exc()
|
||||
|
||||
if self.suggestions_callback:
|
||||
self.taskman.update_progress(self.task_id, 75, None)
|
||||
try:
|
||||
self.suggestions_callback(self.suggestions)
|
||||
except Exception:
|
||||
self.logger.error("Unexpected exception")
|
||||
traceback.print_exc()
|
||||
|
||||
self.taskman.update_progress(self.task_id, 100, None)
|
||||
self.taskman.finish_task(self.task_id)
|
||||
tf = time.time()
|
||||
self.logger.info("Finished. Took {0:.4f} seconds".format(tf - ti))
|
||||
|
||||
|
||||
class SearchIndexGenerator(Thread):
|
||||
|
||||
def __init__(self, taskman: TaskManager, idxman: SearchIndexManager, suggestions_loader: SuggestionsLoader,
|
||||
i18n: I18n, logger: logging.Logger):
|
||||
super(SearchIndexGenerator, self).__init__(daemon=True)
|
||||
self.taskman = taskman
|
||||
self.idxman = idxman
|
||||
self.i18n = i18n
|
||||
self.logger = logger
|
||||
self.suggestions_loader = suggestions_loader
|
||||
self.task_id = 'web_idx_gen'
|
||||
self.taskman.register_task(self.task_id, self.i18n['web.task.search_index'], get_icon_path())
|
||||
|
||||
def run(self):
|
||||
ti = time.time()
|
||||
|
||||
if self.suggestions_loader.is_alive():
|
||||
wait_msg = self.i18n['task.waiting_task'].format(bold(self.suggestions_loader.task_name))
|
||||
self.taskman.update_progress(self.task_id, 0, wait_msg)
|
||||
self.suggestions_loader.join()
|
||||
|
||||
if self.suggestions_loader.suggestions:
|
||||
self.taskman.update_progress(self.task_id, 1, None)
|
||||
self.logger.info('Indexing suggestions')
|
||||
index = self.idxman.generate(self.suggestions_loader.suggestions)
|
||||
|
||||
if index:
|
||||
self.taskman.update_progress(self.task_id, 50, self.i18n['web.task.suggestions.saving'])
|
||||
self.idxman.write(index)
|
||||
|
||||
self.taskman.update_progress(self.task_id, 100, None)
|
||||
self.taskman.finish_task(self.task_id)
|
||||
tf = time.time()
|
||||
self.logger.info("Finished. Took {0:.4f} seconds".format(tf - ti))
|
||||
|
||||
|
||||
class UpdateEnvironmentSettings(Thread):
|
||||
|
||||
def __init__(self, env_updater: EnvironmentUpdater, taskman: TaskManager, i18n: I18n, create_config: CreateConfigFile):
|
||||
super(UpdateEnvironmentSettings, self).__init__(daemon=True)
|
||||
self.env_updater = env_updater
|
||||
self.taskman = taskman
|
||||
self.create_config = create_config
|
||||
self.task_id = env_updater.task_read_settings_id
|
||||
self.i18n = i18n
|
||||
|
||||
def run(self):
|
||||
self.taskman.register_task(self.task_id, self.i18n['web.task.download_settings'], get_icon_path())
|
||||
self.taskman.update_progress(self.task_id, 1, self.i18n['task.waiting_task'].format(bold(self.create_config.task_name)))
|
||||
self.create_config.join()
|
||||
|
||||
web_config = self.create_config.config
|
||||
if self.env_updater.should_download_settings(web_config):
|
||||
self.env_updater.read_settings(web_config=web_config, cache=False)
|
||||
else:
|
||||
self.taskman.update_progress(self.task_id, 100, None)
|
||||
self.taskman.finish_task(self.task_id)
|
||||
Reference in New Issue
Block a user