diff --git a/.gitmodules b/.gitmodules index b6bc63efd4..e6a738fdf5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "src/3rdParty/GSL"] path = src/3rdParty/GSL url = https://github.com/microsoft/GSL +[submodule "src/Mod/AddonManager"] + path = src/Mod/AddonManager + url = https://github.com/FreeCAD/AddonManager.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22f43d741a..36430fd6c0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,6 @@ files: | src/Main| src/Tools| tests/src| - src/Mod/AddonManager| src/Mod/Assembly| src/Mod/CAM| src/Mod/Cloud| diff --git a/src/Mod/AddonManager b/src/Mod/AddonManager new file mode 160000 index 0000000000..34d433a02c --- /dev/null +++ b/src/Mod/AddonManager @@ -0,0 +1 @@ +Subproject commit 34d433a02c7ec5c73bec9c57d0a27ea70b36c90d diff --git a/src/Mod/AddonManager/ALLOWED_PYTHON_PACKAGES.txt b/src/Mod/AddonManager/ALLOWED_PYTHON_PACKAGES.txt deleted file mode 100644 index eec6400eaf..0000000000 --- a/src/Mod/AddonManager/ALLOWED_PYTHON_PACKAGES.txt +++ /dev/null @@ -1,35 +0,0 @@ -# This file lists the Python packages that the Addon Manager allows to be installed -# automatically via pip. To request that a package be added to this list, submit a -# pull request to the FreeCAD git repository with the requested package added. Only -# packages in this list will be processed from the metadata.txt and requirements.txt -# files specified by an Addon. Note that this is NOT a requirements.txt-format file, -# no version information may be specified, and no wildcards are supported. - -# Allow these packages to be installed: -aiofiles -autobahn -ezdxf -gmsh -gmsh-dev -lxml -markdown -matplotlib -msgpack -numpy -ocp -olefile -openpyxl -pandas -pillow -ply -py-slvs -pycollada -pygit2 -pynastran -requests -rhino3dm -scipy -xlrd -xlutils -xlwt -PyYAML diff --git a/src/Mod/AddonManager/Addon.py b/src/Mod/AddonManager/Addon.py deleted file mode 100644 index 8ec60ce48e..0000000000 --- a/src/Mod/AddonManager/Addon.py +++ /dev/null @@ -1,863 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines the Addon class to encapsulate information about FreeCAD Addons""" - -import os -import re -from datetime import datetime -from urllib.parse import urlparse -from typing import Dict, Set, List, Optional -from threading import Lock -from enum import IntEnum, auto -import xml.etree.ElementTree - -import addonmanager_freecad_interface as fci -from addonmanager_macro import Macro -import addonmanager_utilities as utils -from addonmanager_utilities import construct_git_url, process_date_string_to_python_datetime -from addonmanager_metadata import ( - Metadata, - MetadataReader, - UrlType, - Version, - DependencyType, -) -from AddonStats import AddonStats - -translate = fci.translate - -# A list of internal workbenches that can be used as a dependency of an Addon -INTERNAL_WORKBENCHES = { - "bim": "BIM", - "assembly": "Assembly", - "draft": "Draft", - "fem": "FEM", - "mesh": "Mesh", - "openscad": "OpenSCAD", - "part": "Part", - "partdesign": "PartDesign", - "cam": "CAM", - "plot": "Plot", - "points": "Points", - "robot": "Robot", - "sketcher": "Sketcher", - "spreadsheet": "Spreadsheet", - "techdraw": "TechDraw", -} - - -class Addon: - """Encapsulates information about a FreeCAD addon""" - - class Kind(IntEnum): - """The type of Addon: Workbench, macro, or package""" - - WORKBENCH = 1 - MACRO = 2 - PACKAGE = 3 - - def __str__(self) -> str: - if self.value == 1: - return "Workbench" - if self.value == 2: - return "Macro" - if self.value == 3: - return "Package" - return "ERROR_TYPE" - - class Status(IntEnum): - """The installation status of an Addon""" - - NOT_INSTALLED = 0 - UNCHECKED = 1 - NO_UPDATE_AVAILABLE = 2 - UPDATE_AVAILABLE = 3 - PENDING_RESTART = 4 - CANNOT_CHECK = 5 # If we don't have git, etc. - UNKNOWN = 100 - - def __lt__(self, other): - if self.__class__ is other.__class__: - return self.value < other.value - return NotImplemented - - def __str__(self) -> str: - if self.value == 0: - result = "Not installed" - elif self.value == 1: - result = "Unchecked" - elif self.value == 2: - result = "No update available" - elif self.value == 3: - result = "Update available" - elif self.value == 4: - result = "Restart required" - elif self.value == 5: - result = "Can't check" - else: - result = "ERROR_STATUS" - return result - - class Dependencies: - """Addon dependency information""" - - def __init__(self): - self.required_external_addons = [] # A list of Addons - self.blockers = [] # A list of Addons - self.replaces = [] # A list of Addons - self.internal_workbenches: Set[str] = set() # Required internal workbenches - self.python_requires: Set[str] = set() - self.python_optional: Set[str] = set() - self.python_min_version = {"major": 3, "minor": 0} - - class DependencyType(IntEnum): - """Several types of dependency information is stored""" - - INTERNAL_WORKBENCH = auto() - REQUIRED_ADDON = auto() - BLOCKED_ADDON = auto() - REPLACED_ADDON = auto() - REQUIRED_PYTHON = auto() - OPTIONAL_PYTHON = auto() - - class ResolutionFailed(RuntimeError): - """An exception type for dependency resolution failure.""" - - # The location of Addon Manager cache files: overridden by testing code - cache_directory = os.path.join(fci.DataPaths().cache_dir, "AddonManager") - - # The location of the Mod directory: overridden by testing code - mod_directory = fci.DataPaths().mod_dir - - # The location of the Macro directory: overridden by testing code - macro_directory = fci.DataPaths().macro_dir - - def __init__( - self, - name: str, - url: str = "", - status: Status = Status.UNKNOWN, - branch: str = "", - ): - self.name = name.strip() - self.display_name = self.name - self.url = url.strip() - self.branch = branch.strip() - self.python2 = False - self.obsolete = False - self.rejected = False - self.repo_type = Addon.Kind.WORKBENCH - self.description = None - self.tags = set() # Just a cache, loaded from Metadata - self.last_updated = None - self.stats = AddonStats() - self.score = 0 - - # To prevent multiple threads from running git actions on this repo at the - # same time - self.git_lock = Lock() - - # To prevent multiple threads from accessing the status at the same time - self.status_lock = Lock() - self.update_status = status - - self._clean_url() - - if utils.recognized_git_location(self): - self.metadata_url = construct_git_url(self, "package.xml") - else: - self.metadata_url = None - self.metadata: Optional[Metadata] = None - self.icon = None # A QIcon version of this Addon's icon - self.icon_file: str = "" # Absolute local path to cached icon file - self.best_icon_relative_path = "" - self.macro = None # Bridge to Gaël Écorchard's macro management class - self.updated_timestamp = None - self.installed_version = None - self.installed_metadata = None - - # Each repo is also a node in a directed dependency graph (referenced by name so - # they can be serialized): - self.requires: Set[str] = set() - self.blocks: Set[str] = set() - - # And maintains a list of required and optional Python dependencies - self.python_requires: Set[str] = set() - self.python_optional: Set[str] = set() - self.python_min_version = {"major": 3, "minor": 0} - - self._icon_file = None - self._cached_license: str = "" - self._cached_update_date = None - - def _clean_url(self): - # The url should never end in ".git", so strip it if it's there - parsed_url = urlparse(self.url) - if parsed_url.path.endswith(".git"): - self.url = parsed_url.scheme + "://" + parsed_url.netloc + parsed_url.path[:-4] - if parsed_url.query: - self.url += "?" + parsed_url.query - if parsed_url.fragment: - self.url += "#" + parsed_url.fragment - - def __str__(self) -> str: - result = f"FreeCAD {self.repo_type}\n" - result += f"Name: {self.name}\n" - result += f"URL: {self.url}\n" - result += "Has metadata\n" if self.metadata is not None else "No metadata found\n" - if self.macro is not None: - result += "Has linked Macro object\n" - return result - - @property - def license(self): - if not self._cached_license: - self._cached_license = "UNLICENSED" - if self.metadata and self.metadata.license: - self._cached_license = self.metadata.license - elif self.stats and self.stats.license: - self._cached_license = self.stats.license - elif self.macro: - if self.macro.license: - self._cached_license = self.macro.license - elif self.macro.on_wiki: - self._cached_license = "CC-BY-3.0" - return self._cached_license - - @property - def update_date(self): - if self._cached_update_date is None: - self._cached_update_date = 0 - if self.stats and self.stats.last_update_time: - self._cached_update_date = self.stats.last_update_time - elif self.macro and self.macro.date: - # Try to parse the date: - try: - self._cached_update_date = process_date_string_to_python_datetime( - self.macro.date - ) - except ValueError as e: - fci.Console.PrintWarning(str(e) + "\n") - else: - fci.Console.PrintWarning(f"No update date info for {self.name}\n") - return self._cached_update_date - - @classmethod - def from_macro(cls, macro: Macro): - """Create an Addon object from a Macro wrapper object""" - - if macro.is_installed(): - status = Addon.Status.UNCHECKED - else: - status = Addon.Status.NOT_INSTALLED - instance = Addon(macro.name, macro.url, status, "master") - instance.macro = macro - instance.repo_type = Addon.Kind.MACRO - instance.description = macro.desc - return instance - - @classmethod - def from_cache(cls, cache_dict: Dict): - """Load basic data from cached dict data. Does not include Macro or Metadata - information, which must be populated separately.""" - - mod_dir = os.path.join(cls.mod_directory, cache_dict["name"]) - if os.path.isdir(mod_dir): - status = Addon.Status.UNCHECKED - else: - status = Addon.Status.NOT_INSTALLED - instance = Addon(cache_dict["name"], cache_dict["url"], status, cache_dict["branch"]) - - for key, value in cache_dict.items(): - if not str(key).startswith("_"): - instance.__dict__[key] = value - - instance.repo_type = Addon.Kind(cache_dict["repo_type"]) - if instance.repo_type == Addon.Kind.PACKAGE: - # There must be a cached metadata file, too - cached_package_xml_file = os.path.join( - instance.cache_directory, - "PackageMetadata", - instance.name, - ) - if os.path.isfile(cached_package_xml_file): - instance.load_metadata_file(cached_package_xml_file) - - instance._load_installed_metadata() - - if "requires" in cache_dict: - instance.requires = set(cache_dict["requires"]) - instance.blocks = set(cache_dict["blocks"]) - instance.python_requires = set(cache_dict["python_requires"]) - instance.python_optional = set(cache_dict["python_optional"]) - - instance._clean_url() - - return instance - - def to_cache(self) -> Dict: - """Returns a dictionary with cache information that can be used later with - from_cache to recreate this object.""" - - return { - "name": self.name, - "display_name": self.display_name, - "url": self.url, - "branch": self.branch, - "repo_type": int(self.repo_type), - "description": self.description, - "cached_icon_filename": self.get_cached_icon_filename(), - "best_icon_relative_path": self.get_best_icon_relative_path(), - "python2": self.python2, - "obsolete": self.obsolete, - "rejected": self.rejected, - "requires": list(self.requires), - "blocks": list(self.blocks), - "python_requires": list(self.python_requires), - "python_optional": list(self.python_optional), - } - - def load_metadata_file(self, file: str) -> None: - """Read a given metadata file and set it as this object's metadata""" - - if os.path.exists(file): - try: - metadata = MetadataReader.from_file(file) - except xml.etree.ElementTree.ParseError: - fci.Console.PrintWarning( - "An invalid or corrupted package.xml file was found in the cache for" - ) - fci.Console.PrintWarning(f" {self.name}... ignoring the bad data.\n") - return - self.set_metadata(metadata) - self._clean_url() - else: - fci.Console.PrintLog(f"Internal error: {file} does not exist") - - def _load_installed_metadata(self) -> None: - # If it is actually installed, there is a SECOND metadata file, in the actual installation, - # that may not match the cached one if the Addon has not been updated but the cache has. - mod_dir = os.path.join(self.mod_directory, self.name) - installed_metadata_path = os.path.join(mod_dir, "package.xml") - if os.path.isfile(installed_metadata_path): - try: - self.installed_metadata = MetadataReader.from_file(installed_metadata_path) - except xml.etree.ElementTree.ParseError: - fci.Console.PrintWarning( - "An invalid or corrupted package.xml file was found in installation of" - ) - fci.Console.PrintWarning(f" {self.name}... ignoring the bad data.\n") - return - - def set_metadata(self, metadata: Metadata) -> None: - """Set the given metadata object as this object's metadata, updating the - object's display name and package type information to match, as well as - updating any dependency information, etc. - """ - - self.metadata = metadata - self.display_name = metadata.name - self.repo_type = Addon.Kind.PACKAGE - self.description = metadata.description - for url in metadata.url: - if url.type == UrlType.repository: - self.url = url.location - self.branch = url.branch if url.branch else "master" - self._clean_url() - self.extract_tags(self.metadata) - self.extract_metadata_dependencies(self.metadata) - - @staticmethod - def version_is_ok(metadata: Metadata) -> bool: - """Checks to see if the current running version of FreeCAD meets the - requirements set by the passed-in metadata parameter.""" - - from_fci = list(fci.Version()) - fc_version = Version(from_list=from_fci) - - dep_fc_min = metadata.freecadmin if metadata.freecadmin else fc_version - dep_fc_max = metadata.freecadmax if metadata.freecadmax else fc_version - - return dep_fc_min <= fc_version <= dep_fc_max - - def extract_metadata_dependencies(self, metadata: Metadata): - """Read dependency information from a metadata object and store it in this - Addon""" - - # Version check: if this piece of metadata doesn't apply to this version of - # FreeCAD, just skip it. - if not Addon.version_is_ok(metadata): - return - - if metadata.pythonmin: - self.python_min_version["major"] = metadata.pythonmin.version_as_list[0] - self.python_min_version["minor"] = metadata.pythonmin.version_as_list[1] - - for dep in metadata.depend: - if dep.dependency_type == DependencyType.internal: - if dep.package in INTERNAL_WORKBENCHES: - self.requires.add(dep.package) - else: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "{}: Unrecognized internal workbench '{}'", - ).format(self.name, dep.package) - ) - elif dep.dependency_type == DependencyType.addon: - self.requires.add(dep.package) - elif dep.dependency_type == DependencyType.python: - if dep.optional: - self.python_optional.add(dep.package) - else: - self.python_requires.add(dep.package) - else: - # Automatic resolution happens later, once we have a complete list of - # Addons - self.requires.add(dep.package) - - for dep in metadata.conflict: - self.blocks.add(dep.package) - - # Recurse - content = metadata.content - for _, value in content.items(): - for item in value: - self.extract_metadata_dependencies(item) - - def verify_url_and_branch(self, url: str, branch: str) -> None: - """Print diagnostic information for Addon Developers if their metadata is - inconsistent with the actual fetch location. Most often this is due to using - the wrong branch name.""" - - if self.url != url: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({})", - ).format(self.display_name, self.url, url) - + "\n" - ) - if self.branch != branch: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({})", - ).format(self.display_name, self.branch, branch) - + "\n" - ) - - def extract_tags(self, metadata: Metadata) -> None: - """Read the tags from the metadata object""" - - # Version check: if this piece of metadata doesn't apply to this version of - # FreeCAD, just skip it. - if not Addon.version_is_ok(metadata): - return - - for new_tag in metadata.tag: - self.tags.add(new_tag) - - content = metadata.content - for _, value in content.items(): - for item in value: - self.extract_tags(item) - - def contains_workbench(self) -> bool: - """Determine if this package contains (or is) a workbench""" - - if self.repo_type == Addon.Kind.WORKBENCH: - return True - return self.contains_packaged_content("workbench") - - def contains_macro(self) -> bool: - """Determine if this package contains (or is) a macro""" - - if self.repo_type == Addon.Kind.MACRO: - return True - return self.contains_packaged_content("macro") - - def contains_packaged_content(self, content_type: str): - """Determine if the package contains content_type""" - if self.repo_type == Addon.Kind.PACKAGE: - if self.metadata is None: - fci.Console.PrintLog( - f"Addon Manager internal error: lost metadata for package {self.name}\n" - ) - return False - content = self.metadata.content - return content_type in content - return False - - def contains_preference_pack(self) -> bool: - """Determine if this package contains a preference pack""" - return self.contains_packaged_content("preferencepack") - - def contains_bundle(self) -> bool: - """Determine if this package contains a bundle""" - return self.contains_packaged_content("bundle") - - def contains_other(self) -> bool: - """Determine if this package contains an "other" content item""" - return self.contains_packaged_content("other") - - def get_best_icon_relative_path(self) -> str: - """Get the path within the repo the addon's icon. Usually specified by - top-level metadata, but some authors omit it and specify only icons for the - contents. Find the first one of those, in such cases.""" - - if self.best_icon_relative_path: - return self.best_icon_relative_path - - if not self.metadata: - return "" - - real_icon = self.metadata.icon - if not real_icon: - # If there is no icon set for the entire package, see if there are any - # workbenches, which are required to have icons, and grab the first one - # we find: - content = self.metadata.content - if "workbench" in content: - wb = content["workbench"][0] - if wb.icon: - if wb.subdirectory: - subdir = wb.subdirectory - else: - subdir = wb.name - real_icon = subdir + wb.icon - - self.best_icon_relative_path = real_icon - return self.best_icon_relative_path - - def get_cached_icon_filename(self) -> str: - """NOTE: This function is deprecated and will be removed in a coming update.""" - - if hasattr(self, "cached_icon_filename") and self.cached_icon_filename: - return self.cached_icon_filename - - if not self.metadata: - return "" - - real_icon = self.metadata.icon - if not real_icon: - # If there is no icon set for the entire package, see if there are any - # workbenches, which are required to have icons, and grab the first one - # we find: - content = self.metadata.content - if "workbench" in content: - wb = content["workbench"][0] - if wb.icon: - if wb.subdirectory: - subdir = wb.subdirectory - else: - subdir = wb.name - real_icon = subdir + wb.icon - - real_icon = real_icon.replace( - "/", os.path.sep - ) # Required path separator in the metadata.xml file to local separator - - _, file_extension = os.path.splitext(real_icon) - store = os.path.join(self.cache_directory, "PackageMetadata") - self.cached_icon_filename = os.path.join(store, self.name, "cached_icon" + file_extension) - - return self.cached_icon_filename - - def walk_dependency_tree(self, all_repos, deps): - """Compute the total dependency tree for this repo (recursive) - - all_repos is a dictionary of repos, keyed on the name of the repo - - deps is an Addon.Dependency object encapsulating all the types of dependency - information that may be needed. - """ - - deps.python_requires |= self.python_requires - deps.python_optional |= self.python_optional - - deps.python_min_version["major"] = max( - deps.python_min_version["major"], self.python_min_version["major"] - ) - if deps.python_min_version["major"] == 3: - deps.python_min_version["minor"] = max( - deps.python_min_version["minor"], self.python_min_version["minor"] - ) - else: - fci.Console.PrintWarning("Unrecognized Python version information") - - for dep in self.requires: - if dep in all_repos: - if dep not in deps.required_external_addons: - deps.required_external_addons.append(all_repos[dep]) - all_repos[dep].walk_dependency_tree(all_repos, deps) - else: - # See if this is an internal workbench: - if dep.upper().endswith("WB"): - real_name = dep[:-2].strip().lower() - elif dep.upper().endswith("WORKBENCH"): - real_name = dep[:-9].strip().lower() - else: - real_name = dep.strip().lower() - - if real_name in INTERNAL_WORKBENCHES: - deps.internal_workbenches.add(INTERNAL_WORKBENCHES[real_name]) - else: - # Assume it's a Python requirement of some kind: - deps.python_requires.add(dep) - - for dep in self.blocks: - if dep in all_repos: - deps.blockers[dep] = all_repos[dep] - - def status(self): - """Threadsafe access to the current update status""" - with self.status_lock: - return self.update_status - - def set_status(self, status): - """Threadsafe setting of the update status""" - with self.status_lock: - self.update_status = status - - def is_disabled(self): - """Check to see if the disabling stopfile exists""" - - stopfile = os.path.join(self.mod_directory, self.name, "ADDON_DISABLED") - return os.path.exists(stopfile) - - def disable(self): - """Disable this addon from loading when FreeCAD starts up by creating a - stopfile""" - - stopfile = os.path.join(self.mod_directory, self.name, "ADDON_DISABLED") - with open(stopfile, "w", encoding="utf-8") as f: - f.write( - "The existence of this file prevents FreeCAD from loading this Addon. To re-enable, delete the file." - ) - - if self.contains_workbench(): - self.disable_workbench() - - def enable(self): - """Re-enable loading this addon by deleting the stopfile""" - - stopfile = os.path.join(self.mod_directory, self.name, "ADDON_DISABLED") - try: - os.unlink(stopfile) - except FileNotFoundError: - pass - - if self.contains_workbench(): - self.enable_workbench() - - def enable_workbench(self): - wbName = self.get_workbench_name() - - # Remove from the list of disabled. - self.remove_from_disabled_wbs(wbName) - - def disable_workbench(self): - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Workbenches") - wbName = self.get_workbench_name() - - # Add the wb to the list of disabled if it was not already - disabled_wbs = pref.GetString("Disabled", "NoneWorkbench,TestWorkbench") - # print(f"start disabling {disabled_wbs}") - disabled_wbs_list = disabled_wbs.split(",") - if not (wbName in disabled_wbs_list): - disabled_wbs += "," + wbName - pref.SetString("Disabled", disabled_wbs) - # print(f"done disabling : {disabled_wbs} \n") - - def desinstall_workbench(self): - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Workbenches") - wbName = self.get_workbench_name() - - # Remove from the list of ordered. - ordered_wbs = pref.GetString("Ordered", "") - # print(f"start remove from ordering {ordered_wbs}") - ordered_wbs_list = ordered_wbs.split(",") - ordered_wbs = "" - for wb in ordered_wbs_list: - if wb != wbName: - if ordered_wbs != "": - ordered_wbs += "," - ordered_wbs += wb - pref.SetString("Ordered", ordered_wbs) - # print(f"end remove from ordering {ordered_wbs}") - - # Remove from the list of disabled. - self.remove_from_disabled_wbs(wbName) - - def remove_from_disabled_wbs(self, wbName: str): - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Workbenches") - - disabled_wbs = pref.GetString("Disabled", "NoneWorkbench,TestWorkbench") - # print(f"start enabling : {disabled_wbs}") - disabled_wbs_list = disabled_wbs.split(",") - disabled_wbs = "" - for wb in disabled_wbs_list: - if wb != wbName: - if disabled_wbs != "": - disabled_wbs += "," - disabled_wbs += wb - pref.SetString("Disabled", disabled_wbs) - # print(f"Done enabling {disabled_wbs} \n") - - def get_workbench_name(self) -> str: - """Find the name of the workbench class (ie the name under which it's - registered in freecad core)'""" - wb_name = "" - - if self.repo_type == Addon.Kind.PACKAGE: - for wb in self.metadata.content["workbench"]: # we may have more than one wb. - if wb_name != "": - wb_name += "," - wb_name += wb.classname - if self.repo_type == Addon.Kind.WORKBENCH or wb_name == "": - wb_name = self.try_find_wbname_in_files() - if wb_name == "": - wb_name = self.name - return wb_name - - def try_find_wbname_in_files(self) -> str: - """Attempt to locate a line with an addWorkbench command in the workbench's - Python files. If it is directly instantiating a workbench, then we can use - the line to determine classname for this workbench. If it uses a variable, - or if the line doesn't exist at all, an empty string is returned.""" - mod_dir = os.path.join(self.mod_directory, self.name) - - for root, _, files in os.walk(mod_dir): - for f in files: - current_file = os.path.join(root, f) - if not os.path.isdir(current_file): - filename, extension = os.path.splitext(current_file) - if extension == ".py": - wb_classname = self._find_classname_in_file(current_file) - if wb_classname: - return wb_classname - return "" - - @staticmethod - def _find_classname_in_file(current_file) -> str: - try: - with open(current_file, "r", encoding="utf-8") as python_file: - content = python_file.read() - search_result = re.search(r"Gui.addWorkbench\s*\(\s*(\w+)\s*\(\s*\)\s*\)", content) - if search_result: - return search_result.group(1) - except OSError: - pass - return "" - - -# @dataclass(frozen) -class MissingDependencies: - """Encapsulates a group of four types of dependencies: - * Internal workbenches -> wbs - * External addons -> external_addons - * Required Python packages -> python_requires - * Optional Python packages -> python_optional - """ - - def __init__(self, repo: Addon, all_repos: List[Addon]): - deps = Addon.Dependencies() - repo_name_dict = {} - for r in all_repos: - repo_name_dict[r.name] = r - if hasattr(r, "display_name"): - # Test harness might not provide a display name - repo_name_dict[r.display_name] = r - - if hasattr(repo, "walk_dependency_tree"): - # Sometimes the test harness doesn't provide this function, to override - # any dependency checking - repo.walk_dependency_tree(repo_name_dict, deps) - - self.external_addons = [] - for dep in deps.required_external_addons: - if dep.status() == Addon.Status.NOT_INSTALLED: - self.external_addons.append(dep.name) - - # Now check the loaded addons to see if we are missing an internal workbench: - if fci.FreeCADGui: - wbs = [wb.lower() for wb in fci.FreeCADGui.listWorkbenches()] - else: - wbs = [] - - self.wbs = [] - for dep in deps.internal_workbenches: - if dep.lower() + "workbench" not in wbs: - if dep.lower() == "plot": - # Special case for plot, which is no longer a full workbench: - try: - __import__("Plot") - except ImportError: - # Plot might fail for a number of reasons - self.wbs.append(dep) - fci.Console.PrintLog("Failed to import Plot module") - else: - self.wbs.append(dep) - - # Check the Python dependencies: - self.python_min_version = deps.python_min_version - self.python_requires = [] - for py_dep in deps.python_requires: - if py_dep not in self.python_requires: - try: - __import__(py_dep) - except ImportError: - self.python_requires.append(py_dep) - except (OSError, NameError, TypeError, RuntimeError) as e: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Got an error when trying to import {}", - ).format(py_dep) - + ":\n" - + str(e) - ) - - self.python_optional = [] - for py_dep in deps.python_optional: - try: - __import__(py_dep) - except ImportError: - self.python_optional.append(py_dep) - except (OSError, NameError, TypeError, RuntimeError) as e: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Got an error when trying to import {}", - ).format(py_dep) - + ":\n" - + str(e) - ) - - self.wbs.sort() - self.external_addons.sort() - self.python_requires.sort() - self.python_optional.sort() - self.python_optional = [ - option for option in self.python_optional if option not in self.python_requires - ] diff --git a/src/Mod/AddonManager/AddonCatalog.py b/src/Mod/AddonManager/AddonCatalog.py deleted file mode 100644 index 9140c48e94..0000000000 --- a/src/Mod/AddonManager/AddonCatalog.py +++ /dev/null @@ -1,143 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2025 The FreeCAD project association AISBL * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""The Addon Catalog is the main list of all Addons along with their various -sources and compatible versions. Added in FreeCAD 1.1 to replace .gitmodules.""" - -from dataclasses import dataclass -from hashlib import sha256 -from typing import Any, Dict, List, Optional, Tuple -from addonmanager_metadata import Version -from Addon import Addon - -import addonmanager_freecad_interface as fci - - -@dataclass -class AddonCatalogEntry: - """Each individual entry in the catalog, storing data about a particular version of an - Addon. Note that this class needs to be identical to the one that is used in the remote cache - generation, so don't make changes here without ensuring that the classes are synchronized.""" - - freecad_min: Optional[Version] = None - freecad_max: Optional[Version] = None - repository: Optional[str] = None - git_ref: Optional[str] = None - zip_url: Optional[str] = None - note: Optional[str] = None - branch_display_name: Optional[str] = None - - def __init__(self, raw_data: Dict[str, str]) -> None: - """Create an AddonDictionaryEntry from the raw JSON data""" - super().__init__() - for key, value in raw_data.items(): - if hasattr(self, key): - if key in ("freecad_min", "freecad_max"): - value = Version(from_string=value) - setattr(self, key, value) - - def is_compatible(self) -> bool: - """Check whether this AddonCatalogEntry is compatible with the current version of FreeCAD""" - if self.freecad_min is None and self.freecad_max is None: - return True - current_version = Version(from_list=fci.Version()) - if self.freecad_min is None: - return current_version <= self.freecad_max - if self.freecad_max is None: - return current_version >= self.freecad_min - return self.freecad_min <= current_version <= self.freecad_max - - def unique_identifier(self) -> str: - """Return a unique identifier of the AddonCatalogEntry, guaranteed to be repeatable: when - given the same basic information, the same ID is created. Used as the key when storing - the metadata for a given AddonCatalogEntry.""" - sha256_hash = sha256() - sha256_hash.update(str(self).encode("utf-8")) - return sha256_hash.hexdigest() - - -class AddonCatalog: - """A catalog of addons grouped together into sets representing versions that are - compatible with different versions of FreeCAD and/or represent different available branches - of a given addon (e.g. a Development branch that users are presented).""" - - def __init__(self, data: Dict[str, Any]): - self._original_data = data - self._dictionary = {} - self._parse_raw_data() - - def _parse_raw_data(self): - self._dictionary = {} # Clear pre-existing contents - for key, value in self._original_data.items(): - if key == "_meta": # Don't add the documentation object to the tree - continue - self._dictionary[key] = [] - for entry in value: - self._dictionary[key].append(AddonCatalogEntry(entry)) - - def load_metadata_cache(self, cache: Dict[str, Any]): - """Given the raw dictionary, couple that with the remote metadata cache to create the - final working addon dictionary. Only create Addons that are compatible with the current - version of FreeCAD.""" - for value in self._dictionary.values(): - for entry in value: - sha256_hash = entry.unique_identifier() - print(sha256_hash) - if sha256_hash in cache and entry.is_compatible(): - entry.addon = Addon.from_cache(cache[sha256_hash]) - - def get_available_addon_ids(self) -> List[str]: - """Get a list of IDs that have at least one entry compatible with the current version of - FreeCAD""" - id_list = [] - for key, value in self._dictionary.items(): - for entry in value: - if entry.is_compatible(): - id_list.append(key) - break - return id_list - - def get_available_branches(self, addon_id: str) -> List[Tuple[str, str]]: - """For a given ID, get the list of available branches compatible with this version of - FreeCAD along with the branch display name. Either field may be empty, but not both. The - first entry in the list is expected to be the "primary".""" - if addon_id not in self._dictionary: - return [] - result = [] - for entry in self._dictionary[addon_id]: - if entry.is_compatible(): - result.append((entry.git_ref, entry.branch_display_name)) - return result - - def get_addon_from_id(self, addon_id: str, branch: Optional[Tuple[str, str]] = None) -> Addon: - """Get the instantiated Addon object for the given ID and optionally branch. If no - branch is provided, whichever branch is the "primary" branch will be returned (i.e. the - first branch that matches). Raises a ValueError if no addon matches the request.""" - if addon_id not in self._dictionary: - raise ValueError(f"Addon '{addon_id}' not found") - for entry in self._dictionary[addon_id]: - if not entry.is_compatible(): - continue - if not branch or entry.branch_display_name == branch: - return entry.addon - raise ValueError(f"Addon '{addon_id}' has no compatible branches named '{branch}'") diff --git a/src/Mod/AddonManager/AddonManager.py b/src/Mod/AddonManager/AddonManager.py deleted file mode 100644 index e84cb1a770..0000000000 --- a/src/Mod/AddonManager/AddonManager.py +++ /dev/null @@ -1,951 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * Copyright (c) 2015 Yorik van Havre * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import os -import functools -import tempfile -import threading -import json -from datetime import date -from typing import Dict - -from PySide import QtGui, QtCore, QtWidgets -import FreeCAD -import FreeCADGui - -from addonmanager_workers_startup import ( - CreateAddonListWorker, - LoadPackagesFromCacheWorker, - LoadMacrosFromCacheWorker, - CheckWorkbenchesForUpdatesWorker, - CacheMacroCodeWorker, - GetBasicAddonStatsWorker, - GetAddonScoreWorker, -) -from addonmanager_workers_installation import ( - UpdateMetadataCacheWorker, -) -from addonmanager_installer_gui import AddonInstallerGUI, MacroInstallerGUI -from addonmanager_uninstaller_gui import AddonUninstallerGUI -from addonmanager_update_all_gui import UpdateAllGUI -import addonmanager_utilities as utils -import addonmanager_freecad_interface as fci -import AddonManager_rc # pylint: disable=unused-import -from composite_view import CompositeView -from Widgets.addonmanager_widget_global_buttons import WidgetGlobalButtonBar -from Widgets.addonmanager_widget_progress_bar import Progress -from package_list import PackageListItemModel -from Addon import Addon -from addonmanager_python_deps_gui import ( - PythonPackageManager, -) -from addonmanager_cache import local_cache_needs_update -from addonmanager_devmode import DeveloperMode -from addonmanager_firstrun import FirstRunDialog -from addonmanager_connection_checker import ConnectionCheckerGUI -from addonmanager_devmode_metadata_checker import MetadataValidators - -import NetworkManager - -from AddonManagerOptions import AddonManagerOptions - -translate = FreeCAD.Qt.translate - - -def QT_TRANSLATE_NOOP(_, txt): - return txt - - -__title__ = "FreeCAD Addon Manager Module" -__author__ = "Yorik van Havre", "Jonathan Wiedemann", "Kurt Kremitzki", "Chris Hennes" -__url__ = "https://www.freecad.org" - -""" -FreeCAD Addon Manager Module - -Fetches various types of addons from a variety of sources. Built-in sources are: -* https://github.com/FreeCAD/FreeCAD-addons -* https://github.com/FreeCAD/FreeCAD-macros -* https://wiki.freecad.org/ - -Additional git sources may be configure via user preferences. - -You need a working internet connection, and optionally git -- if git is not available, ZIP archives -are downloaded instead. -""" - -# \defgroup ADDONMANAGER AddonManager -# \ingroup ADDONMANAGER -# \brief The Addon Manager allows users to install workbenches and macros made by other users -# @{ - -INSTANCE = None - - -def get_icon(repo: Addon, update: bool = False) -> QtGui.QIcon: - """Returns an icon for an Addon. Uses a cached icon if possible, unless update is True, - in which case the icon is regenerated.""" - - if not update and repo.icon and not repo.icon.isNull() and repo.icon.isValid(): - return repo.icon - - path = ":/icons/" + repo.name.replace(" ", "_") - default_icon = QtGui.QIcon(":/icons/document-package.svg") - if repo.repo_type == Addon.Kind.WORKBENCH: - path += "_workbench_icon.svg" - default_icon = QtGui.QIcon(":/icons/document-package.svg") - elif repo.repo_type == Addon.Kind.MACRO: - if repo.macro and repo.macro.icon: - if os.path.isabs(repo.macro.icon): - path = repo.macro.icon - default_icon = QtGui.QIcon(":/icons/document-python.svg") - else: - path = os.path.join(os.path.dirname(repo.macro.src_filename), repo.macro.icon) - default_icon = QtGui.QIcon(":/icons/document-python.svg") - elif repo.macro and repo.macro.xpm: - cache_path = FreeCAD.getUserCachePath() - am_path = os.path.join(cache_path, "AddonManager", "MacroIcons") - os.makedirs(am_path, exist_ok=True) - path = os.path.join(am_path, repo.name + "_icon.xpm") - if not os.path.exists(path): - with open(path, "w") as f: - f.write(repo.macro.xpm) - default_icon = QtGui.QIcon(repo.macro.xpm) - else: - path += "_macro_icon.svg" - default_icon = QtGui.QIcon(":/icons/document-python.svg") - elif repo.repo_type == Addon.Kind.PACKAGE: - # The cache might not have been downloaded yet, check to see if it's there... - if os.path.isfile(repo.get_cached_icon_filename()): - path = repo.get_cached_icon_filename() - elif repo.contains_workbench(): - path += "_workbench_icon.svg" - default_icon = QtGui.QIcon(":/icons/document-package.svg") - elif repo.contains_macro(): - path += "_macro_icon.svg" - default_icon = QtGui.QIcon(":/icons/document-python.svg") - else: - default_icon = QtGui.QIcon(":/icons/document-package.svg") - - if QtCore.QFile.exists(path): - addon_icon = QtGui.QIcon(path) - else: - addon_icon = default_icon - repo.icon = addon_icon - - return addon_icon - - -class CommandAddonManager(QtCore.QObject): - """The main Addon Manager class and FreeCAD command""" - - workers = [ - "create_addon_list_worker", - "check_worker", - "show_worker", - "showmacro_worker", - "macro_worker", - "update_metadata_cache_worker", - "load_macro_metadata_worker", - "update_all_worker", - "check_for_python_package_updates_worker", - "get_basic_addon_stats_worker", - "get_addon_score_worker", - ] - - lock = threading.Lock() - restart_required = False - - finished = QtCore.Signal() - - def __init__(self): - super().__init__() - - QT_TRANSLATE_NOOP("QObject", "Addon Manager") - FreeCADGui.addPreferencePage( - AddonManagerOptions, - "Addon Manager", - ) - - self.item_model = None - self.developer_mode = None - self.installer_gui = None - self.composite_view = None - self.button_bar = None - - self.update_cache = False - self.dialog = None - self.startup_sequence = [] - self.packages_with_updates = set() - - self.macro_repo_dir = None - self.number_of_progress_regions = 0 - self.current_progress_region = 0 - - self.check_worker = None - self.check_for_python_package_updates_worker = None - self.update_all_worker = None - self.update_metadata_cache_worker = None - self.macro_worker = None - self.create_addon_list_worker = None - self.get_addon_score_worker = None - self.get_basic_addon_stats_worker = None - self.load_macro_metadata_worker = None - - self.macro_cache = [] - self.package_cache = {} - self.manage_python_packages_dialog = None - - # Set up the connection checker - self.connection_checker = ConnectionCheckerGUI() - self.connection_checker.connection_available.connect(self.launch) - - # Give other parts of the AM access to the current instance - global INSTANCE - INSTANCE = self - - def GetResources(self) -> Dict[str, str]: - """FreeCAD-required function: get the core resource information for this Mod.""" - return { - "Pixmap": "AddonManager", - "MenuText": QT_TRANSLATE_NOOP("Std_AddonMgr", "&Addon manager"), - "ToolTip": QT_TRANSLATE_NOOP( - "Std_AddonMgr", - "Manage external workbenches, macros, and preference packs", - ), - "Group": "Tools", - } - - def Activated(self) -> None: - """FreeCAD-required function: called when the command is activated.""" - NetworkManager.InitializeNetworkManager() - first_run_dialog = FirstRunDialog() - if not first_run_dialog.exec(): - return - self.connection_checker.start() - - def launch(self) -> None: - """Shows the Addon Manager UI""" - - # create the dialog - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "AddonManager.ui") - ) - self.dialog.setObjectName("AddonManager_Main_Window") - # self.dialog.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint, True) - - # cleanup the leftovers from previous runs - self.macro_repo_dir = FreeCAD.getUserMacroDir(True) - self.packages_with_updates = set() - self.startup_sequence = [] - self.cleanup_workers() - self.update_cache = local_cache_needs_update() - - # restore window geometry from stored state - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - w = pref.GetInt("WindowWidth", 800) - h = pref.GetInt("WindowHeight", 600) - self.composite_view = CompositeView(self.dialog) - self.button_bar = WidgetGlobalButtonBar(self.dialog) - - # If we are checking for updates automatically, hide the Check for updates button: - autocheck = pref.GetBool("AutoCheck", True) - if autocheck: - self.button_bar.check_for_updates.hide() - else: - self.button_bar.update_all_addons.hide() - - # Set up the listing of packages using the model-view-controller architecture - self.item_model = PackageListItemModel() - self.composite_view.setModel(self.item_model) - self.dialog.layout().addWidget(self.composite_view) - self.dialog.layout().addWidget(self.button_bar) - - # set nice icons to everything, by theme with fallback to FreeCAD icons - self.dialog.setWindowIcon(QtGui.QIcon(":/icons/AddonManager.svg")) - - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - dev_mode_active = pref.GetBool("developerMode", False) - - # enable/disable stuff - self.button_bar.update_all_addons.setEnabled(False) - self.hide_progress_widgets() - self.button_bar.refresh_local_cache.setEnabled(False) - self.button_bar.refresh_local_cache.setText(translate("AddonsInstaller", "Starting up...")) - if dev_mode_active: - self.button_bar.developer_tools.show() - else: - self.button_bar.developer_tools.hide() - - # connect slots - self.dialog.rejected.connect(self.reject) - self.dialog.accepted.connect(self.accept) - self.button_bar.update_all_addons.clicked.connect(self.update_all) - self.button_bar.close.clicked.connect(self.dialog.reject) - self.button_bar.refresh_local_cache.clicked.connect(self.on_button_update_cache_clicked) - self.button_bar.check_for_updates.clicked.connect( - lambda: self.force_check_updates(standalone=True) - ) - self.button_bar.python_dependencies.clicked.connect(self.show_python_updates_dialog) - self.button_bar.developer_tools.clicked.connect(self.show_developer_tools) - self.composite_view.package_list.stop_loading.connect(self.stop_update) - self.composite_view.package_list.setEnabled(False) - self.composite_view.execute.connect(self.execute_macro) - self.composite_view.install.connect(self.launch_installer_gui) - self.composite_view.uninstall.connect(self.remove) - self.composite_view.update.connect(self.update) - self.composite_view.update_status.connect(self.status_updated) - - # center the dialog over the FreeCAD window - self.dialog.resize(w, h) - mw = FreeCADGui.getMainWindow() - self.dialog.move( - mw.frameGeometry().topLeft() + mw.rect().center() - self.dialog.rect().center() - ) - - # begin populating the table in a set of sub-threads - self.startup() - - # rock 'n roll!!! - self.dialog.exec() - - def cleanup_workers(self) -> None: - """Ensure that no workers are running by explicitly asking them to stop and waiting for - them until they do""" - for worker in self.workers: - if hasattr(self, worker): - thread = getattr(self, worker) - if thread: - if not thread.isFinished(): - thread.blockSignals(True) - thread.requestInterruption() - for worker in self.workers: - if hasattr(self, worker): - thread = getattr(self, worker) - if thread: - if not thread.isFinished(): - finished = thread.wait(500) - if not finished: - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "Worker process {} is taking a long time to stop...", - ).format(worker) - + "\n" - ) - - def accept(self) -> None: - self.finished.emit() - - def reject(self) -> None: - """called when the window has been closed""" - - # save window geometry for next use - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - pref.SetInt("WindowWidth", self.dialog.width()) - pref.SetInt("WindowHeight", self.dialog.height()) - - # ensure all threads are finished before closing - ok_to_close = True - worker_killed = False - self.startup_sequence = [] - for worker in self.workers: - if hasattr(self, worker): - thread = getattr(self, worker) - if thread: - if not thread.isFinished(): - thread.blockSignals(True) - thread.requestInterruption() - worker_killed = True - ok_to_close = False - while not ok_to_close: - ok_to_close = True - for worker in self.workers: - if hasattr(self, worker): - thread = getattr(self, worker) - if thread: - thread.wait(25) - if not thread.isFinished(): - ok_to_close = False - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - - # Write the cache data if it's safe to do so: - if not worker_killed: - for repo in self.item_model.repos: - if repo.repo_type == Addon.Kind.MACRO: - self.cache_macro(repo) - else: - self.cache_package(repo) - self.write_package_cache() - self.write_macro_cache() - else: - self.write_cache_stopfile() - FreeCAD.Console.PrintLog( - "Not writing the cache because a process was forcibly terminated and the state is " - "unknown.\n" - ) - - if self.restart_required: - # display restart dialog - m = QtWidgets.QMessageBox() - m.setWindowTitle(translate("AddonsInstaller", "Addon manager")) - m.setWindowIcon(QtGui.QIcon(":/icons/AddonManager.svg")) - m.setText( - translate( - "AddonsInstaller", - "You must restart FreeCAD for changes to take effect.", - ) - ) - m.setIcon(QtWidgets.QMessageBox.Icon.Warning) - m.setStandardButtons( - QtWidgets.QMessageBox.StandardButton.Ok - | QtWidgets.QMessageBox.StandardButton.Cancel - ) - m.setDefaultButton(QtWidgets.QMessageBox.StandardButton.Cancel) - ok_btn = m.button(QtWidgets.QMessageBox.StandardButton.Ok) - cancel_btn = m.button(QtWidgets.QMessageBox.StandardButton.Cancel) - ok_btn.setText(translate("AddonsInstaller", "Restart now")) - cancel_btn.setText(translate("AddonsInstaller", "Restart later")) - ret = m.exec_() - if ret == QtWidgets.QMessageBox.StandardButton.Ok: - # restart FreeCAD after a delay to give time to this dialog to close - QtCore.QTimer.singleShot(1000, utils.restart_freecad) - - self.finished.emit() - - def startup(self) -> None: - """Downloads the available packages listings and populates the table - - This proceeds in four stages: first, the main GitHub repository is queried for a list of - possible addons. Each addon is specified as a git submodule with name and branch - information. The actual specific commit ID of the submodule (as listed on GitHub) is - ignored. Any extra repositories specified by the user are appended to this list. - - Second, the list of macros is downloaded from the FreeCAD/FreeCAD-macros repository and - the wiki. - - Third, each of these items is queried for a package.xml metadata file. If that file exists - it is downloaded, cached, and any icons that it references are also downloaded and cached. - - Finally, for workbenches that are not contained within a package (e.g. they provide no - metadata), an additional git query is made to see if an update is available. Macros are - checked for file changes. - - Each of these stages is launched in a separate thread to ensure that the UI remains - responsive, and the operation can be cancelled. - - Each stage is also subject to caching, so may return immediately, if no cache update has - been requested.""" - - # Each function in this list is expected to launch a thread and connect its completion - # signal to self.do_next_startup_phase, or to shortcut to calling - # self.do_next_startup_phase if it is not launching a worker - self.startup_sequence = [ - self.populate_packages_table, - self.activate_table_widgets, - self.populate_macros, - self.update_metadata_cache, - self.check_updates, - self.check_python_updates, - self.fetch_addon_stats, - self.fetch_addon_score, - self.select_addon, - ] - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - if pref.GetBool("DownloadMacros", True): - self.startup_sequence.append(self.load_macro_metadata) - self.number_of_progress_regions = len(self.startup_sequence) - self.current_progress_region = 0 - self.do_next_startup_phase() - - def do_next_startup_phase(self) -> None: - """Pop the top item in self.startup_sequence off the list and run it""" - - if len(self.startup_sequence) > 0: - phase_runner = self.startup_sequence.pop(0) - self.current_progress_region += 1 - phase_runner() - else: - self.hide_progress_widgets() - self.update_cache = False - self.button_bar.refresh_local_cache.setEnabled(True) - self.button_bar.refresh_local_cache.setText( - translate("AddonsInstaller", "Refresh local cache") - ) - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - pref.SetString("LastCacheUpdate", date.today().isoformat()) - self.composite_view.package_list.item_filter.invalidateFilter() - - def populate_packages_table(self) -> None: - self.item_model.clear() - - use_cache = not self.update_cache - if use_cache: - if os.path.isfile(utils.get_cache_file_name("package_cache.json")): - with open(utils.get_cache_file_name("package_cache.json"), encoding="utf-8") as f: - data = f.read() - try: - from_json = json.loads(data) - if len(from_json) == 0: - use_cache = False - except json.JSONDecodeError: - use_cache = False - else: - use_cache = False - - if not use_cache: - self.update_cache = True # Make sure to trigger the other cache updates, if the json - # file was missing - self.create_addon_list_worker = CreateAddonListWorker() - self.create_addon_list_worker.addon_repo.connect(self.add_addon_repo) - self.update_progress_bar(translate("AddonsInstaller", "Creating addon list"), 10, 100) - self.create_addon_list_worker.finished.connect( - self.do_next_startup_phase - ) # Link to step 2 - self.create_addon_list_worker.start() - else: - self.create_addon_list_worker = LoadPackagesFromCacheWorker( - utils.get_cache_file_name("package_cache.json") - ) - self.create_addon_list_worker.addon_repo.connect(self.add_addon_repo) - self.update_progress_bar(translate("AddonsInstaller", "Loading addon list"), 10, 100) - self.create_addon_list_worker.finished.connect( - self.do_next_startup_phase - ) # Link to step 2 - self.create_addon_list_worker.start() - - def cache_package(self, repo: Addon): - if not hasattr(self, "package_cache"): - self.package_cache = {} - self.package_cache[repo.name] = repo.to_cache() - - def write_package_cache(self): - if hasattr(self, "package_cache"): - package_cache_path = utils.get_cache_file_name("package_cache.json") - with open(package_cache_path, "w", encoding="utf-8") as f: - f.write(json.dumps(self.package_cache, indent=" ")) - - def activate_table_widgets(self) -> None: - self.composite_view.package_list.setEnabled(True) - self.composite_view.package_list.ui.view_bar.search.setFocus() - self.do_next_startup_phase() - - def populate_macros(self) -> None: - macro_cache_file = utils.get_cache_file_name("macro_cache.json") - cache_is_bad = True - if os.path.isfile(macro_cache_file): - size = os.path.getsize(macro_cache_file) - if size > 1000: # Make sure there is actually data in there - cache_is_bad = False - if cache_is_bad: - if not self.update_cache: - self.update_cache = True # Make sure to trigger the other cache updates, if the - # json file was missing - self.create_addon_list_worker = CreateAddonListWorker() - self.create_addon_list_worker.addon_repo.connect(self.add_addon_repo) - self.update_progress_bar( - translate("AddonsInstaller", "Creating macro list"), 10, 100 - ) - self.create_addon_list_worker.finished.connect( - self.do_next_startup_phase - ) # Link to step 2 - self.create_addon_list_worker.start() - else: - # It's already been done in the previous step (TODO: Refactor to eliminate this - # step) - self.do_next_startup_phase() - else: - self.macro_worker = LoadMacrosFromCacheWorker( - utils.get_cache_file_name("macro_cache.json") - ) - self.macro_worker.add_macro_signal.connect(self.add_addon_repo) - self.macro_worker.finished.connect(self.do_next_startup_phase) - self.macro_worker.start() - - def cache_macro(self, repo: Addon): - if not hasattr(self, "macro_cache"): - self.macro_cache = [] - if repo.macro is not None: - self.macro_cache.append(repo.macro.to_cache()) - else: - FreeCAD.Console.PrintError( - f"Addon Manager: Internal error, cache_macro called on non-macro {repo.name}\n" - ) - - def write_macro_cache(self): - if not hasattr(self, "macro_cache"): - return - macro_cache_path = utils.get_cache_file_name("macro_cache.json") - with open(macro_cache_path, "w", encoding="utf-8") as f: - f.write(json.dumps(self.macro_cache, indent=" ")) - self.macro_cache = [] - - def update_metadata_cache(self) -> None: - if self.update_cache: - self.update_metadata_cache_worker = UpdateMetadataCacheWorker(self.item_model.repos) - self.update_metadata_cache_worker.finished.connect( - self.do_next_startup_phase - ) # Link to step 4 - self.update_metadata_cache_worker.progress_made.connect(self.update_progress_bar) - self.update_metadata_cache_worker.package_updated.connect(self.on_package_updated) - self.update_metadata_cache_worker.start() - else: - self.do_next_startup_phase() - - def on_button_update_cache_clicked(self) -> None: - self.update_cache = True - cache_path = FreeCAD.getUserCachePath() - am_path = os.path.join(cache_path, "AddonManager") - utils.rmdir(am_path) - self.button_bar.refresh_local_cache.setEnabled(False) - self.button_bar.refresh_local_cache.setText( - translate("AddonsInstaller", "Updating cache...") - ) - self.startup() - - # Re-caching implies checking for updates, regardless of the user's autocheck option - if self.check_updates in self.startup_sequence: - self.startup_sequence.remove(self.check_updates) - self.startup_sequence.append(self.force_check_updates) - - def on_package_updated(self, repo: Addon) -> None: - """Called when the named package has either new metadata or a new icon (or both)""" - - with self.lock: - repo.icon = get_icon(repo, update=True) - self.item_model.reload_item(repo) - - def load_macro_metadata(self) -> None: - if self.update_cache: - self.load_macro_metadata_worker = CacheMacroCodeWorker(self.item_model.repos) - self.load_macro_metadata_worker.update_macro.connect(self.on_package_updated) - self.load_macro_metadata_worker.progress_made.connect(self.update_progress_bar) - self.load_macro_metadata_worker.finished.connect(self.do_next_startup_phase) - self.load_macro_metadata_worker.start() - else: - self.do_next_startup_phase() - - def select_addon(self) -> None: - prefs = fci.Preferences() - selection = prefs.get("SelectedAddon") - if selection: - self.composite_view.package_list.select_addon(selection) - prefs.set("SelectedAddon", "") - self.do_next_startup_phase() - - def check_updates(self) -> None: - """checks every installed addon for available updates""" - - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - autocheck = pref.GetBool("AutoCheck", True) - if not autocheck: - FreeCAD.Console.PrintLog( - "Addon Manager: Skipping update check because AutoCheck user preference is False\n" - ) - self.do_next_startup_phase() - return - if not self.packages_with_updates: - self.force_check_updates(standalone=False) - else: - self.do_next_startup_phase() - - def force_check_updates(self, standalone=False) -> None: - if hasattr(self, "check_worker"): - thread = self.check_worker - if thread: - if not thread.isFinished(): - self.do_next_startup_phase() - return - - self.button_bar.update_all_addons.setText( - translate("AddonsInstaller", "Checking for updates...") - ) - self.packages_with_updates.clear() - self.button_bar.update_all_addons.show() - self.button_bar.check_for_updates.setDisabled(True) - self.check_worker = CheckWorkbenchesForUpdatesWorker(self.item_model.repos) - self.check_worker.finished.connect(self.do_next_startup_phase) - self.check_worker.finished.connect(self.update_check_complete) - self.check_worker.progress_made.connect(self.update_progress_bar) - if standalone: - self.current_progress_region = 1 - self.number_of_progress_regions = 1 - self.check_worker.update_status.connect(self.status_updated) - self.check_worker.start() - self.enable_updates(len(self.packages_with_updates)) - - def status_updated(self, repo: Addon) -> None: - self.item_model.reload_item(repo) - if repo.status() == Addon.Status.UPDATE_AVAILABLE: - self.packages_with_updates.add(repo) - self.enable_updates(len(self.packages_with_updates)) - elif repo.status() == Addon.Status.PENDING_RESTART: - self.restart_required = True - - def enable_updates(self, number_of_updates: int) -> None: - """enables the update button""" - - if number_of_updates: - self.button_bar.set_number_of_available_updates(number_of_updates) - elif ( - hasattr(self, "check_worker") - and self.check_worker is not None - and self.check_worker.isRunning() - ): - self.button_bar.update_all_addons.setText( - translate("AddonsInstaller", "Checking for updates...") - ) - else: - self.button_bar.set_number_of_available_updates(0) - - def update_check_complete(self) -> None: - self.enable_updates(len(self.packages_with_updates)) - self.button_bar.check_for_updates.setEnabled(True) - - def check_python_updates(self) -> None: - PythonPackageManager.migrate_old_am_installations() # Migrate 0.20 to 0.21 - self.do_next_startup_phase() - - def show_python_updates_dialog(self) -> None: - if not self.manage_python_packages_dialog: - self.manage_python_packages_dialog = PythonPackageManager(self.item_model.repos) - self.manage_python_packages_dialog.show() - - def fetch_addon_stats(self) -> None: - """Fetch the Addon Stats JSON data from a URL""" - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - url = pref.GetString("AddonsStatsURL", "https://freecad.org/addon_stats.json") - if url and url != "NONE": - self.get_basic_addon_stats_worker = GetBasicAddonStatsWorker( - url, self.item_model.repos, self.dialog - ) - self.get_basic_addon_stats_worker.finished.connect(self.do_next_startup_phase) - self.get_basic_addon_stats_worker.update_addon_stats.connect(self.update_addon_stats) - self.get_basic_addon_stats_worker.start() - else: - self.do_next_startup_phase() - - def update_addon_stats(self, addon: Addon): - self.item_model.reload_item(addon) - - def fetch_addon_score(self) -> None: - """Fetch the Addon score JSON data from a URL""" - prefs = fci.Preferences() - url = prefs.get("AddonsScoreURL") - if url and url != "NONE": - self.get_addon_score_worker = GetAddonScoreWorker( - url, self.item_model.repos, self.dialog - ) - self.get_addon_score_worker.finished.connect(self.score_fetched_successfully) - self.get_addon_score_worker.finished.connect(self.do_next_startup_phase) - self.get_addon_score_worker.update_addon_score.connect(self.update_addon_score) - self.get_addon_score_worker.start() - else: - self.composite_view.package_list.ui.view_bar.set_rankings_available(False) - self.do_next_startup_phase() - - def update_addon_score(self, addon: Addon): - self.item_model.reload_item(addon) - - def score_fetched_successfully(self): - self.composite_view.package_list.ui.view_bar.set_rankings_available(True) - - def show_developer_tools(self) -> None: - """Display the developer tools dialog""" - if not self.developer_mode: - self.developer_mode = DeveloperMode() - self.developer_mode.show() - - checker = MetadataValidators() - checker.validate_all(self.item_model.repos) - - def add_addon_repo(self, addon_repo: Addon) -> None: - """adds a workbench to the list""" - - if addon_repo.icon is None or addon_repo.icon.isNull(): - addon_repo.icon = get_icon(addon_repo) - for repo in self.item_model.repos: - if repo.name == addon_repo.name: - # self.item_model.reload_item(repo) # If we want to have later additions superseded - # earlier - return - self.item_model.append_item(addon_repo) - - def append_to_repos_list(self, repo: Addon) -> None: - """this function allows threads to update the main list of workbenches""" - self.item_model.append_item(repo) - - def update(self, repo: Addon) -> None: - self.launch_installer_gui(repo) - - def mark_repo_update_available(self, repo: Addon, available: bool) -> None: - if available: - repo.set_status(Addon.Status.UPDATE_AVAILABLE) - else: - repo.set_status(Addon.Status.NO_UPDATE_AVAILABLE) - self.item_model.reload_item(repo) - self.composite_view.package_details_controller.show_repo(repo) - - def launch_installer_gui(self, addon: Addon) -> None: - if self.installer_gui is not None: - FreeCAD.Console.PrintError( - translate( - "AddonsInstaller", - "Cannot launch a new installer until the previous one has finished.", - ) - ) - return - if addon.macro is not None: - self.installer_gui = MacroInstallerGUI(addon) - else: - self.installer_gui = AddonInstallerGUI(addon, self.item_model.repos) - self.installer_gui.success.connect(self.on_package_status_changed) - self.installer_gui.finished.connect(self.cleanup_installer) - self.installer_gui.run() # Does not block - - def cleanup_installer(self) -> None: - QtCore.QTimer.singleShot(500, self.no_really_clean_up_the_installer) - - def no_really_clean_up_the_installer(self) -> None: - self.installer_gui = None - - def update_all(self) -> None: - """Asynchronously apply all available updates: individual failures are noted, but do not - stop other updates""" - - if self.installer_gui is not None: - FreeCAD.Console.PrintError( - translate( - "AddonsInstaller", - "Cannot launch a new installer until the previous one has finished.", - ) - ) - return - - self.installer_gui = UpdateAllGUI(self.item_model.repos) - self.installer_gui.addon_updated.connect(self.on_package_status_changed) - self.installer_gui.finished.connect(self.cleanup_installer) - self.installer_gui.run() # Does not block - - def hide_progress_widgets(self) -> None: - """hides the progress bar and related widgets""" - self.composite_view.package_list.set_loading(False) - - def show_progress_widgets(self) -> None: - self.composite_view.package_list.set_loading(True) - - def update_progress_bar(self, message: str, current_value: int, max_value: int) -> None: - """Update the progress bar, showing it if it's hidden""" - - max_value = max_value if max_value > 0 else 1 - - if current_value < 0: - current_value = 0 - elif current_value > max_value: - current_value = max_value - - self.show_progress_widgets() - - progress = Progress( - status_text=message, - number_of_tasks=self.number_of_progress_regions, - current_task=self.current_progress_region - 1, - current_task_progress=current_value / max_value, - ) - self.composite_view.package_list.update_loading_progress(progress) - - def stop_update(self) -> None: - self.cleanup_workers() - self.hide_progress_widgets() - self.write_cache_stopfile() - self.button_bar.refresh_local_cache.setEnabled(True) - self.button_bar.refresh_local_cache.setText( - translate("AddonsInstaller", "Refresh local cache") - ) - - @staticmethod - def write_cache_stopfile() -> None: - stopfile = utils.get_cache_file_name("CACHE_UPDATE_INTERRUPTED") - with open(stopfile, "w", encoding="utf8") as f: - f.write( - "This file indicates that a cache operation was interrupted, and " - "the cache is in an unknown state. It will be deleted next time " - "AddonManager re-caches." - ) - - def on_package_status_changed(self, repo: Addon) -> None: - if repo.status() == Addon.Status.PENDING_RESTART: - self.restart_required = True - self.item_model.reload_item(repo) - self.composite_view.package_details_controller.show_repo(repo) - if repo in self.packages_with_updates: - self.packages_with_updates.remove(repo) - self.enable_updates(len(self.packages_with_updates)) - - def execute_macro(self, repo: Addon) -> None: - """executes a selected macro""" - - macro = repo.macro - if not macro or not macro.code: - return - - if macro.is_installed(): - macro_path = os.path.join(self.macro_repo_dir, macro.filename) - FreeCADGui.open(str(macro_path)) - self.dialog.hide() - FreeCADGui.SendMsgToActiveView("Run") - else: - with tempfile.TemporaryDirectory() as temp_dir: - temp_install_succeeded = macro.install(temp_dir) - if not temp_install_succeeded: - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "Temporary installation of macro failed.") - ) - return - macro_path = os.path.join(temp_dir, macro.filename) - FreeCADGui.open(str(macro_path)) - self.dialog.hide() - FreeCADGui.SendMsgToActiveView("Run") - - def remove(self, addon: Addon) -> None: - """Remove this addon.""" - if self.installer_gui is not None: - FreeCAD.Console.PrintError( - translate( - "AddonsInstaller", - "Cannot launch a new installer until the previous one has finished.", - ) - ) - return - self.installer_gui = AddonUninstallerGUI(addon) - self.installer_gui.finished.connect(self.cleanup_installer) - self.installer_gui.finished.connect( - functools.partial(self.on_package_status_changed, addon) - ) - self.installer_gui.run() # Does not block - - -# @} diff --git a/src/Mod/AddonManager/AddonManager.ui b/src/Mod/AddonManager/AddonManager.ui deleted file mode 100644 index b2d31fcb15..0000000000 --- a/src/Mod/AddonManager/AddonManager.ui +++ /dev/null @@ -1,20 +0,0 @@ - - - Dialog - - - - 0 - 0 - 928 - 600 - - - - Addon Manager - - - - - - diff --git a/src/Mod/AddonManager/AddonManagerOptions.py b/src/Mod/AddonManager/AddonManagerOptions.py deleted file mode 100644 index 783f1a733a..0000000000 --- a/src/Mod/AddonManager/AddonManagerOptions.py +++ /dev/null @@ -1,314 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains a the Addon Manager's preferences dialog management class""" - -import os - -import FreeCAD -import FreeCADGui - -from PySide import QtCore -from PySide.QtGui import QIcon -from PySide.QtWidgets import ( - QWidget, - QCheckBox, - QComboBox, - QDialog, - QHeaderView, - QRadioButton, - QLineEdit, - QTextEdit, -) - -translate = FreeCAD.Qt.translate - -# pylint: disable=too-few-public-methods - - -class AddonManagerOptions: - """A class containing a form element that is inserted as a FreeCAD preference page.""" - - def __init__(self, _=None): - self.form = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "AddonManagerOptions.ui") - ) - self.table_model = CustomRepoDataModel() - self.form.customRepositoriesTableView.setModel(self.table_model) - - self.form.addCustomRepositoryButton.setIcon( - QIcon.fromTheme("add", QIcon(":/icons/list-add.svg")) - ) - self.form.removeCustomRepositoryButton.setIcon( - QIcon.fromTheme("remove", QIcon(":/icons/list-remove.svg")) - ) - - self.form.customRepositoriesTableView.horizontalHeader().setStretchLastSection(False) - self.form.customRepositoriesTableView.horizontalHeader().setSectionResizeMode( - 0, QHeaderView.Stretch - ) - self.form.customRepositoriesTableView.horizontalHeader().setSectionResizeMode( - 1, QHeaderView.ResizeToContents - ) - - self.form.addCustomRepositoryButton.clicked.connect(self._add_custom_repo_clicked) - self.form.removeCustomRepositoryButton.clicked.connect(self._remove_custom_repo_clicked) - self.form.customRepositoriesTableView.doubleClicked.connect(self._row_double_clicked) - - def saveSettings(self): - """Required function: called by the preferences dialog when Apply or Save is clicked, - saves out the preference data by reading it from the widgets.""" - for widget in self.form.children(): - self.recursive_widget_saver(widget) - self.table_model.save_model() - - def recursive_widget_saver(self, widget): - """Writes out the data for this widget and all of its children, recursively.""" - if isinstance(widget, QWidget): - # See if it's one of ours: - pref_path = widget.property("prefPath") - pref_entry = widget.property("prefEntry") - if pref_path and pref_entry: - pref_path = pref_path.data() - pref_entry = pref_entry.data() - pref_access_string = f"User parameter:BaseApp/Preferences/{str(pref_path,'utf-8')}" - pref = FreeCAD.ParamGet(pref_access_string) - if isinstance(widget, QCheckBox): - checked = widget.isChecked() - pref.SetBool(str(pref_entry, "utf-8"), checked) - elif isinstance(widget, QRadioButton): - checked = widget.isChecked() - pref.SetBool(str(pref_entry, "utf-8"), checked) - elif isinstance(widget, QComboBox): - new_index = widget.currentIndex() - pref.SetInt(str(pref_entry, "utf-8"), new_index) - elif isinstance(widget, QTextEdit): - text = widget.toPlainText() - pref.SetString(str(pref_entry, "utf-8"), text) - elif isinstance(widget, QLineEdit): - text = widget.text() - pref.SetString(str(pref_entry, "utf-8"), text) - elif widget.metaObject().className() == "Gui::PrefFileChooser": - filename = str(widget.property("fileName")) - filename = pref.SetString(str(pref_entry, "utf-8"), filename) - - # Recurse over children - if isinstance(widget, QtCore.QObject): - for child in widget.children(): - self.recursive_widget_saver(child) - - def loadSettings(self): - """Required function: called by the preferences dialog when it is launched, - loads the preference data and assigns it to the widgets.""" - for widget in self.form.children(): - self.recursive_widget_loader(widget) - self.table_model.load_model() - - def recursive_widget_loader(self, widget): - """Loads the data for this widget and all of its children, recursively.""" - if isinstance(widget, QWidget): - # See if it's one of ours: - pref_path = widget.property("prefPath") - pref_entry = widget.property("prefEntry") - if pref_path and pref_entry: - pref_path = pref_path.data() - pref_entry = pref_entry.data() - pref_access_string = f"User parameter:BaseApp/Preferences/{str(pref_path,'utf-8')}" - pref = FreeCAD.ParamGet(pref_access_string) - if isinstance(widget, QCheckBox): - widget.setChecked(pref.GetBool(str(pref_entry, "utf-8"))) - elif isinstance(widget, QRadioButton): - if pref.GetBool(str(pref_entry, "utf-8")): - widget.setChecked(True) - elif isinstance(widget, QComboBox): - new_index = pref.GetInt(str(pref_entry, "utf-8")) - widget.setCurrentIndex(new_index) - elif isinstance(widget, QTextEdit): - text = pref.GetString(str(pref_entry, "utf-8")) - widget.setText(text) - elif isinstance(widget, QLineEdit): - text = pref.GetString(str(pref_entry, "utf-8")) - widget.setText(text) - elif widget.metaObject().className() == "Gui::PrefFileChooser": - filename = pref.GetString(str(pref_entry, "utf-8")) - widget.setProperty("fileName", filename) - - # Recurse over children - if isinstance(widget, QtCore.QObject): - for child in widget.children(): - self.recursive_widget_loader(child) - - def _add_custom_repo_clicked(self): - """Callback: show the Add custom repo dialog""" - dlg = CustomRepositoryDialog() - url, branch = dlg.exec() - if url and branch: - self.table_model.appendData(url, branch) - - def _remove_custom_repo_clicked(self): - """Callback: when the remove button is clicked, get the current selection and remove it.""" - item = self.form.customRepositoriesTableView.currentIndex() - if not item.isValid(): - return - row = item.row() - self.table_model.removeRows(row, 1, QtCore.QModelIndex()) - - def _row_double_clicked(self, item): - """Edit the row that was double-clicked""" - row = item.row() - dlg = CustomRepositoryDialog() - url_index = self.table_model.createIndex(row, 0) - branch_index = self.table_model.createIndex(row, 1) - dlg.dialog.urlLineEdit.setText(self.table_model.data(url_index)) - dlg.dialog.branchLineEdit.setText(self.table_model.data(branch_index)) - url, branch = dlg.exec() - if url and branch: - self.table_model.setData(url_index, url) - self.table_model.setData(branch_index, branch) - - -class CustomRepoDataModel(QtCore.QAbstractTableModel): - """The model for the custom repositories: wraps the underlying preference data and uses that - as its main data store.""" - - def __init__(self): - super().__init__() - pref_access_string = "User parameter:BaseApp/Preferences/Addons" - self.pref = FreeCAD.ParamGet(pref_access_string) - self.load_model() - - def load_model(self): - """Load the data from the preferences entry""" - pref_entry: str = self.pref.GetString("CustomRepositories", "") - - # The entry is saved as a space- and newline-delimited text block: break it into its - # constituent parts - lines = pref_entry.split("\n") - self.model = [] - for line in lines: - if not line: - continue - split_data = line.split() - if len(split_data) > 1: - branch = split_data[1] - else: - branch = "master" - url = split_data[0] - self.model.append([url, branch]) - - def save_model(self): - """Save the data into a preferences entry""" - entry = "" - for row in self.model: - entry += f"{row[0]} {row[1]}\n" - self.pref.SetString("CustomRepositories", entry) - - def rowCount(self, parent: QtCore.QModelIndex = QtCore.QModelIndex()) -> int: - """The number of rows""" - if parent.isValid(): - return 0 - return len(self.model) - - def columnCount(self, parent: QtCore.QModelIndex = QtCore.QModelIndex()) -> int: - """The number of columns (which is always 2)""" - if parent.isValid(): - return 0 - return 2 - - def data(self, index, role=QtCore.Qt.DisplayRole): - """The data at an index.""" - if role != QtCore.Qt.DisplayRole: - return None - row = index.row() - column = index.column() - if row > len(self.model): - return None - if column > 1: - return None - return self.model[row][column] - - def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): - """Get the row and column header data.""" - if role != QtCore.Qt.DisplayRole: - return None - if orientation == QtCore.Qt.Vertical: - return section + 1 - if section == 0: - return translate( - "AddonsInstaller", - "Repository URL", - "Preferences header for custom repositories", - ) - if section == 1: - return translate( - "AddonsInstaller", - "Branch name", - "Preferences header for custom repositories", - ) - return None - - def removeRows(self, row, count, parent): - """Remove rows""" - self.beginRemoveRows(parent, row, row + count - 1) - for _ in range(count): - self.model.pop(row) - self.endRemoveRows() - - def insertRows(self, row, count, parent): - """Insert blank rows""" - self.beginInsertRows(parent, row, row + count - 1) - for _ in range(count): - self.model.insert(["", ""]) - self.endInsertRows() - - def appendData(self, url, branch): - """Append this url and branch to the end of the list""" - row = self.rowCount() - self.beginInsertRows(QtCore.QModelIndex(), row, row) - self.model.append([url, branch]) - self.endInsertRows() - - def setData(self, index, value, role=QtCore.Qt.EditRole): - """Set the data at this index""" - if role != QtCore.Qt.EditRole: - return - self.model[index.row()][index.column()] = value - self.dataChanged.emit(index, index) - - -class CustomRepositoryDialog: - """A dialog for setting up a custom repository, with branch information""" - - def __init__(self): - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "AddonManagerOptions_AddCustomRepository.ui") - ) - - def exec(self): - """Run the dialog modally, and return either None or a tuple or (url,branch)""" - result = self.dialog.exec() - if result == QDialog.Accepted: - url = self.dialog.urlLineEdit.text() - branch = self.dialog.branchLineEdit.text() - return (url, branch) - return (None, None) diff --git a/src/Mod/AddonManager/AddonManagerOptions.ui b/src/Mod/AddonManager/AddonManagerOptions.ui deleted file mode 100644 index 8c9869e5e3..0000000000 --- a/src/Mod/AddonManager/AddonManagerOptions.ui +++ /dev/null @@ -1,482 +0,0 @@ - - - Gui::Dialog::DlgSettingsAddonManager - - - - 0 - 0 - 757 - 783 - - - - Addon manager options - - - - 0 - - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - Automatically check for updates at start (requires Git) - - - false - - - AutoCheck - - - Addons - - - - - - - Download Macro metadata (approximately 10MB) - - - DownloadMacros - - - Addons - - - - - - - - - Cache update frequency - - - - - - - - 0 - 0 - - - - UpdateFrequencyComboEntry - - - Addons - - - - Manual (no automatic updates) - - - - - Daily - - - - - Weekly - - - - - - - - - - Hide Addons without a license - - - true - - - HideUnlicensed - - - Addons - - - - - - - Hide Addons with non-FSF Free/Libre license - - - false - - - HideNonFSFFreeLibre - - - Addons - - - - - - - Hide Addons with non-OSI-approved license - - - true - - - HideNonOSIApproved - - - Addons - - - - - - - Hide Addons marked Python 2 Only - - - true - - - HidePy2 - - - Addons - - - - - - - Hide Addons marked Obsolete - - - true - - - HideObsolete - - - Addons - - - - - - - Hide Addons that require a newer version of FreeCAD - - - true - - - Addons - - - HideNewerFreeCADRequired - - - - - - - - 75 - true - - - - Custom repositories - - - - - - - true - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - false - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - ... - - - - - - - ... - - - - - - - - - Proxy - - - - - - No proxy - - - true - - - NoProxyCheck - - - Addons - - - - - - - User system proxy - - - SystemProxyCheck - - - Addons - - - - - - - User-defined proxy: - - - false - - - UserProxyCheck - - - Addons - - - - - - - ProxyUrl - - - Addons - - - - - - - - - - - - Score source URL - - - - - - - - 0 - 0 - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - AddonsScoreURL - - - Addons - - - - - - - - - - - Path to Git executable (optional): - - - - - - - - 0 - 0 - - - - - 300 - 0 - - - - The path to the Git executable. Autodetected if needed and not specified. - - - GitExecutable - - - Addons - - - - - - - - - - 0 - 0 - - - - Advanced Options - - - - - - Show option to change branches (requires Git) - - - ShowBranchSwitcher - - - Addons - - - - - - - Disable Git (fall back to ZIP downloads only) - - - disableGit - - - Addons - - - - - - - Activate Addon Manager options intended for developers of new Addons. - - - Addon developer mode - - - Addons - - - developerMode - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Gui::PrefCheckBox - QCheckBox -
Gui/PrefWidgets.h
-
- - Gui::PrefComboBox - QComboBox -
Gui/PrefWidgets.h
-
- - Gui::PrefRadioButton - QRadioButton -
Gui/PrefWidgets.h
-
- - Gui::PrefLineEdit - QLineEdit -
Gui/PrefWidgets.h
-
- - Gui::PrefFileChooser - QWidget -
Gui/PrefWidgets.h
-
-
- - -
diff --git a/src/Mod/AddonManager/AddonManagerOptions_AddCustomRepository.ui b/src/Mod/AddonManager/AddonManagerOptions_AddCustomRepository.ui deleted file mode 100644 index 17d9190b49..0000000000 --- a/src/Mod/AddonManager/AddonManagerOptions_AddCustomRepository.ui +++ /dev/null @@ -1,84 +0,0 @@ - - - AddCustomRepositoryDialog - - - - 0 - 0 - 400 - 95 - - - - Custom repository - - - - - - Repository URL - - - - - - - - - - Branch - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - - buttonBox - accepted() - AddCustomRepositoryDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - AddCustomRepositoryDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/__init__.py b/src/Mod/AddonManager/AddonManagerTest/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/Mod/AddonManager/AddonManagerTest/app/__init__.py b/src/Mod/AddonManager/AddonManagerTest/app/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/Mod/AddonManager/AddonManagerTest/app/mocks.py b/src/Mod/AddonManager/AddonManagerTest/app/mocks.py deleted file mode 100644 index 3e94f7e161..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/mocks.py +++ /dev/null @@ -1,463 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Mock objects for use when testing the addon manager non-GUI code.""" - -# pylint: disable=too-few-public-methods,too-many-instance-attributes,missing-function-docstring - -import os -from typing import Union, List -import xml.etree.ElementTree as ElemTree - - -class GitFailed(RuntimeError): - pass - - -class MockConsole: - """Spy for the FreeCAD.Console -- does NOT print anything out, just logs it.""" - - def __init__(self): - self.log = [] - self.messages = [] - self.warnings = [] - self.errors = [] - - def PrintLog(self, data: str): - self.log.append(data) - - def PrintMessage(self, data: str): - self.messages.append(data) - - def PrintWarning(self, data: str): - self.warnings.append(data) - - def PrintError(self, data: str): - self.errors.append(data) - - def missing_newlines(self) -> int: - """In most cases, all console entries should end with newlines: this is a - convenience function for unit testing that is true.""" - counter = 0 - counter += self._count_missing_newlines(self.log) - counter += self._count_missing_newlines(self.messages) - counter += self._count_missing_newlines(self.warnings) - counter += self._count_missing_newlines(self.errors) - return counter - - @staticmethod - def _count_missing_newlines(some_list) -> int: - counter = 0 - for line in some_list: - if line[-1] != "\n": - counter += 1 - return counter - - -class MockAddon: - """Minimal Addon class""" - - # pylint: disable=too-many-instance-attributes - - def __init__( - self, - name: str = None, - url: str = None, - status: object = None, - branch: str = "main", - ): - test_dir = os.path.join(os.path.dirname(__file__), "..", "data") - if name: - self.name = name - self.display_name = name - else: - self.name = "MockAddon" - self.display_name = "Mock Addon" - self.url = url if url else os.path.join(test_dir, "test_simple_repo.zip") - self.branch = branch - self.status = status - self.macro = None - self.update_status = None - self.metadata = None - self.icon_file = None - self.last_updated = None - self.requires = set() - self.python_requires = set() - self.python_optional = set() - self.on_git = False - self.on_wiki = True - - def set_status(self, status): - self.update_status = status - - @staticmethod - def get_best_icon_relative_path(): - return "" - - -class MockMacro: - """Minimal Macro class""" - - def __init__(self, name="MockMacro"): - self.name = name - self.filename = self.name + ".FCMacro" - self.icon = "" # If set, should just be fake filename, doesn't have to exist - self.xpm = "" - self.code = "" - self.raw_code_url = "" - self.other_files = [] # If set, should be fake names, don't have to exist - self.details_filled_from_file = False - self.details_filled_from_code = False - self.parsed_wiki_page = False - self.on_git = False - self.on_wiki = True - - def install(self, location: os.PathLike): - """Installer function for the mock macro object: creates a file with the src_filename - attribute, and optionally an icon, xpm, and other_files. The data contained in these files - is not usable and serves only as a placeholder for the existence of the files. - """ - - with open( - os.path.join(location, self.filename), - "w", - encoding="utf-8", - ) as f: - f.write("Test file for macro installation unit tests") - if self.icon: - with open(os.path.join(location, self.icon), "wb") as f: - f.write(b"Fake icon data - nothing to see here\n") - if self.xpm: - with open(os.path.join(location, "MockMacro_icon.xpm"), "w", encoding="utf-8") as f: - f.write(self.xpm) - for name in self.other_files: - if "/" in name: - new_location = os.path.dirname(os.path.join(location, name)) - os.makedirs(new_location, exist_ok=True) - with open(os.path.join(location, name), "w", encoding="utf-8") as f: - f.write("# Fake macro data for unit testing\n") - return True, [] - - def fill_details_from_file(self, _): - """Tracks that this function was called, but otherwise does nothing""" - self.details_filled_from_file = True - - def fill_details_from_code(self, _): - self.details_filled_from_code = True - - def parse_wiki_page(self, _): - self.parsed_wiki_page = True - - -class SignalCatcher: - """Object to track signals that it has caught. - - Usage: - catcher = SignalCatcher() - my_signal.connect(catcher.catch_signal) - do_things_that_emit_the_signal() - self.assertTrue(catcher.caught) - """ - - def __init__(self): - self.caught = False - self.killed = False - self.args = None - - def catch_signal(self, *args): - self.caught = True - self.args = args - - def die(self): - self.killed = True - - -class AddonSignalCatcher: - """Signal catcher specifically designed for catching emitted addons.""" - - def __init__(self): - self.addons = [] - - def catch_signal(self, addon): - self.addons.append(addon) - - -class CallCatcher: - """Generic call monitor -- use to override functions that are not themselves under - test so that you can detect when the function has been called, and how many times. - """ - - def __init__(self): - self.called = False - self.call_count = 0 - self.args = None - - def catch_call(self, *args): - self.called = True - self.call_count += 1 - self.args = args - - -class MockGitManager: - """A mock git manager: does NOT require a git installation. Takes no actions, only records - which functions are called for instrumentation purposes. Can be forced to appear to fail as - needed. Various member variables can be set to emulate necessary return responses. - """ - - def __init__(self): - self.called_methods = [] - self.update_available_response = False - self.current_tag_response = "main" - self.current_branch_response = "main" - self.get_remote_response = "No remote set" - self.get_branches_response = ["main"] - self.get_last_committers_response = {"John Doe": {"email": "jdoe@freecad.org", "count": 1}} - self.get_last_authors_response = {"Jane Doe": {"email": "jdoe@freecad.org", "count": 1}} - self.should_fail = False - self.fail_once = False # Switch back to success after the simulated failure - - def _check_for_failure(self): - if self.should_fail: - if self.fail_once: - self.should_fail = False - raise GitFailed("Unit test forced failure") - - def clone(self, _remote, _local_path, _args: List[str] = None): - self.called_methods.append("clone") - self._check_for_failure() - - def async_clone(self, _remote, _local_path, _progress_monitor, _args: List[str] = None): - self.called_methods.append("async_clone") - self._check_for_failure() - - def checkout(self, _local_path, _spec, _args: List[str] = None): - self.called_methods.append("checkout") - self._check_for_failure() - - def update(self, _local_path): - self.called_methods.append("update") - self._check_for_failure() - - def status(self, _local_path) -> str: - self.called_methods.append("status") - self._check_for_failure() - return "Up-to-date" - - def reset(self, _local_path, _args: List[str] = None): - self.called_methods.append("reset") - self._check_for_failure() - - def async_fetch_and_update(self, _local_path, _progress_monitor, _args=None): - self.called_methods.append("async_fetch_and_update") - self._check_for_failure() - - def update_available(self, _local_path) -> bool: - self.called_methods.append("update_available") - self._check_for_failure() - return self.update_available_response - - def current_tag(self, _local_path) -> str: - self.called_methods.append("current_tag") - self._check_for_failure() - return self.current_tag_response - - def current_branch(self, _local_path) -> str: - self.called_methods.append("current_branch") - self._check_for_failure() - return self.current_branch_response - - def repair(self, _remote, _local_path): - self.called_methods.append("repair") - self._check_for_failure() - - def get_remote(self, _local_path) -> str: - self.called_methods.append("get_remote") - self._check_for_failure() - return self.get_remote_response - - def get_branches(self, _local_path) -> List[str]: - self.called_methods.append("get_branches") - self._check_for_failure() - return self.get_branches_response - - def get_last_committers(self, _local_path, _n=10): - self.called_methods.append("get_last_committers") - self._check_for_failure() - return self.get_last_committers_response - - def get_last_authors(self, _local_path, _n=10): - self.called_methods.append("get_last_authors") - self._check_for_failure() - return self.get_last_authors_response - - -class MockSignal: - """A purely synchronous signal, instrumented and intended only for use in unit testing. - emit() is semi-functional, but does not use queued slots so cannot be used across - threads.""" - - def __init__(self, *args): - self.expected_types = args - self.connections = [] - self.disconnections = [] - self.emitted = False - - def connect(self, func): - self.connections.append(func) - - def disconnect(self, func): - if func in self.connections: - self.connections.remove(func) - self.disconnections.append(func) - - def emit(self, *args): - self.emitted = True - for connection in self.connections: - connection(args) - - -class MockNetworkManager: - """Instrumented mock for the NetworkManager. Does no network access, is not asynchronous, and - does not require a running event loop. No submitted requests ever complete.""" - - def __init__(self): - self.urls = [] - self.aborted = [] - self.data = MockByteArray() - self.called_methods = [] - - self.completed = MockSignal(int, int, MockByteArray) - self.progress_made = MockSignal(int, int, int) - self.progress_complete = MockSignal(int, int, os.PathLike) - - def submit_unmonitored_get(self, url: str) -> int: - self.urls.append(url) - self.called_methods.append("submit_unmonitored_get") - return len(self.urls) - 1 - - def submit_monitored_get(self, url: str) -> int: - self.urls.append(url) - self.called_methods.append("submit_monitored_get") - return len(self.urls) - 1 - - def blocking_get(self, url: str): - self.urls.append(url) - self.called_methods.append("blocking_get") - return self.data - - def abort_all(self): - self.called_methods.append("abort_all") - for url in self.urls: - self.aborted.append(url) - - def abort(self, index: int): - self.called_methods.append("abort") - self.aborted.append(self.urls[index]) - - -class MockByteArray: - """Mock for QByteArray. Only provides the data() access member.""" - - def __init__(self, data_to_wrap="data".encode("utf-8")): - self.wrapped = data_to_wrap - - def data(self) -> bytes: - return self.wrapped - - -class MockThread: - """Mock for QThread for use when threading is not being used, but interruption - needs to be tested. Set interrupt_after_n_calls to the call number to stop at.""" - - def __init__(self): - self.interrupt_after_n_calls = 0 - self.interrupt_check_counter = 0 - - def isInterruptionRequested(self): - self.interrupt_check_counter += 1 - if ( - self.interrupt_after_n_calls - and self.interrupt_check_counter >= self.interrupt_after_n_calls - ): - return True - return False - - -class MockPref: - def __init__(self): - self.prefs = {} - self.pref_set_counter = {} - self.pref_get_counter = {} - - def set_prefs(self, pref_dict: dict) -> None: - self.prefs = pref_dict - - def GetInt(self, key: str, default: int) -> int: - return self.Get(key, default) - - def GetString(self, key: str, default: str) -> str: - return self.Get(key, default) - - def GetBool(self, key: str, default: bool) -> bool: - return self.Get(key, default) - - def Get(self, key: str, default): - if key not in self.pref_set_counter: - self.pref_get_counter[key] = 1 - else: - self.pref_get_counter[key] += 1 - if key in self.prefs: - return self.prefs[key] - raise ValueError(f"Expected key not in mock preferences: {key}") - - def SetInt(self, key: str, value: int) -> None: - return self.Set(key, value) - - def SetString(self, key: str, value: str) -> None: - return self.Set(key, value) - - def SetBool(self, key: str, value: bool) -> None: - return self.Set(key, value) - - def Set(self, key: str, value): - if key not in self.pref_set_counter: - self.pref_set_counter[key] = 1 - else: - self.pref_set_counter[key] += 1 - self.prefs[key] = value - - -class MockExists: - def __init__(self, files: List[str] = None): - """Returns True for all files in files, and False for all others""" - self.files = files - self.files_checked = [] - - def exists(self, check_file: str): - self.files_checked.append(check_file) - if not self.files: - return False - for file in self.files: - if check_file.endswith(file): - return True - return False diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_addon.py b/src/Mod/AddonManager/AddonManagerTest/app/test_addon.py deleted file mode 100644 index 3872364739..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_addon.py +++ /dev/null @@ -1,407 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** -import tempfile -import unittest -import os -import sys - -sys.path.append("../../") - -from Addon import Addon, INTERNAL_WORKBENCHES -from addonmanager_macro import Macro - - -class TestAddon(unittest.TestCase): - MODULE = "test_addon" # file name without extension - - def setUp(self): - self.test_dir = os.path.join(os.path.dirname(__file__), "..", "data") - - def test_display_name(self): - # Case 1: No display name set elsewhere: name == display_name - addon = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - self.assertEqual(addon.name, "FreeCAD") - self.assertEqual(addon.display_name, "FreeCAD") - - # Case 2: Package.xml metadata file sets a display name: - addon.load_metadata_file(os.path.join(self.test_dir, "good_package.xml")) - self.assertEqual(addon.name, "FreeCAD") - self.assertEqual(addon.display_name, "Test Workbench") - - def test_git_url_cleanup(self): - base_url = "https://github.com/FreeCAD/FreeCAD" - test_urls = [f" {base_url} ", f"{base_url}.git", f" {base_url}.git "] - for url in test_urls: - addon = Addon("FreeCAD", url, Addon.Status.NOT_INSTALLED, "master") - self.assertEqual(addon.url, base_url) - - def test_tag_extraction(self): - addon = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon.load_metadata_file(os.path.join(self.test_dir, "good_package.xml")) - - tags = addon.tags - self.assertEqual(len(tags), 5) - expected_tags = set() - expected_tags.add("Tag0") - expected_tags.add("Tag1") - expected_tags.add("TagA") - expected_tags.add("TagB") - expected_tags.add("TagC") - self.assertEqual(expected_tags, tags) - - def test_contains_functions(self): - # Test package.xml combinations: - - # Workbenches - addon_with_workbench = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon_with_workbench.load_metadata_file(os.path.join(self.test_dir, "workbench_only.xml")) - self.assertTrue(addon_with_workbench.contains_workbench()) - self.assertFalse(addon_with_workbench.contains_macro()) - self.assertFalse(addon_with_workbench.contains_preference_pack()) - self.assertFalse(addon_with_workbench.contains_bundle()) - self.assertFalse(addon_with_workbench.contains_other()) - - # Macros - addon_with_macro = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon_with_macro.load_metadata_file(os.path.join(self.test_dir, "macro_only.xml")) - self.assertFalse(addon_with_macro.contains_workbench()) - self.assertTrue(addon_with_macro.contains_macro()) - self.assertFalse(addon_with_macro.contains_preference_pack()) - self.assertFalse(addon_with_workbench.contains_bundle()) - self.assertFalse(addon_with_workbench.contains_other()) - - # Preference Packs - addon_with_prefpack = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon_with_prefpack.load_metadata_file(os.path.join(self.test_dir, "prefpack_only.xml")) - self.assertFalse(addon_with_prefpack.contains_workbench()) - self.assertFalse(addon_with_prefpack.contains_macro()) - self.assertTrue(addon_with_prefpack.contains_preference_pack()) - self.assertFalse(addon_with_workbench.contains_bundle()) - self.assertFalse(addon_with_workbench.contains_other()) - - # Combination - addon_with_all = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon_with_all.load_metadata_file(os.path.join(self.test_dir, "combination.xml")) - self.assertTrue(addon_with_all.contains_workbench()) - self.assertTrue(addon_with_all.contains_macro()) - self.assertTrue(addon_with_all.contains_preference_pack()) - self.assertTrue(addon_with_all.contains_bundle()) - self.assertTrue(addon_with_all.contains_other()) - - # Now do the simple, explicitly-set cases - addon_wb = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon_wb.repo_type = Addon.Kind.WORKBENCH - self.assertTrue(addon_wb.contains_workbench()) - self.assertFalse(addon_wb.contains_macro()) - self.assertFalse(addon_wb.contains_preference_pack()) - - addon_m = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon_m.repo_type = Addon.Kind.MACRO - self.assertFalse(addon_m.contains_workbench()) - self.assertTrue(addon_m.contains_macro()) - self.assertFalse(addon_m.contains_preference_pack()) - - # There is no equivalent for preference packs, they are always accompanied by a - # metadata file - - def test_create_from_macro(self): - macro_file = os.path.join(self.test_dir, "DoNothing.FCMacro") - macro = Macro("DoNothing") - macro.fill_details_from_file(macro_file) - addon = Addon.from_macro(macro) - - self.assertEqual(addon.repo_type, Addon.Kind.MACRO) - self.assertEqual(addon.name, "DoNothing") - self.assertEqual( - addon.macro.comment, - "Do absolutely nothing. For Addon Manager integration tests.", - ) - self.assertEqual(addon.url, "https://github.com/FreeCAD/FreeCAD") - self.assertEqual(addon.macro.version, "1.0") - self.assertEqual(len(addon.macro.other_files), 3) - self.assertEqual(addon.macro.author, "Chris Hennes") - self.assertEqual(addon.macro.date, "2022-02-28") - self.assertEqual(addon.macro.icon, "not_real.png") - self.assertNotEqual(addon.macro.xpm, "") - - def test_cache(self): - addon = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - cache_data = addon.to_cache() - second_addon = Addon.from_cache(cache_data) - - self.assertTrue(addon.__dict__, second_addon.__dict__) - - def test_dependency_resolution(self): - addonA = Addon( - "AddonA", - "https://github.com/FreeCAD/FakeAddonA", - Addon.Status.NOT_INSTALLED, - "master", - ) - addonB = Addon( - "AddonB", - "https://github.com/FreeCAD/FakeAddonB", - Addon.Status.NOT_INSTALLED, - "master", - ) - addonC = Addon( - "AddonC", - "https://github.com/FreeCAD/FakeAddonC", - Addon.Status.NOT_INSTALLED, - "master", - ) - addonD = Addon( - "AddonD", - "https://github.com/FreeCAD/FakeAddonD", - Addon.Status.NOT_INSTALLED, - "master", - ) - - addonA.requires.add("AddonB") - addonB.requires.add("AddonC") - addonB.requires.add("AddonD") - addonD.requires.add("CAM") - - all_addons = { - addonA.name: addonA, - addonB.name: addonB, - addonC.name: addonC, - addonD.name: addonD, - } - - deps = Addon.Dependencies() - addonA.walk_dependency_tree(all_addons, deps) - - self.assertEqual(len(deps.required_external_addons), 3) - addon_strings = [addon.name for addon in deps.required_external_addons] - self.assertTrue( - "AddonB" in addon_strings, - "AddonB not in required dependencies, and it should be.", - ) - self.assertTrue( - "AddonC" in addon_strings, - "AddonC not in required dependencies, and it should be.", - ) - self.assertTrue( - "AddonD" in addon_strings, - "AddonD not in required dependencies, and it should be.", - ) - self.assertTrue( - "CAM" in deps.internal_workbenches, - "CAM not in workbench dependencies, and it should be.", - ) - - def test_internal_workbench_list(self): - addon = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon.load_metadata_file(os.path.join(self.test_dir, "depends_on_all_workbenches.xml")) - deps = Addon.Dependencies() - addon.walk_dependency_tree({}, deps) - self.assertEqual(len(deps.internal_workbenches), len(INTERNAL_WORKBENCHES)) - - def test_version_check(self): - addon = Addon( - "FreeCAD", - "https://github.com/FreeCAD/FreeCAD", - Addon.Status.NOT_INSTALLED, - "master", - ) - addon.load_metadata_file(os.path.join(self.test_dir, "test_version_detection.xml")) - - self.assertEqual( - len(addon.tags), - 1, - "Wrong number of tags found: version requirements should have restricted to only one", - ) - self.assertFalse( - "TagA" in addon.tags, - "Found 'TagA' in tags, it should have been excluded by version requirement", - ) - self.assertTrue( - "TagB" in addon.tags, - "Failed to find 'TagB' in tags, it should have been included", - ) - self.assertFalse( - "TagC" in addon.tags, - "Found 'TagA' in tags, it should have been excluded by version requirement", - ) - - def test_try_find_wbname_in_files_empty_dir(self): - with tempfile.TemporaryDirectory() as mod_dir: - # Arrange - test_addon = Addon("test") - test_addon.mod_directory = mod_dir - os.mkdir(os.path.join(mod_dir, test_addon.name)) - - # Act - wb_name = test_addon.try_find_wbname_in_files() - - # Assert - self.assertEqual(wb_name, "") - - def test_try_find_wbname_in_files_non_python_ignored(self): - with tempfile.TemporaryDirectory() as mod_dir: - # Arrange - test_addon = Addon("test") - test_addon.mod_directory = mod_dir - base_path = os.path.join(mod_dir, test_addon.name) - os.mkdir(base_path) - file_path = os.path.join(base_path, "test.txt") - with open(file_path, "w", encoding="utf-8") as f: - f.write("Gui.addWorkbench(TestWorkbench())") - - # Act - wb_name = test_addon.try_find_wbname_in_files() - - # Assert - self.assertEqual(wb_name, "") - - def test_try_find_wbname_in_files_simple(self): - with tempfile.TemporaryDirectory() as mod_dir: - # Arrange - test_addon = Addon("test") - test_addon.mod_directory = mod_dir - base_path = os.path.join(mod_dir, test_addon.name) - os.mkdir(base_path) - file_path = os.path.join(base_path, "test.py") - with open(file_path, "w", encoding="utf-8") as f: - f.write("Gui.addWorkbench(TestWorkbench())") - - # Act - wb_name = test_addon.try_find_wbname_in_files() - - # Assert - self.assertEqual(wb_name, "TestWorkbench") - - def test_try_find_wbname_in_files_subdir(self): - with tempfile.TemporaryDirectory() as mod_dir: - # Arrange - test_addon = Addon("test") - test_addon.mod_directory = mod_dir - base_path = os.path.join(mod_dir, test_addon.name) - os.mkdir(base_path) - subdir = os.path.join(base_path, "subdirectory") - os.mkdir(subdir) - file_path = os.path.join(subdir, "test.py") - with open(file_path, "w", encoding="utf-8") as f: - f.write("Gui.addWorkbench(TestWorkbench())") - - # Act - wb_name = test_addon.try_find_wbname_in_files() - - # Assert - self.assertEqual(wb_name, "TestWorkbench") - - def test_try_find_wbname_in_files_variable_used(self): - with tempfile.TemporaryDirectory() as mod_dir: - # Arrange - test_addon = Addon("test") - test_addon.mod_directory = mod_dir - base_path = os.path.join(mod_dir, test_addon.name) - os.mkdir(base_path) - file_path = os.path.join(base_path, "test.py") - with open(file_path, "w", encoding="utf-8") as f: - f.write("Gui.addWorkbench(wb)") - - # Act - wb_name = test_addon.try_find_wbname_in_files() - - # Assert - self.assertEqual(wb_name, "") - - def test_try_find_wbname_in_files_variants(self): - variants = [ - "Gui.addWorkbench(TestWorkbench())", - "Gui.addWorkbench (TestWorkbench())", - "Gui.addWorkbench( TestWorkbench() )", - "Gui.addWorkbench(TestWorkbench( ))", - "Gui.addWorkbench( TestWorkbench( ) )", - "Gui.addWorkbench( TestWorkbench ( ) )", - "Gui.addWorkbench ( TestWorkbench ( ) )", - ] - for variant in variants: - with self.subTest(variant=variant): - with tempfile.TemporaryDirectory() as mod_dir: - # Arrange - test_addon = Addon("test") - test_addon.mod_directory = mod_dir - base_path = os.path.join(mod_dir, test_addon.name) - os.mkdir(base_path) - file_path = os.path.join(base_path, "test.py") - with open(file_path, "w", encoding="utf-8") as f: - f.write(variant) - - # Act - wb_name = test_addon.try_find_wbname_in_files() - - # Assert - self.assertEqual(wb_name, "TestWorkbench") diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_addoncatalog.py b/src/Mod/AddonManager/AddonManagerTest/app/test_addoncatalog.py deleted file mode 100644 index 5b058c53c2..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_addoncatalog.py +++ /dev/null @@ -1,213 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later - -# pylint: disable=global-at-module-level,global-statement,import-outside-toplevel, - -"""Tests for the AddonCatalog and AddonCatalogEntry classes.""" - -import unittest -from unittest import mock -from unittest.mock import patch - -global AddonCatalogEntry -global AddonCatalog -global Version - - -class TestAddonCatalogEntry(unittest.TestCase): - """Tests for the AddonCatalogEntry class.""" - - def setUp(self): - """Start mock for addonmanager_licenses class.""" - global AddonCatalogEntry - global AddonCatalog - global Version - self.addon_patch = mock.patch.dict("sys.modules", {"addonmanager_licenses": mock.Mock()}) - self.mock_addon_module = self.addon_patch.start() - from AddonCatalog import AddonCatalogEntry, AddonCatalog - from addonmanager_metadata import Version - - def tearDown(self): - """Stop patching the addonmanager_licenses class""" - self.addon_patch.stop() - - def test_version_match_without_restrictions(self): - """Given an AddonCatalogEntry that has no version restrictions, a fixed version matches.""" - with patch("addonmanager_freecad_interface.Version") as mock_freecad: - mock_freecad.Version = lambda: (1, 2, 3, "dev") - ac = AddonCatalogEntry({}) - self.assertTrue(ac.is_compatible()) - - def test_version_match_with_min_no_max_good_match(self): - """Given an AddonCatalogEntry with a minimum FreeCAD version, a version smaller than that - does not match.""" - with patch("addonmanager_freecad_interface.Version", return_value=(1, 2, 3, "dev")): - ac = AddonCatalogEntry({"freecad_min": Version(from_string="1.2")}) - self.assertTrue(ac.is_compatible()) - - def test_version_match_with_max_no_min_good_match(self): - """Given an AddonCatalogEntry with a maximum FreeCAD version, a version larger than that - does not match.""" - with patch("addonmanager_freecad_interface.Version", return_value=(1, 2, 3, "dev")): - ac = AddonCatalogEntry({"freecad_max": Version(from_string="1.3")}) - self.assertTrue(ac.is_compatible()) - - def test_version_match_with_min_and_max_good_match(self): - """Given an AddonCatalogEntry with both a minimum and maximum FreeCAD version, a version - between the two matches.""" - with patch("addonmanager_freecad_interface.Version", return_value=(1, 2, 3, "dev")): - ac = AddonCatalogEntry( - { - "freecad_min": Version(from_string="1.1"), - "freecad_max": Version(from_string="1.3"), - } - ) - self.assertTrue(ac.is_compatible()) - - def test_version_match_with_min_and_max_bad_match_high(self): - """Given an AddonCatalogEntry with both a minimum and maximum FreeCAD version, a version - higher than the maximum does not match.""" - with patch("addonmanager_freecad_interface.Version", return_value=(1, 3, 3, "dev")): - ac = AddonCatalogEntry( - { - "freecad_min": Version(from_string="1.1"), - "freecad_max": Version(from_string="1.3"), - } - ) - self.assertFalse(ac.is_compatible()) - - def test_version_match_with_min_and_max_bad_match_low(self): - """Given an AddonCatalogEntry with both a minimum and maximum FreeCAD version, a version - lower than the minimum does not match.""" - with patch("addonmanager_freecad_interface.Version", return_value=(1, 0, 3, "dev")): - ac = AddonCatalogEntry( - { - "freecad_min": Version(from_string="1.1"), - "freecad_max": Version(from_string="1.3"), - } - ) - self.assertFalse(ac.is_compatible()) - - -class TestAddonCatalog(unittest.TestCase): - """Tests for the AddonCatalog class.""" - - def setUp(self): - """Start mock for addonmanager_licenses class.""" - global AddonCatalog - global Version - self.addon_patch = mock.patch.dict("sys.modules", {"addonmanager_licenses": mock.Mock()}) - self.mock_addon_module = self.addon_patch.start() - from AddonCatalog import AddonCatalog - from addonmanager_metadata import Version - - def tearDown(self): - """Stop patching the addonmanager_licenses class""" - self.addon_patch.stop() - - def test_single_addon_simple_entry(self): - """Test that an addon entry for an addon with only a git ref is accepted and added, and - appears as an available addon.""" - data = {"AnAddon": [{"git_ref": "main"}]} - catalog = AddonCatalog(data) - ids = catalog.get_available_addon_ids() - self.assertEqual(len(ids), 1) - self.assertIn("AnAddon", ids) - - def test_single_addon_max_single_entry(self): - """Test that an addon with the maximum possible data load is accepted.""" - data = { - "AnAddon": [ - { - "freecad_min": "0.21.0", - "freecad_max": "1.99.99", - "repository": "https://github.com/FreeCAD/FreeCAD", - "git_ref": "main", - "zip_url": "https://github.com/FreeCAD/FreeCAD/archive/main.zip", - "note": "This is a fake repo, don't use it", - "branch_display_name": "main", - } - ] - } - catalog = AddonCatalog(data) - ids = catalog.get_available_addon_ids() - self.assertEqual(len(ids), 1) - self.assertIn("AnAddon", ids) - - def test_single_addon_multiple_entries(self): - """Test that an addon with multiple entries is accepted and only appears as a single - addon.""" - data = { - "AnAddon": [ - { - "freecad_min": "1.0.0", - "repository": "https://github.com/FreeCAD/FreeCAD", - "git_ref": "main", - }, - { - "freecad_min": "0.21.0", - "freecad_max": "0.21.99", - "repository": "https://github.com/FreeCAD/FreeCAD", - "git_ref": "0_21_compatibility_branch", - "branch_display_name": "FreeCAD 0.21 Compatibility Branch", - }, - ] - } - catalog = AddonCatalog(data) - ids = catalog.get_available_addon_ids() - self.assertEqual(len(ids), 1) - self.assertIn("AnAddon", ids) - - def test_multiple_addon_entries(self): - """Test that multiple distinct addon entries are added as distinct addons""" - data = { - "AnAddon": [{"git_ref": "main"}], - "AnotherAddon": [{"git_ref": "main"}], - "YetAnotherAddon": [{"git_ref": "main"}], - } - catalog = AddonCatalog(data) - ids = catalog.get_available_addon_ids() - self.assertEqual(len(ids), 3) - self.assertIn("AnAddon", ids) - self.assertIn("AnotherAddon", ids) - self.assertIn("YetAnotherAddon", ids) - - def test_multiple_branches_single_match(self): - """Test that an addon with multiple branches representing different configurations of - min and max FreeCAD versions returns only the appropriate match.""" - data = { - "AnAddon": [ - { - "freecad_min": "1.0.0", - "repository": "https://github.com/FreeCAD/FreeCAD", - "git_ref": "main", - }, - { - "freecad_min": "0.21.0", - "freecad_max": "0.21.99", - "repository": "https://github.com/FreeCAD/FreeCAD", - "git_ref": "0_21_compatibility_branch", - "branch_display_name": "FreeCAD 0.21 Compatibility Branch", - }, - { - "freecad_min": "0.19.0", - "freecad_max": "0.20.99", - "repository": "https://github.com/FreeCAD/FreeCAD", - "git_ref": "0_19_compatibility_branch", - "branch_display_name": "FreeCAD 0.19 Compatibility Branch", - }, - ] - } - with patch("addonmanager_freecad_interface.Version", return_value=(1, 0, 3, "dev")): - catalog = AddonCatalog(data) - branches = catalog.get_available_branches("AnAddon") - self.assertEqual(len(branches), 1) - - def test_load_metadata_cache(self): - """Test that an addon with a known hash is correctly loaded (e.g. no exception is raised)""" - data = {"AnAddon": [{"git_ref": "main"}]} - catalog = AddonCatalog(data) - sha = "cbce6737d7d058dca2b5ae3f2fdb8cc45b0c02bf711e75bdf5f12fb71ce87790" - cache = {sha: "CacheData"} - with patch("addonmanager_freecad_interface.Version", return_value=cache): - with patch("Addon.Addon") as addon_mock: - catalog.load_metadata_cache(cache) diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_cache.py b/src/Mod/AddonManager/AddonManagerTest/app/test_cache.py deleted file mode 100644 index 098f1b3a01..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_cache.py +++ /dev/null @@ -1,126 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** -import datetime -import sys -import unittest -from datetime import date -from unittest import TestCase -from unittest.mock import MagicMock, patch - -sys.path.append("../..") - -import addonmanager_cache as cache -from AddonManagerTest.app.mocks import MockPref, MockExists - - -class TestCache(TestCase): - @patch("addonmanager_freecad_interface.getUserCachePath") - @patch("addonmanager_freecad_interface.ParamGet") - @patch("os.remove", MagicMock()) - @patch("os.makedirs", MagicMock()) - def test_local_cache_needs_update(self, param_mock: MagicMock, cache_mock: MagicMock): - cache_mock.return_value = "" - param_mock.return_value = MockPref() - default_prefs = { - "UpdateFrequencyComboEntry": 0, - "LastCacheUpdate": "2000-01-01", - "CustomRepoHash": "", - "CustomRepositories": "", - } - today = date.today().isoformat() - yesterday = (date.today() - datetime.timedelta(1)).isoformat() - - # Organize these as subtests because of all the patching that has to be done: once we are in this function, - # the patch is complete, and we can just modify the return values of the fakes one by one - tests = ( - { - "case": "No existing cache", - "files_that_exist": [], - "prefs_to_set": {}, - "expect": True, - }, - { - "case": "Last cache update was interrupted", - "files_that_exist": ["CACHE_UPDATE_INTERRUPTED"], - "prefs_to_set": {}, - "expect": True, - }, - { - "case": "Cache exists and updating is blocked", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {}, - "expect": False, - }, - { - "case": "Daily updates set and last update was long ago", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {"UpdateFrequencyComboEntry": 1}, - "expect": True, - }, - { - "case": "Daily updates set and last update was today", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {"UpdateFrequencyComboEntry": 1, "LastCacheUpdate": today}, - "expect": False, - }, - { - "case": "Daily updates set and last update was yesterday", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {"UpdateFrequencyComboEntry": 1, "LastCacheUpdate": yesterday}, - "expect": True, - }, - { - "case": "Weekly updates set and last update was long ago", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {"UpdateFrequencyComboEntry": 1}, - "expect": True, - }, - { - "case": "Weekly updates set and last update was yesterday", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {"UpdateFrequencyComboEntry": 2, "LastCacheUpdate": yesterday}, - "expect": False, - }, - { - "case": "Custom repo list changed", - "files_that_exist": ["AddonManager"], - "prefs_to_set": {"CustomRepositories": "NewRepo"}, - "expect": True, - }, - ) - for test_case in tests: - with self.subTest(test_case["case"]): - case_prefs = default_prefs - for pref, setting in test_case["prefs_to_set"].items(): - case_prefs[pref] = setting - param_mock.return_value.set_prefs(case_prefs) - exists_mock = MockExists(test_case["files_that_exist"]) - with patch("os.path.exists", exists_mock.exists): - if test_case["expect"]: - self.assertTrue(cache.local_cache_needs_update()) - else: - self.assertFalse(cache.local_cache_needs_update()) - - -if __name__ == "__main__": - unittest.main() diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_dependency_installer.py b/src/Mod/AddonManager/AddonManagerTest/app/test_dependency_installer.py deleted file mode 100644 index c70e08491c..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_dependency_installer.py +++ /dev/null @@ -1,195 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import functools -import os -import subprocess -import tempfile -from time import sleep -import unittest - -from addonmanager_dependency_installer import DependencyInstaller - - -class CompleteProcessMock(subprocess.CompletedProcess): - def __init__(self): - super().__init__(["fake_arg"], 0) - self.stdout = "Mock subprocess call stdout result" - - -class SubprocessMock: - def __init__(self): - self.arg_log = [] - self.called = False - self.call_count = 0 - self.delay = 0 - self.succeed = True - - def subprocess_interceptor(self, args): - self.arg_log.append(args) - self.called = True - self.call_count += 1 - sleep(self.delay) - if self.succeed: - return CompleteProcessMock() - raise subprocess.CalledProcessError(1, " ".join(args), "Unit test mock output") - - -class FakeFunction: - def __init__(self): - self.called = False - self.call_count = 0 - self.return_value = None - self.arg_log = [] - - def func_call(self, *args): - self.arg_log.append(args) - self.called = True - self.call_count += 1 - return self.return_value - - -class TestDependencyInstaller(unittest.TestCase): - """Test the dependency installation class""" - - def setUp(self): - self.subprocess_mock = SubprocessMock() - self.test_object = DependencyInstaller([], ["required_py_package"], ["optional_py_package"]) - self.test_object._subprocess_wrapper = self.subprocess_mock.subprocess_interceptor - self.signals_caught = [] - self.test_object.failure.connect(functools.partial(self.catch_signal, "failure")) - self.test_object.finished.connect(functools.partial(self.catch_signal, "finished")) - self.test_object.no_pip.connect(functools.partial(self.catch_signal, "no_pip")) - self.test_object.no_python_exe.connect( - functools.partial(self.catch_signal, "no_python_exe") - ) - - def tearDown(self): - pass - - def catch_signal(self, signal_name, *_): - self.signals_caught.append(signal_name) - - def test_run_no_pip(self): - self.test_object._verify_pip = lambda: False - self.test_object.run() - self.assertIn("finished", self.signals_caught) - - def test_run_with_pip(self): - ff = FakeFunction() - self.test_object._verify_pip = lambda: True - self.test_object._install_python_packages = ff.func_call - self.test_object.run() - self.assertIn("finished", self.signals_caught) - self.assertTrue(ff.called) - - def test_run_with_no_packages(self): - ff = FakeFunction() - self.test_object._verify_pip = lambda: True - self.test_object._install_python_packages = ff.func_call - self.test_object.python_requires = [] - self.test_object.python_optional = [] - self.test_object.run() - self.assertIn("finished", self.signals_caught) - self.assertFalse(ff.called) - - def test_install_python_packages_new_location(self): - ff_required = FakeFunction() - ff_optional = FakeFunction() - self.test_object._install_required = ff_required.func_call - self.test_object._install_optional = ff_optional.func_call - with tempfile.TemporaryDirectory() as td: - self.test_object.location = os.path.join(td, "UnitTestLocation") - self.test_object._install_python_packages() - self.assertTrue(ff_required.called) - self.assertTrue(ff_optional.called) - self.assertTrue(os.path.exists(self.test_object.location)) - - def test_install_python_packages_existing_location(self): - ff_required = FakeFunction() - ff_optional = FakeFunction() - self.test_object._install_required = ff_required.func_call - self.test_object._install_optional = ff_optional.func_call - with tempfile.TemporaryDirectory() as td: - self.test_object.location = td - self.test_object._install_python_packages() - self.assertTrue(ff_required.called) - self.assertTrue(ff_optional.called) - - def test_verify_pip_no_pip(self): - sm = SubprocessMock() - sm.succeed = False - self.test_object._subprocess_wrapper = sm.subprocess_interceptor - self.test_object._get_python = lambda: "fake_python" - result = self.test_object._verify_pip() - self.assertFalse(result) - self.assertIn("no_pip", self.signals_caught) - - def test_verify_pip_with_pip(self): - sm = SubprocessMock() - sm.succeed = True - self.test_object._subprocess_wrapper = sm.subprocess_interceptor - self.test_object._get_python = lambda: "fake_python" - result = self.test_object._verify_pip() - self.assertTrue(result) - self.assertNotIn("no_pip", self.signals_caught) - - def test_install_required_loops(self): - sm = SubprocessMock() - sm.succeed = True - self.test_object._subprocess_wrapper = sm.subprocess_interceptor - self.test_object._get_python = lambda: "fake_python" - self.test_object.python_requires = ["test1", "test2", "test3"] - self.test_object._install_required("vendor_path") - self.assertEqual(sm.call_count, 3) - - def test_install_required_failure(self): - sm = SubprocessMock() - sm.succeed = False - self.test_object._subprocess_wrapper = sm.subprocess_interceptor - self.test_object._get_python = lambda: "fake_python" - self.test_object.python_requires = ["test1", "test2", "test3"] - self.test_object._install_required("vendor_path") - self.assertEqual(sm.call_count, 1) - self.assertIn("failure", self.signals_caught) - - def test_install_optional_loops(self): - sm = SubprocessMock() - sm.succeed = True - self.test_object._subprocess_wrapper = sm.subprocess_interceptor - self.test_object._get_python = lambda: "fake_python" - self.test_object.python_optional = ["test1", "test2", "test3"] - self.test_object._install_optional("vendor_path") - self.assertEqual(sm.call_count, 3) - - def test_install_optional_failure(self): - sm = SubprocessMock() - sm.succeed = False - self.test_object._subprocess_wrapper = sm.subprocess_interceptor - self.test_object._get_python = lambda: "fake_python" - self.test_object.python_optional = ["test1", "test2", "test3"] - self.test_object._install_optional("vendor_path") - self.assertEqual(sm.call_count, 3) - - def test_run_pip(self): - pass diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_freecad_interface.py b/src/Mod/AddonManager/AddonManagerTest/app/test_freecad_interface.py deleted file mode 100644 index 07da9f5301..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_freecad_interface.py +++ /dev/null @@ -1,299 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Tests for the Addon Manager's FreeCAD interface classes.""" - -import json -import os -import sys -import tempfile -import unittest -from unittest.mock import patch, MagicMock - -# pylint: disable=protected-access,import-outside-toplevel - - -class TestConsole(unittest.TestCase): - """Tests for the Console""" - - def setUp(self) -> None: - self.saved_freecad = None - if "FreeCAD" in sys.modules: - self.saved_freecad = sys.modules["FreeCAD"] - sys.modules.pop("FreeCAD") - if "addonmanager_freecad_interface" in sys.modules: - sys.modules.pop("addonmanager_freecad_interface") - sys.path.append("../../") - - def tearDown(self) -> None: - if "FreeCAD" in sys.modules: - sys.modules.pop("FreeCAD") - if self.saved_freecad is not None: - sys.modules["FreeCAD"] = self.saved_freecad - - def test_log_with_freecad(self): - """Ensure that if FreeCAD exists, the appropriate function is called""" - sys.modules["FreeCAD"] = unittest.mock.MagicMock() - import addonmanager_freecad_interface as fc - - fc.Console.PrintLog("Test output") - self.assertTrue(isinstance(fc.Console, unittest.mock.MagicMock)) - self.assertTrue(fc.Console.PrintLog.called) - - def test_log_no_freecad(self): - """Test that if the FreeCAD import fails, the logger is set up correctly, and - implements PrintLog""" - sys.modules["FreeCAD"] = None - with patch("addonmanager_freecad_interface.logging", new=MagicMock()) as mock_logging: - import addonmanager_freecad_interface as fc - - fc.Console.PrintLog("Test output") - self.assertTrue(isinstance(fc.Console, fc.ConsoleReplacement)) - self.assertTrue(mock_logging.log.called) - - def test_message_no_freecad(self): - """Test that if the FreeCAD import fails the logger implements PrintMessage""" - sys.modules["FreeCAD"] = None - with patch("addonmanager_freecad_interface.logging", new=MagicMock()) as mock_logging: - import addonmanager_freecad_interface as fc - - fc.Console.PrintMessage("Test output") - self.assertTrue(mock_logging.info.called) - - def test_warning_no_freecad(self): - """Test that if the FreeCAD import fails the logger implements PrintWarning""" - sys.modules["FreeCAD"] = None - with patch("addonmanager_freecad_interface.logging", new=MagicMock()) as mock_logging: - import addonmanager_freecad_interface as fc - - fc.Console.PrintWarning("Test output") - self.assertTrue(mock_logging.warning.called) - - def test_error_no_freecad(self): - """Test that if the FreeCAD import fails the logger implements PrintError""" - sys.modules["FreeCAD"] = None - with patch("addonmanager_freecad_interface.logging", new=MagicMock()) as mock_logging: - import addonmanager_freecad_interface as fc - - fc.Console.PrintError("Test output") - self.assertTrue(mock_logging.error.called) - - -class TestParameters(unittest.TestCase): - """Tests for the Parameters""" - - def setUp(self) -> None: - self.saved_freecad = None - if "FreeCAD" in sys.modules: - self.saved_freecad = sys.modules["FreeCAD"] - sys.modules.pop("FreeCAD") - if "addonmanager_freecad_interface" in sys.modules: - sys.modules.pop("addonmanager_freecad_interface") - sys.path.append("../../") - - def tearDown(self) -> None: - if "FreeCAD" in sys.modules: - sys.modules.pop("FreeCAD") - if self.saved_freecad is not None: - sys.modules["FreeCAD"] = self.saved_freecad - - def test_param_get_with_freecad(self): - """Ensure that if FreeCAD exists, the built-in FreeCAD function is called""" - sys.modules["FreeCAD"] = unittest.mock.MagicMock() - import addonmanager_freecad_interface as fc - - prefs = fc.ParamGet("some/fake/path") - self.assertTrue(isinstance(prefs, unittest.mock.MagicMock)) - - def test_param_get_no_freecad(self): - """Test that if the FreeCAD import fails, param_get returns a ParametersReplacement""" - sys.modules["FreeCAD"] = None - import addonmanager_freecad_interface as fc - - prefs = fc.ParamGet("some/fake/path") - self.assertTrue(isinstance(prefs, fc.ParametersReplacement)) - - def test_replacement_getters_and_setters(self): - """Test that ParameterReplacement's getters, setters, and deleters work""" - sys.modules["FreeCAD"] = None - import addonmanager_freecad_interface as fc - - prf = fc.ParamGet("some/fake/path") - gs_types = [ - ("Bool", prf.GetBool, prf.SetBool, prf.RemBool, True, False), - ("Int", prf.GetInt, prf.SetInt, prf.RemInt, 42, 0), - ("Float", prf.GetFloat, prf.SetFloat, prf.RemFloat, 1.2, 3.4), - ("String", prf.GetString, prf.SetString, prf.RemString, "test", "other"), - ] - for gs_type in gs_types: - with self.subTest(msg=f"Testing {gs_type[0]}", gs_type=gs_type): - getter = gs_type[1] - setter = gs_type[2] - deleter = gs_type[3] - value_1 = gs_type[4] - value_2 = gs_type[5] - self.assertEqual(getter("test", value_1), value_1) - self.assertEqual(getter("test", value_2), value_2) - self.assertNotIn("test", prf.parameters) - setter("test", value_1) - self.assertIn("test", prf.parameters) - self.assertEqual(getter("test", value_2), value_1) - deleter("test") - self.assertNotIn("test", prf.parameters) - - -class TestDataPaths(unittest.TestCase): - """Tests for the data paths""" - - def setUp(self) -> None: - self.saved_freecad = None - if "FreeCAD" in sys.modules: - self.saved_freecad = sys.modules["FreeCAD"] - sys.modules.pop("FreeCAD") - if "addonmanager_freecad_interface" in sys.modules: - sys.modules.pop("addonmanager_freecad_interface") - sys.path.append("../../") - - def tearDown(self) -> None: - if "FreeCAD" in sys.modules: - sys.modules.pop("FreeCAD") - if self.saved_freecad is not None: - sys.modules["FreeCAD"] = self.saved_freecad - - def test_init_with_freecad(self): - """Ensure that if FreeCAD exists, the appropriate functions are called""" - sys.modules["FreeCAD"] = unittest.mock.MagicMock() - import addonmanager_freecad_interface as fc - - data_paths = fc.DataPaths() - self.assertTrue(sys.modules["FreeCAD"].getUserAppDataDir.called) - self.assertTrue(sys.modules["FreeCAD"].getUserMacroDir.called) - self.assertTrue(sys.modules["FreeCAD"].getUserCachePath.called) - self.assertIsNotNone(data_paths.mod_dir) - self.assertIsNotNone(data_paths.cache_dir) - self.assertIsNotNone(data_paths.macro_dir) - - def test_init_without_freecad(self): - """Ensure that if FreeCAD does not exist, the appropriate functions are called""" - sys.modules["FreeCAD"] = None - import addonmanager_freecad_interface as fc - - data_paths = fc.DataPaths() - self.assertIsNotNone(data_paths.mod_dir) - self.assertIsNotNone(data_paths.cache_dir) - self.assertIsNotNone(data_paths.macro_dir) - self.assertNotEqual(data_paths.mod_dir, data_paths.cache_dir) - self.assertNotEqual(data_paths.mod_dir, data_paths.macro_dir) - self.assertNotEqual(data_paths.cache_dir, data_paths.macro_dir) - - -class TestPreferences(unittest.TestCase): - """Tests for the preferences wrapper""" - - def setUp(self) -> None: - sys.path.append("../../") - import addonmanager_freecad_interface as fc - - self.fc = fc - - def tearDown(self) -> None: - pass - - def test_load_preferences_defaults(self): - """Preferences are loaded from a given file""" - defaults = self.given_defaults() - with tempfile.TemporaryDirectory() as temp_dir: - json_file = os.path.join(temp_dir, "defaults.json") - with open(json_file, "w", encoding="utf-8") as f: - f.write(json.dumps(defaults)) - self.fc.Preferences._load_preferences_defaults(json_file) - self.assertDictEqual(defaults, self.fc.Preferences.preferences_defaults) - - def test_in_memory_defaults(self): - """Preferences are loaded from memory""" - defaults = self.given_defaults() - prefs = self.fc.Preferences(defaults) - self.assertDictEqual(defaults, prefs.preferences_defaults) - - def test_get_good(self): - """Get returns results when matching an existing preference""" - defaults = self.given_defaults() - prefs = self.fc.Preferences(defaults) - self.assertEqual(prefs.get("TestBool"), defaults["TestBool"]) - self.assertEqual(prefs.get("TestInt"), defaults["TestInt"]) - self.assertEqual(prefs.get("TestFloat"), defaults["TestFloat"]) - self.assertEqual(prefs.get("TestString"), defaults["TestString"]) - - def test_get_nonexistent(self): - """Get raises an exception when asked for a non-existent preference""" - defaults = self.given_defaults() - prefs = self.fc.Preferences(defaults) - with self.assertRaises(RuntimeError): - prefs.get("No_such_thing") - - def test_get_bad_type(self): - """Get raises an exception when getting an unsupported type""" - defaults = self.given_defaults() - defaults["TestArray"] = ["This", "Is", "Legal", "JSON"] - prefs = self.fc.Preferences(defaults) - with self.assertRaises(RuntimeError): - prefs.get("TestArray") - - def test_set_good(self): - """Set works when matching an existing preference""" - defaults = self.given_defaults() - prefs = self.fc.Preferences(defaults) - prefs.set("TestBool", False) - self.assertEqual(prefs.get("TestBool"), False) - prefs.set("TestInt", 4321) - self.assertEqual(prefs.get("TestInt"), 4321) - prefs.set("TestFloat", 3.14159) - self.assertEqual(prefs.get("TestFloat"), 3.14159) - prefs.set("TestString", "Forty two") - self.assertEqual(prefs.get("TestString"), "Forty two") - - def test_set_nonexistent(self): - """Set raises an exception when asked for a non-existent preference""" - defaults = self.given_defaults() - prefs = self.fc.Preferences(defaults) - with self.assertRaises(RuntimeError): - prefs.get("No_such_thing") - - def test_set_bad_type(self): - """Set raises an exception when setting an unsupported type""" - defaults = self.given_defaults() - defaults["TestArray"] = ["This", "Is", "Legal", "JSON"] - prefs = self.fc.Preferences(defaults) - with self.assertRaises(RuntimeError): - prefs.get("TestArray") - - @staticmethod - def given_defaults(): - """Get a dictionary of fake defaults for testing""" - defaults = { - "TestBool": True, - "TestInt": 42, - "TestFloat": 1.2, - "TestString": "Test", - } - return defaults diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_git.py b/src/Mod/AddonManager/AddonManagerTest/app/test_git.py deleted file mode 100644 index e9a9aaaf64..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_git.py +++ /dev/null @@ -1,177 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - - -import unittest -import os -import shutil -import stat -import tempfile -import time -from zipfile import ZipFile -import FreeCAD - -from addonmanager_git import GitManager, NoGitFound, GitFailed - -try: - git_manager = GitManager() -except NoGitFound: - git_manager = None - - -@unittest.skipIf(git_manager is None, "No git executable -- not running git-based tests") -class TestGit(unittest.TestCase): - - MODULE = "test_git" # file name without extension - - def setUp(self): - """Set up the test case: called by the unit test system""" - self.cwd = os.getcwd() - test_data_dir = os.path.join( - FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data" - ) - git_repo_zip = os.path.join(test_data_dir, "test_repo.zip") - self.test_dir = os.path.join( - tempfile.gettempdir(), "FreeCADTesting", "AddonManagerTests", "Git" - ) - os.makedirs(self.test_dir, exist_ok=True) - self.test_repo_remote = os.path.join(self.test_dir, "TEST_REPO_REMOTE") - if os.path.exists(self.test_repo_remote): - # Make sure any old copy that got left around is deleted - self._rmdir(self.test_repo_remote) - - if not os.path.exists(git_repo_zip): - self.skipTest("Can't find test repo") - return - - with ZipFile(git_repo_zip, "r") as zip_repo: - zip_repo.extractall(self.test_repo_remote) - self.test_repo_remote = os.path.join(self.test_repo_remote, "test_repo") - - self.git = git_manager - - def tearDown(self): - """Clean up after the test""" - os.chdir(self.cwd) - # self._rmdir(self.test_dir) - os.rename(self.test_dir, self.test_dir + ".old." + str(time.time())) - - def test_clone(self): - """Test git clone""" - checkout_dir = self._clone_test_repo() - self.assertTrue(os.path.exists(checkout_dir)) - self.assertTrue(os.path.exists(os.path.join(checkout_dir, ".git"))) - self.assertEqual(os.getcwd(), self.cwd, "We should be left in the same CWD we started") - - def test_checkout(self): - """Test git checkout""" - checkout_dir = self._clone_test_repo() - - self.git.checkout(checkout_dir, "HEAD~1") - status = self.git.status(checkout_dir).strip() - expected_status = "## HEAD (no branch)" - self.assertEqual(status, expected_status) - - self.assertEqual(os.getcwd(), self.cwd, "We should be left in the same CWD we started") - - def test_update(self): - """Test using git to update the local repo""" - checkout_dir = self._clone_test_repo() - - self.git.reset(checkout_dir, ["--hard", "HEAD~1"]) - self.assertTrue(self.git.update_available(checkout_dir)) - self.git.update(checkout_dir) - self.assertFalse(self.git.update_available(checkout_dir)) - self.assertEqual(os.getcwd(), self.cwd, "We should be left in the same CWD we started") - - def test_tag_and_branch(self): - """Test checking the currently checked-out tag""" - checkout_dir = self._clone_test_repo() - - expected_tag = "TestTag" - self.git.checkout(checkout_dir, expected_tag) - found_tag = self.git.current_tag(checkout_dir) - self.assertEqual(found_tag, expected_tag) - self.assertFalse(self.git.update_available(checkout_dir)) - - expected_branch = "TestBranch" - self.git.checkout(checkout_dir, expected_branch) - found_branch = self.git.current_branch(checkout_dir) - self.assertEqual(found_branch, expected_branch) - self.assertFalse(self.git.update_available(checkout_dir)) - - expected_branch = "main" - self.git.checkout(checkout_dir, expected_branch) - found_branch = self.git.current_branch(checkout_dir) - self.assertEqual(found_branch, expected_branch) - self.assertFalse(self.git.update_available(checkout_dir)) - - self.assertEqual(os.getcwd(), self.cwd, "We should be left in the same CWD we started") - - def test_get_remote(self): - """Test getting the remote location""" - checkout_dir = self._clone_test_repo() - expected_remote = self.test_repo_remote - returned_remote = self.git.get_remote(checkout_dir) - self.assertEqual(expected_remote, returned_remote) - self.assertEqual(os.getcwd(), self.cwd, "We should be left in the same CWD we started") - - def test_repair(self): - """Test the repair feature (and some exception throwing)""" - checkout_dir = self._clone_test_repo() - remote = self.git.get_remote(checkout_dir) - git_dir = os.path.join(checkout_dir, ".git") - self.assertTrue(os.path.exists(git_dir)) - self._rmdir(git_dir) - - # Make sure that we've truly broken the install - with self.assertRaises(GitFailed): - self.git.status(checkout_dir) - - self.git.repair(remote, checkout_dir) - status = self.git.status(checkout_dir) - self.assertEqual(status, "## main...origin/main\n") - self.assertEqual(os.getcwd(), self.cwd, "We should be left in the same CWD we started") - - def _rmdir(self, path): - try: - shutil.rmtree(path, onerror=self._remove_readonly) - except Exception as e: - print(e) - - def _remove_readonly(self, func, path, _) -> None: - """Remove a read-only file.""" - - os.chmod(path, stat.S_IWRITE) - func(path) - - def _clone_test_repo(self) -> str: - checkout_dir = os.path.join(self.test_dir, "test_repo") - try: - # Git won't clone to an existing directory, so make sure to remove it first - if os.path.exists(checkout_dir): - self._rmdir(checkout_dir) - self.git.clone(self.test_repo_remote, checkout_dir) - except GitFailed as e: - self.fail(str(e)) - return checkout_dir diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_installer.py b/src/Mod/AddonManager/AddonManagerTest/app/test_installer.py deleted file mode 100644 index fa57af41a0..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_installer.py +++ /dev/null @@ -1,412 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains the unit test class for addonmanager_installer.py non-GUI functionality.""" - -import unittest -from unittest.mock import Mock -import os -import shutil -import tempfile -from zipfile import ZipFile -import sys - -sys.path.append("../../") # So the IDE can find the imports below - -import FreeCAD -from addonmanager_installer import InstallationMethod, AddonInstaller, MacroInstaller -from addonmanager_git import GitManager, initialize_git -from addonmanager_metadata import MetadataReader -from Addon import Addon -from AddonManagerTest.app.mocks import MockAddon, MockMacro - - -class TestAddonInstaller(unittest.TestCase): - """Test class for addonmanager_installer.py non-GUI functionality""" - - MODULE = "test_installer" # file name without extension - - def setUp(self): - """Initialize data needed for all tests""" - # self.start_time = time.perf_counter() - self.test_data_dir = os.path.join( - FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data" - ) - self.real_addon = Addon( - "TestAddon", - "https://github.com/FreeCAD/FreeCAD-addons", - Addon.Status.NOT_INSTALLED, - "master", - ) - self.mock_addon = MockAddon() - - def tearDown(self): - """Finalize the test.""" - # end_time = time.perf_counter() - # print(f"Test '{self.id()}' ran in {end_time-self.start_time:.4f} seconds") - - def test_validate_object(self): - """An object is valid if it has a name, url, and branch attribute.""" - - AddonInstaller._validate_object(self.real_addon) # Won't raise - AddonInstaller._validate_object(self.mock_addon) # Won't raise - - class NoName: - def __init__(self): - self.url = "https://github.com/FreeCAD/FreeCAD-addons" - self.branch = "master" - - no_name = NoName() - with self.assertRaises(RuntimeError): - AddonInstaller._validate_object(no_name) - - class NoUrl: - def __init__(self): - self.name = "TestAddon" - self.branch = "master" - - no_url = NoUrl() - with self.assertRaises(RuntimeError): - AddonInstaller._validate_object(no_url) - - class NoBranch: - def __init__(self): - self.name = "TestAddon" - self.url = "https://github.com/FreeCAD/FreeCAD-addons" - - no_branch = NoBranch() - with self.assertRaises(RuntimeError): - AddonInstaller._validate_object(no_branch) - - def test_update_metadata(self): - """If a metadata file exists in the installation location, it should be - loaded.""" - addon = Mock() - addon.name = "MockAddon" - installer = AddonInstaller(addon, []) - installer._update_metadata() # Does nothing, but should not crash - - installer = AddonInstaller(self.real_addon, []) - with tempfile.TemporaryDirectory() as temp_dir: - installer.installation_path = temp_dir - installer._update_metadata() - addon_dir = os.path.join(temp_dir, self.real_addon.name) - os.mkdir(addon_dir) - shutil.copy( - os.path.join(self.test_data_dir, "good_package.xml"), - os.path.join(addon_dir, "package.xml"), - ) - good_metadata = MetadataReader.from_file(os.path.join(addon_dir, "package.xml")) - installer._update_metadata() - self.assertEqual(self.real_addon.installed_version, good_metadata.version) - - def test_finalize_zip_installation_non_github(self): - """Ensure that zip files are correctly extracted.""" - with tempfile.TemporaryDirectory() as temp_dir: - test_simple_repo = os.path.join(self.test_data_dir, "test_simple_repo.zip") - non_gh_mock = MockAddon() - non_gh_mock.url = test_simple_repo[:-4] - non_gh_mock.name = "NonGitHubMock" - installer = AddonInstaller(non_gh_mock, []) - installer.installation_path = temp_dir - installer._finalize_zip_installation(test_simple_repo) - expected_location = os.path.join(temp_dir, non_gh_mock.name, "README") - self.assertTrue(os.path.isfile(expected_location), "Non-GitHub zip extraction failed") - - def test_finalize_zip_installation_github(self): - with tempfile.TemporaryDirectory() as temp_dir: - test_github_style_repo = os.path.join(self.test_data_dir, "test_github_style_repo.zip") - self.mock_addon.url = "https://github.com/something/test_github_style_repo" - self.mock_addon.branch = "master" - installer = AddonInstaller(self.mock_addon, []) - installer.installation_path = temp_dir - installer._finalize_zip_installation(test_github_style_repo) - expected_location = os.path.join(temp_dir, self.mock_addon.name, "README") - self.assertTrue(os.path.isfile(expected_location), "GitHub zip extraction failed") - - def test_code_in_branch_subdirectory_true(self): - """When there is a subdirectory with the branch name in it, find it""" - self.mock_addon.url = "https://something.com/something_else/something" - installer = AddonInstaller(self.mock_addon, []) - with tempfile.TemporaryDirectory() as temp_dir: - os.mkdir(os.path.join(temp_dir, f"something-{self.mock_addon.branch}")) - result = installer._code_in_branch_subdirectory(temp_dir) - self.assertTrue(result, "Failed to find ZIP subdirectory") - - def test_code_in_branch_subdirectory_false(self): - """When there is not a subdirectory with the branch name in it, don't find - one""" - installer = AddonInstaller(self.mock_addon, []) - with tempfile.TemporaryDirectory() as temp_dir: - result = installer._code_in_branch_subdirectory(temp_dir) - self.assertFalse(result, "Found ZIP subdirectory when there was none") - - def test_code_in_branch_subdirectory_more_than_one(self): - """When there are multiple subdirectories, never find a branch subdirectory""" - installer = AddonInstaller(self.mock_addon, []) - with tempfile.TemporaryDirectory() as temp_dir: - os.mkdir(os.path.join(temp_dir, f"{self.mock_addon.name}-{self.mock_addon.branch}")) - os.mkdir(os.path.join(temp_dir, "AnotherSubdir")) - result = installer._code_in_branch_subdirectory(temp_dir) - self.assertFalse(result, "Found ZIP subdirectory when there were multiple subdirs") - - def test_move_code_out_of_subdirectory(self): - """All files are moved out and the subdirectory is deleted""" - self.mock_addon.url = "https://something.com/something_else/something" - installer = AddonInstaller(self.mock_addon, []) - with tempfile.TemporaryDirectory() as temp_dir: - subdir = os.path.join(temp_dir, f"something-{self.mock_addon.branch}") - os.mkdir(subdir) - with open(os.path.join(subdir, "README.txt"), "w", encoding="utf-8") as f: - f.write("# Test file for unit testing") - with open(os.path.join(subdir, "AnotherFile.txt"), "w", encoding="utf-8") as f: - f.write("# Test file for unit testing") - installer._move_code_out_of_subdirectory(temp_dir) - self.assertTrue(os.path.isfile(os.path.join(temp_dir, "README.txt"))) - self.assertTrue(os.path.isfile(os.path.join(temp_dir, "AnotherFile.txt"))) - self.assertFalse(os.path.isdir(subdir)) - - def test_install_by_git(self): - """Test using git to install. Depends on there being a local git - installation: the test is skipped if there is no local git.""" - git_manager = initialize_git() - if not git_manager: - self.skipTest("git not found, skipping git installer tests") - return - - # Our test git repo has to be in a zipfile, otherwise it cannot itself be - # stored in git, since it has a .git subdirectory. - with tempfile.TemporaryDirectory() as temp_dir: - git_repo_zip = os.path.join(self.test_data_dir, "test_repo.zip") - with ZipFile(git_repo_zip, "r") as zip_repo: - zip_repo.extractall(temp_dir) - - mock_addon = MockAddon() - mock_addon.url = os.path.join(temp_dir, "test_repo") - mock_addon.branch = "main" - installer = AddonInstaller(mock_addon, []) - installer.installation_path = os.path.join(temp_dir, "installed_addon") - installer._install_by_git() - - self.assertTrue(os.path.exists(installer.installation_path)) - addon_name_dir = os.path.join(installer.installation_path, mock_addon.name) - self.assertTrue(os.path.exists(addon_name_dir)) - readme = os.path.join(addon_name_dir, "README.md") - self.assertTrue(os.path.exists(readme)) - - def test_install_by_copy(self): - """Test using a simple filesystem copy to install an addon.""" - with tempfile.TemporaryDirectory() as temp_dir: - git_repo_zip = os.path.join(self.test_data_dir, "test_repo.zip") - with ZipFile(git_repo_zip, "r") as zip_repo: - zip_repo.extractall(temp_dir) - - mock_addon = MockAddon() - mock_addon.url = os.path.join(temp_dir, "test_repo") - mock_addon.branch = "main" - installer = AddonInstaller(mock_addon, []) - installer.addon_to_install = mock_addon - installer.installation_path = os.path.join(temp_dir, "installed_addon") - installer._install_by_copy() - - self.assertTrue(os.path.exists(installer.installation_path)) - addon_name_dir = os.path.join(installer.installation_path, mock_addon.name) - self.assertTrue(os.path.exists(addon_name_dir)) - readme = os.path.join(addon_name_dir, "README.md") - self.assertTrue(os.path.exists(readme)) - - def test_determine_install_method_local_path(self): - """Test which install methods are accepted for a local path""" - - with tempfile.TemporaryDirectory() as temp_dir: - installer = AddonInstaller(self.mock_addon, []) - method = installer._determine_install_method(temp_dir, InstallationMethod.COPY) - self.assertEqual(method, InstallationMethod.COPY) - git_manager = initialize_git() - if git_manager: - method = installer._determine_install_method(temp_dir, InstallationMethod.GIT) - self.assertEqual(method, InstallationMethod.GIT) - method = installer._determine_install_method(temp_dir, InstallationMethod.ZIP) - self.assertIsNone(method) - method = installer._determine_install_method(temp_dir, InstallationMethod.ANY) - self.assertEqual(method, InstallationMethod.COPY) - - def test_determine_install_method_file_url(self): - """Test which install methods are accepted for a file:// url""" - - with tempfile.TemporaryDirectory() as temp_dir: - installer = AddonInstaller(self.mock_addon, []) - temp_dir = "file://" + temp_dir.replace(os.path.sep, "/") - method = installer._determine_install_method(temp_dir, InstallationMethod.COPY) - self.assertEqual(method, InstallationMethod.COPY) - git_manager = initialize_git() - if git_manager: - method = installer._determine_install_method(temp_dir, InstallationMethod.GIT) - self.assertEqual(method, InstallationMethod.GIT) - method = installer._determine_install_method(temp_dir, InstallationMethod.ZIP) - self.assertIsNone(method) - method = installer._determine_install_method(temp_dir, InstallationMethod.ANY) - self.assertEqual(method, InstallationMethod.COPY) - - def test_determine_install_method_local_zip(self): - """Test which install methods are accepted for a local path to a zipfile""" - - with tempfile.TemporaryDirectory() as temp_dir: - installer = AddonInstaller(self.mock_addon, []) - temp_file = os.path.join(temp_dir, "dummy.zip") - method = installer._determine_install_method(temp_file, InstallationMethod.COPY) - self.assertEqual(method, InstallationMethod.ZIP) - method = installer._determine_install_method(temp_file, InstallationMethod.GIT) - self.assertIsNone(method) - method = installer._determine_install_method(temp_file, InstallationMethod.ZIP) - self.assertEqual(method, InstallationMethod.ZIP) - method = installer._determine_install_method(temp_file, InstallationMethod.ANY) - self.assertEqual(method, InstallationMethod.ZIP) - - def test_determine_install_method_remote_zip(self): - """Test which install methods are accepted for a remote path to a zipfile""" - - installer = AddonInstaller(self.mock_addon, []) - - temp_file = "https://freecad.org/dummy.zip" # Doesn't have to actually exist! - - method = installer._determine_install_method(temp_file, InstallationMethod.COPY) - self.assertIsNone(method) - method = installer._determine_install_method(temp_file, InstallationMethod.GIT) - self.assertIsNone(method) - method = installer._determine_install_method(temp_file, InstallationMethod.ZIP) - self.assertEqual(method, InstallationMethod.ZIP) - method = installer._determine_install_method(temp_file, InstallationMethod.ANY) - self.assertEqual(method, InstallationMethod.ZIP) - - def test_determine_install_method_https_known_sites_copy(self): - """Test which install methods are accepted for an https GitHub URL""" - - installer = AddonInstaller(self.mock_addon, []) - installer.git_manager = True - - for site in ["github.org", "gitlab.org", "framagit.org", "salsa.debian.org"]: - with self.subTest(site=site): - temp_file = f"https://{site}/dummy/dummy" # Doesn't have to actually exist! - method = installer._determine_install_method(temp_file, InstallationMethod.COPY) - self.assertIsNone(method, f"Allowed copying from {site} URL") - - def test_determine_install_method_https_known_sites_git(self): - """Test which install methods are accepted for an https GitHub URL""" - - installer = AddonInstaller(self.mock_addon, []) - installer.git_manager = True - - for site in ["github.org", "gitlab.org", "framagit.org", "salsa.debian.org"]: - with self.subTest(site=site): - temp_file = f"https://{site}/dummy/dummy" # Doesn't have to actually exist! - method = installer._determine_install_method(temp_file, InstallationMethod.GIT) - self.assertEqual( - method, - InstallationMethod.GIT, - f"Failed to allow git access to {site} URL", - ) - - def test_determine_install_method_https_known_sites_zip(self): - """Test which install methods are accepted for an https GitHub URL""" - - installer = AddonInstaller(self.mock_addon, []) - installer.git_manager = True - - for site in ["github.org", "gitlab.org", "framagit.org", "salsa.debian.org"]: - with self.subTest(site=site): - temp_file = f"https://{site}/dummy/dummy" # Doesn't have to actually exist! - method = installer._determine_install_method(temp_file, InstallationMethod.ZIP) - self.assertEqual( - method, - InstallationMethod.ZIP, - f"Failed to allow zip access to {site} URL", - ) - - def test_determine_install_method_https_known_sites_any_gm(self): - """Test which install methods are accepted for an https GitHub URL""" - - installer = AddonInstaller(self.mock_addon, []) - installer.git_manager = True - - for site in ["github.org", "gitlab.org", "framagit.org", "salsa.debian.org"]: - with self.subTest(site=site): - temp_file = f"https://{site}/dummy/dummy" # Doesn't have to actually exist! - method = installer._determine_install_method(temp_file, InstallationMethod.ANY) - self.assertEqual( - method, - InstallationMethod.GIT, - f"Failed to allow git access to {site} URL", - ) - - def test_determine_install_method_https_known_sites_any_no_gm(self): - """Test which install methods are accepted for an https GitHub URL""" - - installer = AddonInstaller(self.mock_addon, []) - installer.git_manager = None - - for site in ["github.org", "gitlab.org", "framagit.org", "salsa.debian.org"]: - with self.subTest(site=site): - temp_file = f"https://{site}/dummy/dummy" # Doesn't have to actually exist! - method = installer._determine_install_method(temp_file, InstallationMethod.ANY) - self.assertEqual( - method, - InstallationMethod.ZIP, - f"Failed to allow zip access to {site} URL", - ) - - def test_fcmacro_copying(self): - with tempfile.TemporaryDirectory() as temp_dir: - mock_addon = MockAddon() - mock_addon.url = os.path.join(self.test_data_dir, "test_addon_with_fcmacro.zip") - installer = AddonInstaller(mock_addon, []) - installer.installation_path = temp_dir - installer.macro_installation_path = os.path.join(temp_dir, "Macros") - installer.run() - self.assertTrue( - os.path.exists(os.path.join(temp_dir, "Macros", "TestMacro.FCMacro")), - "FCMacro file was not copied to macro installation location", - ) - - -class TestMacroInstaller(unittest.TestCase): - MODULE = "test_installer" # file name without extension - - def setUp(self): - """Set up the mock objects""" - - self.mock = MockAddon() - self.mock.macro = MockMacro() - - def test_installation(self): - """Test the wrapper around the macro installer""" - - # Note that this doesn't test the underlying Macro object's install function, - # it only tests whether that function is called appropriately by the - # MacroInstaller wrapper. - with tempfile.TemporaryDirectory() as temp_dir: - installer = MacroInstaller(self.mock) - installer.installation_path = temp_dir - installation_succeeded = installer.run() - self.assertTrue(installation_succeeded) - self.assertTrue(os.path.exists(os.path.join(temp_dir, self.mock.macro.filename))) diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_macro.py b/src/Mod/AddonManager/AddonManagerTest/app/test_macro.py deleted file mode 100644 index 20960e3c6e..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_macro.py +++ /dev/null @@ -1,213 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import os -import sys -import tempfile -from typing import Dict -import unittest -from unittest.mock import MagicMock - -sys.path.append("../../") # So the IDE can find the - -import FreeCAD - -from addonmanager_macro import Macro - - -class TestMacro(unittest.TestCase): - MODULE = "test_macro" # file name without extension - - def setUp(self): - self.test_dir = os.path.join( - FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data" - ) - - def test_basic_metadata(self): - replacements = { - "COMMENT": "test comment", - "WEB": "https://test.url", - "VERSION": "1.2.3", - "AUTHOR": "Test Author", - "DATE": "2022-03-09", - "ICON": "testicon.svg", - } - m = self.generate_macro(replacements) - self.assertEqual(m.comment, replacements["COMMENT"]) - self.assertEqual(m.url, replacements["WEB"]) - self.assertEqual(m.version, replacements["VERSION"]) - self.assertEqual(m.author, replacements["AUTHOR"]) - self.assertEqual(m.date, replacements["DATE"]) - self.assertEqual(m.icon, replacements["ICON"]) - - def test_other_files(self): - replacements = { - "FILES": "file_a,file_b,file_c", - } - m = self.generate_macro(replacements) - self.assertEqual(len(m.other_files), 3) - self.assertEqual(m.other_files[0], "file_a") - self.assertEqual(m.other_files[1], "file_b") - self.assertEqual(m.other_files[2], "file_c") - - replacements = { - "FILES": "file_a, file_b, file_c", - } - m = self.generate_macro(replacements) - self.assertEqual(len(m.other_files), 3) - self.assertEqual(m.other_files[0], "file_a") - self.assertEqual(m.other_files[1], "file_b") - self.assertEqual(m.other_files[2], "file_c") - - replacements = { - "FILES": "file_a file_b file_c", - } - m = self.generate_macro(replacements) - self.assertEqual(len(m.other_files), 1) - self.assertEqual(m.other_files[0], "file_a file_b file_c") - - def test_version_from_string(self): - replacements = { - "VERSION": "1.2.3", - } - m = self.generate_macro(replacements) - self.assertEqual(m.version, "1.2.3") - - def test_version_from_date(self): - replacements = { - "DATE": "2022-03-09", - } - outfile = self.generate_macro_file(replacements) - with open(outfile) as f: - lines = f.readlines() - output_lines = [] - for line in lines: - if "VERSION" in line: - line = "__Version__ = __Date__" - output_lines.append(line) - with open(outfile, "w") as f: - f.write("\n".join(output_lines)) - m = Macro("Unit Test Macro") - m.fill_details_from_file(outfile) - self.assertEqual(m.version, "2022-03-09") - - def test_version_from_float(self): - outfile = self.generate_macro_file() - with open(outfile) as f: - lines = f.readlines() - output_lines = [] - for line in lines: - if "VERSION" in line: - line = "__Version__ = 1.23" - output_lines.append(line) - with open(outfile, "w") as f: - f.write("\n".join(output_lines)) - m = Macro("Unit Test Macro") - m.fill_details_from_file(outfile) - self.assertEqual(m.version, "1.23") - - def test_version_from_int(self): - outfile = self.generate_macro_file() - with open(outfile) as f: - lines = f.readlines() - output_lines = [] - for line in lines: - if "VERSION" in line: - line = "__Version__ = 1" - output_lines.append(line) - with open(outfile, "w") as f: - f.write("\n".join(output_lines)) - m = Macro("Unit Test Macro") - m.fill_details_from_file(outfile) - self.assertEqual(m.version, "1") - - def test_xpm(self): - outfile = self.generate_macro_file() - xpm_data = """/* XPM */ -static char * blarg_xpm[] = { -"16 7 2 1", -"* c #000000", -". c #ffffff", -"**..*...........", -"*.*.*...........", -"**..*..**.**..**", -"*.*.*.*.*.*..*.*", -"**..*..**.*...**", -"...............*", -".............**." -};""" - with open(outfile) as f: - contents = f.read() - contents += f'\n__xpm__ = """{xpm_data}"""\n' - - with open(outfile, "w") as f: - f.write(contents) - m = Macro("Unit Test Macro") - m.fill_details_from_file(outfile) - self.assertEqual(m.xpm, xpm_data) - - def generate_macro_file(self, replacements: Dict[str, str] = {}) -> os.PathLike: - with open(os.path.join(self.test_dir, "macro_template.FCStd")) as f: - lines = f.readlines() - outfile = tempfile.NamedTemporaryFile(mode="wt", delete=False) - for line in lines: - for key, value in replacements.items(): - line = line.replace(key, value) - - outfile.write(line) - outfile.close() - return outfile.name - - def generate_macro(self, replacements: Dict[str, str] = {}) -> Macro: - outfile = self.generate_macro_file(replacements) - m = Macro("Unit Test Macro") - m.fill_details_from_file(outfile) - os.unlink(outfile) - return m - - def test_fetch_raw_code_no_data(self): - m = Macro("Unit Test Macro") - Macro.blocking_get = MagicMock(return_value=None) - returned_data = m._fetch_raw_code( - 'rawcodeurl Totally fake' - ) - self.assertIsNone(returned_data) - m.blocking_get.assert_called_with("https://fake_url.com") - Macro.blocking_get = None - - def test_fetch_raw_code_no_url(self): - m = Macro("Unit Test Macro") - Macro.blocking_get = MagicMock(return_value=None) - returned_data = m._fetch_raw_code("Fake pagedata with no URL at all.") - self.assertIsNone(returned_data) - m.blocking_get.assert_not_called() - Macro.blocking_get = None - - def test_fetch_raw_code_with_data(self): - m = Macro("Unit Test Macro") - Macro.blocking_get = MagicMock(return_value=b"Data returned to _fetch_raw_code") - returned_data = m._fetch_raw_code( - 'rawcodeurl Totally fake' - ) - self.assertEqual(returned_data, "Data returned to _fetch_raw_code") - Macro.blocking_get = None diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_macro_parser.py b/src/Mod/AddonManager/AddonManagerTest/app/test_macro_parser.py deleted file mode 100644 index 5e89bc0945..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_macro_parser.py +++ /dev/null @@ -1,344 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Tests for the MacroParser class""" - -import io -import os -import sys -import unittest - -sys.path.append("../../") # So the IDE can find the classes to run with - -from addonmanager_macro_parser import MacroParser -from AddonManagerTest.app.mocks import MockConsole, CallCatcher, MockThread - - -# pylint: disable=protected-access, too-many-public-methods - - -class TestMacroParser(unittest.TestCase): - """Test the MacroParser class""" - - def setUp(self) -> None: - self.test_object = MacroParser("UnitTestMacro") - self.test_object.console = MockConsole() - self.test_object.current_thread = MockThread() - - def tearDown(self) -> None: - pass - - def test_fill_details_from_code_normal(self): - """Test to make sure _process_line gets called as expected""" - catcher = CallCatcher() - self.test_object._process_line = catcher.catch_call - fake_macro_data = self.given_some_lines(20, 10) - self.test_object.fill_details_from_code(fake_macro_data) - self.assertEqual(catcher.call_count, 10) - - def test_fill_details_from_code_too_many_lines(self): - """Test to make sure _process_line gets limited as expected""" - catcher = CallCatcher() - self.test_object._process_line = catcher.catch_call - self.test_object.MAX_LINES_TO_SEARCH = 5 - fake_macro_data = self.given_some_lines(20, 10) - self.test_object.fill_details_from_code(fake_macro_data) - self.assertEqual(catcher.call_count, 5) - - def test_fill_details_from_code_thread_interrupted(self): - """Test to make sure _process_line gets stopped as expected""" - catcher = CallCatcher() - self.test_object._process_line = catcher.catch_call - self.test_object.current_thread.interrupt_after_n_calls = 6 # Stop on the 6th - fake_macro_data = self.given_some_lines(20, 10) - self.test_object.fill_details_from_code(fake_macro_data) - self.assertEqual(catcher.call_count, 5) - - @staticmethod - def given_some_lines(num_lines, num_dunder_lines) -> str: - """Generate fake macro header data with the given number of lines and number of - lines beginning with a double-underscore.""" - result = "" - for i in range(num_lines): - if i < num_dunder_lines: - result += f"__something_{i}__ = 'Test{i}' # A line to be scanned\n" - else: - result += f"# Nothing to see on line {i}\n" - return result - - def test_process_line_known_lines(self): - """Lines starting with keys are processed""" - test_lines = ["__known_key__ = 'Test'", "__another_known_key__ = 'Test'"] - for line in test_lines: - with self.subTest(line=line): - self.test_object.remaining_item_map = { - "__known_key__": "known_key", - "__another_known_key__": "another_known_key", - } - content_lines = io.StringIO(line) - read_in_line = content_lines.readline() - catcher = CallCatcher() - self.test_object._process_key = catcher.catch_call - self.test_object._process_line(read_in_line, content_lines) - self.assertTrue(catcher.called, "_process_key was not called for a known key") - - def test_process_line_unknown_lines(self): - """Lines starting with non-keys are not processed""" - test_lines = [ - "# Just a line with a comment", - "\n", - "__dont_know_this_one__ = 'Who cares?'", - "# __known_key__ = 'Aha, but it is commented out!'", - ] - for line in test_lines: - with self.subTest(line=line): - self.test_object.remaining_item_map = { - "__known_key__": "known_key", - "__another_known_key__": "another_known_key", - } - content_lines = io.StringIO(line) - read_in_line = content_lines.readline() - catcher = CallCatcher() - self.test_object._process_key = catcher.catch_call - self.test_object._process_line(read_in_line, content_lines) - self.assertFalse(catcher.called, "_process_key was called for an unknown key") - - def test_process_key_standard(self): - """Normal expected data is processed""" - self.test_object._reset_map() - in_memory_data = '__comment__ = "Test"' - content_lines = io.StringIO(in_memory_data) - line = content_lines.readline() - self.test_object._process_key("__comment__", line, content_lines) - self.assertTrue(self.test_object.parse_results["comment"], "Test") - - def test_process_key_special(self): - """Special handling for version = date is processed""" - self.test_object._reset_map() - self.test_object.parse_results["date"] = "2001-01-01" - in_memory_data = "__version__ = __date__" - content_lines = io.StringIO(in_memory_data) - line = content_lines.readline() - self.test_object._process_key("__version__", line, content_lines) - self.assertTrue(self.test_object.parse_results["version"], "2001-01-01") - - def test_handle_backslash_continuation_no_backslashes(self): - """The backslash handling code doesn't change a line with no backslashes""" - in_memory_data = '"Not a backslash in sight"' - content_lines = io.StringIO(in_memory_data) - line = content_lines.readline() - result = self.test_object._handle_backslash_continuation(line, content_lines) - self.assertEqual(result, in_memory_data) - - def test_handle_backslash_continuation(self): - """Lines ending in a backslash get stripped and concatenated""" - in_memory_data = '"Line1\\\nLine2\\\nLine3\\\nLine4"' - content_lines = io.StringIO(in_memory_data) - line = content_lines.readline() - result = self.test_object._handle_backslash_continuation(line, content_lines) - self.assertEqual(result, '"Line1Line2Line3Line4"') - - def test_handle_triple_quoted_string_no_triple_quotes(self): - """The triple-quote handler leaves alone lines without triple-quotes""" - in_memory_data = '"Line1"' - content_lines = io.StringIO(in_memory_data) - line = content_lines.readline() - result, was_triple_quoted = self.test_object._handle_triple_quoted_string( - line, content_lines - ) - self.assertEqual(result, in_memory_data) - self.assertFalse(was_triple_quoted) - - def test_handle_triple_quoted_string(self): - """Data is extracted across multiple lines for a triple-quoted string""" - in_memory_data = '"""Line1\nLine2\nLine3\nLine4"""\nLine5\n' - content_lines = io.StringIO(in_memory_data) - line = content_lines.readline() - result, was_triple_quoted = self.test_object._handle_triple_quoted_string( - line, content_lines - ) - self.assertEqual(result, '"""Line1\nLine2\nLine3\nLine4"""') - self.assertTrue(was_triple_quoted) - - def test_strip_quotes_single(self): - """Single quotes are stripped from the final string""" - expected = "test" - quoted = f"'{expected}'" - actual = self.test_object._strip_quotes(quoted) - self.assertEqual(actual, expected) - - def test_strip_quotes_double(self): - """Double quotes are stripped from the final string""" - expected = "test" - quoted = f'"{expected}"' - actual = self.test_object._strip_quotes(quoted) - self.assertEqual(actual, expected) - - def test_strip_quotes_triple(self): - """Triple quotes are stripped from the final string""" - expected = "test" - quoted = f'"""{expected}"""' - actual = self.test_object._strip_quotes(quoted) - self.assertEqual(actual, expected) - - def test_strip_quotes_unquoted(self): - """Unquoted data results in None""" - unquoted = "This has no quotation marks of any kind" - actual = self.test_object._strip_quotes(unquoted) - self.assertIsNone(actual) - - def test_standard_extraction_string(self): - """String variables are extracted and stored""" - string_keys = [ - "comment", - "url", - "wiki", - "version", - "author", - "date", - "icon", - "xpm", - ] - for key in string_keys: - with self.subTest(key=key): - self.test_object._standard_extraction(key, "test") - self.assertEqual(self.test_object.parse_results[key], "test") - - def test_standard_extraction_list(self): - """List variable is extracted and stored""" - key = "other_files" - self.test_object._standard_extraction(key, "test1, test2, test3") - self.assertIn("test1", self.test_object.parse_results[key]) - self.assertIn("test2", self.test_object.parse_results[key]) - self.assertIn("test3", self.test_object.parse_results[key]) - - def test_apply_special_handling_version(self): - """If the tag is __version__, apply our special handling""" - self.test_object._reset_map() - self.test_object._apply_special_handling("__version__", 42) - self.assertNotIn("__version__", self.test_object.remaining_item_map) - self.assertEqual(self.test_object.parse_results["version"], "42") - - def test_apply_special_handling_not_version(self): - """If the tag is not __version__, raise an error""" - self.test_object._reset_map() - with self.assertRaises(SyntaxError): - self.test_object._apply_special_handling("__not_version__", 42) - self.assertIn("__version__", self.test_object.remaining_item_map) - - def test_process_noncompliant_version_date(self): - """Detect and allow __date__ for the __version__""" - self.test_object.parse_results["date"] = "1/2/3" - self.test_object._process_noncompliant_version("__date__") - self.assertEqual( - self.test_object.parse_results["version"], - self.test_object.parse_results["date"], - ) - - def test_process_noncompliant_version_float(self): - """Detect and allow floats for the __version__""" - self.test_object._process_noncompliant_version(1.2) - self.assertEqual(self.test_object.parse_results["version"], "1.2") - - def test_process_noncompliant_version_int(self): - """Detect and allow integers for the __version__""" - self.test_object._process_noncompliant_version(42) - self.assertEqual(self.test_object.parse_results["version"], "42") - - def test_detect_illegal_content_prefixed_string(self): - """Detect and raise an error for various kinds of prefixed strings""" - illegal_strings = [ - "f'Some fancy {thing}'", - 'f"Some fancy {thing}"', - "r'Some fancy {thing}'", - 'r"Some fancy {thing}"', - "u'Some fancy {thing}'", - 'u"Some fancy {thing}"', - "fr'Some fancy {thing}'", - 'fr"Some fancy {thing}"', - "rf'Some fancy {thing}'", - 'rf"Some fancy {thing}"', - ] - for test_string in illegal_strings: - with self.subTest(test_string=test_string): - with self.assertRaises(SyntaxError): - MacroParser._detect_illegal_content(test_string) - - def test_detect_illegal_content_not_a_string(self): - """Detect and raise an error for (some) non-strings""" - illegal_strings = [ - "no quotes", - "do_stuff()", - 'print("A function call sporting quotes!")', - "__name__", - "__version__", - "1.2.3", - ] - for test_string in illegal_strings: - with self.subTest(test_string=test_string): - with self.assertRaises(SyntaxError): - MacroParser._detect_illegal_content(test_string) - - def test_detect_illegal_content_no_failure(self): - """Recognize strings of various kinds, plus ints, and floats""" - legal_strings = [ - '"Some legal value in double quotes"', - "'Some legal value in single quotes'", - '"""Some legal value in triple quotes"""', - "__date__", - "42", - "4.2", - ] - for test_string in legal_strings: - with self.subTest(test_string=test_string): - MacroParser._detect_illegal_content(test_string) - - ##################### - # INTEGRATION TESTS # - ##################### - - def test_macro_parser(self): - """INTEGRATION TEST: Given "real" data, ensure the parsing yields the expected results.""" - data_dir = os.path.join(os.path.dirname(__file__), "../data") - macro_file = os.path.join(data_dir, "DoNothing.FCMacro") - with open(macro_file, "r", encoding="utf-8") as f: - code = f.read() - self.test_object.fill_details_from_code(code) - self.assertEqual(len(self.test_object.console.errors), 0) - self.assertEqual(len(self.test_object.console.warnings), 0) - self.assertEqual(self.test_object.parse_results["author"], "Chris Hennes") - self.assertEqual(self.test_object.parse_results["version"], "1.0") - self.assertEqual(self.test_object.parse_results["date"], "2022-02-28") - self.assertEqual( - self.test_object.parse_results["comment"], - "Do absolutely nothing. For Addon Manager integration tests.", - ) - self.assertEqual( - self.test_object.parse_results["url"], "https://github.com/FreeCAD/FreeCAD" - ) - self.assertEqual(self.test_object.parse_results["icon"], "not_real.png") - self.assertListEqual( - self.test_object.parse_results["other_files"], - ["file1.py", "file2.py", "file3.py"], - ) - self.assertNotEqual(self.test_object.parse_results["xpm"], "") diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py b/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py deleted file mode 100644 index 9f6f53cecf..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_metadata.py +++ /dev/null @@ -1,649 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** -import os -import sys -import tempfile -import unittest -import unittest.mock - -Mock = unittest.mock.MagicMock - -sys.path.append("../../") - - -class TestVersion(unittest.TestCase): - def setUp(self) -> None: - if "addonmanager_metadata" in sys.modules: - sys.modules.pop("addonmanager_metadata") - self.packaging_version = None - if "packaging.version" in sys.modules: - self.packaging_version = sys.modules["packaging.version"] - sys.modules.pop("packaging.version") - - def tearDown(self) -> None: - if self.packaging_version is not None: - sys.modules["packaging.version"] = self.packaging_version - - def test_init_from_string_manual(self): - import addonmanager_metadata as amm - - version = amm.Version() - version._parse_string_to_tuple = unittest.mock.MagicMock() - version._init_from_string("1.2.3beta") - self.assertTrue(version._parse_string_to_tuple.called) - - def test_init_from_list_good(self): - """Initialization from a list works for good input""" - import addonmanager_metadata as amm - - test_cases = [ - {"input": (1,), "output": [1, 0, 0, ""]}, - {"input": (1, 2), "output": [1, 2, 0, ""]}, - {"input": (1, 2, 3), "output": [1, 2, 3, ""]}, - {"input": (1, 2, 3, "b1"), "output": [1, 2, 3, "b1"]}, - ] - for test_case in test_cases: - with self.subTest(test_case=test_case): - v = amm.Version(from_list=test_case["input"]) - self.assertListEqual(test_case["output"], v.version_as_list) - - def test_parse_string_to_tuple_normal(self): - """Parsing of complete version string works for normal cases""" - import addonmanager_metadata as amm - - cases = { - "1": [1, 0, 0, ""], - "1.2": [1, 2, 0, ""], - "1.2.3": [1, 2, 3, ""], - "1.2.3beta": [1, 2, 3, "beta"], - "12_345.6_7.8pre-alpha": [12345, 67, 8, "pre-alpha"], - # The above test is mostly to point out that Python gets permits underscore - # characters in a number. - } - for inp, output in cases.items(): - with self.subTest(inp=inp, output=output): - version = amm.Version() - version._parse_string_to_tuple(inp) - self.assertListEqual(version.version_as_list, output) - - def test_parse_string_to_tuple_invalid(self): - """Parsing of invalid version string raises an exception""" - import addonmanager_metadata as amm - - cases = {"One", "1,2,3", "1-2-3", "1/2/3"} - for inp in cases: - with self.subTest(inp=inp): - with self.assertRaises(ValueError): - version = amm.Version() - version._parse_string_to_tuple(inp) - - def test_parse_final_entry_normal(self): - """Parsing of the final entry works for normal cases""" - import addonmanager_metadata as amm - - cases = { - "3beta": (3, "beta"), - "42.alpha": (42, ".alpha"), - "123.45.6": (123, ".45.6"), - "98_delta": (98, "_delta"), - "1 and some words": (1, " and some words"), - } - for inp, output in cases.items(): - with self.subTest(inp=inp, output=output): - number, text = amm.Version._parse_final_entry(inp) - self.assertEqual(number, output[0]) - self.assertEqual(text, output[1]) - - def test_parse_final_entry_invalid(self): - """Invalid input raises an exception""" - import addonmanager_metadata as amm - - cases = ["beta", "", ["a", "b"]] - for case in cases: - with self.subTest(case=case): - with self.assertRaises(ValueError): - amm.Version._parse_final_entry(case) - - def test_operators_internal(self): - """Test internal (non-package) comparison operators""" - sys.modules["packaging.version"] = None - import addonmanager_metadata as amm - - cases = self.given_comparison_cases() - for case in cases: - with self.subTest(case=case): - first = amm.Version(case[0]) - second = amm.Version(case[1]) - self.assertEqual(first < second, case[0] < case[1]) - self.assertEqual(first > second, case[0] > case[1]) - self.assertEqual(first <= second, case[0] <= case[1]) - self.assertEqual(first >= second, case[0] >= case[1]) - self.assertEqual(first == second, case[0] == case[1]) - - @staticmethod - def given_comparison_cases(): - return [ - ("0.0.0alpha", "1.0.0alpha"), - ("0.0.0alpha", "0.1.0alpha"), - ("0.0.0alpha", "0.0.1alpha"), - ("0.0.0alpha", "0.0.0beta"), - ("0.0.0alpha", "0.0.0alpha"), - ("1.0.0alpha", "0.0.0alpha"), - ("0.1.0alpha", "0.0.0alpha"), - ("0.0.1alpha", "0.0.0alpha"), - ("0.0.0beta", "0.0.0alpha"), - ] - - -class TestDependencyType(unittest.TestCase): - """Ensure that the DependencyType dataclass converts to the correct strings""" - - def setUp(self) -> None: - from addonmanager_metadata import DependencyType - - self.DependencyType = DependencyType - - def test_string_conversion_automatic(self): - self.assertEqual(str(self.DependencyType.automatic), "automatic") - - def test_string_conversion_internal(self): - self.assertEqual(str(self.DependencyType.internal), "internal") - - def test_string_conversion_addon(self): - self.assertEqual(str(self.DependencyType.addon), "addon") - - def test_string_conversion_python(self): - self.assertEqual(str(self.DependencyType.python), "python") - - -class TestUrlType(unittest.TestCase): - """Ensure that the UrlType dataclass converts to the correct strings""" - - def setUp(self) -> None: - from addonmanager_metadata import UrlType - - self.UrlType = UrlType - - def test_string_conversion_website(self): - self.assertEqual(str(self.UrlType.website), "website") - - def test_string_conversion_repository(self): - self.assertEqual(str(self.UrlType.repository), "repository") - - def test_string_conversion_bugtracker(self): - self.assertEqual(str(self.UrlType.bugtracker), "bugtracker") - - def test_string_conversion_readme(self): - self.assertEqual(str(self.UrlType.readme), "readme") - - def test_string_conversion_documentation(self): - self.assertEqual(str(self.UrlType.documentation), "documentation") - - def test_string_conversion_discussion(self): - self.assertEqual(str(self.UrlType.discussion), "discussion") - - -class TestMetadataAuxiliaryFunctions(unittest.TestCase): - def test_get_first_supported_freecad_version_simple(self): - from addonmanager_metadata import ( - Metadata, - Version, - get_first_supported_freecad_version, - ) - - expected_result = Version(from_string="0.20.2beta") - metadata = self.given_metadata_with_freecadmin_set(expected_result) - first_version = get_first_supported_freecad_version(metadata) - self.assertEqual(expected_result, first_version) - - @staticmethod - def given_metadata_with_freecadmin_set(min_version): - from addonmanager_metadata import Metadata - - metadata = Metadata() - metadata.freecadmin = min_version - return metadata - - def test_get_first_supported_freecad_version_with_content(self): - from addonmanager_metadata import ( - Metadata, - Version, - get_first_supported_freecad_version, - ) - - expected_result = Version(from_string="0.20.2beta") - metadata = self.given_metadata_with_freecadmin_in_content(expected_result) - first_version = get_first_supported_freecad_version(metadata) - self.assertEqual(expected_result, first_version) - - @staticmethod - def given_metadata_with_freecadmin_in_content(min_version): - from addonmanager_metadata import Metadata, Version - - v_list = min_version.version_as_list - metadata = Metadata() - wb1 = Metadata() - wb1.freecadmin = Version(from_list=[v_list[0] + 1, v_list[1], v_list[2], v_list[3]]) - wb2 = Metadata() - wb2.freecadmin = Version(from_list=[v_list[0], v_list[1] + 1, v_list[2], v_list[3]]) - wb3 = Metadata() - wb3.freecadmin = Version(from_list=[v_list[0], v_list[1], v_list[2] + 1, v_list[3]]) - m1 = Metadata() - m1.freecadmin = min_version - metadata.content = {"workbench": [wb1, wb2, wb3], "macro": [m1]} - return metadata - - -class TestMetadataReader(unittest.TestCase): - """Test reading metadata from XML""" - - def setUp(self) -> None: - if "xml.etree.ElementTree" in sys.modules: - sys.modules.pop("xml.etree.ElementTree") - if "addonmanager_metadata" in sys.modules: - sys.modules.pop("addonmanager_metadata") - - def tearDown(self) -> None: - if "xml.etree.ElementTree" in sys.modules: - sys.modules.pop("xml.etree.ElementTree") - if "addonmanager_metadata" in sys.modules: - sys.modules.pop("addonmanager_metadata") - - def test_from_file(self): - from addonmanager_metadata import MetadataReader - - MetadataReader.from_bytes = Mock() - with tempfile.NamedTemporaryFile(delete=False) as temp: - temp.write(b"Some data") - temp.close() - MetadataReader.from_file(temp.name) - self.assertTrue(MetadataReader.from_bytes.called) - MetadataReader.from_bytes.assert_called_once_with(b"Some data") - os.unlink(temp.name) - - @unittest.skip("Breaks other tests, needs to be fixed") - def test_from_bytes(self): - import xml.etree.ElementTree - - with unittest.mock.patch("xml.etree.ElementTree") as element_tree_mock: - from addonmanager_metadata import MetadataReader - - MetadataReader._process_element_tree = Mock() - MetadataReader.from_bytes(b"Some data") - element_tree_mock.parse.assert_called_once_with(b"Some data") - - def test_process_element_tree(self): - from addonmanager_metadata import MetadataReader - - MetadataReader._determine_namespace = Mock(return_value="") - element_tree_mock = Mock() - MetadataReader._create_node = Mock() - MetadataReader._process_element_tree(element_tree_mock) - MetadataReader._create_node.assert_called_once() - - def test_determine_namespace_found_full(self): - from addonmanager_metadata import MetadataReader - - root = Mock() - root.tag = "{https://wiki.freecad.org/Package_Metadata}package" - found_ns = MetadataReader._determine_namespace(root) - self.assertEqual(found_ns, "{https://wiki.freecad.org/Package_Metadata}") - - def test_determine_namespace_found_empty(self): - from addonmanager_metadata import MetadataReader - - root = Mock() - root.tag = "package" - found_ns = MetadataReader._determine_namespace(root) - self.assertEqual(found_ns, "") - - def test_determine_namespace_not_found(self): - from addonmanager_metadata import MetadataReader - - root = Mock() - root.find = Mock(return_value=False) - with self.assertRaises(RuntimeError): - MetadataReader._determine_namespace(root) - - def test_parse_child_element_simple_strings(self): - from addonmanager_metadata import Metadata, MetadataReader - - tags = ["name", "date", "description", "icon", "classname", "subdirectory"] - for tag in tags: - with self.subTest(tag=tag): - text = f"Test Data for {tag}" - child = self.given_mock_tree_node(tag, text) - mock_metadata = Metadata() - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(mock_metadata.__dict__[tag], text) - - def test_parse_child_element_version(self): - from addonmanager_metadata import Metadata, Version, MetadataReader - - mock_metadata = Metadata() - child = self.given_mock_tree_node("version", "1.2.3") - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(Version("1.2.3"), mock_metadata.version) - - def test_parse_child_element_version_bad(self): - from addonmanager_metadata import Metadata, Version, MetadataReader - - mock_metadata = Metadata() - child = self.given_mock_tree_node("version", "1-2-3") - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(Version("0.0.0"), mock_metadata.version) - - def test_parse_child_element_lists_of_strings(self): - from addonmanager_metadata import Metadata, MetadataReader - - tags = ["file", "tag"] - for tag in tags: - with self.subTest(tag=tag): - mock_metadata = Metadata() - expected_results = [] - for i in range(10): - text = f"Test {i} for {tag}" - expected_results.append(text) - child = self.given_mock_tree_node(tag, text) - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(len(mock_metadata.__dict__[tag]), 10) - self.assertListEqual(mock_metadata.__dict__[tag], expected_results) - - def test_parse_child_element_lists_of_contacts(self): - from addonmanager_metadata import Metadata, Contact, MetadataReader - - tags = ["maintainer", "author"] - for tag in tags: - with self.subTest(tag=tag): - mock_metadata = Metadata() - expected_results = [] - for i in range(10): - text = f"Test {i} for {tag}" - email = f"Email {i} for {tag}" if i % 2 == 0 else None - expected_results.append(Contact(name=text, email=email)) - child = self.given_mock_tree_node(tag, text, {"email": email}) - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(len(mock_metadata.__dict__[tag]), 10) - self.assertListEqual(mock_metadata.__dict__[tag], expected_results) - - def test_parse_child_element_list_of_licenses(self): - from addonmanager_metadata import Metadata, License, MetadataReader - - mock_metadata = Metadata() - expected_results = [] - tag = "license" - for i in range(10): - text = f"Test {i} for {tag}" - file = f"Filename {i} for {tag}" if i % 2 == 0 else None - expected_results.append(License(name=text, file=file)) - child = self.given_mock_tree_node(tag, text, {"file": file}) - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(len(mock_metadata.__dict__[tag]), 10) - self.assertListEqual(mock_metadata.__dict__[tag], expected_results) - - def test_parse_child_element_list_of_urls(self): - from addonmanager_metadata import Metadata, Url, UrlType, MetadataReader - - mock_metadata = Metadata() - expected_results = [] - tag = "url" - for i in range(10): - text = f"Test {i} for {tag}" - url_type = UrlType(i % len(UrlType)) - type = str(url_type) - branch = "" - if type == "repository": - branch = f"Branch {i} for {tag}" - expected_results.append(Url(location=text, type=url_type, branch=branch)) - child = self.given_mock_tree_node(tag, text, {"type": type, "branch": branch}) - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(len(mock_metadata.__dict__[tag]), 10) - self.assertListEqual(mock_metadata.__dict__[tag], expected_results) - - def test_parse_child_element_lists_of_dependencies(self): - from addonmanager_metadata import ( - Metadata, - Dependency, - DependencyType, - MetadataReader, - ) - - tags = ["depend", "conflict", "replace"] - attributes = { - "version_lt": "1.0.0", - "version_lte": "1.0.0", - "version_eq": "1.0.0", - "version_gte": "1.0.0", - "version_gt": "1.0.0", - "condition": "$BuildVersionMajor<1", - "optional": True, - } - - for tag in tags: - for attribute, attr_value in attributes.items(): - with self.subTest(tag=tag, attribute=attribute): - mock_metadata = Metadata() - expected_results = [] - for i in range(10): - text = f"Test {i} for {tag}" - dependency_type = DependencyType(i % len(DependencyType)) - dependency_type_str = str(dependency_type) - expected = Dependency(package=text, dependency_type=dependency_type) - expected.__dict__[attribute] = attr_value - expected_results.append(expected) - child = self.given_mock_tree_node( - tag, - text, - {"type": dependency_type_str, attribute: str(attr_value)}, - ) - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(len(mock_metadata.__dict__[tag]), 10) - self.assertListEqual(mock_metadata.__dict__[tag], expected_results) - - def test_parse_child_element_ignore_unknown_tag(self): - from addonmanager_metadata import Metadata, MetadataReader - - tag = "invalid_tag" - text = "Shouldn't matter" - child = self.given_mock_tree_node(tag, text) - mock_metadata = Metadata() - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertNotIn(tag, mock_metadata.__dict__) - - def test_parse_child_element_versions(self): - from addonmanager_metadata import Metadata, Version, MetadataReader - - tags = ["version", "freecadmin", "freecadmax", "pythonmin"] - for tag in tags: - with self.subTest(tag=tag): - mock_metadata = Metadata() - text = "3.4.5beta" - child = self.given_mock_tree_node(tag, text) - MetadataReader._parse_child_element("", child, mock_metadata) - self.assertEqual(mock_metadata.__dict__[tag], Version(from_string=text)) - - def given_mock_tree_node(self, tag, text, attributes=None): - class MockTreeNode: - def __init__(self): - self.tag = tag - self.text = text - self.attrib = attributes if attributes is not None else [] - - return MockTreeNode() - - def test_parse_content_valid(self): - from addonmanager_metadata import MetadataReader - - valid_content_items = ["workbench", "macro", "preferencepack"] - MetadataReader._create_node = Mock() - for content_type in valid_content_items: - with self.subTest(content_type=content_type): - tree_mock = [self.given_mock_tree_node(content_type, None)] - metadata_mock = Mock() - MetadataReader._parse_content("", metadata_mock, tree_mock) - MetadataReader._create_node.assert_called_once() - MetadataReader._create_node.reset_mock() - - def test_parse_content_invalid(self): - from addonmanager_metadata import MetadataReader - - MetadataReader._create_node = Mock() - content_item = "no_such_content_type" - tree_mock = [self.given_mock_tree_node(content_item, None)] - metadata_mock = Mock() - MetadataReader._parse_content("", metadata_mock, tree_mock) - MetadataReader._create_node.assert_not_called() - - -class TestMetadataReaderIntegration(unittest.TestCase): - """Full-up tests of the MetadataReader class (no mocking).""" - - def setUp(self) -> None: - self.test_data_dir = os.path.join(os.path.dirname(__file__), "..", "data") - remove_list = [] - for key in sys.modules: - if "addonmanager_metadata" in key: - remove_list.append(key) - for key in remove_list: - print(f"Removing {key}") - sys.modules.pop(key) - - def test_loading_simple_metadata_file(self): - from addonmanager_metadata import ( - Contact, - Dependency, - License, - MetadataReader, - Url, - UrlType, - Version, - ) - - filename = os.path.join(self.test_data_dir, "good_package.xml") - metadata = MetadataReader.from_file(filename) - self.assertEqual("Test Workbench", metadata.name) - self.assertEqual("A package.xml file for unit testing.", metadata.description) - self.assertEqual(Version("1.0.1"), metadata.version) - self.assertEqual("2022-01-07", metadata.date) - self.assertEqual("Resources/icons/PackageIcon.svg", metadata.icon) - self.assertListEqual([License(name="LGPL-2.1", file="LICENSE")], metadata.license) - self.assertListEqual( - [Contact(name="FreeCAD Developer", email="developer@freecad.org")], - metadata.maintainer, - ) - self.assertListEqual( - [ - Url( - location="https://github.com/chennes/FreeCAD-Package", - type=UrlType.repository, - branch="main", - ), - Url( - location="https://github.com/chennes/FreeCAD-Package/blob/main/README.md", - type=UrlType.readme, - ), - ], - metadata.url, - ) - self.assertListEqual(["Tag0", "Tag1"], metadata.tag) - self.assertIn("workbench", metadata.content) - self.assertEqual(len(metadata.content["workbench"]), 1) - wb_metadata = metadata.content["workbench"][0] - self.assertEqual("MyWorkbench", wb_metadata.classname) - self.assertEqual("./", wb_metadata.subdirectory) - self.assertListEqual(["TagA", "TagB", "TagC"], wb_metadata.tag) - - def test_multiple_workbenches(self): - from addonmanager_metadata import MetadataReader - - filename = os.path.join(self.test_data_dir, "workbench_only.xml") - metadata = MetadataReader.from_file(filename) - self.assertIn("workbench", metadata.content) - self.assertEqual(len(metadata.content["workbench"]), 3) - expected_wb_classnames = [ - "MyFirstWorkbench", - "MySecondWorkbench", - "MyThirdWorkbench", - ] - for wb in metadata.content["workbench"]: - self.assertIn(wb.classname, expected_wb_classnames) - expected_wb_classnames.remove(wb.classname) - self.assertEqual(len(expected_wb_classnames), 0) - - def test_multiple_macros(self): - from addonmanager_metadata import MetadataReader - - filename = os.path.join(self.test_data_dir, "macro_only.xml") - metadata = MetadataReader.from_file(filename) - self.assertIn("macro", metadata.content) - self.assertEqual(len(metadata.content["macro"]), 2) - expected_wb_files = ["MyMacro.FCStd", "MyOtherMacro.FCStd"] - for wb in metadata.content["macro"]: - self.assertIn(wb.file[0], expected_wb_files) - expected_wb_files.remove(wb.file[0]) - self.assertEqual(len(expected_wb_files), 0) - - def test_multiple_preference_packs(self): - from addonmanager_metadata import MetadataReader - - filename = os.path.join(self.test_data_dir, "prefpack_only.xml") - metadata = MetadataReader.from_file(filename) - self.assertIn("preferencepack", metadata.content) - self.assertEqual(len(metadata.content["preferencepack"]), 3) - expected_packs = ["MyFirstPack", "MySecondPack", "MyThirdPack"] - for wb in metadata.content["preferencepack"]: - self.assertIn(wb.name, expected_packs) - expected_packs.remove(wb.name) - self.assertEqual(len(expected_packs), 0) - - def test_bundle(self): - from addonmanager_metadata import MetadataReader - - filename = os.path.join(self.test_data_dir, "bundle_only.xml") - metadata = MetadataReader.from_file(filename) - self.assertIn("bundle", metadata.content) - self.assertEqual(len(metadata.content["bundle"]), 1) - - def test_other(self): - from addonmanager_metadata import MetadataReader - - filename = os.path.join(self.test_data_dir, "other_only.xml") - metadata = MetadataReader.from_file(filename) - self.assertIn("other", metadata.content) - self.assertEqual(len(metadata.content["other"]), 1) - - def test_content_combination(self): - from addonmanager_metadata import MetadataReader - - filename = os.path.join(self.test_data_dir, "combination.xml") - metadata = MetadataReader.from_file(filename) - self.assertIn("preferencepack", metadata.content) - self.assertEqual(len(metadata.content["preferencepack"]), 1) - self.assertIn("macro", metadata.content) - self.assertEqual(len(metadata.content["macro"]), 1) - self.assertIn("workbench", metadata.content) - self.assertEqual(len(metadata.content["workbench"]), 1) - - -if __name__ == "__main__": - unittest.main() diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_uninstaller.py b/src/Mod/AddonManager/AddonManagerTest/app/test_uninstaller.py deleted file mode 100644 index 8c82c28421..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_uninstaller.py +++ /dev/null @@ -1,437 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains the unit test class for addonmanager_uninstaller.py non-GUI functionality.""" - -import functools -import os -from stat import S_IREAD, S_IRGRP, S_IROTH, S_IWUSR -import tempfile -import unittest - -import FreeCAD - -from addonmanager_uninstaller import AddonUninstaller, MacroUninstaller - -from Addon import Addon -from AddonManagerTest.app.mocks import MockAddon, MockMacro - - -class TestAddonUninstaller(unittest.TestCase): - """Test class for addonmanager_uninstaller.py non-GUI functionality""" - - MODULE = "test_uninstaller" # file name without extension - - def setUp(self): - """Initialize data needed for all tests""" - self.test_data_dir = os.path.join( - FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data" - ) - self.mock_addon = MockAddon() - self.signals_caught = [] - self.test_object = AddonUninstaller(self.mock_addon) - - self.test_object.finished.connect(functools.partial(self.catch_signal, "finished")) - self.test_object.success.connect(functools.partial(self.catch_signal, "success")) - self.test_object.failure.connect(functools.partial(self.catch_signal, "failure")) - - def tearDown(self): - """Finalize the test.""" - - def catch_signal(self, signal_name, *_): - """Internal use: used to catch and log any emitted signals. Not called directly.""" - self.signals_caught.append(signal_name) - - def setup_dummy_installation(self, temp_dir) -> str: - """Set up a dummy Addon in temp_dir""" - toplevel_path = os.path.join(temp_dir, self.mock_addon.name) - os.makedirs(toplevel_path) - with open(os.path.join(toplevel_path, "README.md"), "w") as f: - f.write("## Mock Addon ##\n\nFile created by the unit test code.") - self.test_object.installation_path = temp_dir - return toplevel_path - - def create_fake_macro(self, macro_directory, fake_macro_name, digest): - """Create an FCMacro file and matching digest entry for later removal""" - os.makedirs(macro_directory, exist_ok=True) - fake_file_installed = os.path.join(macro_directory, fake_macro_name) - with open(digest, "a", encoding="utf-8") as f: - f.write("# The following files were created outside this installation:\n") - f.write(fake_file_installed + "\n") - with open(fake_file_installed, "w", encoding="utf-8") as f: - f.write("# Fake macro data for unit testing") - - def test_uninstall_normal(self): - """Test the integrated uninstall function under normal circumstances""" - - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - self.test_object.run() - self.assertTrue(os.path.exists(temp_dir)) - self.assertFalse(os.path.exists(toplevel_path)) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_uninstall_no_name(self): - """Test the integrated uninstall function for an addon without a name""" - - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - self.mock_addon.name = None - result = self.test_object.run() - self.assertTrue(os.path.exists(temp_dir)) - self.assertIn("failure", self.signals_caught) - self.assertNotIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_uninstall_dangerous_name(self): - """Test the integrated uninstall function for an addon with a dangerous name""" - - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - self.mock_addon.name = "./" - result = self.test_object.run() - self.assertTrue(os.path.exists(temp_dir)) - self.assertIn("failure", self.signals_caught) - self.assertNotIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_uninstall_unmatching_name(self): - """Test the integrated uninstall function for an addon with a name that isn't installed""" - - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - self.mock_addon.name += "Nonexistent" - result = self.test_object.run() - self.assertTrue(os.path.exists(temp_dir)) - self.assertIn("failure", self.signals_caught) - self.assertNotIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_uninstall_addon_with_macros(self): - """Tests that the uninstaller removes the macro files""" - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - macro_directory = os.path.join(temp_dir, "Macros") - self.create_fake_macro( - macro_directory, - "FakeMacro.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - result = self.test_object.run() - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - self.assertFalse(os.path.exists(os.path.join(macro_directory, "FakeMacro.FCMacro"))) - self.assertTrue(os.path.exists(macro_directory)) - - def test_uninstall_calls_script(self): - """Tests that the main uninstaller run function calls the uninstall.py script""" - - class Interceptor: - def __init__(self): - self.called = False - self.args = [] - - def func(self, *args): - self.called = True - self.args = args - - interceptor = Interceptor() - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - self.test_object.run_uninstall_script = interceptor.func - result = self.test_object.run() - self.assertTrue(interceptor.called, "Failed to call uninstall script") - - def test_remove_extra_files_no_digest(self): - """Tests that a lack of digest file is not an error, and nothing gets removed""" - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.remove_extra_files(temp_dir) # Shouldn't throw - self.assertTrue(os.path.exists(temp_dir)) - - def test_remove_extra_files_empty_digest(self): - """Test that an empty digest file is not an error, and nothing gets removed""" - with tempfile.TemporaryDirectory() as temp_dir: - with open("AM_INSTALLATION_DIGEST.txt", "w", encoding="utf-8") as f: - f.write("") - self.test_object.remove_extra_files(temp_dir) # Shouldn't throw - self.assertTrue(os.path.exists(temp_dir)) - - def test_remove_extra_files_comment_only_digest(self): - """Test that a digest file that contains only comment lines is not an error, and nothing - gets removed""" - with tempfile.TemporaryDirectory() as temp_dir: - with open("AM_INSTALLATION_DIGEST.txt", "w", encoding="utf-8") as f: - f.write("# Fake digest file for unit testing") - self.test_object.remove_extra_files(temp_dir) # Shouldn't throw - self.assertTrue(os.path.exists(temp_dir)) - - def test_remove_extra_files_repeated_files(self): - """Test that a digest with the same file repeated removes it once, but doesn't error on - later requests to remove it.""" - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - macro_directory = os.path.join(temp_dir, "Macros") - self.create_fake_macro( - macro_directory, - "FakeMacro.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - self.create_fake_macro( - macro_directory, - "FakeMacro.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - self.create_fake_macro( - macro_directory, - "FakeMacro.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - self.test_object.remove_extra_files(toplevel_path) # Shouldn't throw - self.assertFalse(os.path.exists(os.path.join(macro_directory, "FakeMacro.FCMacro"))) - - def test_remove_extra_files_normal_case(self): - """Test that a digest that is a "normal" case removes the requested files""" - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - macro_directory = os.path.join(temp_dir, "Macros") - self.create_fake_macro( - macro_directory, - "FakeMacro1.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - self.create_fake_macro( - macro_directory, - "FakeMacro2.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - self.create_fake_macro( - macro_directory, - "FakeMacro3.FCMacro", - os.path.join(toplevel_path, "AM_INSTALLATION_DIGEST.txt"), - ) - - # Make sure the setup worked as expected, otherwise the test is meaningless - self.assertTrue(os.path.exists(os.path.join(macro_directory, "FakeMacro1.FCMacro"))) - self.assertTrue(os.path.exists(os.path.join(macro_directory, "FakeMacro2.FCMacro"))) - self.assertTrue(os.path.exists(os.path.join(macro_directory, "FakeMacro3.FCMacro"))) - - self.test_object.remove_extra_files(toplevel_path) # Shouldn't throw - - self.assertFalse(os.path.exists(os.path.join(macro_directory, "FakeMacro1.FCMacro"))) - self.assertFalse(os.path.exists(os.path.join(macro_directory, "FakeMacro2.FCMacro"))) - self.assertFalse(os.path.exists(os.path.join(macro_directory, "FakeMacro3.FCMacro"))) - - def test_runs_uninstaller_script_successful(self): - """Tests that the uninstall.py script is called""" - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - with open(os.path.join(toplevel_path, "uninstall.py"), "w", encoding="utf-8") as f: - double_escaped = temp_dir.replace("\\", "\\\\") - f.write( - f"""# Mock uninstaller script -import os -path = '{double_escaped}' -with open(os.path.join(path,"RAN_UNINSTALLER.txt"),"w",encoding="utf-8") as f: - f.write("File created by uninstall.py from unit tests") -""" - ) - self.test_object.run_uninstall_script(toplevel_path) # The exception does not leak out - self.assertTrue(os.path.exists(os.path.join(temp_dir, "RAN_UNINSTALLER.txt"))) - - def test_runs_uninstaller_script_failure(self): - """Tests that exceptions in the uninstall.py script do not leak out""" - with tempfile.TemporaryDirectory() as temp_dir: - toplevel_path = self.setup_dummy_installation(temp_dir) - with open(os.path.join(toplevel_path, "uninstall.py"), "w", encoding="utf-8") as f: - f.write( - f"""# Mock uninstaller script -raise RuntimeError("Fake exception for unit testing") -""" - ) - self.test_object.run_uninstall_script(toplevel_path) # The exception does not leak out - - -class TestMacroUninstaller(unittest.TestCase): - """Test class for addonmanager_uninstaller.py non-GUI functionality""" - - MODULE = "test_uninstaller" # file name without extension - - def setUp(self): - self.mock_addon = MockAddon() - self.mock_addon.macro = MockMacro() - self.test_object = MacroUninstaller(self.mock_addon) - self.signals_caught = [] - - self.test_object.finished.connect(functools.partial(self.catch_signal, "finished")) - self.test_object.success.connect(functools.partial(self.catch_signal, "success")) - self.test_object.failure.connect(functools.partial(self.catch_signal, "failure")) - - def tearDown(self): - pass - - def catch_signal(self, signal_name, *_): - """Internal use: used to catch and log any emitted signals. Not called directly.""" - self.signals_caught.append(signal_name) - - def test_remove_simple_macro(self): - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.installation_location = temp_dir - self.mock_addon.macro.install(temp_dir) - # Make sure the setup worked, otherwise the test is meaningless - self.assertTrue(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.test_object.run() - self.assertFalse(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_remove_macro_with_icon(self): - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.installation_location = temp_dir - self.mock_addon.macro.icon = "mock_icon_test.svg" - self.mock_addon.macro.install(temp_dir) - # Make sure the setup worked, otherwise the test is meaningless - self.assertTrue(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.assertTrue(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.icon))) - self.test_object.run() - self.assertFalse(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.assertFalse(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.icon))) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_remove_macro_with_xpm_data(self): - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.installation_location = temp_dir - self.mock_addon.macro.xpm = "/*Fake XPM data*/" - self.mock_addon.macro.install(temp_dir) - # Make sure the setup worked, otherwise the test is meaningless - self.assertTrue(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.assertTrue(os.path.exists(os.path.join(temp_dir, "MockMacro_icon.xpm"))) - self.test_object.run() - self.assertFalse(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.assertFalse(os.path.exists(os.path.join(temp_dir, "MockMacro_icon.xpm"))) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_remove_macro_with_files(self): - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.installation_location = temp_dir - self.mock_addon.macro.other_files = [ - "test_file_1.txt", - "test_file_2.FCMacro", - "subdir/test_file_3.txt", - ] - self.mock_addon.macro.install(temp_dir) - # Make sure the setup worked, otherwise the test is meaningless - for f in self.mock_addon.macro.other_files: - self.assertTrue( - os.path.exists(os.path.join(temp_dir, f)), - f"Expected {f} to exist, and it does not", - ) - self.test_object.run() - for f in self.mock_addon.macro.other_files: - self.assertFalse( - os.path.exists(os.path.join(temp_dir, f)), - f"Expected {f} to be removed, and it was not", - ) - self.assertFalse( - os.path.exists(os.path.join(temp_dir, "subdir")), - "Failed to remove empty subdirectory", - ) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_remove_nonexistent_macro(self): - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.installation_location = temp_dir - # Don't run the installer: - - self.assertFalse(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.test_object.run() # Should not raise an exception - self.assertFalse(os.path.exists(os.path.join(temp_dir, self.mock_addon.macro.filename))) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("success", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_remove_write_protected_macro(self): - with tempfile.TemporaryDirectory() as temp_dir: - self.test_object.installation_location = temp_dir - self.mock_addon.macro.install(temp_dir) - # Make sure the setup worked, otherwise the test is meaningless - f = os.path.join(temp_dir, self.mock_addon.macro.filename) - self.assertTrue(os.path.exists(f)) - os.chmod(f, S_IREAD | S_IRGRP | S_IROTH) - self.test_object.run() - - if os.path.exists(f): - os.chmod(f, S_IWUSR | S_IREAD) - self.assertNotIn("success", self.signals_caught) - self.assertIn("failure", self.signals_caught) - else: - # In some cases we managed to delete it anyway: - self.assertIn("success", self.signals_caught) - self.assertNotIn("failure", self.signals_caught) - self.assertIn("finished", self.signals_caught) - - def test_cleanup_directories_multiple_empty(self): - with tempfile.TemporaryDirectory() as temp_dir: - empty_directories = set(["empty1", "empty2", "empty3"]) - full_paths = set() - for directory in empty_directories: - full_path = os.path.join(temp_dir, directory) - os.mkdir(full_path) - full_paths.add(full_path) - - for directory in full_paths: - self.assertTrue(directory, "Test code failed to create {directory}") - self.test_object._cleanup_directories(full_paths) - for directory in full_paths: - self.assertFalse(os.path.exists(directory)) - - def test_cleanup_directories_none(self): - with tempfile.TemporaryDirectory() as temp_dir: - full_paths = set() - self.test_object._cleanup_directories(full_paths) # Shouldn't throw - - def test_cleanup_directories_not_empty(self): - with tempfile.TemporaryDirectory() as temp_dir: - empty_directories = set(["empty1", "empty2", "empty3"]) - full_paths = set() - for directory in empty_directories: - full_path = os.path.join(temp_dir, directory) - os.mkdir(full_path) - full_paths.add(full_path) - with open(os.path.join(full_path, "test.txt"), "w", encoding="utf-8") as f: - f.write("Unit test dummy data\n") - - for directory in full_paths: - self.assertTrue(directory, "Test code failed to create {directory}") - self.test_object._cleanup_directories(full_paths) - for directory in full_paths: - self.assertTrue(os.path.exists(directory)) diff --git a/src/Mod/AddonManager/AddonManagerTest/app/test_utilities.py b/src/Mod/AddonManager/AddonManagerTest/app/test_utilities.py deleted file mode 100644 index 66035acc74..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/app/test_utilities.py +++ /dev/null @@ -1,287 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -from datetime import datetime -import unittest -from unittest.mock import MagicMock, patch, mock_open -import os -import sys -import subprocess - -try: - import FreeCAD -except ImportError: - FreeCAD = None - -sys.path.append("../..") - -from AddonManagerTest.app.mocks import MockAddon as Addon - -from addonmanager_utilities import ( - get_assigned_string_literal, - get_macro_version_from_file, - get_readme_url, - process_date_string_to_python_datetime, - recognized_git_location, - run_interruptable_subprocess, -) - - -class TestUtilities(unittest.TestCase): - - MODULE = "test_utilities" # file name without extension - - @classmethod - def tearDownClass(cls): - try: - os.remove("AM_INSTALLATION_DIGEST.txt") - except FileNotFoundError: - pass - - def test_recognized_git_location(self): - recognized_urls = [ - "https://github.com/FreeCAD/FreeCAD", - "https://gitlab.com/freecad/FreeCAD", - "https://framagit.org/freecad/FreeCAD", - "https://salsa.debian.org/science-team/freecad", - ] - for url in recognized_urls: - repo = Addon("Test Repo", url, "Addon.Status.NOT_INSTALLED", "branch") - self.assertTrue(recognized_git_location(repo), f"{url} was unexpectedly not recognized") - - unrecognized_urls = [ - "https://google.com", - "https://freecad.org", - "https://not.quite.github.com/FreeCAD/FreeCAD", - "https://github.com.malware.com/", - ] - for url in unrecognized_urls: - repo = Addon("Test Repo", url, "Addon.Status.NOT_INSTALLED", "branch") - self.assertFalse(recognized_git_location(repo), f"{url} was unexpectedly recognized") - - def test_get_readme_url(self): - github_urls = [ - "https://github.com/FreeCAD/FreeCAD", - ] - gitlab_urls = [ - "https://gitlab.com/freecad/FreeCAD", - "https://framagit.org/freecad/FreeCAD", - "https://salsa.debian.org/science-team/freecad", - "https://unknown.location/and/path", - ] - - # GitHub and Gitlab have two different schemes for file URLs: unrecognized URLs are - # presumed to be local instances of a GitLab server. Note that in neither case does this - # take into account the redirects that are used to actually fetch the data. - - for url in github_urls: - branch = "branchname" - expected_result = f"{url}/raw/{branch}/README.md" - repo = Addon("Test Repo", url, "Addon.Status.NOT_INSTALLED", branch) - actual_result = get_readme_url(repo) - self.assertEqual(actual_result, expected_result) - - for url in gitlab_urls: - branch = "branchname" - expected_result = f"{url}/-/raw/{branch}/README.md" - repo = Addon("Test Repo", url, "Addon.Status.NOT_INSTALLED", branch) - actual_result = get_readme_url(repo) - self.assertEqual(actual_result, expected_result) - - def test_get_assigned_string_literal(self): - good_lines = [ - ["my_var = 'Single-quoted literal'", "Single-quoted literal"], - ['my_var = "Double-quoted literal"', "Double-quoted literal"], - ["my_var = \t 'Extra whitespace'", "Extra whitespace"], - ["my_var = 42", "42"], - ["my_var = 1.23", "1.23"], - ] - for line in good_lines: - result = get_assigned_string_literal(line[0]) - self.assertEqual(result, line[1]) - - bad_lines = [ - "my_var = __date__", - "my_var 'No equals sign'", - "my_var = 'Unmatched quotes\"", - "my_var = No quotes at all", - "my_var = 1.2.3", - ] - for line in bad_lines: - result = get_assigned_string_literal(line) - self.assertIsNone(result) - - def test_get_macro_version_from_file_good_metadata(self): - good_metadata = """__Version__ = "1.2.3" """ - with patch("builtins.open", new_callable=mock_open, read_data=good_metadata): - version = get_macro_version_from_file("mocked_file.FCStd") - self.assertEqual(version, "1.2.3") - - def test_get_macro_version_from_file_missing_quotes(self): - bad_metadata = """__Version__ = 1.2.3 """ # No quotes - with patch("builtins.open", new_callable=mock_open, read_data=bad_metadata): - version = get_macro_version_from_file("mocked_file.FCStd") - self.assertEqual(version, "", "Bad version did not yield empty string") - - def test_get_macro_version_from_file_no_version(self): - good_metadata = "" - with patch("builtins.open", new_callable=mock_open, read_data=good_metadata): - version = get_macro_version_from_file("mocked_file.FCStd") - self.assertEqual(version, "", "Missing version did not yield empty string") - - @patch("subprocess.Popen") - def test_run_interruptable_subprocess_success_instant_return(self, mock_popen): - mock_process = MagicMock() - mock_process.communicate.return_value = ("Mocked stdout", "Mocked stderr") - mock_process.returncode = 0 - mock_popen.return_value = mock_process - - completed_process = run_interruptable_subprocess(["arg0", "arg1"]) - - self.assertEqual(completed_process.returncode, 0) - self.assertEqual(completed_process.stdout, "Mocked stdout") - self.assertEqual(completed_process.stderr, "Mocked stderr") - - @patch("subprocess.Popen") - def test_run_interruptable_subprocess_returns_nonzero(self, mock_popen): - mock_process = MagicMock() - mock_process.communicate.return_value = ("Mocked stdout", "Mocked stderr") - mock_process.returncode = 1 - mock_popen.return_value = mock_process - - with self.assertRaises(subprocess.CalledProcessError): - run_interruptable_subprocess(["arg0", "arg1"]) - - @patch("subprocess.Popen") - def test_run_interruptable_subprocess_timeout_five_times(self, mock_popen): - """Five times is below the limit for an error to be raised""" - - def raises_first_five_times(timeout): - raises_first_five_times.counter += 1 - if raises_first_five_times.counter <= 5: - raise subprocess.TimeoutExpired("Test", timeout) - return "Mocked stdout", None - - raises_first_five_times.counter = 0 - - mock_process = MagicMock() - mock_process.communicate = raises_first_five_times - mock_process.returncode = 0 - mock_popen.return_value = mock_process - - result = run_interruptable_subprocess(["arg0", "arg1"], 10) - - self.assertEqual(result.returncode, 0) - - @patch("subprocess.Popen") - def test_run_interruptable_subprocess_timeout_exceeded(self, mock_popen): - """Exceeding the set timeout gives a CalledProcessError exception""" - - def raises_one_time(timeout=0): - if not raises_one_time.raised: - raises_one_time.raised = True - raise subprocess.TimeoutExpired("Test", timeout) - return "Mocked stdout", None - - raises_one_time.raised = False - - def fake_time(): - """Time that advances by one second every time it is called""" - fake_time.time += 1.0 - return fake_time.time - - fake_time.time = 0.0 - - mock_process = MagicMock() - mock_process.communicate = raises_one_time - raises_one_time.mock_access = mock_process - mock_process.returncode = None - mock_popen.return_value = mock_process - - with self.assertRaises(subprocess.CalledProcessError): - with patch("time.time", fake_time): - run_interruptable_subprocess(["arg0", "arg1"], 0.1) - - def test_process_date_string_to_python_datetime_non_numeric(self): - with self.assertRaises(ValueError): - process_date_string_to_python_datetime("TwentyTwentyFour-January-ThirtyFirst") - - def test_process_date_string_to_python_datetime_year_first(self): - result = process_date_string_to_python_datetime("2024-01-31") - expected_result = datetime(2024, 1, 31, 0, 0) - self.assertEqual(result, expected_result) - - def test_process_date_string_to_python_datetime_day_first(self): - result = process_date_string_to_python_datetime("31-01-2024") - expected_result = datetime(2024, 1, 31, 0, 0) - self.assertEqual(result, expected_result) - - def test_process_date_string_to_python_datetime_month_first(self): - result = process_date_string_to_python_datetime("01-31-2024") - expected_result = datetime(2024, 1, 31, 0, 0) - self.assertEqual(result, expected_result) - - def test_process_date_string_to_python_datetime_ambiguous(self): - """In the ambiguous case, the code should assume that the date is in the DD-MM-YYYY format.""" - result = process_date_string_to_python_datetime("01-12-2024") - expected_result = datetime(2024, 12, 1, 0, 0) - self.assertEqual(result, expected_result) - - def test_process_date_string_to_python_datetime_invalid_date(self): - with self.assertRaises(ValueError): - process_date_string_to_python_datetime("13-31-2024") - - def test_process_date_string_to_python_datetime_too_many_components(self): - with self.assertRaises(ValueError): - process_date_string_to_python_datetime("01-01-31-2024") - - def test_process_date_string_to_python_datetime_too_few_components(self): - """Month-Year-only dates are not supported""" - with self.assertRaises(ValueError): - process_date_string_to_python_datetime("01-2024") - - def test_process_date_string_to_python_datetime_unrecognizable(self): - """Two-digit years are not supported""" - with self.assertRaises(ValueError): - process_date_string_to_python_datetime("01-02-24") - - def test_process_date_string_to_python_datetime_valid_separators(self): - """Four individual separators are supported, plus any combination of multiple of those separators""" - valid_separators = [" ", ".", "/", "-", " - ", " / ", "--"] - for separator in valid_separators: - with self.subTest(separator=separator): - result = process_date_string_to_python_datetime(f"2024{separator}01{separator}31") - expected_result = datetime(2024, 1, 31, 0, 0) - self.assertEqual(result, expected_result) - - def test_process_date_string_to_python_datetime_invalid_separators(self): - """Only the four separators [ ./-] are supported: ensure others fail""" - invalid_separators = ["a", "\\", "|", "'", ";", "*", " \\ "] - for separator in invalid_separators: - with self.subTest(separator=separator): - with self.assertRaises(ValueError): - process_date_string_to_python_datetime(f"2024{separator}01{separator}31") - - -if __name__ == "__main__": - unittest.main() diff --git a/src/Mod/AddonManager/AddonManagerTest/data/DoNothing.FCMacro b/src/Mod/AddonManager/AddonManagerTest/data/DoNothing.FCMacro deleted file mode 100644 index b20265d396..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/DoNothing.FCMacro +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- - -__Title__ = 'Do Nothing' -__Author__ = 'Chris Hennes' -__Version__ = '1.0' -__Date__ = '2022-02-28' -__Comment__ = 'Do absolutely nothing. For Addon Manager integration tests.' -__Web__ = 'https://github.com/FreeCAD/FreeCAD' -__Wiki__ = '' -__Icon__ = 'not_real.png' -__Help__ = 'Not much to help with' -__Status__ = 'Very Stable' -__Requires__ = '' -__Communication__ = 'Shout into the void' -__Files__ = 'file1.py, file2.py, file3.py' -__Xpm__ = """/* XPM */ -static char * blarg_xpm[] = { -"16 7 2 1", -"* c #000000", -". c #ffffff", -"**..*...........", -"*.*.*...........", -"**..*..**.**..**", -"*.*.*.*.*.*..*.*", -"**..*..**.*...**", -"...............*", -".............**." -};""" - -print("Well, not quite *nothing*... it does print this line out.") diff --git a/src/Mod/AddonManager/AddonManagerTest/data/MacrosRecipesWikiPage.zip b/src/Mod/AddonManager/AddonManagerTest/data/MacrosRecipesWikiPage.zip deleted file mode 100644 index bbd3053954..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/MacrosRecipesWikiPage.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/TestWorkbench.zip b/src/Mod/AddonManager/AddonManagerTest/data/TestWorkbench.zip deleted file mode 100644 index 187c9b6c34..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/TestWorkbench.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/__init__.py b/src/Mod/AddonManager/AddonManagerTest/data/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/Mod/AddonManager/AddonManagerTest/data/addon_update_stats.json b/src/Mod/AddonManager/AddonManagerTest/data/addon_update_stats.json deleted file mode 100644 index f9f5206b30..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/addon_update_stats.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "3DfindIT": { - "refs/remotes/origin/HEAD": [ - "2022-09-08T13:58:17+02:00", - "dc99f8f1bdb17c1e55c00ac0dffa3ec15caf5b9d" - ], - "refs/remotes/origin/master": [ - "2022-09-08T13:58:17+02:00", - "dc99f8f1bdb17c1e55c00ac0dffa3ec15caf5b9d" - ], - "refs/tags/v1.0": [ - "2020-11-09T10:11:44+01:00", - "e97b6caf5eaed0b709dfeabecedac14c9bc2cc2b" - ], - "refs/tags/v1.1": [ - "2021-06-21T13:33:58+02:00", - "b9ab38ae93fcb8c1f69516ea563494bca63ebf49" - ], - "refs/tags/v1.2": [ - "2021-08-31T07:42:11+02:00", - "d8553961a43dd450681f6df6e8ce5bce72da1b0a" - ] - }, - "3D_Printing_Tools": { - "refs/remotes/origin/HEAD": [ - "2019-06-30T23:01:34+01:00", - "e7ea9cd05dc11d5503115522b87cac7704eafc0e" - ], - "refs/remotes/origin/master": [ - "2019-06-30T23:01:34+01:00", - "e7ea9cd05dc11d5503115522b87cac7704eafc0e" - ] - }, - "A2plus": { - "refs/remotes/origin/HEAD": [ - "2022-10-02T22:20:41+02:00", - "3392d72ded45918ea28cd46ed4de778571488639" - ], - "refs/remotes/origin/devel": [ - "2022-01-27T19:10:27+01:00", - "dcc6193f36d4c7c8c43c4f3384e2bc03d27debd3" - ], - "refs/remotes/origin/master": [ - "2022-10-02T22:20:41+02:00", - "3392d72ded45918ea28cd46ed4de778571488639" - ], - "refs/tags/V0.1.4.1": [ - "2018-10-28T16:38:46+01:00", - "6f6ff0a892efca602ec916faac11b041be792fe2" - ], - "refs/tags/V0.1.5": [ - "2018-11-01T19:03:15+01:00", - "db6cdde71d4a2e9a53f2b14694e2ba2b42ac58c0" - ], - "refs/tags/V0.1.6": [ - "2018-11-11T16:04:51+01:00", - "46d4039c1fd08b3e5604d4fad3e955bca5855338" - ], - "refs/tags/V0.4.6": [ - "2019-03-19T15:19:32+01:00", - "42d5ed3846f24c7a7f0f6db655513e9038c3f651" - ] - }, - "AirPlaneDesign": { - "refs/remotes/origin/HEAD": [ - "2022-07-03T19:21:44+02:00", - "34a5c5a827a378d4b6c9c16c54a1f2238b8e3b6b" - ], - "refs/remotes/origin/dev-v0.4": [ - "2021-01-23T16:15:58+01:00", - "f21bb8fca55b7d34fe920f0b823a7722ff977e43" - ], - "refs/remotes/origin/dev-v03bis": [ - "2021-08-03T18:28:22+02:00", - "5e2b4ebafaaed6ca87b99f480ae2fecd3722a83b" - ], - "refs/remotes/origin/master": [ - "2022-07-03T19:21:44+02:00", - "34a5c5a827a378d4b6c9c16c54a1f2238b8e3b6b" - ], - "refs/remotes/origin/refactoring": [ - "2021-10-18T18:41:10+02:00", - "2f22aa7faa049b0e8ec7dd43a39554b597c7e772" - ], - "refs/tags/V0.1": [ - "2018-08-18T20:27:30+02:00", - "c5bf85c552b31c0abdca7cadf428099c0b38e97e" - ], - "refs/tags/V0.2": [ - "2019-07-30T08:36:55+02:00", - "39a7c90ac53148c3317d50e07584c96f54db549e" - ], - "refs/tags/V0.3": [ - "2019-10-25T08:44:43+02:00", - "8e11fb6a5c33479570e0f572e6319f220e3cf6fd" - ] - }, - "Curves": { - "refs/remotes/origin/HEAD": [ - "2022-10-06T19:18:14+02:00", - "b43970d71ccfed6a85d6e547993863520db9920c" - ], - "refs/remotes/origin/blendcurve": [ - "2020-02-26T18:55:13+01:00", - "41dff49edfadc7b3085d4afff3c32b598fcd3ed0" - ], - "refs/remotes/origin/blending": [ - "2022-06-24T17:52:22+02:00", - "687b38faad85187e486fe68ccf072adb7d06be11" - ], - "refs/remotes/origin/decimate_edges": [ - "2021-05-18T18:40:44+02:00", - "b299597f3817cfb29fd45a8c5710706ae01261fe" - ], - "refs/remotes/origin/facemap": [ - "2021-12-21T19:06:20+01:00", - "7f315ab0e72d61fb6d04a2da631c66f8f3a30c82" - ], - "refs/remotes/origin/flatten": [ - "2022-05-09T15:18:05+02:00", - "436b135ff1c2d93686911c2e81ef4fa379e5b001" - ], - "refs/remotes/origin/master": [ - "2022-10-06T19:18:14+02:00", - "b43970d71ccfed6a85d6e547993863520db9920c" - ], - "refs/remotes/origin/reflect2": [ - "2021-04-10T13:42:07+02:00", - "6245d86e18f0e5c0a1e724ac614a369da18590e3" - ], - "refs/remotes/origin/rotsweep": [ - "2022-10-05T17:50:39+02:00", - "99b5e2619481257636d864921d22f60ca0af24d8" - ], - "refs/remotes/origin/seamcheck": [ - "2022-03-18T17:53:05+01:00", - "2703f93074a94ecdf09c4bb445bef347c206f00f" - ], - "refs/remotes/origin/solid": [ - "2021-03-01T22:16:08+01:00", - "4f4cc7ec6672b48660601b566777366fd0685a5d" - ], - "refs/tags/v0.1": [ - "2019-02-17T08:57:09+01:00", - "74ea77f091cf3a62e1dee3b64b49e9ab9fcdb560" - ], - "refs/tags/v0.2": [ - "2020-06-16T15:02:23+02:00", - "521037588be1aa28320ce6c9b9f77b40f4c8aeb6" - ], - "refs/tags/v0.3": [ - "2021-01-08T19:06:59+01:00", - "a1fa4857b1de95da1062acc63919acdee59f045c" - ] - } -} diff --git a/src/Mod/AddonManager/AddonManagerTest/data/bundle_only.xml b/src/Mod/AddonManager/AddonManagerTest/data/bundle_only.xml deleted file mode 100644 index 0cac57f292..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/bundle_only.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - Test Bundle - A package.xml file for unit testing. - 1.0.0 - 2025-02-22 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - - - - A bunch of great addons you should install - TestAddon1 - TestAddon2 - TestAddon3 - TestAddon4 - TestAddon5 - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/combination.xml b/src/Mod/AddonManager/AddonManagerTest/data/combination.xml deleted file mode 100644 index bc72470a0e..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/combination.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - Combination Test - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - Resources/icons/PackageIcon.svg - Tag0 - Tag1 - - - - MyFirstWorkbench - Resources/icons/PackageIcon.svg - - - MyMacro.FCStd - - - MyFirstPack - - - A bundle that bundles nothing - - - Mysterious Object - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/corrupted_metadata.zip b/src/Mod/AddonManager/AddonManagerTest/data/corrupted_metadata.zip deleted file mode 100644 index e2f001fb8f..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/corrupted_metadata.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/depends_on_all_workbenches.xml b/src/Mod/AddonManager/AddonManagerTest/data/depends_on_all_workbenches.xml deleted file mode 100644 index 945134bb5e..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/depends_on_all_workbenches.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - Test Workbenches - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - - - - MyFirstWorkbench - Resources/icons/PackageIcon.svg - BIM - Assembly - DraftWB - FEM WB - MeshWorkbench - OpenSCAD Workbench - Part WORKBENCH - PartDesign WB - CAM - Plot - POINTS - ROBOTWB - Sketcher workbench - Spreadsheet - TechDraw - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/git_submodules.txt b/src/Mod/AddonManager/AddonManagerTest/data/git_submodules.txt deleted file mode 100644 index 2a447c61b6..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/git_submodules.txt +++ /dev/null @@ -1,23 +0,0 @@ -[submodule "3DfindIT"] - path = 3DfindIT - url = https://github.com/cadenasgmbh/3dfindit-freecad-integration -[submodule "A2plus"] - path = A2plus - url = https://github.com/kbwbe/A2plus -[submodule "Behave-Dark-Colors"] - path = Behave-Dark-Colors - url = https://github.com/Chrismettal/FreeCAD-Behave-Dark-Preference-Pack - branch = main -[submodule "Beltrami"] - path = Beltrami - url = https://github.com/Simturb/Beltrami - branch = main -[submodule "CurvedShapes"] - path = CurvedShapes - url = https://github.com/chbergmann/CurvedShapesWorkbench.git -[submodule "Curves"] - path = Curves - url = https://github.com/tomate44/CurvesWB.git -[submodule "Defeaturing"] - path = Defeaturing - url = https://github.com/easyw/Defeaturing_WB.git diff --git a/src/Mod/AddonManager/AddonManagerTest/data/good_package.xml b/src/Mod/AddonManager/AddonManagerTest/data/good_package.xml deleted file mode 100644 index 3be6edb282..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/good_package.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - Test Workbench - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - Resources/icons/PackageIcon.svg - Tag0 - Tag1 - - - - MyWorkbench - ./ - TagA - TagB - TagC - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/icon_cache.zip b/src/Mod/AddonManager/AddonManagerTest/data/icon_cache.zip deleted file mode 100644 index 766c988fcd..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/icon_cache.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/icon_cache.zip.sha1 b/src/Mod/AddonManager/AddonManagerTest/data/icon_cache.zip.sha1 deleted file mode 100644 index 2d0b37ee0d..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/icon_cache.zip.sha1 +++ /dev/null @@ -1 +0,0 @@ -67b372f9a5ac11e5377a4075537f31dfebf61753 *icon_cache.zip diff --git a/src/Mod/AddonManager/AddonManagerTest/data/macro_only.xml b/src/Mod/AddonManager/AddonManagerTest/data/macro_only.xml deleted file mode 100644 index b20295cc9f..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/macro_only.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - Test Macros - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - Resources/icons/PackageIcon.svg - - - - MyMacro.FCStd - - - MyOtherMacro.FCStd - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/macro_template.FCStd b/src/Mod/AddonManager/AddonManagerTest/data/macro_template.FCStd deleted file mode 100644 index 9cc885bd8d..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/macro_template.FCStd +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -# *************************************************************************** -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of the FreeCAD CAx development system. * -# * * -# * This library is free software; you can redistribute it and/or * -# * modify it under the terms of the GNU Lesser General Public * -# * License as published by the Free Software Foundation; either * -# * version 2.1 of the License, or (at your option) any later version. * -# * * -# * This library is distributed in the hope that it will be useful, * -# * but WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with this library; if not, write to the Free Software * -# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * -# * 02110-1301 USA * -# * * -# *************************************************************************** - -__Title__ = "TITLE" -__Author__ = "AUTHOR" -__Date__ = "DATE" -__Version__ = "VERSION" -__Comment__ = "COMMENT" -__Web__ = "WEB" -__Wiki__ = "WIKI" -__Icon__ = "ICON" -__Help__ = "HELP" -__Status__ = "STATUS" -__Requires__ = "REQUIRES" -__Communication__ = "COMMUNICATION" -__Files__ = "FILES" diff --git a/src/Mod/AddonManager/AddonManagerTest/data/metadata.zip b/src/Mod/AddonManager/AddonManagerTest/data/metadata.zip deleted file mode 100644 index 2f30f1b8ae..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/metadata.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/missing_macro_metadata.FCStd b/src/Mod/AddonManager/AddonManagerTest/data/missing_macro_metadata.FCStd deleted file mode 100644 index 1dc58af652..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/missing_macro_metadata.FCStd +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -# *************************************************************************** -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of the FreeCAD CAx development system. * -# * * -# * This library is free software; you can redistribute it and/or * -# * modify it under the terms of the GNU Lesser General Public * -# * License as published by the Free Software Foundation; either * -# * version 2.1 of the License, or (at your option) any later version. * -# * * -# * This library is distributed in the hope that it will be useful, * -# * but WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with this library; if not, write to the Free Software * -# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * -# * 02110-1301 USA * -# * * -# *************************************************************************** - -# This file contains no metadata diff --git a/src/Mod/AddonManager/AddonManagerTest/data/other_only.xml b/src/Mod/AddonManager/AddonManagerTest/data/other_only.xml deleted file mode 100644 index e4401f334d..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/other_only.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Test Other - A package.xml file for unit testing. - 1.0.0 - 2025-02-22 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - - - - A thing that's not a workbench, macro, preference pack, or bundle - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/prefpack_only.xml b/src/Mod/AddonManager/AddonManagerTest/data/prefpack_only.xml deleted file mode 100644 index 8e8dc5c741..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/prefpack_only.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - Test Preference Packs - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - - - - MyFirstPack - - - MySecondPack - - - MyThirdPack - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/test_addon_with_fcmacro.zip b/src/Mod/AddonManager/AddonManagerTest/data/test_addon_with_fcmacro.zip deleted file mode 100644 index 46dce11c5b..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/test_addon_with_fcmacro.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/test_github_style_repo.zip b/src/Mod/AddonManager/AddonManagerTest/data/test_github_style_repo.zip deleted file mode 100644 index 672ba33492..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/test_github_style_repo.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/test_repo.zip b/src/Mod/AddonManager/AddonManagerTest/data/test_repo.zip deleted file mode 100644 index 6449777ab5..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/test_repo.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/test_simple_repo.zip b/src/Mod/AddonManager/AddonManagerTest/data/test_simple_repo.zip deleted file mode 100644 index 9ce0ee9ac3..0000000000 Binary files a/src/Mod/AddonManager/AddonManagerTest/data/test_simple_repo.zip and /dev/null differ diff --git a/src/Mod/AddonManager/AddonManagerTest/data/test_version_detection.xml b/src/Mod/AddonManager/AddonManagerTest/data/test_version_detection.xml deleted file mode 100644 index 0856dac73d..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/test_version_detection.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - Test Workbenches - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - - - - MacroA - TagA - 0.1 - 0.10 - - - MacroB - TagB - 0.20 - 9999.98 - - - MacroC - TagC - 9999.99 - 99999.99 - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/data/workbench_only.xml b/src/Mod/AddonManager/AddonManagerTest/data/workbench_only.xml deleted file mode 100644 index 719e117611..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/data/workbench_only.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - Test Workbenches - A package.xml file for unit testing. - 1.0.1 - 2022-01-07 - FreeCAD Developer - LGPL-2.1 - https://github.com/chennes/FreeCAD-Package - https://github.com/chennes/FreeCAD-Package/blob/main/README.md - - - - MyFirstWorkbench - Resources/icons/PackageIcon.svg - - - MySecondWorkbench - Resources/icons/PackageIcon.svg - - - MyThirdWorkbench - Resources/icons/PackageIcon.svg - - - - diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/__init__.py b/src/Mod/AddonManager/AddonManagerTest/gui/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/gui_mocks.py b/src/Mod/AddonManager/AddonManagerTest/gui/gui_mocks.py deleted file mode 100644 index fde8d9e896..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/gui_mocks.py +++ /dev/null @@ -1,157 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import sys - -try: - from PySide import QtCore, QtWidgets -except ImportError: - try: - from PySide6 import QtCore, QtWidgets - except ImportError: - from PySide2 import QtCore, QtWidgets - -sys.path.append("../../") # For running in standalone mode during testing - -from AddonManagerTest.app.mocks import SignalCatcher - - -class DialogInteractor(QtCore.QObject): - """Takes the title of the dialog and a callable. The callable is passed the widget - we found and can do whatever it wants to it. Whatever it does should eventually - close the dialog, however.""" - - def __init__(self, dialog_to_watch_for, interaction): - super().__init__() - - # Status variables for tests to check: - self.dialog_found = False - self.has_run = False - self.button_found = False - self.interaction = interaction - - self.dialog_to_watch_for = dialog_to_watch_for - - self.execution_counter = 0 - self.timer = QtCore.QTimer() - self.timer.timeout.connect(self.run) - self.timer.start( - 1 - ) # At 10 this occasionally left open dialogs; less than 1 produced failed tests - - def run(self): - widget = QtWidgets.QApplication.activeModalWidget() - if widget and self._dialog_matches(widget): - # Found the dialog we are looking for: now try to run the interaction - if self.interaction is not None and callable(self.interaction): - self.interaction(widget) - self.dialog_found = True - self.timer.stop() - - self.has_run = True - self.execution_counter += 1 - if self.execution_counter > 100: - print("Stopped timer after 100 iterations") - self.timer.stop() - - def _dialog_matches(self, widget) -> bool: - # Is this the widget we are looking for? Only applies on Linux and Windows: macOS - # doesn't set the title of a modal dialog: - os = QtCore.QSysInfo.productType() # Qt5 gives "osx", Qt6 gives "macos" - if os in ["osx", "macos"] or ( - hasattr(widget, "windowTitle") - and callable(widget.windowTitle) - and widget.windowTitle() == self.dialog_to_watch_for - ): - return True - return False - - -class DialogWatcher(DialogInteractor): - """Examine the running GUI and look for a modal dialog with a given title, containing a button - with a role. Click that button, which is expected to close the dialog. Generally run on - a one-shot QTimer to allow the dialog time to open up. If the specified dialog is found, but - it does not contain the expected button, button_found will be false, and the dialog will be - closed with a reject() slot.""" - - def __init__(self, dialog_to_watch_for, button=QtWidgets.QDialogButtonBox.NoButton): - super().__init__(dialog_to_watch_for, self.click_button) - if button != QtWidgets.QDialogButtonBox.NoButton: - self.button = button - else: - self.button = QtWidgets.QDialogButtonBox.Cancel - - def click_button(self, widget): - button_boxes = widget.findChildren(QtWidgets.QDialogButtonBox) - if len(button_boxes) == 1: # There should be one, and only one - button_to_click = button_boxes[0].button(self.button) - if button_to_click: - self.button_found = True - button_to_click.click() - else: - widget.reject() - else: - widget.reject() - - -class FakeWorker: - def __init__(self): - self.called = False - self.should_continue = True - - def work(self): - while self.should_continue: - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) - - def stop(self): - self.should_continue = False - - -class MockThread: - def wait(self): - pass - - def isRunning(self): - return False - - -class AsynchronousMonitor: - """Watch for a signal to be emitted for at most some given number of milliseconds""" - - def __init__(self, signal): - self.signal = signal - self.signal_catcher = SignalCatcher() - self.signal.connect(self.signal_catcher.catch_signal) - self.kill_timer = QtCore.QTimer() - self.kill_timer.setSingleShot(True) - self.kill_timer.timeout.connect(self.signal_catcher.die) - - def wait_for_at_most(self, max_wait_millis) -> None: - self.kill_timer.setInterval(max_wait_millis) - self.kill_timer.start() - while not self.signal_catcher.caught and not self.signal_catcher.killed: - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 10) - self.kill_timer.stop() - - def good(self) -> bool: - return self.signal_catcher.caught and not self.signal_catcher.killed diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_change_branch.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_change_branch.py deleted file mode 100644 index b70689d0c4..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_change_branch.py +++ /dev/null @@ -1,234 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2025 The FreeCAD Project Association AISBL * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Test the Change Branch GUI code""" - -# pylint: disable=wrong-import-position, deprecated-module, too-many-return-statements - -import sys -import unittest -from unittest.mock import patch, Mock, MagicMock - -# So that when run standalone, the Addon Manager classes imported below are available -sys.path.append("../..") - -from AddonManagerTest.gui.gui_mocks import DialogWatcher, AsynchronousMonitor - -from change_branch import ChangeBranchDialog - -from addonmanager_freecad_interface import translate -from addonmanager_git import GitFailed - -try: - from PySide import QtCore, QtWidgets -except ImportError: - try: - from PySide6 import QtCore, QtWidgets - except ImportError: - from PySide2 import QtCore, QtWidgets - - -class MockFilter(QtCore.QSortFilterProxyModel): - """Replaces a filter with a non-filter that simply always returns whatever it's given""" - - def mapToSource(self, something): - return something - - -class MockChangeBranchDialogModel(QtCore.QAbstractTableModel): - """Replace a data-connected model with a static one for testing""" - - branches = [ - {"ref_name": "ref1", "upstream": "us1"}, - {"ref_name": "ref2", "upstream": "us2"}, - {"ref_name": "ref3", "upstream": "us3"}, - ] - current_branch = "ref1" - DataSortRole = QtCore.Qt.UserRole - RefAccessRole = QtCore.Qt.UserRole + 1 - - def __init__(self, _: str, parent=None) -> None: - super().__init__(parent) - - def rowCount(self, parent: QtCore.QModelIndex = QtCore.QModelIndex()) -> int: - """Number of rows: should always return 3""" - if parent.isValid(): - return 0 - return len(self.branches) - - def columnCount(self, parent: QtCore.QModelIndex = QtCore.QModelIndex()) -> int: - """Number of columns (identical to non-mocked version)""" - if parent.isValid(): - return 0 - return 3 # Local name, remote name, date - - def data(self, index: QtCore.QModelIndex, role: int = QtCore.Qt.DisplayRole): - """Mock returns static untranslated strings for DisplayRole, no tooltips at all, and - otherwise matches the non-mock version""" - if not index.isValid(): - return None - row = index.row() - column = index.column() - if role == QtCore.Qt.DisplayRole: - if column == 2: - return "date" - if column == 0: - return "ref_name" - if column == 1: - return "upstream" - return None - if role == MockChangeBranchDialogModel.DataSortRole: - return None - if role == MockChangeBranchDialogModel.RefAccessRole: - return self.branches[row] - return None - - def headerData( - self, - section: int, - orientation: QtCore.Qt.Orientation, - role: int = QtCore.Qt.DisplayRole, - ): - """Mock returns untranslated strings for DisplayRole, and no tooltips at all""" - if orientation == QtCore.Qt.Vertical: - return None - if role != QtCore.Qt.DisplayRole: - return None - if section == 0: - return "Local" - if section == 1: - return "Remote tracking" - if section == 2: - return "Last Updated" - return None - - def currentBranch(self) -> str: - """Mock returns a static string stored in the class: that string could be modified to - return something else by tests that require it.""" - return self.current_branch - - -class TestChangeBranchGui(unittest.TestCase): - """Tests for the ChangeBranch GUI code""" - - MODULE = "test_change_branch" # file name without extension - - def setUp(self): - pass - - def tearDown(self): - pass - - @patch("change_branch.ChangeBranchDialogModel", new=MockChangeBranchDialogModel) - @patch("change_branch.initialize_git", new=Mock(return_value=None)) - def test_no_git(self): - """If git is not present, a dialog saying so is presented""" - # Arrange - gui = ChangeBranchDialog("/some/path") - ref = {"ref_name": "foo/bar", "upstream": "us1"} - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Cannot find git"), - QtWidgets.QDialogButtonBox.Ok, - ) - - # Act - gui.change_branch("/foo/bar/baz", ref) - - # Assert - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - - @patch("change_branch.ChangeBranchDialogModel", new=MockChangeBranchDialogModel) - @patch("change_branch.initialize_git") - def test_git_failed(self, init_git: MagicMock): - """If git fails when attempting to change branches, a dialog saying so is presented""" - # Arrange - git_manager = MagicMock() - git_manager.checkout = MagicMock() - git_manager.checkout.side_effect = GitFailed() - init_git.return_value = git_manager - gui = ChangeBranchDialog("/some/path") - ref = {"ref_name": "foo/bar", "upstream": "us1"} - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "git operation failed"), - QtWidgets.QDialogButtonBox.Ok, - ) - - # Act - gui.change_branch("/foo/bar/baz", ref) - - # Assert - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - - @patch("change_branch.ChangeBranchDialogModel", new=MockChangeBranchDialogModel) - @patch("change_branch.initialize_git", new=MagicMock) - def test_branch_change_succeeded(self): - """If nothing gets thrown, then the process is assumed to have worked, and the appropriate - signal is emitted.""" - - # Arrange - gui = ChangeBranchDialog("/some/path") - ref = {"ref_name": "foo/bar", "upstream": "us1"} - monitor = AsynchronousMonitor(gui.branch_changed) - - # Act - gui.change_branch("/foo/bar/baz", ref) - - # Assert - monitor.wait_for_at_most(10) # Should be effectively instantaneous - self.assertTrue(monitor.good()) - - @patch("change_branch.ChangeBranchDialogFilter", new=MockFilter) - @patch("change_branch.ChangeBranchDialogModel", new=MockChangeBranchDialogModel) - @patch("change_branch.initialize_git", new=MagicMock) - def test_warning_is_shown_when_dialog_is_accepted(self): - """If the dialog is accepted (e.g. a branch change is requested) then a warning dialog is - displayed, and gives the opportunity to cancel. If cancelled, no signal is emitted.""" - # Arrange - gui = ChangeBranchDialog("/some/path") - gui.ui.exec = MagicMock() - gui.ui.exec.return_value = QtWidgets.QDialog.Accepted - gui.ui.tableView.selectedIndexes = MagicMock() - gui.ui.tableView.selectedIndexes.return_value = [MagicMock()] - gui.ui.tableView.selectedIndexes.return_value[0].isValid = MagicMock() - gui.ui.tableView.selectedIndexes.return_value[0].isValid.return_value = True - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "DANGER: Developer feature"), - QtWidgets.QDialogButtonBox.Cancel, - ) - monitor = AsynchronousMonitor(gui.branch_changed) - - # Act - gui.exec() - - # Assert - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertFalse(monitor.good()) # The watcher cancelled the op, so no signal is emitted - - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - QtCore.QTimer.singleShot(0, unittest.main) - if hasattr(app, "exec"): - app.exec() # PySide6 - else: - app.exec_() # PySide2 diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_gui.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_gui.py deleted file mode 100644 index 1af1592057..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_gui.py +++ /dev/null @@ -1,33 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import unittest -import FreeCAD - - -class TestGui(unittest.TestCase): - - MODULE = "test_gui" # file name without extension - - def setUp(self): - pass diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py deleted file mode 100644 index 6523f2ccdc..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_installer_gui.py +++ /dev/null @@ -1,650 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import os -import tempfile -import unittest -import FreeCAD - -from PySide import QtCore, QtWidgets - -from addonmanager_installer_gui import AddonInstallerGUI, MacroInstallerGUI - -from AddonManagerTest.gui.gui_mocks import DialogWatcher, DialogInteractor -from AddonManagerTest.app.mocks import MockAddon - -translate = FreeCAD.Qt.translate - - -class TestInstallerGui(unittest.TestCase): - - MODULE = "test_installer_gui" # file name without extension - - def setUp(self): - self.addon_to_install = MockAddon() - self.installer_gui = AddonInstallerGUI(self.addon_to_install) - self.finalized_thread = False - - def tearDown(self): - pass - - def test_success_dialog(self): - # Pop the modal dialog and verify that it opens, and responds to an OK click - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Success"), - QtWidgets.QDialogButtonBox.Ok, - ) - self.installer_gui._installation_succeeded() - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_failure_dialog(self): - # Pop the modal dialog and verify that it opens, and responds to a Cancel click - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Installation Failed"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.installer_gui._installation_failed( - self.addon_to_install, "Test of installation failure" - ) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_no_python_dialog(self): - # Pop the modal dialog and verify that it opens, and responds to a No click - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Cannot execute Python"), - QtWidgets.QDialogButtonBox.No, - ) - self.installer_gui._report_no_python_exe() - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_no_pip_dialog(self): - # Pop the modal dialog and verify that it opens, and responds to a No click - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Cannot execute pip"), - QtWidgets.QDialogButtonBox.No, - ) - self.installer_gui._report_no_pip("pip not actually run, this was a test") - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_dependency_failure_dialog(self): - # Pop the modal dialog and verify that it opens, and responds to a No click - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Package installation failed"), - QtWidgets.QDialogButtonBox.No, - ) - self.installer_gui._report_dependency_failure( - "Unit test", "Nothing really failed, this is a test of the dialog box" - ) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_install(self): - # Run the installation code and make sure it puts the directory in place - with tempfile.TemporaryDirectory() as temp_dir: - self.installer_gui.installer.installation_path = temp_dir - self.installer_gui.install() # This does not block - self.installer_gui.installer.success.disconnect( - self.installer_gui._installation_succeeded - ) - self.installer_gui.installer.failure.disconnect(self.installer_gui._installation_failed) - while not self.installer_gui.worker_thread.isFinished(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) - self.assertTrue( - os.path.exists(os.path.join(temp_dir, "MockAddon")), - "Installed directory not found", - ) - - def test_handle_disallowed_python(self): - disallowed_packages = ["disallowed_package_name"] - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Missing Requirement"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.installer_gui._handle_disallowed_python(disallowed_packages) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_handle_disallowed_python_long_list(self): - """A separate test for when there are MANY packages, which takes a separate code path.""" - disallowed_packages = [] - for i in range(50): - disallowed_packages.append(f"disallowed_package_name_{i}") - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Missing Requirement"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.installer_gui._handle_disallowed_python(disallowed_packages) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_report_missing_workbenches_single(self): - """Test only missing one workbench""" - wbs = ["OneMissingWorkbench"] - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Missing Requirement"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.installer_gui._report_missing_workbenches(wbs) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_report_missing_workbenches_multiple(self): - """Test only missing one workbench""" - wbs = ["FirstMissingWorkbench", "SecondMissingWorkbench"] - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Missing Requirement"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.installer_gui._report_missing_workbenches(wbs) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_resolve_dependencies_then_install(self): - class MissingDependenciesMock: - def __init__(self): - self.external_addons = ["addon_1", "addon_2"] - self.python_requires = ["py_req_1", "py_req_2"] - self.python_optional = ["py_opt_1", "py_opt_2"] - - missing = MissingDependenciesMock() - dialog_watcher = DialogWatcher( - translate("DependencyResolutionDialog", "Resolve Dependencies"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.installer_gui._resolve_dependencies_then_install(missing) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_check_python_version_bad(self): - class MissingDependenciesMock: - def __init__(self): - self.python_min_version = {"major": 3, "minor": 9999} - - missing = MissingDependenciesMock() - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Incompatible Python version"), - QtWidgets.QDialogButtonBox.Cancel, - ) - stop_installing = self.installer_gui._check_python_version(missing) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - self.assertTrue(stop_installing, "Failed to halt installation on bad Python version") - - def test_check_python_version_good(self): - class MissingDependenciesMock: - def __init__(self): - self.python_min_version = {"major": 3, "minor": 0} - - missing = MissingDependenciesMock() - stop_installing = self.installer_gui._check_python_version(missing) - self.assertFalse(stop_installing, "Failed to continue installation on good Python version") - - def test_clean_up_optional(self): - class MissingDependenciesMock: - def __init__(self): - self.python_optional = [ - "allowed_packages_1", - "allowed_packages_2", - "disallowed_package", - ] - - allowed_packages = ["allowed_packages_1", "allowed_packages_2"] - missing = MissingDependenciesMock() - self.installer_gui.installer.allowed_packages = set(allowed_packages) - self.installer_gui._clean_up_optional(missing) - self.assertTrue("allowed_packages_1" in missing.python_optional) - self.assertTrue("allowed_packages_2" in missing.python_optional) - self.assertFalse("disallowed_package" in missing.python_optional) - - def intercept_run_dependency_installer(self, addons, python_requires, python_optional): - self.assertEqual(python_requires, ["py_req_1", "py_req_2"]) - self.assertEqual(python_optional, ["py_opt_1", "py_opt_2"]) - self.assertEqual(addons[0].name, "addon_1") - self.assertEqual(addons[1].name, "addon_2") - - def test_dependency_dialog_yes_clicked(self): - class DialogMock: - class ListWidgetMock: - class ListWidgetItemMock: - def __init__(self, name): - self.name = name - - def text(self): - return self.name - - def checkState(self): - return QtCore.Qt.Checked - - def __init__(self, items): - self.list = [] - for item in items: - self.list.append(DialogMock.ListWidgetMock.ListWidgetItemMock(item)) - - def count(self): - return len(self.list) - - def item(self, i): - return self.list[i] - - def __init__(self): - self.listWidgetAddons = DialogMock.ListWidgetMock(["addon_1", "addon_2"]) - self.listWidgetPythonRequired = DialogMock.ListWidgetMock(["py_req_1", "py_req_2"]) - self.listWidgetPythonOptional = DialogMock.ListWidgetMock(["py_opt_1", "py_opt_2"]) - - class AddonMock: - def __init__(self, name): - self.name = name - - self.installer_gui.dependency_dialog = DialogMock() - self.installer_gui.addons = [AddonMock("addon_1"), AddonMock("addon_2")] - self.installer_gui._run_dependency_installer = self.intercept_run_dependency_installer - self.installer_gui._dependency_dialog_yes_clicked() - - -class TestMacroInstallerGui(unittest.TestCase): - class MockMacroAddon: - class MockMacro: - def __init__(self): - self.install_called = False - self.install_result = ( - True # External code can change to False to test failed install - ) - self.name = "MockMacro" - self.filename = "mock_macro_no_real_file.FCMacro" - self.comment = "This is a mock macro for unit testing" - self.icon = None - self.xpm = None - - def install(self): - self.install_called = True - return self.install_result - - def __init__(self): - self.macro = TestMacroInstallerGui.MockMacroAddon.MockMacro() - self.name = self.macro.name - self.display_name = self.macro.name - - class MockParameter: - """Mock the parameter group to allow simplified behavior and introspection.""" - - def __init__(self): - self.params = {} - self.groups = {} - self.accessed_parameters = {} # Dict is param name: default value - - types = ["Bool", "String", "Int", "UInt", "Float"] - for t in types: - setattr(self, f"Get{t}", self.get) - setattr(self, f"Set{t}", self.set) - setattr(self, f"Rem{t}", self.rem) - - def get(self, p, default=None): - self.accessed_parameters[p] = default - if p in self.params: - return self.params[p] - else: - return default - - def set(self, p, value): - self.params[p] = value - - def rem(self, p): - if p in self.params: - self.params.erase(p) - - def GetGroup(self, name): - if name not in self.groups: - self.groups[name] = TestMacroInstallerGui.MockParameter() - return self.groups[name] - - def GetGroups(self): - return self.groups.keys() - - class ToolbarIntercepter: - def __init__(self): - self.ask_for_toolbar_called = False - self.install_macro_to_toolbar_called = False - self.tb = None - self.custom_group = TestMacroInstallerGui.MockParameter() - self.custom_group.set("Name", "MockCustomToolbar") - - def _ask_for_toolbar(self, _): - self.ask_for_toolbar_called = True - return self.custom_group - - def _install_macro_to_toolbar(self, tb): - self.install_macro_to_toolbar_called = True - self.tb = tb - - class InstallerInterceptor: - def __init__(self): - self.ccc_called = False - - def _create_custom_command( - self, - toolbar, - filename, - menuText, - tooltipText, - whatsThisText, - statustipText, - pixmapText, - ): - self.ccc_called = True - self.toolbar = toolbar - self.filename = filename - self.menuText = menuText - self.tooltipText = tooltipText - self.whatsThisText = whatsThisText - self.statustipText = statustipText - self.pixmapText = pixmapText - - def setUp(self): - self.mock_macro = TestMacroInstallerGui.MockMacroAddon() - self.installer = MacroInstallerGUI(self.mock_macro) - self.installer.addon_params = TestMacroInstallerGui.MockParameter() - self.installer.toolbar_params = TestMacroInstallerGui.MockParameter() - - def tearDown(self): - pass - - def test_class_is_initialized(self): - """Connecting to a signal does not throw""" - self.installer.finished.connect(lambda: None) - - def test_ask_for_toolbar_no_dialog_default_exists(self): - self.installer.addon_params.set("alwaysAskForToolbar", False) - self.installer.addon_params.set("CustomToolbarName", "UnitTestCustomToolbar") - utct = self.installer.toolbar_params.GetGroup("UnitTestCustomToolbar") - utct.set("Name", "UnitTestCustomToolbar") - utct.set("Active", True) - result = self.installer._ask_for_toolbar([]) - self.assertIsNotNone(result) - self.assertTrue(hasattr(result, "get")) - name = result.get("Name") - self.assertEqual(name, "UnitTestCustomToolbar") - - def test_ask_for_toolbar_with_dialog_cancelled(self): - - # First test: the user cancels the dialog - self.installer.addon_params.set("alwaysAskForToolbar", True) - dialog_watcher = DialogWatcher( - translate("select_toolbar_dialog", "Select Toolbar"), - QtWidgets.QDialogButtonBox.Cancel, - ) - result = self.installer._ask_for_toolbar([]) - self.assertIsNone(result) - - def test_ask_for_toolbar_with_dialog_defaults(self): - - # Second test: the user leaves the dialog at all default values, so: - # - The checkbox "Ask every time" is unchecked - # - The selected toolbar option is "Create new toolbar", which triggers a search for - # a new custom toolbar name by calling _create_new_custom_toolbar, which we mock. - fake_custom_toolbar_group = TestMacroInstallerGui.MockParameter() - fake_custom_toolbar_group.set("Name", "UnitTestCustomToolbar") - self.installer._create_new_custom_toolbar = lambda: fake_custom_toolbar_group - dialog_watcher = DialogWatcher( - translate("select_toolbar_dialog", "Select Toolbar"), - QtWidgets.QDialogButtonBox.Ok, - ) - result = self.installer._ask_for_toolbar([]) - self.assertIsNotNone(result) - self.assertTrue(hasattr(result, "get")) - name = result.get("Name") - self.assertEqual(name, "UnitTestCustomToolbar") - self.assertIn("alwaysAskForToolbar", self.installer.addon_params.params) - self.assertFalse(self.installer.addon_params.get("alwaysAskForToolbar", True)) - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_ask_for_toolbar_with_dialog_selection(self): - - # Third test: the user selects a custom toolbar in the dialog, and checks the box to always - # ask. - dialog_interactor = DialogInteractor( - translate("select_toolbar_dialog", "Select Toolbar"), - self.interactor_selection_option_and_checkbox, - ) - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_2 = self.installer.toolbar_params.GetGroup("UT_TB_2") - ut_tb_3 = self.installer.toolbar_params.GetGroup("UT_TB_3") - ut_tb_1.set("Name", "UT_TB_1") - ut_tb_2.set("Name", "UT_TB_2") - ut_tb_3.set("Name", "UT_TB_3") - result = self.installer._ask_for_toolbar(["UT_TB_1", "UT_TB_2", "UT_TB_3"]) - self.assertIsNotNone(result) - self.assertTrue(hasattr(result, "get")) - name = result.get("Name") - self.assertEqual(name, "UT_TB_3") - self.assertIn("alwaysAskForToolbar", self.installer.addon_params.params) - self.assertTrue(self.installer.addon_params.get("alwaysAskForToolbar", False)) - - def interactor_selection_option_and_checkbox(self, parent): - - boxes = parent.findChildren(QtWidgets.QComboBox) - self.assertEqual(len(boxes), 1) # Just to make sure... - box = boxes[0] - box.setCurrentIndex(box.count() - 2) # Select the last thing but one - - checkboxes = parent.findChildren(QtWidgets.QCheckBox) - self.assertEqual(len(checkboxes), 1) # Just to make sure... - checkbox = checkboxes[0] - checkbox.setChecked(True) - - parent.accept() - - def test_macro_button_exists_no_command(self): - # Test 1: No command for this macro - self.installer._find_custom_command = lambda _: None - button_exists = self.installer._macro_button_exists() - self.assertFalse(button_exists) - - def test_macro_button_exists_true(self): - # Test 2: Macro is in the list of buttons - ut_tb_1 = self.installer.toolbar_params.GetGroup("UnitTestCommand") - ut_tb_1.set("UnitTestCommand", "FreeCAD") # This is what the real thing looks like... - self.installer._find_custom_command = lambda _: "UnitTestCommand" - self.assertTrue(self.installer._macro_button_exists()) - - def test_macro_button_exists_false(self): - # Test 3: Macro is not in the list of buttons - self.installer._find_custom_command = lambda _: "UnitTestCommand" - self.assertFalse(self.installer._macro_button_exists()) - - def test_ask_to_install_toolbar_button_disabled(self): - self.installer.addon_params.SetBool("dontShowAddMacroButtonDialog", True) - self.installer._ask_to_install_toolbar_button() - # This should NOT block when dontShowAddMacroButtonDialog is True - - def test_ask_to_install_toolbar_button_enabled_no(self): - self.installer.addon_params.SetBool("dontShowAddMacroButtonDialog", False) - dialog_watcher = DialogWatcher( - translate("toolbar_button", "Add button?"), - QtWidgets.QDialogButtonBox.No, - ) - # Note: that dialog does not use a QButtonBox, so we can really only test its - # reject() signal, which is triggered by the DialogWatcher when it cannot find - # the button. In this case, failure to find that button is NOT an error. - self.installer._ask_to_install_toolbar_button() # Blocks until killed by watcher - self.assertTrue(dialog_watcher.dialog_found) - - def test_get_toolbar_with_name_found(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UnitTestToolbar") - ut_tb_1.set("Name", "Unit Test Toolbar") - ut_tb_1.set("UnitTestParam", True) - tb = self.installer._get_toolbar_with_name("Unit Test Toolbar") - self.assertIsNotNone(tb) - self.assertTrue(tb.get("UnitTestParam", False)) - - def test_get_toolbar_with_name_not_found(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UnitTestToolbar") - ut_tb_1.set("Name", "Not the Unit Test Toolbar") - tb = self.installer._get_toolbar_with_name("Unit Test Toolbar") - self.assertIsNone(tb) - - def test_create_new_custom_toolbar_no_existing(self): - tb = self.installer._create_new_custom_toolbar() - self.assertEqual(tb.get("Name", ""), "Auto-Created Macro Toolbar") - self.assertTrue(tb.get("Active", False), True) - - def test_create_new_custom_toolbar_one_existing(self): - _ = self.installer._create_new_custom_toolbar() - tb = self.installer._create_new_custom_toolbar() - self.assertEqual(tb.get("Name", ""), "Auto-Created Macro Toolbar (2)") - self.assertTrue(tb.get("Active", False), True) - - def test_check_for_toolbar_true(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - self.assertTrue(self.installer._check_for_toolbar("UT_TB_1")) - - def test_check_for_toolbar_false(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - self.assertFalse(self.installer._check_for_toolbar("Not UT_TB_1")) - - def test_install_toolbar_button_first_custom_toolbar(self): - tbi = TestMacroInstallerGui.ToolbarIntercepter() - self.installer._ask_for_toolbar = tbi._ask_for_toolbar - self.installer._install_macro_to_toolbar = tbi._install_macro_to_toolbar - self.installer._install_toolbar_button() - self.assertTrue(tbi.install_macro_to_toolbar_called) - self.assertFalse(tbi.ask_for_toolbar_called) - self.assertTrue("Custom_1" in self.installer.toolbar_params.GetGroups()) - - def test_install_toolbar_button_existing_custom_toolbar_1(self): - # There is an existing custom toolbar, and we should use it - tbi = TestMacroInstallerGui.ToolbarIntercepter() - self.installer._ask_for_toolbar = tbi._ask_for_toolbar - self.installer._install_macro_to_toolbar = tbi._install_macro_to_toolbar - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - self.installer.addon_params.set("CustomToolbarName", "UT_TB_1") - self.installer._install_toolbar_button() - self.assertTrue(tbi.install_macro_to_toolbar_called) - self.assertFalse(tbi.ask_for_toolbar_called) - self.assertEqual(tbi.tb.get("Name", ""), "UT_TB_1") - - def test_install_toolbar_button_existing_custom_toolbar_2(self): - # There are multiple existing custom toolbars, and we should use one of them - tbi = TestMacroInstallerGui.ToolbarIntercepter() - self.installer._ask_for_toolbar = tbi._ask_for_toolbar - self.installer._install_macro_to_toolbar = tbi._install_macro_to_toolbar - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_2 = self.installer.toolbar_params.GetGroup("UT_TB_2") - ut_tb_3 = self.installer.toolbar_params.GetGroup("UT_TB_3") - ut_tb_1.set("Name", "UT_TB_1") - ut_tb_2.set("Name", "UT_TB_2") - ut_tb_3.set("Name", "UT_TB_3") - self.installer.addon_params.set("CustomToolbarName", "UT_TB_3") - self.installer._install_toolbar_button() - self.assertTrue(tbi.install_macro_to_toolbar_called) - self.assertFalse(tbi.ask_for_toolbar_called) - self.assertEqual(tbi.tb.get("Name", ""), "UT_TB_3") - - def test_install_toolbar_button_existing_custom_toolbar_3(self): - # There are multiple existing custom toolbars, but none of them match - tbi = TestMacroInstallerGui.ToolbarIntercepter() - self.installer._ask_for_toolbar = tbi._ask_for_toolbar - self.installer._install_macro_to_toolbar = tbi._install_macro_to_toolbar - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_2 = self.installer.toolbar_params.GetGroup("UT_TB_2") - ut_tb_3 = self.installer.toolbar_params.GetGroup("UT_TB_3") - ut_tb_1.set("Name", "UT_TB_1") - ut_tb_2.set("Name", "UT_TB_2") - ut_tb_3.set("Name", "UT_TB_3") - self.installer.addon_params.set("CustomToolbarName", "UT_TB_4") - self.installer._install_toolbar_button() - self.assertTrue(tbi.install_macro_to_toolbar_called) - self.assertTrue(tbi.ask_for_toolbar_called) - self.assertEqual(tbi.tb.get("Name", ""), "MockCustomToolbar") - - def test_install_toolbar_button_existing_custom_toolbar_4(self): - # There are multiple existing custom toolbars, one of them matches, but we have set - # "alwaysAskForToolbar" to True - tbi = TestMacroInstallerGui.ToolbarIntercepter() - self.installer._ask_for_toolbar = tbi._ask_for_toolbar - self.installer._install_macro_to_toolbar = tbi._install_macro_to_toolbar - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_2 = self.installer.toolbar_params.GetGroup("UT_TB_2") - ut_tb_3 = self.installer.toolbar_params.GetGroup("UT_TB_3") - ut_tb_1.set("Name", "UT_TB_1") - ut_tb_2.set("Name", "UT_TB_2") - ut_tb_3.set("Name", "UT_TB_3") - self.installer.addon_params.set("CustomToolbarName", "UT_TB_3") - self.installer.addon_params.set("alwaysAskForToolbar", True) - self.installer._install_toolbar_button() - self.assertTrue(tbi.install_macro_to_toolbar_called) - self.assertTrue(tbi.ask_for_toolbar_called) - self.assertEqual(tbi.tb.get("Name", ""), "MockCustomToolbar") - - def test_install_macro_to_toolbar_icon_abspath(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - ii = TestMacroInstallerGui.InstallerInterceptor() - self.installer._create_custom_command = ii._create_custom_command - with tempfile.NamedTemporaryFile() as ntf: - self.mock_macro.macro.icon = ntf.name - self.installer._install_macro_to_toolbar(ut_tb_1) - self.assertTrue(ii.ccc_called) - self.assertEqual(ii.pixmapText, ntf.name) - - def test_install_macro_to_toolbar_icon_relpath(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - ii = TestMacroInstallerGui.InstallerInterceptor() - self.installer._create_custom_command = ii._create_custom_command - with tempfile.TemporaryDirectory() as td: - self.installer.macro_dir = td - self.mock_macro.macro.icon = "RelativeIconPath.png" - self.installer._install_macro_to_toolbar(ut_tb_1) - self.assertTrue(ii.ccc_called) - self.assertEqual(ii.pixmapText, os.path.join(td, "RelativeIconPath.png")) - - def test_install_macro_to_toolbar_xpm(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - ii = TestMacroInstallerGui.InstallerInterceptor() - self.installer._create_custom_command = ii._create_custom_command - with tempfile.TemporaryDirectory() as td: - self.installer.macro_dir = td - self.mock_macro.macro.xpm = "Not really xpm data, don't try to use it!" - self.installer._install_macro_to_toolbar(ut_tb_1) - self.assertTrue(ii.ccc_called) - self.assertEqual(ii.pixmapText, os.path.join(td, "MockMacro_icon.xpm")) - self.assertTrue(os.path.exists(os.path.join(td, "MockMacro_icon.xpm"))) - - def test_install_macro_to_toolbar_no_icon(self): - ut_tb_1 = self.installer.toolbar_params.GetGroup("UT_TB_1") - ut_tb_1.set("Name", "UT_TB_1") - ii = TestMacroInstallerGui.InstallerInterceptor() - self.installer._create_custom_command = ii._create_custom_command - with tempfile.TemporaryDirectory() as td: - self.installer.macro_dir = td - self.installer._install_macro_to_toolbar(ut_tb_1) - self.assertTrue(ii.ccc_called) - self.assertIsNone(ii.pixmapText) diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_python_deps_gui.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_python_deps_gui.py deleted file mode 100644 index be08fa37e6..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_python_deps_gui.py +++ /dev/null @@ -1,139 +0,0 @@ -import logging -import subprocess -import sys -import unittest -from unittest.mock import MagicMock, patch - -try: - import FreeCAD - import FreeCADGui -except ImportError: - try: - from PySide6 import QtCore, QtWidgets - except ImportError: - from PySide2 import QtCore, QtWidgets - -sys.path.append( - "../.." -) # So that when run standalone, the Addon Manager classes imported below are available - -from addonmanager_python_deps_gui import ( - PythonPackageManager, - call_pip, - PipFailed, - python_package_updates_are_available, - parse_pip_list_output, -) -from AddonManagerTest.gui.gui_mocks import DialogInteractor, DialogWatcher - - -class TestPythonPackageManager(unittest.TestCase): - - def setUp(self) -> None: - self.manager = PythonPackageManager([]) - - def tearDown(self) -> None: - if self.manager.worker_thread: - self.manager.worker_thread.terminate() - self.manager.worker_thread.wait() - - @patch("addonmanager_python_deps_gui.PythonPackageManager._create_list_from_pip") - def test_show(self, patched_create_list_from_pip): - dialog_watcher = DialogWatcher("Manage Python Dependencies") - self.manager.show() - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - - -class TestPythonDepsStandaloneFunctions(unittest.TestCase): - - @patch("addonmanager_utilities.run_interruptable_subprocess") - def test_call_pip(self, mock_run_subprocess: MagicMock): - call_pip(["arg1", "arg2", "arg3"]) - mock_run_subprocess.assert_called() - args = mock_run_subprocess.call_args[0][0] - self.assertTrue("pip" in args) - - @patch("addonmanager_python_deps_gui.get_python_exe") - def test_call_pip_no_python(self, mock_get_python_exe: MagicMock): - mock_get_python_exe.return_value = None - with self.assertRaises(PipFailed): - call_pip(["arg1", "arg2", "arg3"]) - - @patch("addonmanager_utilities.run_interruptable_subprocess") - def test_call_pip_exception_raised(self, mock_run_subprocess: MagicMock): - mock_run_subprocess.side_effect = subprocess.CalledProcessError( - -1, "dummy_command", "Fake contents of stdout", "Fake contents of stderr" - ) - with self.assertRaises(PipFailed): - call_pip(["arg1", "arg2", "arg3"]) - - @patch("addonmanager_utilities.run_interruptable_subprocess") - def test_call_pip_splits_results(self, mock_run_subprocess: MagicMock): - result_mock = MagicMock() - result_mock.stdout = "\n".join(["Value 1", "Value 2", "Value 3"]) - mock_run_subprocess.return_value = result_mock - result = call_pip(["arg1", "arg2", "arg3"]) - self.assertEqual(len(result), 3) - - @patch("addonmanager_python_deps_gui.call_pip") - def test_python_package_updates_are_available(self, mock_call_pip: MagicMock): - mock_call_pip.return_value = "Some result" - result = python_package_updates_are_available() - self.assertEqual(result, True) - - @patch("addonmanager_python_deps_gui.call_pip") - def test_python_package_updates_are_available_no_results(self, mock_call_pip: MagicMock): - """An empty string is an indication that no updates are available""" - mock_call_pip.return_value = "" - result = python_package_updates_are_available() - self.assertEqual(result, False) - - @patch("addonmanager_python_deps_gui.call_pip") - def test_python_package_updates_are_available_pip_failure(self, mock_call_pip: MagicMock): - logging.disable() - mock_call_pip.side_effect = PipFailed("Test error message") - logging.disable() # A logging error message is expected here, but not desirable during test runs - result = python_package_updates_are_available() - self.assertEqual(result, False) - logging.disable(logging.NOTSET) - - def test_parse_pip_list_output_no_input(self): - results_dict = parse_pip_list_output("", "") - self.assertEqual(len(results_dict), 0) - - def test_parse_pip_list_output_all_packages_no_updates(self): - results_dict = parse_pip_list_output( - ["Package Version", "---------- -------", "gitdb 4.0.9", "setuptools 41.2.0"], - [], - ) - self.assertEqual(len(results_dict), 2) - self.assertTrue("gitdb" in results_dict) - self.assertTrue("setuptools" in results_dict) - self.assertEqual(results_dict["gitdb"]["installed_version"], "4.0.9") - self.assertEqual(results_dict["gitdb"]["available_version"], "") - self.assertEqual(results_dict["setuptools"]["installed_version"], "41.2.0") - self.assertEqual(results_dict["setuptools"]["available_version"], "") - - def test_parse_pip_list_output_all_packages_with_updates(self): - results_dict = parse_pip_list_output( - [], - [ - "Package Version Latest Type", - "---------- ------- ------ -----", - "pip 21.0.1 22.1.2 wheel", - "setuptools 41.2.0 63.2.0 wheel", - ], - ) - self.assertEqual(len(results_dict), 2) - self.assertTrue("pip" in results_dict) - self.assertTrue("setuptools" in results_dict) - self.assertEqual(results_dict["pip"]["installed_version"], "21.0.1") - self.assertEqual(results_dict["pip"]["available_version"], "22.1.2") - self.assertEqual(results_dict["setuptools"]["installed_version"], "41.2.0") - self.assertEqual(results_dict["setuptools"]["available_version"], "63.2.0") - - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - QtCore.QTimer.singleShot(0, unittest.main) - app.exec() diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py deleted file mode 100644 index 538c8daac9..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_uninstaller_gui.py +++ /dev/null @@ -1,131 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import functools -import unittest - -from PySide import QtCore, QtWidgets - -import FreeCAD - -from AddonManagerTest.gui.gui_mocks import ( - DialogWatcher, - FakeWorker, - MockThread, -) -from AddonManagerTest.app.mocks import MockAddon - -from addonmanager_uninstaller_gui import AddonUninstallerGUI - -translate = FreeCAD.Qt.translate - - -class TestUninstallerGUI(unittest.TestCase): - - MODULE = "test_uninstaller_gui" # file name without extension - - def setUp(self): - self.addon_to_remove = MockAddon() - self.uninstaller_gui = AddonUninstallerGUI(self.addon_to_remove) - self.finalized_thread = False - self.signals_caught = [] - - def tearDown(self): - pass - - def catch_signal(self, signal_name, *_): - self.signals_caught.append(signal_name) - - def test_confirmation_dialog_yes(self): - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Confirm remove"), - QtWidgets.QDialogButtonBox.Yes, - ) - answer = self.uninstaller_gui._confirm_uninstallation() - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - self.assertTrue(answer, "Expected a 'Yes' click to return True, but got False") - - def test_confirmation_dialog_cancel(self): - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Confirm remove"), - QtWidgets.QDialogButtonBox.Cancel, - ) - answer = self.uninstaller_gui._confirm_uninstallation() - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - self.assertFalse(answer, "Expected a 'Cancel' click to return False, but got True") - - def test_progress_dialog(self): - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Removing Addon"), - QtWidgets.QDialogButtonBox.Cancel, - ) - self.uninstaller_gui._show_progress_dialog() - # That call isn't modal, so spin our own event loop: - while self.uninstaller_gui.progress_dialog.isVisible(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_timer_launches_progress_dialog(self): - worker = FakeWorker() - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Removing Addon"), - QtWidgets.QDialogButtonBox.Cancel, - ) - QtCore.QTimer.singleShot(1000, worker.stop) # If the test fails, this kills the "worker" - self.uninstaller_gui._confirm_uninstallation = lambda: True - self.uninstaller_gui._run_uninstaller = worker.work - self.uninstaller_gui._finalize = lambda: None - self.uninstaller_gui.dialog_timer.setInterval(1) # To speed up the test, only wait 1ms - self.uninstaller_gui.run() # Blocks once it hits the fake worker - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - worker.stop() - - def test_success_dialog(self): - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Uninstall complete"), - QtWidgets.QDialogButtonBox.Ok, - ) - self.uninstaller_gui._succeeded(self.addon_to_remove) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_failure_dialog(self): - dialog_watcher = DialogWatcher( - translate("AddonsInstaller", "Uninstall failed"), - QtWidgets.QDialogButtonBox.Ok, - ) - self.uninstaller_gui._failed( - self.addon_to_remove, "Some failure message\nAnother failure message" - ) - self.assertTrue(dialog_watcher.dialog_found, "Failed to find the expected dialog box") - self.assertTrue(dialog_watcher.button_found, "Failed to find the expected button") - - def test_finalize(self): - self.uninstaller_gui.finished.connect(functools.partial(self.catch_signal, "finished")) - self.uninstaller_gui.worker_thread = MockThread() - self.uninstaller_gui._finalize() - self.assertIn("finished", self.signals_caught) diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_update_all_gui.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_update_all_gui.py deleted file mode 100644 index 8cea9f327b..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_update_all_gui.py +++ /dev/null @@ -1,260 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2025 FreeCAD project association AISBL * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -from time import sleep -import unittest -import FreeCAD - -from Addon import Addon - -from PySide import QtCore, QtWidgets - -from addonmanager_update_all_gui import UpdateAllGUI, AddonStatus - - -class MockUpdater(QtCore.QObject): - success = QtCore.Signal(object) - failure = QtCore.Signal(object) - finished = QtCore.Signal() - - def __init__(self, addon, addons=[]): - super().__init__() - self.addon_to_install = addon - self.addons = addons - self.has_run = False - self.emit_success = True - self.work_function = None # Set to some kind of callable to make this function take time - - def run(self): - self.has_run = True - if self.work_function is not None and callable(self.work_function): - self.work_function() - if self.emit_success: - self.success.emit(self.addon_to_install) - else: - self.failure.emit(self.addon_to_install) - self.finished.emit() - - -class MockUpdaterFactory: - def __init__(self, addons): - self.addons = addons - self.work_function = None - self.updater = None - - def get_updater(self, addon): - self.updater = MockUpdater(addon, self.addons) - self.updater.work_function = self.work_function - return self.updater - - -class MockAddon: - def __init__(self, name): - self.display_name = name - self.name = name - self.macro = None - self.metadata = None - self.installed_metadata = None - - def status(self): - return Addon.Status.UPDATE_AVAILABLE - - -class CallInterceptor: - def __init__(self): - self.called = False - self.args = None - - def intercept(self, *args): - self.called = True - self.args = args - - -class TestUpdateAllGui(unittest.TestCase): - def setUp(self): - self.addons = [] - for i in range(3): - self.addons.append(MockAddon(f"Mock Addon {i}")) - self.factory = MockUpdaterFactory(self.addons) - self.test_object = UpdateAllGUI(self.addons) - self.test_object.updater_factory = self.factory - - def tearDown(self): - pass - - def test_run(self): - self.factory.work_function = lambda: sleep(0.1) - self.test_object.run() - while self.test_object.is_running(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) - self.test_object.dialog.accept() - - def test_setup_dialog(self): - self.test_object._setup_dialog() - self.assertIsNotNone( - self.test_object.dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel) - ) - self.assertEqual(self.test_object.dialog.tableWidget.rowCount(), 3) - - def test_cancelling_installation(self): - class Worker: - def __init__(self): - self.counter = 0 - self.LIMIT = 100 - self.limit_reached = False - - def run(self): - while self.counter < self.LIMIT: - if QtCore.QThread.currentThread().isInterruptionRequested(): - return - self.counter += 1 - sleep(0.01) - self.limit_reached = True - - worker = Worker() - self.factory.work_function = worker.run - self.test_object.run() - cancel_timer = QtCore.QTimer() - cancel_timer.timeout.connect( - self.test_object.dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel).click - ) - cancel_timer.start(90) - while self.test_object.is_running(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 10) - self.assertGreater(len(self.test_object.addons_with_update), 0) - - def test_add_addon_to_table(self): - mock_addon = MockAddon("MockAddon") - self.test_object.dialog.tableWidget.clear() - self.test_object._add_addon_to_table(mock_addon, 1) - self.assertEqual(self.test_object.dialog.tableWidget.rowCount(), 1) - - def test_update_addon_status(self): - self.test_object._setup_dialog() - self.test_object._update_addon_status(0, AddonStatus.WAITING) - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.WAITING.ui_string(), - ) - self.test_object._update_addon_status(0, AddonStatus.INSTALLING) - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.INSTALLING.ui_string(), - ) - self.test_object._update_addon_status(0, AddonStatus.SUCCEEDED) - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.SUCCEEDED.ui_string(), - ) - self.test_object._update_addon_status(0, AddonStatus.FAILED) - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.FAILED.ui_string(), - ) - - def test_process_next_update(self): - self.test_object._setup_dialog() - self.test_object._launch_active_installer = lambda: None - self.test_object._process_next_update() - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.INSTALLING.ui_string(), - ) - - self.test_object._process_next_update() - self.assertEqual( - self.test_object.dialog.tableWidget.item(1, 2).text(), - AddonStatus.INSTALLING.ui_string(), - ) - - self.test_object._process_next_update() - self.assertEqual( - self.test_object.dialog.tableWidget.item(2, 2).text(), - AddonStatus.INSTALLING.ui_string(), - ) - - self.test_object._process_next_update() - - def test_launch_active_installer(self): - self.test_object.active_installer = self.factory.get_updater(self.addons[0]) - self.test_object._update_succeeded = lambda _: None - self.test_object._update_failed = lambda _: None - self.test_object.process_next_update = lambda: None - self.test_object._launch_active_installer() - # The above call does not block, so spin until it has completed (basically instantly in testing) - while self.test_object.worker_thread.isRunning(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) - self.test_object.dialog.accept() - - def test_update_succeeded(self): - self.test_object._setup_dialog() - self.test_object._update_succeeded(self.addons[0]) - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.SUCCEEDED.ui_string(), - ) - - def test_update_failed(self): - self.test_object._setup_dialog() - self.test_object._update_failed(self.addons[0]) - self.assertEqual( - self.test_object.dialog.tableWidget.item(0, 2).text(), - AddonStatus.FAILED.ui_string(), - ) - - def test_update_finished(self): - self.test_object._setup_dialog() - call_interceptor = CallInterceptor() - self.test_object.worker_thread = QtCore.QThread() - self.test_object.worker_thread.start() - self.test_object._process_next_update = call_interceptor.intercept - self.test_object.active_installer = self.factory.get_updater(self.addons[0]) - self.test_object._update_finished() - self.assertFalse(self.test_object.worker_thread.isRunning()) - self.test_object.worker_thread.quit() - self.assertTrue(call_interceptor.called) - self.test_object.worker_thread.wait() - - def test_finalize(self): - self.test_object._setup_dialog() - self.test_object.worker_thread = QtCore.QThread() - self.test_object.worker_thread.start() - self.test_object._finalize() - self.assertFalse(self.test_object.worker_thread.isRunning()) - self.test_object.worker_thread.quit() - self.test_object.worker_thread.wait() - self.assertFalse(self.test_object.running) - self.assertIsNotNone( - self.test_object.dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Close) - ) - self.assertIsNone( - self.test_object.dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel) - ) - - def test_is_running(self): - self.assertFalse(self.test_object.is_running()) - self.test_object.run() - self.assertTrue(self.test_object.is_running()) - while self.test_object.is_running(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) - self.test_object.dialog.accept() diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_widget_progress_bar.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_widget_progress_bar.py deleted file mode 100644 index 1e6dca06a6..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_widget_progress_bar.py +++ /dev/null @@ -1,145 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import sys -import unittest - -sys.path.append("../..") - -from Widgets.addonmanager_widget_progress_bar import Progress - - -class TestProgress(unittest.TestCase): - - def test_default_construction(self): - """Given no parameters, a single-task Progress object is initialized with zero progress""" - progress = Progress() - self.assertEqual(progress.status_text, "") - self.assertEqual(progress.number_of_tasks, 1) - self.assertEqual(progress.current_task, 0) - self.assertEqual(progress.current_task_progress, 0.0) - - def test_good_parameters(self): - """Given good parameters, no exception is raised""" - _ = Progress( - status_text="Some text", number_of_tasks=1, current_task=0, current_task_progress=0.0 - ) - - def test_zero_task_count(self): - with self.assertRaises(ValueError): - _ = Progress(number_of_tasks=0) - - def test_negative_task_count(self): - with self.assertRaises(ValueError): - _ = Progress(number_of_tasks=-1) - - def test_setting_status_post_creation(self): - progress = Progress() - self.assertEqual(progress.status_text, "") - progress.status_text = "Some status" - self.assertEqual(progress.status_text, "Some status") - - def test_setting_task_count(self): - progress = Progress() - progress.number_of_tasks = 10 - self.assertEqual(progress.number_of_tasks, 10) - - def test_setting_negative_task_count(self): - progress = Progress() - with self.assertRaises(ValueError): - progress.number_of_tasks = -1 - - def test_setting_invalid_task_count(self): - progress = Progress() - with self.assertRaises(TypeError): - progress.number_of_tasks = 3.14159 - - def test_setting_current_task(self): - progress = Progress(number_of_tasks=10) - progress.number_of_tasks = 5 - self.assertEqual(progress.number_of_tasks, 5) - - def test_setting_current_task_greater_than_task_count(self): - progress = Progress() - progress.number_of_tasks = 10 - with self.assertRaises(ValueError): - progress.current_task = 11 - - def test_setting_current_task_equal_to_task_count(self): - """current_task is zero-indexed, so this is too high""" - progress = Progress() - progress.number_of_tasks = 10 - with self.assertRaises(ValueError): - progress.current_task = 10 - - def test_setting_current_task_negative(self): - progress = Progress() - with self.assertRaises(ValueError): - progress.current_task = -1 - - def test_setting_current_task_invalid(self): - progress = Progress() - with self.assertRaises(TypeError): - progress.current_task = 2.718281 - - def test_setting_current_task_progress(self): - progress = Progress() - progress.current_task_progress = 50.0 - self.assertEqual(progress.current_task_progress, 50.0) - - def test_setting_current_task_progress_too_low(self): - progress = Progress() - progress.current_task_progress = -0.01 - self.assertEqual(progress.current_task_progress, 0.0) - - def test_setting_current_task_progress_too_high(self): - progress = Progress() - progress.current_task_progress = 100.001 - self.assertEqual(progress.current_task_progress, 100.0) - - def test_incrementing_task(self): - progress = Progress(number_of_tasks=10, current_task_progress=100.0) - progress.next_task() - self.assertEqual(progress.current_task, 1) - self.assertEqual(progress.current_task_progress, 0.0) - - def test_incrementing_task_too_high(self): - progress = Progress(number_of_tasks=10, current_task=9, current_task_progress=100.0) - with self.assertRaises(ValueError): - progress.next_task() - - def test_overall_progress_simple(self): - progress = Progress() - self.assertEqual(progress.overall_progress(), 0.0) - - def test_overall_progress_with_ranges(self): - progress = Progress(number_of_tasks=2, current_task=1, current_task_progress=0.0) - self.assertAlmostEqual(progress.overall_progress(), 0.5) - - def test_overall_progress_with_ranges_and_progress(self): - progress = Progress(number_of_tasks=10, current_task=5, current_task_progress=50.0) - self.assertAlmostEqual(progress.overall_progress(), 0.55) - - -if __name__ == "__main__": - unittest.main() diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_workers_startup.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_workers_startup.py deleted file mode 100644 index c3dda4b72a..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_workers_startup.py +++ /dev/null @@ -1,200 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import json -import unittest -import os -import tempfile - -import FreeCAD - -from PySide import QtCore - -import NetworkManager -from Addon import Addon -from addonmanager_workers_startup import ( - CreateAddonListWorker, - LoadPackagesFromCacheWorker, - LoadMacrosFromCacheWorker, -) - -run_slow_tests = False - - -class TestWorkersStartup(unittest.TestCase): - - MODULE = "test_workers_startup" # file name without extension - - @unittest.skipUnless(run_slow_tests, "This integration test is slow and uses the network") - def setUp(self): - """Set up the test""" - self.test_dir = os.path.join( - FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data" - ) - - self.saved_mod_directory = Addon.mod_directory - self.saved_cache_directory = Addon.cache_directory - Addon.mod_directory = os.path.join(tempfile.gettempdir(), "FreeCADTesting", "Mod") - Addon.cache_directory = os.path.join(tempfile.gettempdir(), "FreeCADTesting", "Cache") - - os.makedirs(Addon.mod_directory, mode=0o777, exist_ok=True) - os.makedirs(Addon.cache_directory, mode=0o777, exist_ok=True) - - url = "https://api.github.com/zen" - NetworkManager.InitializeNetworkManager() - result = NetworkManager.AM_NETWORK_MANAGER.blocking_get(url) - if result is None: - self.skipTest("No active internet connection detected") - - self.addon_list = [] - self.macro_counter = 0 - self.workbench_counter = 0 - self.prefpack_counter = 0 - self.addon_from_cache_counter = 0 - self.macro_from_cache_counter = 0 - - self.package_cache = {} - self.macro_cache = [] - - self.package_cache_filename = os.path.join(Addon.cache_directory, "packages.json") - self.macro_cache_filename = os.path.join(Addon.cache_directory, "macros.json") - - # Store the user's preference for whether git is enabled or disabled - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - self.saved_git_disabled_status = pref.GetBool("disableGit", False) - - def tearDown(self): - """Tear down the test""" - Addon.mod_directory = self.saved_mod_directory - Addon.cache_directory = self.saved_cache_directory - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - pref.SetBool("disableGit", self.saved_git_disabled_status) - - def test_create_addon_list_worker(self): - """Test whether any addons are added: runs the full query, so this potentially is a SLOW - test.""" - worker = CreateAddonListWorker() - worker.addon_repo.connect(self._addon_added) - worker.start() - while worker.isRunning(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50) - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - - self.assertGreater(self.macro_counter, 0, "No macros returned") - self.assertGreater(self.workbench_counter, 0, "No workbenches returned") - - # Make sure there are no duplicates: - addon_name_set = set() - for addon in self.addon_list: - addon_name_set.add(addon.name) - self.assertEqual( - len(addon_name_set), len(self.addon_list), "Duplicate names are not allowed" - ) - - # Write the cache data - if hasattr(self, "package_cache"): - with open(self.package_cache_filename, "w", encoding="utf-8") as f: - f.write(json.dumps(self.package_cache, indent=" ")) - if hasattr(self, "macro_cache"): - with open(self.macro_cache_filename, "w", encoding="utf-8") as f: - f.write(json.dumps(self.macro_cache, indent=" ")) - - original_macro_counter = self.macro_counter - original_addon_list = self.addon_list.copy() - self.macro_counter = 0 - self.workbench_counter = 0 - self.addon_list.clear() - - # Now try loading the same data from the cache we just created - worker = LoadPackagesFromCacheWorker(self.package_cache_filename) - worker.override_metadata_cache_path(os.path.join(Addon.cache_directory, "PackageMetadata")) - worker.addon_repo.connect(self._addon_added) - - worker.start() - while worker.isRunning(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50) - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - - worker = LoadMacrosFromCacheWorker(self.macro_cache_filename) - worker.add_macro_signal.connect(self._addon_added) - - worker.start() - while worker.isRunning(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50) - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - - # Make sure that every addon in the original list is also in the new list - fail_counter = 0 - for original_addon in original_addon_list: - found = False - for addon in self.addon_list: - if addon.name == original_addon.name: - found = True - break - if not found: - print(f"Failed to load {addon.name} from cache") - fail_counter += 1 - self.assertEqual(fail_counter, 0) - - # Make sure there are no duplicates: - addon_name_set.clear() - for addon in self.addon_list: - addon_name_set.add(addon.name) - - self.assertEqual(len(addon_name_set), len(self.addon_list)) - self.assertEqual(len(original_addon_list), len(self.addon_list)) - - self.assertEqual( - original_macro_counter, - self.macro_counter, - "Cache loaded a different number of macros", - ) - # We can't check workbench and preference pack counting at this point, because that relies - # on the package.xml metadata file, which this test does not download. - - def test_create_addon_list_git_disabled(self): - """If the user has git enabled, also test the addon manager with git disabled""" - if self.saved_git_disabled_status: - self.skipTest("Git is disabled, this test is redundant") - - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - pref.SetBool("disableGit", True) - - self.test_create_addon_list_worker() - - def _addon_added(self, addon: Addon): - """Callback for adding an Addon: tracks the list, and counts the various types""" - print(f"Addon added: {addon.name}") - self.addon_list.append(addon) - if addon.contains_workbench(): - self.workbench_counter += 1 - if addon.contains_macro(): - self.macro_counter += 1 - if addon.contains_preference_pack(): - self.prefpack_counter += 1 - - # Also record the information for cache purposes - if addon.macro is None: - self.package_cache[addon.name] = addon.to_cache() - else: - self.macro_cache.append(addon.macro.to_cache()) diff --git a/src/Mod/AddonManager/AddonManagerTest/gui/test_workers_utility.py b/src/Mod/AddonManager/AddonManagerTest/gui/test_workers_utility.py deleted file mode 100644 index cea77491aa..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/gui/test_workers_utility.py +++ /dev/null @@ -1,78 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import unittest -import os -import FreeCAD -from addonmanager_workers_utility import ConnectionChecker -from PySide import QtCore - -import NetworkManager - - -class TestWorkersUtility(unittest.TestCase): - - MODULE = "test_workers_utility" # file name without extension - - @unittest.skip("Test is slow and uses the network: refactor!") - def setUp(self): - self.test_dir = os.path.join( - FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data" - ) - self.last_result = None - - url = "https://api.github.com/zen" - NetworkManager.InitializeNetworkManager() - result = NetworkManager.AM_NETWORK_MANAGER.blocking_get(url) - if result is None: - self.skipTest("No active internet connection detected") - - def test_connection_checker_basic(self): - """Tests the connection checking worker's basic operation: does not exit until worker thread completes""" - worker = ConnectionChecker() - worker.success.connect(self.connection_succeeded) - worker.failure.connect(self.connection_failed) - self.last_result = None - worker.start() - while worker.isRunning(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50) - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - self.assertEqual(self.last_result, "SUCCESS") - - def test_connection_checker_thread_interrupt(self): - worker = ConnectionChecker() - worker.success.connect(self.connection_succeeded) - worker.failure.connect(self.connection_failed) - self.last_result = None - worker.start() - worker.requestInterruption() - while worker.isRunning(): - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50) - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - self.assertIsNone(self.last_result, "Requesting interruption of thread failed to interrupt") - - def connection_succeeded(self): - self.last_result = "SUCCESS" - - def connection_failed(self): - self.last_result = "FAILURE" diff --git a/src/Mod/AddonManager/AddonManagerTest/test_information.md b/src/Mod/AddonManager/AddonManagerTest/test_information.md deleted file mode 100644 index 5df8cbc554..0000000000 --- a/src/Mod/AddonManager/AddonManagerTest/test_information.md +++ /dev/null @@ -1,3 +0,0 @@ -## Unit tests for the Addon Manager - -Data files are located in the `data/` subdirectory. diff --git a/src/Mod/AddonManager/AddonStats.py b/src/Mod/AddonManager/AddonStats.py deleted file mode 100644 index 4cf7b319ac..0000000000 --- a/src/Mod/AddonManager/AddonStats.py +++ /dev/null @@ -1,81 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Classes and structures related to Addon sidecar information""" -from __future__ import annotations - -from dataclasses import dataclass -from datetime import datetime -from typing import Optional - -import addonmanager_freecad_interface as fci - - -def to_int_or_zero(inp: [str | int | None]): - try: - return int(inp) - except TypeError: - return 0 - - -def time_string_to_datetime(inp: str) -> Optional[datetime]: - try: - return datetime.fromisoformat(inp) - except ValueError: - try: - # Support for the trailing "Z" was added in Python 3.11 -- strip it and see if it works now - return datetime.fromisoformat(inp[:-1]) - except ValueError: - fci.Console.PrintWarning(f"Unable to parse '{str}' as a Python datetime") - return None - - -@dataclass -class AddonStats: - """Statistics about an addon: not all stats apply to all addon types""" - - last_update_time: datetime | None = None - date_created: datetime | None = None - stars: int = 0 - open_issues: int = 0 - forks: int = 0 - license: str = "" - page_views_last_month: int = 0 - - @classmethod - def from_json(cls, json_dict: dict): - new_stats = AddonStats() - if "pushed_at" in json_dict: - new_stats.last_update_time = time_string_to_datetime(json_dict["pushed_at"]) - if "created_at" in json_dict: - new_stats.date_created = time_string_to_datetime(json_dict["created_at"]) - if "stargazers_count" in json_dict: - new_stats.stars = to_int_or_zero(json_dict["stargazers_count"]) - if "forks_count" in json_dict: - new_stats.forks = to_int_or_zero(json_dict["forks_count"]) - if "open_issues_count" in json_dict: - new_stats.open_issues = to_int_or_zero(json_dict["open_issues_count"]) - if "license" in json_dict: - if json_dict["license"] != "NOASSERTION" and json_dict["license"] != "None": - new_stats.license = json_dict["license"] # Might be None or "NOASSERTION" - return new_stats diff --git a/src/Mod/AddonManager/CMakeLists.txt b/src/Mod/AddonManager/CMakeLists.txt deleted file mode 100644 index 895b5e3bd2..0000000000 --- a/src/Mod/AddonManager/CMakeLists.txt +++ /dev/null @@ -1,189 +0,0 @@ -IF (BUILD_GUI) - PYSIDE_WRAP_RC(AddonManager_QRC_SRCS Resources/AddonManager.qrc) - add_subdirectory(Widgets) -ENDIF (BUILD_GUI) - -SET(AddonManager_SRCS - ALLOWED_PYTHON_PACKAGES.txt - Addon.py - AddonManager.py - AddonManager.ui - AddonManagerOptions.py - AddonManagerOptions.ui - AddonManagerOptions_AddCustomRepository.ui - AddonStats.py - Init.py - InitGui.py - NetworkManager.py - PythonDependencyUpdateDialog.ui - TestAddonManagerApp.py - add_toolbar_button_dialog.ui - addonmanager_cache.py - addonmanager_connection_checker.py - addonmanager_dependency_installer.py - addonmanager_devmode.py - addonmanager_devmode_add_content.py - addonmanager_devmode_license_selector.py - addonmanager_devmode_licenses_table.py - addonmanager_devmode_metadata_checker.py - addonmanager_devmode_people_table.py - addonmanager_devmode_person_editor.py - addonmanager_devmode_predictor.py - addonmanager_devmode_validators.py - addonmanager_firstrun.py - addonmanager_freecad_interface.py - addonmanager_git.py - addonmanager_installer.py - addonmanager_installer_gui.py - addonmanager_licenses.py - addonmanager_macro.py - addonmanager_macro_parser.py - addonmanager_metadata.py - addonmanager_package_details_controller.py - addonmanager_preferences_defaults.json - addonmanager_pyside_interface.py - addonmanager_python_deps_gui.py - addonmanager_readme_controller.py - addonmanager_uninstaller.py - addonmanager_uninstaller_gui.py - addonmanager_update_all_gui.py - addonmanager_utilities.py - addonmanager_workers_installation.py - addonmanager_workers_startup.py - addonmanager_workers_utility.py - change_branch.py - change_branch.ui - compact_view.py - composite_view.py - dependency_resolution_dialog.ui - developer_mode.ui - developer_mode_add_content.ui - developer_mode_advanced_freecad_versions.ui - developer_mode_copyright_info.ui - developer_mode_dependencies.ui - developer_mode_edit_dependency.ui - developer_mode_freecad_versions.ui - developer_mode_license.ui - developer_mode_licenses_table.ui - developer_mode_people.ui - developer_mode_people_table.ui - developer_mode_select_from_list.ui - developer_mode_tags.ui - expanded_view.py - first_run.ui - install_to_toolbar.py - loading.html - package_list.py - select_toolbar_dialog.ui - update_all.ui -) -IF (BUILD_GUI) - LIST(APPEND AddonManager_SRCS TestAddonManagerGui.py) -ENDIF (BUILD_GUI) - -SOURCE_GROUP("" FILES ${AddonManager_SRCS}) - -SET(AddonManagerTests_SRCS - AddonManagerTest/__init__.py - AddonManagerTest/test_information.md -) - -SET(AddonManagerTestsApp_SRCS - AddonManagerTest/app/__init__.py - AddonManagerTest/app/mocks.py - AddonManagerTest/app/test_addon.py - AddonManagerTest/app/test_addoncatalog.py - AddonManagerTest/app/test_cache.py - AddonManagerTest/app/test_dependency_installer.py - AddonManagerTest/app/test_freecad_interface.py - AddonManagerTest/app/test_git.py - AddonManagerTest/app/test_installer.py - AddonManagerTest/app/test_macro.py - AddonManagerTest/app/test_macro_parser.py - AddonManagerTest/app/test_metadata.py - AddonManagerTest/app/test_uninstaller.py - AddonManagerTest/app/test_utilities.py -) - -SET(AddonManagerTestsGui_SRCS - AddonManagerTest/gui/__init__.py - AddonManagerTest/gui/gui_mocks.py - AddonManagerTest/gui/test_gui.py - AddonManagerTest/gui/test_installer_gui.py - AddonManagerTest/gui/test_python_deps_gui.py - AddonManagerTest/gui/test_uninstaller_gui.py - AddonManagerTest/gui/test_update_all_gui.py - AddonManagerTest/gui/test_widget_progress_bar.py - AddonManagerTest/gui/test_workers_startup.py - AddonManagerTest/gui/test_workers_utility.py -) - -SET(AddonManagerTestsFiles_SRCS - AddonManagerTest/data/__init__.py - AddonManagerTest/data/addon_update_stats.json - AddonManagerTest/data/bundle_only.xml - AddonManagerTest/data/combination.xml - AddonManagerTest/data/corrupted_metadata.zip - AddonManagerTest/data/depends_on_all_workbenches.xml - AddonManagerTest/data/DoNothing.FCMacro - AddonManagerTest/data/git_submodules.txt - AddonManagerTest/data/good_package.xml - AddonManagerTest/data/icon_cache.zip - AddonManagerTest/data/icon_cache.zip.sha1 - AddonManagerTest/data/macro_only.xml - AddonManagerTest/data/macro_template.FCStd - AddonManagerTest/data/MacrosRecipesWikiPage.zip - AddonManagerTest/data/metadata.zip - AddonManagerTest/data/missing_macro_metadata.FCStd - AddonManagerTest/data/other_only.xml - AddonManagerTest/data/prefpack_only.xml - AddonManagerTest/data/test_addon_with_fcmacro.zip - AddonManagerTest/data/test_github_style_repo.zip - AddonManagerTest/data/test_repo.zip - AddonManagerTest/data/test_simple_repo.zip - AddonManagerTest/data/test_version_detection.xml - AddonManagerTest/data/TestWorkbench.zip - AddonManagerTest/data/workbench_only.xml -) - -SET(AddonManagerTests_ALL - ${AddonManagerTests_SRCS} - ${AddonManagerTestsApp_SRCS} - ${AddonManagerTestsFiles_SRCS} - ) - -IF (BUILD_GUI) - LIST(APPEND AddonManagerTests_ALL ${AddonManagerTestsGui_SRCS}) -ENDIF (BUILD_GUI) - -ADD_CUSTOM_TARGET(AddonManager ALL - SOURCES ${AddonManager_SRCS} ${AddonManager_QRC_SRCS} -) - -ADD_CUSTOM_TARGET(AddonManagerTests ALL - SOURCES ${AddonManagerTests_ALL} -) - -fc_copy_sources(AddonManager "${CMAKE_BINARY_DIR}/Mod/AddonManager" ${AddonManager_SRCS}) - -fc_copy_sources(AddonManagerTests "${CMAKE_BINARY_DIR}/Mod/AddonManager" ${AddonManagerTests_ALL}) - -IF (BUILD_GUI) - fc_target_copy_resource(AddonManager - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_BINARY_DIR}/Mod/AddonManager - AddonManager_rc.py) -ENDIF (BUILD_GUI) - -INSTALL( - FILES - ${AddonManager_SRCS} - ${AddonManager_QRC_SRCS} - DESTINATION - Mod/AddonManager -) - -INSTALL(FILES ${AddonManagerTests_SRCS} DESTINATION Mod/AddonManager/AddonManagerTest) -INSTALL(FILES ${AddonManagerTestsApp_SRCS} DESTINATION Mod/AddonManager/AddonManagerTest/app) -INSTALL(FILES ${AddonManagerTestsGui_SRCS} DESTINATION Mod/AddonManager/AddonManagerTest/gui) -INSTALL(FILES ${AddonManagerTestsFiles_SRCS} DESTINATION Mod/AddonManager/AddonManagerTest/data) diff --git a/src/Mod/AddonManager/Init.py b/src/Mod/AddonManager/Init.py deleted file mode 100644 index a09c412a0b..0000000000 --- a/src/Mod/AddonManager/Init.py +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# FreeCAD init script of the AddonManager module -# (c) 2001 Juergen Riegel -# License LGPL - -import FreeCAD - -FreeCAD.__unit_test__ += ["TestAddonManagerApp"] diff --git a/src/Mod/AddonManager/InitGui.py b/src/Mod/AddonManager/InitGui.py deleted file mode 100644 index 3173fd107d..0000000000 --- a/src/Mod/AddonManager/InitGui.py +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# AddonManager gui init module -# (c) 2001 Juergen Riegel -# License LGPL - -import AddonManager - -FreeCADGui.addLanguagePath(":/translations") -FreeCADGui.addCommand("Std_AddonMgr", AddonManager.CommandAddonManager()) - -import FreeCAD - -FreeCAD.__unit_test__ += ["TestAddonManagerGui"] diff --git a/src/Mod/AddonManager/NetworkManager.py b/src/Mod/AddonManager/NetworkManager.py deleted file mode 100644 index 34b91d7f88..0000000000 --- a/src/Mod/AddonManager/NetworkManager.py +++ /dev/null @@ -1,714 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -""" -############################################################################# -# -# ABOUT NETWORK MANAGER -# -# A wrapper around QNetworkAccessManager providing proxy-handling -# capabilities, and simplified access to submitting requests from any -# application thread. -# -# -# USAGE -# -# Once imported, this file provides access to a global object called -# AM_NETWORK_MANAGER. This is a QObject running on the main thread, but -# designed to be interacted with from any other application thread. It -# provides two principal methods: submit_unmonitored_get() and -# submit_monitored_get(). Use the unmonitored version for small amounts of -# data (suitable for caching in RAM, and without a need to show a progress -# bar during download), and the monitored version for larger amounts of data. -# Both functions take a URL, and return an integer index. That index allows -# tracking of the completed request by attaching to the signals completed(), -# progress_made(), and progress_complete(). All three provide, as the first -# argument to the signal, the index of the request the signal refers to. -# Code attached to those signals should filter them to look for the indices -# of the requests they care about. Requests may complete in any order. -# -# A secondary blocking interface is also provided, for very short network -# accesses: the blocking_get() function blocks until the network transmission -# is complete, directly returning a QByteArray object with the received data. -# Do not run on the main GUI thread! -""" - -import threading -import os -import queue -import itertools -import tempfile -import sys -from typing import Dict, List, Optional -from urllib.parse import urlparse - -try: - import FreeCAD - - if FreeCAD.GuiUp: - import FreeCADGui - - HAVE_FREECAD = True - translate = FreeCAD.Qt.translate -except ImportError: - # For standalone testing support working without the FreeCAD import - HAVE_FREECAD = False - -from PySide import QtCore - -if FreeCAD.GuiUp: - from PySide import QtWidgets - - -# This is the global instance of the NetworkManager that outside code -# should access -AM_NETWORK_MANAGER = None - -HAVE_QTNETWORK = True -try: - from PySide import QtNetwork -except ImportError: - if HAVE_FREECAD: - FreeCAD.Console.PrintError( - translate( - "AddonsInstaller", - 'Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork")', - ) - + "\n" - ) - else: - print("Could not import QtNetwork, unable to test this file.") - sys.exit(1) - HAVE_QTNETWORK = False - -if HAVE_QTNETWORK: - - # Added in Qt 5.15 - if hasattr(QtNetwork.QNetworkRequest, "DefaultTransferTimeoutConstant"): - timeoutConstant = QtNetwork.QNetworkRequest.DefaultTransferTimeoutConstant - if hasattr(timeoutConstant, "value"): - # Qt 6 changed the timeout constant to have a 'value' attribute. - # The function setTransferTimeout does not accept - # DefaultTransferTimeoutConstant of type - # QtNetwork.QNetworkRequest.TransferTimeoutConstant any - # longer but only an int. - default_timeout = timeoutConstant.value - else: - # In Qt 5.15 we can use the timeoutConstant as is. - default_timeout = timeoutConstant - else: - default_timeout = 30000 - - class QueueItem: - """A container for information about an item in the network queue.""" - - def __init__(self, index: int, request: QtNetwork.QNetworkRequest, track_progress: bool): - self.index = index - self.request = request - self.original_url = request.url() - self.track_progress = track_progress - - class NetworkManager(QtCore.QObject): - """A single global instance of NetworkManager is instantiated and stored as - AM_NETWORK_MANAGER. Outside threads should send GET requests to this class by - calling the submit_unmonitored_request() or submit_monitored_request() function, - as needed. See the documentation of those functions for details.""" - - # Connect to complete for requests with no progress monitoring (e.g. small amounts of data) - completed = QtCore.Signal( - int, int, QtCore.QByteArray - ) # Index, http response code, received data (if any) - - # Connect to progress_made and progress_complete for large amounts of data, which get buffered into a temp file - # That temp file should be deleted when your code is done with it - progress_made = QtCore.Signal(int, int, int) # Index, bytes read, total bytes (may be None) - - progress_complete = QtCore.Signal( - int, int, os.PathLike - ) # Index, http response code, filename - - __request_queued = QtCore.Signal() - - def __init__(self): - super().__init__() - - self.counting_iterator = itertools.count() - self.queue = queue.Queue() - self.__last_started_index = 0 - self.__abort_when_found: List[int] = [] - self.replies: Dict[int, QtNetwork.QNetworkReply] = {} - self.file_buffers = {} - - # We support an arbitrary number of threads using synchronous GET calls: - self.synchronous_lock = threading.Lock() - self.synchronous_complete: Dict[int, bool] = {} - self.synchronous_result_data: Dict[int, QtCore.QByteArray] = {} - - # Make sure we exit nicely on quit - if QtCore.QCoreApplication.instance() is not None: - QtCore.QCoreApplication.instance().aboutToQuit.connect(self.__aboutToQuit) - - # Create the QNAM on this thread: - self.QNAM = QtNetwork.QNetworkAccessManager() - self.QNAM.proxyAuthenticationRequired.connect(self.__authenticate_proxy) - self.QNAM.authenticationRequired.connect(self.__authenticate_resource) - self.QNAM.setRedirectPolicy(QtNetwork.QNetworkRequest.ManualRedirectPolicy) - - qnam_cache = QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.CacheLocation) - os.makedirs(qnam_cache, exist_ok=True) - self.diskCache = QtNetwork.QNetworkDiskCache() - self.diskCache.setCacheDirectory(qnam_cache) - self.QNAM.setCache(self.diskCache) - - self.monitored_connections: List[int] = [] - self._setup_proxy() - - # A helper connection for our blocking interface - self.completed.connect(self.__synchronous_process_completion) - - # Set up our worker connection - self.__request_queued.connect(self.__setup_network_request) - - def _setup_proxy(self): - """Set up the proxy based on user preferences or prompts on command line""" - - # Set up the proxy, if necessary: - if HAVE_FREECAD: - ( - noProxyCheck, - systemProxyCheck, - userProxyCheck, - proxy_string, - ) = self._setup_proxy_freecad() - else: - ( - noProxyCheck, - systemProxyCheck, - userProxyCheck, - proxy_string, - ) = self._setup_proxy_standalone() - - if noProxyCheck: - pass - elif systemProxyCheck: - query = QtNetwork.QNetworkProxyQuery( - QtCore.QUrl("https://github.com/FreeCAD/FreeCAD") - ) - proxy = QtNetwork.QNetworkProxyFactory.systemProxyForQuery(query) - if proxy and proxy[0]: - self.QNAM.setProxy(proxy[0]) # This may still be QNetworkProxy.NoProxy - elif userProxyCheck: - try: - parsed_url = urlparse(proxy_string) - host = parsed_url.hostname - port = parsed_url.port - scheme = ( - "http" if parsed_url.scheme == "https" else parsed_url.scheme - ) # There seems no https type: doc.qt.io/qt-6/qnetworkproxy.html#ProxyType-enum - except ValueError: - FreeCAD.Console.PrintError( - translate( - "AddonsInstaller", - "Failed to parse proxy URL '{}'", - ).format(proxy_string) - + "\n" - ) - return - - FreeCAD.Console.PrintMessage(f"Using proxy {scheme}://{host}:{port} \n") - if scheme == "http": - _scheme = QtNetwork.QNetworkProxy.HttpProxy - elif scheme == "socks5": - _scheme = QtNetwork.QNetworkProxy.Socks5Proxy - else: - FreeCAD.Console.PrintWarning(f"Unknown proxy scheme '{scheme}', using http. \n") - _scheme = QtNetwork.QNetworkProxy.HttpProxy - proxy = QtNetwork.QNetworkProxy(_scheme, host, port) - self.QNAM.setProxy(proxy) - - def _setup_proxy_freecad(self): - """If we are running within FreeCAD, this uses the config data to set up the proxy""" - noProxyCheck = True - systemProxyCheck = False - userProxyCheck = False - proxy_string = "" - pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - noProxyCheck = pref.GetBool("NoProxyCheck", noProxyCheck) - systemProxyCheck = pref.GetBool("SystemProxyCheck", systemProxyCheck) - userProxyCheck = pref.GetBool("UserProxyCheck", userProxyCheck) - proxy_string = pref.GetString("ProxyUrl", "") - - # Add some error checking to the proxy setup, since for historical reasons they - # are independent booleans, rather than an enumeration: - option_count = [noProxyCheck, systemProxyCheck, userProxyCheck].count(True) - if option_count != 1: - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "Parameter error: mutually exclusive proxy options set. Resetting to default.", - ) - + "\n" - ) - noProxyCheck = True - systemProxyCheck = False - userProxyCheck = False - pref.SetBool("NoProxyCheck", noProxyCheck) - pref.SetBool("SystemProxyCheck", systemProxyCheck) - pref.SetBool("UserProxyCheck", userProxyCheck) - - if userProxyCheck and not proxy_string: - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "Parameter error: user proxy indicated, but no proxy provided. Resetting to default.", - ) - + "\n" - ) - noProxyCheck = True - userProxyCheck = False - pref.SetBool("NoProxyCheck", noProxyCheck) - pref.SetBool("UserProxyCheck", userProxyCheck) - return noProxyCheck, systemProxyCheck, userProxyCheck, proxy_string - - def _setup_proxy_standalone(self): - """If we are NOT running inside FreeCAD, prompt the user for proxy information""" - noProxyCheck = True - systemProxyCheck = False - userProxyCheck = False - proxy_string = "" - print("Please select a proxy type:") - print("1) No proxy") - print("2) Use system proxy settings") - print("3) Custom proxy settings") - result = input("Choice: ") - if result == "1": - pass - elif result == "2": - noProxyCheck = False - systemProxyCheck = True - elif result == "3": - noProxyCheck = False - userProxyCheck = True - proxy_string = input("Enter your proxy server (host:port): ") - else: - print(f"Got {result}, expected 1, 2, or 3.") - app.quit() - return noProxyCheck, systemProxyCheck, userProxyCheck, proxy_string - - def __aboutToQuit(self): - """Called when the application is about to quit. Not currently used.""" - - def __setup_network_request(self): - """Get the next request off the queue and launch it.""" - try: - item = self.queue.get_nowait() - if item: - if item.index in self.__abort_when_found: - self.__abort_when_found.remove(item.index) - return # Do not do anything with this item, it's been aborted... - if item.track_progress: - self.monitored_connections.append(item.index) - self.__launch_request(item.index, item.request) - except queue.Empty: - pass - - def __launch_request(self, index: int, request: QtNetwork.QNetworkRequest) -> None: - """Given a network request, ask the QNetworkAccessManager to begin processing it.""" - reply = self.QNAM.get(request) - self.replies[index] = reply - - self.__last_started_index = index - reply.finished.connect(self.__reply_finished) - reply.sslErrors.connect(self.__on_ssl_error) - if index in self.monitored_connections: - reply.readyRead.connect(self.__ready_to_read) - reply.downloadProgress.connect(self.__download_progress) - - def submit_unmonitored_get( - self, - url: str, - timeout_ms: int = default_timeout, - ) -> int: - """Adds this request to the queue, and returns an index that can be used by calling code - in conjunction with the completed() signal to handle the results of the call. All data is - kept in memory, and the completed() call includes a direct handle to the bytes returned. It - is not called until the data transfer has finished and the connection is closed.""" - - current_index = next(self.counting_iterator) # A thread-safe counter - # Use a queue because we can only put things on the QNAM from the main event loop thread - self.queue.put( - QueueItem( - current_index, self.__create_get_request(url, timeout_ms), track_progress=False - ) - ) - self.__request_queued.emit() - return current_index - - def submit_monitored_get( - self, - url: str, - timeout_ms: int = default_timeout, - ) -> int: - """Adds this request to the queue, and returns an index that can be used by calling code - in conjunction with the progress_made() and progress_completed() signals to handle the - results of the call. All data is cached to disk, and progress is reported periodically - as the underlying QNetworkReply reports its progress. The progress_completed() signal - contains a path to a temporary file with the stored data. Calling code should delete this - file when done with it (or move it into its final place, etc.).""" - - current_index = next(self.counting_iterator) # A thread-safe counter - # Use a queue because we can only put things on the QNAM from the main event loop thread - self.queue.put( - QueueItem( - current_index, self.__create_get_request(url, timeout_ms), track_progress=True - ) - ) - self.__request_queued.emit() - return current_index - - def blocking_get( - self, - url: str, - timeout_ms: int = default_timeout, - ) -> Optional[QtCore.QByteArray]: - """Submits a GET request to the QNetworkAccessManager and block until it is complete""" - - current_index = next(self.counting_iterator) # A thread-safe counter - with self.synchronous_lock: - self.synchronous_complete[current_index] = False - - self.queue.put( - QueueItem( - current_index, self.__create_get_request(url, timeout_ms), track_progress=False - ) - ) - self.__request_queued.emit() - while True: - if QtCore.QThread.currentThread().isInterruptionRequested(): - return None - QtCore.QCoreApplication.processEvents() - with self.synchronous_lock: - if self.synchronous_complete[current_index]: - break - - with self.synchronous_lock: - self.synchronous_complete.pop(current_index) - if current_index in self.synchronous_result_data: - return self.synchronous_result_data.pop(current_index) - return None - - def __synchronous_process_completion( - self, index: int, code: int, data: QtCore.QByteArray - ) -> None: - """Check the return status of a completed process, and handle its returned data (if - any).""" - with self.synchronous_lock: - if index in self.synchronous_complete: - if code == 200: - self.synchronous_result_data[index] = data - else: - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "Addon Manager: Unexpected {} response from server", - ).format(code) - + "\n" - ) - self.synchronous_complete[index] = True - - @staticmethod - def __create_get_request(url: str, timeout_ms: int) -> QtNetwork.QNetworkRequest: - """Construct a network request to a given URL""" - request = QtNetwork.QNetworkRequest(QtCore.QUrl(url)) - request.setAttribute( - QtNetwork.QNetworkRequest.RedirectPolicyAttribute, - QtNetwork.QNetworkRequest.ManualRedirectPolicy, - ) - request.setAttribute(QtNetwork.QNetworkRequest.CacheSaveControlAttribute, True) - request.setAttribute( - QtNetwork.QNetworkRequest.CacheLoadControlAttribute, - QtNetwork.QNetworkRequest.PreferNetwork, - ) - if hasattr(request, "setTransferTimeout"): - # Added in Qt 5.15 - # In Qt 5, the function setTransferTimeout seems to accept - # DefaultTransferTimeoutConstant of type - # PySide2.QtNetwork.QNetworkRequest.TransferTimeoutConstant, - # whereas in Qt 6, the function seems to only accept an - # integer. - request.setTransferTimeout(timeout_ms) - return request - - def abort_all(self): - """Abort ALL network calls in progress, including clearing the queue""" - for reply in self.replies.values(): - if reply.abort().isRunning(): - reply.abort() - while True: - try: - self.queue.get() - self.queue.task_done() - except queue.Empty: - break - - def abort(self, index: int): - """Abort a specific request""" - if index in self.replies and self.replies[index].isRunning(): - self.replies[index].abort() - elif index < self.__last_started_index: - # It's still in the queue. Mark it for later destruction. - self.__abort_when_found.append(index) - - def __authenticate_proxy( - self, - reply: QtNetwork.QNetworkProxy, - authenticator: QtNetwork.QAuthenticator, - ): - """If proxy authentication is required, attempt to authenticate. If the GUI is running this displays - a window asking for credentials. If the GUI is not running, it prompts on the command line. - """ - if HAVE_FREECAD and FreeCAD.GuiUp: - proxy_authentication = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "proxy_authentication.ui") - ) - # Show the right labels, etc. - proxy_authentication.labelProxyAddress.setText(f"{reply.hostName()}:{reply.port()}") - if authenticator.realm(): - proxy_authentication.labelProxyRealm.setText(authenticator.realm()) - else: - proxy_authentication.labelProxyRealm.hide() - proxy_authentication.labelRealmCaption.hide() - result = proxy_authentication.exec() - if result == QtWidgets.QDialogButtonBox.Ok: - authenticator.setUser(proxy_authentication.lineEditUsername.text()) - authenticator.setPassword(proxy_authentication.lineEditPassword.text()) - else: - username = input("Proxy username: ") - import getpass - - password = getpass.getpass() - authenticator.setUser(username) - authenticator.setPassword(password) - - def __authenticate_resource( - self, - _reply: QtNetwork.QNetworkReply, - _authenticator: QtNetwork.QAuthenticator, - ): - """Unused.""" - - def __on_ssl_error(self, reply: str, errors: List[str] = None): - """Called when an SSL error occurs: prints the error information.""" - if HAVE_FREECAD: - FreeCAD.Console.PrintWarning( - translate("AddonsInstaller", "Error with encrypted connection") + "\n:" - ) - FreeCAD.Console.PrintWarning(reply) - if errors is not None: - for error in errors: - FreeCAD.Console.PrintWarning(error) - else: - print("Error with encrypted connection") - if errors is not None: - for error in errors: - print(error) - - def __download_progress(self, bytesReceived: int, bytesTotal: int) -> None: - """Monitors download progress and emits a progress_made signal""" - sender = self.sender() - if not sender: - return - for index, reply in self.replies.items(): - if reply == sender: - self.progress_made.emit(index, bytesReceived, bytesTotal) - return - - def __ready_to_read(self) -> None: - """Called when data is available, this reads that data.""" - sender = self.sender() - if not sender: - return - - for index, reply in self.replies.items(): - if reply == sender: - self.__data_incoming(index, reply) - return - - def __data_incoming(self, index: int, reply: QtNetwork.QNetworkReply) -> None: - """Read incoming data and attach it to a data object""" - if not index in self.replies: - # We already finished this reply, this is a vestigial signal - return - buffer = reply.readAll() - if not index in self.file_buffers: - f = tempfile.NamedTemporaryFile("wb", delete=False) - self.file_buffers[index] = f - else: - f = self.file_buffers[index] - try: - f.write(buffer.data()) - except OSError as e: - if HAVE_FREECAD: - FreeCAD.Console.PrintError(f"Network Manager internal error: {str(e)}") - else: - print(f"Network Manager internal error: {str(e)}") - - def __reply_finished(self) -> None: - """Called when a reply has been completed: this makes sure the data has been read and - any notifications have been called.""" - reply = self.sender() - if not reply: - # This can happen during a cancellation operation: silently do nothing - return - - index = None - for key, value in self.replies.items(): - if reply == value: - index = key - break - if index is None: - return - - response_code = reply.attribute(QtNetwork.QNetworkRequest.HttpStatusCodeAttribute) - redirect_codes = [301, 302, 303, 305, 307, 308] - if response_code in redirect_codes: # This is a redirect - timeout_ms = default_timeout - if hasattr(reply, "request"): - request = reply.request() - if hasattr(request, "transferTimeout"): - timeout_ms = request.transferTimeout() - new_url = reply.attribute(QtNetwork.QNetworkRequest.RedirectionTargetAttribute) - self.__launch_request(index, self.__create_get_request(new_url, timeout_ms)) - return # The task is not done, so get out of this method now - if reply.error() != QtNetwork.QNetworkReply.NetworkError.OperationCanceledError: - # It this was not a timeout, make sure we mark the queue task done - self.queue.task_done() - if reply.error() == QtNetwork.QNetworkReply.NetworkError.NoError: - if index in self.monitored_connections: - # Make sure to read any remaining data - self.__data_incoming(index, reply) - self.monitored_connections.remove(index) - f = self.file_buffers[index] - f.close() - self.progress_complete.emit(index, response_code, f.name) - else: - data = reply.readAll() - self.completed.emit(index, response_code, data) - else: - FreeCAD.Console.PrintWarning(f"Request failed: {reply.error()} \n") - if index in self.monitored_connections: - self.progress_complete.emit(index, response_code, "") - else: - self.completed.emit(index, response_code, None) - self.replies.pop(index) - -else: # HAVE_QTNETWORK is false: - - class NetworkManager(QtCore.QObject): - """A dummy class to enable an offline mode when the QtNetwork package is not yet installed""" - - completed = QtCore.Signal( - int, int, bytes - ) # Emitted as soon as the request is made, with a connection failed error - progress_made = QtCore.Signal(int, int, int) # Never emitted, no progress is made here - progress_complete = QtCore.Signal( - int, int, os.PathLike - ) # Emitted as soon as the request is made, with a connection failed error - - def __init__(self): - super().__init__() - self.monitored_queue = queue.Queue() - self.unmonitored_queue = queue.Queue() - - def submit_unmonitored_request(self, _) -> int: - """Returns a fake index that can be used for testing -- nothing is actually queued""" - current_index = next(itertools.count()) - self.unmonitored_queue.put(current_index) - return current_index - - def submit_monitored_request(self, _) -> int: - """Returns a fake index that can be used for testing -- nothing is actually queued""" - current_index = next(itertools.count()) - self.monitored_queue.put(current_index) - return current_index - - def blocking_get(self, _: str) -> QtCore.QByteArray: - """No operation - returns None immediately""" - return None - - def abort_all( - self, - ): - """There is nothing to abort in this case""" - - def abort(self, _): - """There is nothing to abort in this case""" - - -def InitializeNetworkManager(): - """Called once at the beginning of program execution to create the appropriate manager object""" - global AM_NETWORK_MANAGER - if AM_NETWORK_MANAGER is None: - AM_NETWORK_MANAGER = NetworkManager() - - -if __name__ == "__main__": - app = QtCore.QCoreApplication() - - InitializeNetworkManager() - - count = 0 - - # For testing, create several network requests and send them off in quick succession: - # (Choose small downloads, no need for significant data) - urls = [ - "https://api.github.com/zen", - "http://climate.ok.gov/index.php/climate/rainfall_table/local_data", - "https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/AIANNHA/MapServer", - ] - - def handle_completion(index: int, code: int, data): - """Attached to the completion signal, prints diagnostic information about the network access""" - global count - if code == 200: - print(f"For request {index+1}, response was {data.size()} bytes.", flush=True) - else: - print( - f"For request {index+1}, request failed with HTTP result code {code}", - flush=True, - ) - - count += 1 - if count >= len(urls): - print("Shutting down...", flush=True) - AM_NETWORK_MANAGER.requestInterruption() - AM_NETWORK_MANAGER.wait(5000) - app.quit() - - AM_NETWORK_MANAGER.completed.connect(handle_completion) - for test_url in urls: - AM_NETWORK_MANAGER.submit_unmonitored_get(test_url) - - app.exec_() - - print("Done with all requests.") diff --git a/src/Mod/AddonManager/PythonDependencyUpdateDialog.ui b/src/Mod/AddonManager/PythonDependencyUpdateDialog.ui deleted file mode 100644 index af32fadc5e..0000000000 --- a/src/Mod/AddonManager/PythonDependencyUpdateDialog.ui +++ /dev/null @@ -1,109 +0,0 @@ - - - PythonDependencyUpdateDialog - - - - 0 - 0 - 528 - 300 - - - - Manage Python Dependencies - - - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - true - - - - - - - placeholder for path - - - Qt::TextSelectableByMouse - - - - - - - true - - - QAbstractItemView::SelectRows - - - true - - - 5 - - - true - - - false - - - - Package name - - - - - Installed version - - - - - Available version - - - - - Used by - - - - - - - - - - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - true - - - - - - - - - Update all available - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/AddonManager.qrc b/src/Mod/AddonManager/Resources/AddonManager.qrc deleted file mode 100644 index e8b651c079..0000000000 --- a/src/Mod/AddonManager/Resources/AddonManager.qrc +++ /dev/null @@ -1,127 +0,0 @@ - - - icons/preferences-addon_manager.svg - icons/3D_Printing_Tools_workbench_icon.svg - icons/AddonMgrWithWarning.svg - icons/A2plus_workbench_icon.svg - icons/AirPlaneDesign_workbench_icon.svg - icons/ArchTextures_workbench_icon.svg - icons/Assembly4_workbench_icon.svg - icons/BCFPlugin_workbench_icon.svg - icons/BIMBots_workbench_icon.svg - icons/BIM_workbench_icon.svg - icons/BOLTSFC_workbench_icon.svg - icons/CADExchanger_workbench_icon.svg - icons/cadquery_module_workbench_icon.svg - icons/Cfd_workbench_icon.svg - icons/CfdOF_workbench_icon.svg - icons/CurvedShapes_workbench_icon.svg - icons/Curves_workbench_icon.svg - icons/Defeaturing_workbench_icon.svg - icons/DesignSPHysics_workbench_icon.svg - icons/dodo_workbench_icon.svg - icons/DynamicData_workbench_icon.svg - icons/EM_workbench_icon.svg - icons/ExplodedAssembly_workbench_icon.svg - icons/ExtMan_workbench_icon.svg - icons/fasteners_workbench_icon.svg - icons/flamingo_workbench_icon.svg - icons/FEM_FrontISTR_workbench_icon.svg - icons/GDML_workbench_icon.svg - icons/GDT_workbench_icon.svg - icons/FCGear_workbench_icon.svg - icons/Geomatics_workbench_icon.svg - icons/ImportNURBS_workbench_icon.svg - icons/InventorLoader_workbench_icon.svg - icons/kicadStepUpMod_workbench_icon.svg - icons/lattice2_workbench_icon.svg - icons/LCInterlocking_workbench_icon.svg - icons/Lithophane_workbench_icon.svg - icons/Maker_workbench_icon.svg - icons/Manipulator_workbench_icon.svg - icons/Marz_workbench_icon.svg - icons/MeshRemodel_workbench_icon.svg - icons/ModernUI_workbench_icon.svg - icons/MOOC_workbench_icon.svg - icons/MnesarcoUtils_workbench_icon.svg - icons/OSE3dPrinter_workbench_icon.svg - icons/Part-o-magic_workbench_icon.svg - icons/Plot_workbench_icon.svg - icons/POV-Ray-Rendering_workbench_icon.svg - icons/Pyramids-and-Polyhedrons_workbench_icon.svg - icons/pyrate_workbench_icon.svg - icons/Reinforcement_workbench_icon.svg - icons/Reporting_workbench_icon.svg - icons/Render_workbench_icon.svg - icons/Rocket_workbench_icon.svg - icons/sheetmetal_workbench_icon.svg - icons/slic3r-tools_workbench_icon.svg - icons/Ship_workbench_icon.svg - icons/Silk_workbench_icon.svg - icons/TaackPLM_workbench_icon.svg - icons/timber_workbench_icon.svg - icons/ThreadProfile_workbench_icon.svg - icons/WebTools_workbench_icon.svg - icons/workfeature_workbench_icon.svg - icons/yaml-workspace_workbench_icon.svg - icons/compact_view.svg - icons/composite_view.svg - icons/expanded_view.svg - icons/sort_ascending.svg - icons/sort_descending.svg - licenses/Apache-2.0.txt - licenses/BSD-2-Clause.txt - licenses/BSD-3-Clause.txt - licenses/CC0-1.0.txt - licenses/GPL-2.0-or-later.txt - licenses/GPL-3.0-or-later.txt - licenses/LGPL-2.1-or-later.txt - licenses/LGPL-3.0-or-later.txt - licenses/MIT.txt - licenses/MPL-2.0.txt - licenses/spdx.json - translations/AddonManager_af.qm - translations/AddonManager_ar.qm - translations/AddonManager_ca.qm - translations/AddonManager_cs.qm - translations/AddonManager_de.qm - translations/AddonManager_el.qm - translations/AddonManager_es-ES.qm - translations/AddonManager_eu.qm - translations/AddonManager_fi.qm - translations/AddonManager_fil.qm - translations/AddonManager_fr.qm - translations/AddonManager_gl.qm - translations/AddonManager_hr.qm - translations/AddonManager_hu.qm - translations/AddonManager_id.qm - translations/AddonManager_it.qm - translations/AddonManager_ja.qm - translations/AddonManager_kab.qm - translations/AddonManager_ko.qm - translations/AddonManager_lt.qm - translations/AddonManager_nl.qm - translations/AddonManager_no.qm - translations/AddonManager_pl.qm - translations/AddonManager_pt-BR.qm - translations/AddonManager_pt-PT.qm - translations/AddonManager_ro.qm - translations/AddonManager_ru.qm - translations/AddonManager_sk.qm - translations/AddonManager_sl.qm - translations/AddonManager_sr.qm - translations/AddonManager_sv-SE.qm - translations/AddonManager_tr.qm - translations/AddonManager_uk.qm - translations/AddonManager_val-ES.qm - translations/AddonManager_vi.qm - translations/AddonManager_zh-CN.qm - translations/AddonManager_zh-TW.qm - translations/AddonManager_es-AR.qm - translations/AddonManager_bg.qm - translations/AddonManager_ka.qm - translations/AddonManager_sr-CS.qm - translations/AddonManager_be.qm - translations/AddonManager_da.qm - - diff --git a/src/Mod/AddonManager/Resources/icons/3D_Printing_Tools_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/3D_Printing_Tools_workbench_icon.svg deleted file mode 100644 index 4c3cfa8827..0000000000 --- a/src/Mod/AddonManager/Resources/icons/3D_Printing_Tools_workbench_icon.svg +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/A2plus_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/A2plus_workbench_icon.svg deleted file mode 100644 index 5e5162a293..0000000000 --- a/src/Mod/AddonManager/Resources/icons/A2plus_workbench_icon.svg +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - Path-Stock - 2015-07-04 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/AddonMgrWithWarning.svg b/src/Mod/AddonManager/Resources/icons/AddonMgrWithWarning.svg deleted file mode 100644 index 8bcf1cfa9d..0000000000 --- a/src/Mod/AddonManager/Resources/icons/AddonMgrWithWarning.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/AirPlaneDesign_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/AirPlaneDesign_workbench_icon.svg deleted file mode 100644 index 03f4896f8e..0000000000 --- a/src/Mod/AddonManager/Resources/icons/AirPlaneDesign_workbench_icon.svg +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/ArchTextures_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/ArchTextures_workbench_icon.svg deleted file mode 100644 index 3acdd00c6b..0000000000 --- a/src/Mod/AddonManager/Resources/icons/ArchTextures_workbench_icon.svg +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Assembly4_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Assembly4_workbench_icon.svg deleted file mode 100644 index 36005737ed..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Assembly4_workbench_icon.svg +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - Path-Stock - 2015-07-04 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/BCFPlugin_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/BCFPlugin_workbench_icon.svg deleted file mode 100644 index ccf9f03b06..0000000000 --- a/src/Mod/AddonManager/Resources/icons/BCFPlugin_workbench_icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/Mod/AddonManager/Resources/icons/BIMBots_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/BIMBots_workbench_icon.svg deleted file mode 100644 index 59cf6d7395..0000000000 --- a/src/Mod/AddonManager/Resources/icons/BIMBots_workbench_icon.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/BIM_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/BIM_workbench_icon.svg deleted file mode 100644 index 73a41130b7..0000000000 --- a/src/Mod/AddonManager/Resources/icons/BIM_workbench_icon.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/BOLTSFC_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/BOLTSFC_workbench_icon.svg deleted file mode 100644 index ce124ff301..0000000000 --- a/src/Mod/AddonManager/Resources/icons/BOLTSFC_workbench_icon.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/CADExchanger_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/CADExchanger_workbench_icon.svg deleted file mode 100644 index 49ff8dfa50..0000000000 --- a/src/Mod/AddonManager/Resources/icons/CADExchanger_workbench_icon.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/CfdOF_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/CfdOF_workbench_icon.svg deleted file mode 100644 index 9db1fd2cbf..0000000000 --- a/src/Mod/AddonManager/Resources/icons/CfdOF_workbench_icon.svg +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Cfd_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Cfd_workbench_icon.svg deleted file mode 100644 index 1652933f31..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Cfd_workbench_icon.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/CurvedShapes_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/CurvedShapes_workbench_icon.svg deleted file mode 100644 index 9473fea256..0000000000 --- a/src/Mod/AddonManager/Resources/icons/CurvedShapes_workbench_icon.svg +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - image/svg+xml - - FreeCAD SVG Export - - - - - FreeCAD SVG Export - Drawing page: Page exported from FreeCAD document: horten_wing - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Curves_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Curves_workbench_icon.svg deleted file mode 100644 index 7986716229..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Curves_workbench_icon.svg +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Defeaturing_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Defeaturing_workbench_icon.svg deleted file mode 100644 index ab9980ced3..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Defeaturing_workbench_icon.svg +++ /dev/null @@ -1,347 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [Yorik van Havre] - - - Arch_Pipe_Tree - 2016-08-24 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Arch/Resources/icons/Arch_Pipe_Tree.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/DesignSPHysics_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/DesignSPHysics_workbench_icon.svg deleted file mode 100644 index de9106a89e..0000000000 --- a/src/Mod/AddonManager/Resources/icons/DesignSPHysics_workbench_icon.svg +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/DynamicData_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/DynamicData_workbench_icon.svg deleted file mode 100644 index c46277fd3f..0000000000 --- a/src/Mod/AddonManager/Resources/icons/DynamicData_workbench_icon.svg +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/EM_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/EM_workbench_icon.svg deleted file mode 100644 index 66486fc6e1..0000000000 --- a/src/Mod/AddonManager/Resources/icons/EM_workbench_icon.svg +++ /dev/null @@ -1,602 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [triplus] - - - ArchWorkbench - 2016-02-26 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Arch/Resources/icons/ArchWorkbench.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/ExplodedAssembly_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/ExplodedAssembly_workbench_icon.svg deleted file mode 100644 index 6879a75884..0000000000 --- a/src/Mod/AddonManager/Resources/icons/ExplodedAssembly_workbench_icon.svg +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/ExtMan_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/ExtMan_workbench_icon.svg deleted file mode 100644 index ae29e44317..0000000000 --- a/src/Mod/AddonManager/Resources/icons/ExtMan_workbench_icon.svg +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/FCGear_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/FCGear_workbench_icon.svg deleted file mode 100644 index 3579612b1a..0000000000 --- a/src/Mod/AddonManager/Resources/icons/FCGear_workbench_icon.svg +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/FEM_FrontISTR_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/FEM_FrontISTR_workbench_icon.svg deleted file mode 100644 index 4c3fe05d44..0000000000 --- a/src/Mod/AddonManager/Resources/icons/FEM_FrontISTR_workbench_icon.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/GDML_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/GDML_workbench_icon.svg deleted file mode 100644 index acdf4bd819..0000000000 --- a/src/Mod/AddonManager/Resources/icons/GDML_workbench_icon.svg +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [triplus] - - - OpenSCADWorkbench - 2016-02-26 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/OpenSCAD/Resources/icons/OpenSCADWorkbench.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/GDT_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/GDT_workbench_icon.svg deleted file mode 100644 index ea4ef88e68..0000000000 --- a/src/Mod/AddonManager/Resources/icons/GDT_workbench_icon.svg +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Geomatics_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Geomatics_workbench_icon.svg deleted file mode 100644 index e39563c820..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Geomatics_workbench_icon.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 diff --git a/src/Mod/AddonManager/Resources/icons/ImportNURBS_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/ImportNURBS_workbench_icon.svg deleted file mode 100644 index 7446dd70dd..0000000000 --- a/src/Mod/AddonManager/Resources/icons/ImportNURBS_workbench_icon.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/InventorLoader_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/InventorLoader_workbench_icon.svg deleted file mode 100644 index c1292a311d..0000000000 --- a/src/Mod/AddonManager/Resources/icons/InventorLoader_workbench_icon.svg +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/LCInterlocking_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/LCInterlocking_workbench_icon.svg deleted file mode 100644 index c3957ff9f5..0000000000 --- a/src/Mod/AddonManager/Resources/icons/LCInterlocking_workbench_icon.svg +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Lithophane_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Lithophane_workbench_icon.svg deleted file mode 100644 index 1101468760..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Lithophane_workbench_icon.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/MOOC_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/MOOC_workbench_icon.svg deleted file mode 100644 index f79589f108..0000000000 --- a/src/Mod/AddonManager/Resources/icons/MOOC_workbench_icon.svg +++ /dev/null @@ -1,1175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Maker_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Maker_workbench_icon.svg deleted file mode 100644 index f1e2c9143e..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Maker_workbench_icon.svg +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Manipulator_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Manipulator_workbench_icon.svg deleted file mode 100644 index 80cb90ea8f..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Manipulator_workbench_icon.svg +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Mon Oct 10 13:44:52 2011 +0000 - - - [wmayer] - - - - - FreeCAD LGPL2+ - - - - - FreeCAD - - - FreeCAD/src/Mod/Draft/Resources/icons/Draft_Move.svg - https://www.freecad.org/wiki/index.php?title=Artwork - - - [agryson] Alexander Gryson - - - - - arrow - move - arrows - compass - cross - - - Four equally sized arrow heads at 90° to each other, all joined at the tail - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Marz_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Marz_workbench_icon.svg deleted file mode 100644 index 7e76002095..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Marz_workbench_icon.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/MeshRemodel_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/MeshRemodel_workbench_icon.svg deleted file mode 100644 index 44a68477de..0000000000 --- a/src/Mod/AddonManager/Resources/icons/MeshRemodel_workbench_icon.svg +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/MnesarcoUtils_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/MnesarcoUtils_workbench_icon.svg deleted file mode 100644 index 55097cf050..0000000000 --- a/src/Mod/AddonManager/Resources/icons/MnesarcoUtils_workbench_icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/ModernUI_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/ModernUI_workbench_icon.svg deleted file mode 100644 index e0b3a738b1..0000000000 --- a/src/Mod/AddonManager/Resources/icons/ModernUI_workbench_icon.svg +++ /dev/null @@ -1,259 +0,0 @@ - - - Modern UI Logo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Modern UI Logo - - - [bitacovir] - - - - - - CC BY - - - 04-20-2020 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/OSE3dPrinter_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/OSE3dPrinter_workbench_icon.svg deleted file mode 100644 index fdacc3d703..0000000000 --- a/src/Mod/AddonManager/Resources/icons/OSE3dPrinter_workbench_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - -image/svg+xml - diff --git a/src/Mod/AddonManager/Resources/icons/POV-Ray-Rendering_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/POV-Ray-Rendering_workbench_icon.svg deleted file mode 100644 index 6931e1e02a..0000000000 --- a/src/Mod/AddonManager/Resources/icons/POV-Ray-Rendering_workbench_icon.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Part-o-magic_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Part-o-magic_workbench_icon.svg deleted file mode 100644 index 1b4675d0fc..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Part-o-magic_workbench_icon.svg +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Plot_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Plot_workbench_icon.svg deleted file mode 100644 index 1bb0f53a02..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Plot_workbench_icon.svg +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [triplus] - - - PlotWorkbench - 2016-02-26 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Plot/resources/icons/PlotWorkbench.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Pyramids-and-Polyhedrons_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Pyramids-and-Polyhedrons_workbench_icon.svg deleted file mode 100644 index 55c0ccd4b9..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Pyramids-and-Polyhedrons_workbench_icon.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Reinforcement_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Reinforcement_workbench_icon.svg deleted file mode 100644 index e1aa380dd3..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Reinforcement_workbench_icon.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [Yorik van Havre] - - - Arch_Rebar - 2013-10-07 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Arch/Resources/icons/Arch_Rebar.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Render_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Render_workbench_icon.svg deleted file mode 100644 index 8ce9fbfdc6..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Render_workbench_icon.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Reporting_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Reporting_workbench_icon.svg deleted file mode 100644 index d9a0fdd1ac..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Reporting_workbench_icon.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Rocket_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Rocket_workbench_icon.svg deleted file mode 100644 index 8e96d0b952..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Rocket_workbench_icon.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Ship_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Ship_workbench_icon.svg deleted file mode 100644 index 60fd9d3bf0..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Ship_workbench_icon.svg +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [triplus] - - - ShipWorkbench - 2016-02-26 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Ship/resources/icons/ShipWorkbench.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [agryson] Alexander Gryson - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/Silk_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/Silk_workbench_icon.svg deleted file mode 100644 index 7885882baf..0000000000 --- a/src/Mod/AddonManager/Resources/icons/Silk_workbench_icon.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/TaackPLM_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/TaackPLM_workbench_icon.svg deleted file mode 100644 index 39e96c180d..0000000000 --- a/src/Mod/AddonManager/Resources/icons/TaackPLM_workbench_icon.svg +++ /dev/null @@ -1,40 +0,0 @@ - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/ThreadProfile_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/ThreadProfile_workbench_icon.svg deleted file mode 100644 index c730b07e22..0000000000 --- a/src/Mod/AddonManager/Resources/icons/ThreadProfile_workbench_icon.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/WebTools_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/WebTools_workbench_icon.svg deleted file mode 100644 index dcc27e5f7e..0000000000 --- a/src/Mod/AddonManager/Resources/icons/WebTools_workbench_icon.svg +++ /dev/null @@ -1,277 +0,0 @@ - - - - - WebTool Addon Logo - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - WebTool Addon Logo - - - [bitacovir] - - - Part_Box - 2019-10-16 - https://forum.freecad.org/viewtopic.php?f=34&t=40130&p=341411#p341411 - - - FreeCAD - - - - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/cadquery_module_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/cadquery_module_workbench_icon.svg deleted file mode 100644 index c716c26200..0000000000 --- a/src/Mod/AddonManager/Resources/icons/cadquery_module_workbench_icon.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/compact_view.svg b/src/Mod/AddonManager/Resources/icons/compact_view.svg deleted file mode 100644 index 93ad359ef6..0000000000 --- a/src/Mod/AddonManager/Resources/icons/compact_view.svg +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/composite_view.svg b/src/Mod/AddonManager/Resources/icons/composite_view.svg deleted file mode 100644 index 10a62d0a9b..0000000000 --- a/src/Mod/AddonManager/Resources/icons/composite_view.svg +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/dodo_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/dodo_workbench_icon.svg deleted file mode 100644 index fff4d48dce..0000000000 --- a/src/Mod/AddonManager/Resources/icons/dodo_workbench_icon.svg +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/expanded_view.svg b/src/Mod/AddonManager/Resources/icons/expanded_view.svg deleted file mode 100644 index 40c94243a0..0000000000 --- a/src/Mod/AddonManager/Resources/icons/expanded_view.svg +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/fasteners_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/fasteners_workbench_icon.svg deleted file mode 100644 index 8710de1d64..0000000000 --- a/src/Mod/AddonManager/Resources/icons/fasteners_workbench_icon.svg +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/flamingo_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/flamingo_workbench_icon.svg deleted file mode 100644 index a709f5b55f..0000000000 --- a/src/Mod/AddonManager/Resources/icons/flamingo_workbench_icon.svg +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/kicadStepUpMod_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/kicadStepUpMod_workbench_icon.svg deleted file mode 100644 index 3b9262de23..0000000000 --- a/src/Mod/AddonManager/Resources/icons/kicadStepUpMod_workbench_icon.svg +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/lattice2_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/lattice2_workbench_icon.svg deleted file mode 100644 index afc3f68588..0000000000 --- a/src/Mod/AddonManager/Resources/icons/lattice2_workbench_icon.svg +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/preferences-addon_manager.svg b/src/Mod/AddonManager/Resources/icons/preferences-addon_manager.svg deleted file mode 100644 index bc1330a0d7..0000000000 --- a/src/Mod/AddonManager/Resources/icons/preferences-addon_manager.svg +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/pyrate_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/pyrate_workbench_icon.svg deleted file mode 100644 index 3652724320..0000000000 --- a/src/Mod/AddonManager/Resources/icons/pyrate_workbench_icon.svg +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/sheetmetal_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/sheetmetal_workbench_icon.svg deleted file mode 100644 index ebb90f1bdd..0000000000 --- a/src/Mod/AddonManager/Resources/icons/sheetmetal_workbench_icon.svg +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/Mod/Sketcher/Gui/Resources/icons/Sketcher_CreateArc.svg - - - FreeCAD LGPL2+ - - - 2023-12-19 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/slic3r-tools_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/slic3r-tools_workbench_icon.svg deleted file mode 100644 index fe806c21c9..0000000000 --- a/src/Mod/AddonManager/Resources/icons/slic3r-tools_workbench_icon.svg +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/sort_ascending.svg b/src/Mod/AddonManager/Resources/icons/sort_ascending.svg deleted file mode 100644 index c7d42ad5cb..0000000000 --- a/src/Mod/AddonManager/Resources/icons/sort_ascending.svg +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/sort_descending.svg b/src/Mod/AddonManager/Resources/icons/sort_descending.svg deleted file mode 100644 index 08566e8d87..0000000000 --- a/src/Mod/AddonManager/Resources/icons/sort_descending.svg +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - [maxwxyz] - - - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - FreeCAD/src/ - - - FreeCAD LGPL2+ - - - 2024 - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/timber_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/timber_workbench_icon.svg deleted file mode 100644 index 61dfbf8d4b..0000000000 --- a/src/Mod/AddonManager/Resources/icons/timber_workbench_icon.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/icons/workfeature_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/workfeature_workbench_icon.svg deleted file mode 100644 index c3edfe078f..0000000000 --- a/src/Mod/AddonManager/Resources/icons/workfeature_workbench_icon.svg +++ /dev/null @@ -1,452 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - W - p - - diff --git a/src/Mod/AddonManager/Resources/icons/yaml-workspace_workbench_icon.svg b/src/Mod/AddonManager/Resources/icons/yaml-workspace_workbench_icon.svg deleted file mode 100644 index e8662f1427..0000000000 --- a/src/Mod/AddonManager/Resources/icons/yaml-workspace_workbench_icon.svg +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - [wmayer] - - - Part_Box - 2011-10-10 - https://www.freecad.org/wiki/index.php?title=Artwork - - - FreeCAD - - - Resources/icons/YAML_workbench_icon.svg - - - FreeCAD LGPL2+ - - - https://www.gnu.org/copyleft/lesser.html - - - [bitacovir] - - - - - - - - - - - - - - diff --git a/src/Mod/AddonManager/Resources/licenses/Apache-2.0.txt b/src/Mod/AddonManager/Resources/licenses/Apache-2.0.txt deleted file mode 100644 index d645695673..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/Apache-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/Mod/AddonManager/Resources/licenses/BSD-2-Clause.txt b/src/Mod/AddonManager/Resources/licenses/BSD-2-Clause.txt deleted file mode 100644 index b6e0e031a3..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/BSD-2-Clause.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright <%%YEAR%%> <%%COPYRIGHT HOLDER%%> - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions -and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other materials provided with -the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/Mod/AddonManager/Resources/licenses/BSD-3-Clause.txt b/src/Mod/AddonManager/Resources/licenses/BSD-3-Clause.txt deleted file mode 100644 index fe112b08ea..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/BSD-3-Clause.txt +++ /dev/null @@ -1,23 +0,0 @@ -Copyright <%%YEAR%%> <%%COPYRIGHT HOLDER%%> - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions -and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other materials provided with -the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to -endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/Mod/AddonManager/Resources/licenses/CC0-1.0.txt b/src/Mod/AddonManager/Resources/licenses/CC0-1.0.txt deleted file mode 100644 index ae39b2e3cd..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/CC0-1.0.txt +++ /dev/null @@ -1,97 +0,0 @@ -CC0 1.0 Universal - -CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF -THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS -INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS -DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES -RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and -Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") -of an original work of authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for the purpose of -contributing to a commons of creative, cultural and scientific works ("Commons") that the public -can reliably and without fear of later claims of infringement build upon, modify, incorporate in -other works, reuse and redistribute as freely as possible in any form whatsoever and for any -purposes, including without limitation commercial purposes. These owners may contribute to the -Commons to promote the ideal of a free culture and the further production of creative, cultural -and scientific works, or to gain reputation or greater distribution for their Work in part through -the use and efforts of others. - -For these and/or other purposes and motivations, and without any expectation of additional -consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the -extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects -to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or -her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on -those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and -related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights -include, but are not limited to, the following: - -the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; -moral rights retained by the original author(s) and/or performer(s); -publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; -rights protecting against unfair competition in regards to a Work, subject to the limitations in -paragraph 4(a), below; -rights protecting the extraction, dissemination, use and reuse of data in a Work; -database rights (such as those arising under Directive 96/9/EC of the European Parliament and of -the Council of 11 March 1996 on the legal protection of databases, and under any national -implementation thereof, including any amended or successor version of such directive); and -other similar, equivalent or corresponding rights throughout the world based on applicable -law or treaty, and any national implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, -Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, -and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as future claims and causes -of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided -by applicable law or treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the -Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's -heirs and successors, fully intending that such Waiver shall not be subject to revocation, -rescission, cancellation, termination, or any other legal or equitable action to disrupt the -quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of -Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason be judged legally -invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum -extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, -non-transferable, non sublicensable, non exclusive, irrevocable and unconditional license to -exercise Affirmer's Copyright and Related Rights in the Work -(i) in all territories worldwide, -(ii) for the maximum duration provided by applicable law or treaty (including future time -extensions), -(iii) in any current or future medium and for any number of copies, and -(iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional -purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by -Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or -ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate -the remainder of the License, and in such case Affirmer hereby affirms that he or she will not -(i) exercise any of his or her remaining Copyright and Related Rights in the Work or -(ii) assert any associated claims and causes of action with respect to the Work, in either case -contrary to Affirmer's express Statement of Purpose. - -4. Limitations and Disclaimers. - -No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or -otherwise affected by this document. - -Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning -the Work, express, implied, statutory or otherwise, including without limitation warranties of -title, merchantability, fitness for a particular purpose, non infringement, or the absence of -latent or other defects, accuracy, or the present or absence of errors, whether or not -discoverable, all to the greatest extent permissible under applicable law. - -Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work -or any use thereof, including without limitation any person's Copyright and Related Rights in the -Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions -or other rights required for any use of the Work. - -Affirmer understands and acknowledges that Creative Commons is not a party to this document and has -no duty or obligation with respect to this CC0 or use of the Work. diff --git a/src/Mod/AddonManager/Resources/licenses/GPL-2.0-or-later.txt b/src/Mod/AddonManager/Resources/licenses/GPL-2.0-or-later.txt deleted file mode 100644 index 0503436feb..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/GPL-2.0-or-later.txt +++ /dev/null @@ -1,265 +0,0 @@ -GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - -Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing -it is not allowed. - -Preamble - -The licenses for most software are designed to take away your freedom to share and change it. By -contrast, the GNU General Public License is intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. This General Public License -applies to most of the Free Software Foundation's software and to any other program whose authors -commit to using it. (Some other Free Software Foundation software is covered by the GNU Library -General Public License instead.) You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses -are designed to make sure that you have the freedom to distribute copies of free software (and -charge for this service if you wish), that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free programs; and that you know you can -do these things. - -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or -to ask you to surrender the rights. These restrictions translate to certain responsibilities for you -if you distribute copies of the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must give -the recipients all the rights that you have. You must make sure that they, too, receive or can get -the source code. And you must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) offer you this license -which gives you legal permission to copy, distribute and/or modify the software. - -Also, for each author's protection and ours, we want to make certain that everyone understands that -there is no warranty for this free software. If the software is modified by someone else and passed -on, we want its recipients to know that what they have is not the original, so that any problems -introduced by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger -that redistributors of a free program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any patent must be licensed for -everyone's free use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a notice placed by the copyright -holder saying it may be distributed under the terms of this General Public License. The "Program", -below, refers to any such program or work, and a "work based on the Program" means either the -Program or any derivative work under copyright law: that is to say, a work containing the Program or -a portion of it, either verbatim or with modifications and/or translated into another language. -(Hereinafter, translation is included without limitation in the term "modification".) Each licensee -is addressed as "you". - -Activities other than copying, distribution and modification are not covered by this License; they -are outside its scope. The act of running the Program is not restricted, and the output from the -Program is covered only if its contents constitute a work based on the Program (independent of -having been made by running the Program). Whether that is true depends on what the Program does. - -1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in -any medium, provided that you conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License -and to the absence of any warranty; and give any other recipients of the Program a copy of this -License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer -warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based -on the Program, and copy and distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - -a) You must cause the modified files to carry prominent notices stating that you changed the files -and the date of any change. - -b) You must cause any work that you distribute or publish, that in whole or in part contains or is -derived from the Program or any part thereof, to be licensed as a whole at no charge to all third -parties under the terms of this License. - -c) If the modified program normally reads commands interactively when run, you must cause it, when -started running for such interactive use in the most ordinary way, to print or display an -announcement including an appropriate copyright notice and a notice that there is no warranty (or -else, saying that you provide a warranty) and that users may redistribute the program under these -conditions, and telling the user how to view a copy of this License. (Exception: if the Program -itself is interactive but does not normally print such an announcement, your work based on the -Program is not required to print an announcement.) These requirements apply to the modified work as -a whole. If identifiable sections of that work are not derived from the Program, and can be -reasonably considered independent and separate works in themselves, then this License, and its -terms, do not apply to those sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based on the Program, the -distribution of the whole must be on the terms of this License, whose permissions for other -licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written -entirely by you; rather, the intent is to exercise the right to control the distribution of -derivative or collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program with the Program (or with a -work based on the Program) on a volume of a storage or distribution medium does not bring the other -work under the scope of this License. - -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code -or executable form under the terms of Sections 1 and 2 above provided that you also do one of the -following: - -a) Accompany it with the complete corresponding machine-readable source code, which must be -distributed under the terms of Sections 1 and 2 above on a medium customarily used for software -interchange; or, - -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a -charge no more than your cost of physically performing source distribution, a complete -machine-readable copy of the corresponding source code, to be distributed under the terms of -Sections 1 and 2 above on a medium customarily used for software interchange; or, - -c) Accompany it with the information you received as to the offer to distribute corresponding source -code. (This alternative is allowed only for noncommercial distribution and only if you received the -program in object code or executable form with such an offer, in accord with Subsection b above.) -The source code for a work means the preferred form of the work for making modifications to it. For -an executable work, complete source code means all the source code for all modules it contains, plus -any associated interface definition files, plus the scripts used to control compilation and -installation of the executable. However, as a special exception, the source code distributed need -not include anything that is normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on which the executable runs, -unless that component itself accompanies the executable. - -If distribution of executable or object code is made by offering access to copy from a designated -place, then offering equivalent access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not compelled to copy the source -along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided -under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. However, parties who have -received copies, or rights, from you under this License will not have their licenses terminated so -long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed it. However, nothing else -grants you permission to modify or distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by modifying or distributing the -Program (or any work based on the Program), you indicate your acceptance of this License to do so, -and all its terms and conditions for copying, distributing or modifying the Program or works based -on it. - -6. Each time you redistribute the Program (or any work based on the Program), the recipient -automatically receives a license from the original licensor to copy, distribute or modify the -Program subject to these terms and conditions. You may not impose any further restrictions on the -recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance -by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other -reason (not limited to patent issues), conditions are imposed on you (whether by court order, -agreement or otherwise) that contradict the conditions of this License, they do not excuse you from -the conditions of this License. If you cannot distribute so as to satisfy simultaneously your -obligations under this License and any other pertinent obligations, then as a consequence you may -not distribute the Program at all. For example, if a patent license would not permit royalty-free -redistribution of the Program by all those who receive copies directly or indirectly through you, -then the only way you could satisfy both it and this License would be to refrain entirely from -distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, -the balance of the section is intended to apply and the section as a whole is intended to apply in -other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right -claims or to contest validity of any such claims; this section has the sole purpose of protecting -the integrity of the free software distribution system, which is implemented by public license -practices. Many people have made generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that system; it is up to the -author/donor to decide if he or she is willing to distribute software through any other system and a -licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest -of this License. - -8. If the distribution and/or use of the Program is restricted in certain countries either by -patents or by copyrighted interfaces, the original copyright holder who places the Program under -this License may add an explicit geographical distribution limitation excluding those countries, so -that distribution is permitted only in or among countries not thus excluded. In such case, this -License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of the General Public -License from time to time. Such new versions will be similar in spirit to the present version, but -may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies a version number of -this License which applies to it and "any later version", you have the option of following the terms -and conditions either of that version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of this License, you may choose any -version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs whose distribution -conditions are different, write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing and reuse of software -generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE -EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS -AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR -IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. -SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR -CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, -OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO -YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF -THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO -OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the -best way to achieve this is to make it free software which everyone can redistribute and change -under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of -each source file to most effectively convey the exclusion of warranty; and each file should have at -least the "copyright" line and a pointer to where the full notice is found. - -One line to give the program's name and a brief idea of what it does. Copyright (C) - -This program is free software; you can redistribute it and/or modify it under the terms of the GNU -General Public License as published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program; if not, -write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this when it starts in an -interactive mode: - -Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO -WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it -under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' -should show the appropriate parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be mouse-clicks or menu -items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a -"copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes -passes at compilers) written by James Hacker. - -signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice This General Public License does not -permit incorporating your program into proprietary programs. If your program is a subroutine -library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General Public License instead of this -License. diff --git a/src/Mod/AddonManager/Resources/licenses/GPL-3.0-or-later.txt b/src/Mod/AddonManager/Resources/licenses/GPL-3.0-or-later.txt deleted file mode 100644 index f288702d2f..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/GPL-3.0-or-later.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/src/Mod/AddonManager/Resources/licenses/LGPL-2.1-or-later.txt b/src/Mod/AddonManager/Resources/licenses/LGPL-2.1-or-later.txt deleted file mode 100644 index e5ab03e123..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/LGPL-2.1-or-later.txt +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/src/Mod/AddonManager/Resources/licenses/LGPL-3.0-or-later.txt b/src/Mod/AddonManager/Resources/licenses/LGPL-3.0-or-later.txt deleted file mode 100644 index 0a041280bd..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/LGPL-3.0-or-later.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/src/Mod/AddonManager/Resources/licenses/MIT.txt b/src/Mod/AddonManager/Resources/licenses/MIT.txt deleted file mode 100644 index 2b6d1ad269..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/MIT.txt +++ /dev/null @@ -1,16 +0,0 @@ -Copyright © <%%YEAR%%> <%%COPYRIGHT HOLDER%%> - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the “Software”), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES -OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/Mod/AddonManager/Resources/licenses/MPL-2.0.txt b/src/Mod/AddonManager/Resources/licenses/MPL-2.0.txt deleted file mode 100644 index 3585607237..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/MPL-2.0.txt +++ /dev/null @@ -1,258 +0,0 @@ -Mozilla Public License 2.0 (MPL-2.0) - -1. Definitions -1.1. “Contributor” -means each individual or legal entity that creates, contributes to the creation of, or owns Covered -Software. - -1.2. “Contributor Version” -means the combination of the Contributions of others (if any) used by a Contributor and that -particular Contributor’s Contribution. - -1.3. “Contribution” -means Covered Software of a particular Contributor. - -1.4. “Covered Software” -means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the -Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case -including portions thereof. - -1.5. “Incompatible With Secondary Licenses” -means that the initial Contributor has attached the notice described in Exhibit B to the Covered -Software; or -that the Covered Software was made available under the terms of version 1.1 or earlier of the -License, but not also under the terms of a Secondary License. - -1.6. “Executable Form” -means any form of the work other than Source Code Form. - -1.7. “Larger Work” -means a work that combines Covered Software with other material, in a separate file or files, that -is not Covered Software. - -1.8. “License” -means this document. - -1.9. “Licensable” -means having the right to grant, to the maximum extent possible, whether at the time of the initial -grant or subsequently, any and all of the rights conveyed by this License. - -1.10. “Modifications” -means any of the following: - -any file in Source Code Form that results from an addition to, deletion from, or modification of the -contents of Covered Software; or - -any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor -means any patent claim(s), including without limitation, method, process, and apparatus claims, in -any patent Licensable by such Contributor that would be infringed, but for the grant of the License, -by the making, using, selling, offering for sale, having made, import, or transfer of either its -Contributions or its Contributor Version. - -1.12. “Secondary License” -means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, -Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those -licenses. - -1.13. “Source Code Form” -means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) -means an individual or a legal entity exercising rights under this License. For legal entities, -“You” includes any entity that controls, is controlled by, or is under common control with You. For -purposes of this definition, “control” means (a) the power, direct or indirect, to cause the -direction or management of such entity, whether by contract or otherwise, or (b) ownership of more -than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. - -2. License Grants and Conditions -2.1. Grants -Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: - -under intellectual property rights (other than patent or trademark) Licensable by such Contributor -to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its -Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and - -under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and -otherwise transfer either its Contributions or its Contributor Version. - -2.2. Effective Date -The licenses granted in Section 2.1 with respect to any Contribution become effective for each -Contribution on the date the Contributor first distributes such Contribution. - -2.3. Limitations on Grant Scope -The licenses granted in this Section 2 are the only rights granted under this License. No additional -rights or licenses will be implied from the distribution or licensing of Covered Software under this -License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: - -for any code that a Contributor has removed from Covered Software; or - -for infringements caused by: (i) Your and any other third party’s modifications of Covered Software, -or (ii) the combination of its Contributions with other software (except as part of its Contributor -Version); or - -under Patent Claims infringed by Covered Software in the absence of its Contributions. - -This License does not grant any rights in the trademarks, service marks, or logos of any Contributor -(except as may be necessary to comply with the notice requirements in Section 3.4). - -2.4. Subsequent Licenses -No Contributor makes additional grants as a result of Your choice to distribute the Covered Software -under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary -License (if permitted under the terms of Section 3.3). - -2.5. Representation -Each Contributor represents that the Contributor believes its Contributions are its original -creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this -License. - -2.6. Fair Use -This License is not intended to limit any rights You have under applicable copyright doctrines of -fair use, fair dealing, or other equivalents. - -2.7. Conditions -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. - -3. Responsibilities -3.1. Distribution of Source Form -All distribution of Covered Software in Source Code Form, including any Modifications that You -create or to which You contribute, must be under the terms of this License. You must inform -recipients that the Source Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not attempt to alter or restrict -the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form -If You distribute Covered Software in Executable Form then: - -such Covered Software must also be made available in Source Code Form, as described in Section 3.1, -and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code -Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to -the recipient; and - -You may distribute such Executable Form under the terms of this License, or sublicense it under -different terms, provided that the license for the Executable Form does not attempt to limit or -alter the recipients’ rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work -You may create and distribute a Larger Work under terms of Your choice, provided that You also -comply with the requirements of this License for the Covered Software. If the Larger Work is a -combination of Covered Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this License permits You to -additionally distribute such Covered Software under the terms of such Secondary License(s), so that -the recipient of the Larger Work may, at their option, further distribute the Covered Software under -the terms of either this License or such Secondary License(s). - -3.4. Notices -You may not remove or alter the substance of any license notices (including copyright notices, -patent notices, disclaimers of warranty, or limitations of liability) contained within the Source -Code Form of the Covered Software, except that You may alter any license notices to the extent -required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms -You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability -obligations to one or more recipients of Covered Software. However, You may do so only on Your own -behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such -warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree -to indemnify every Contributor for any liability incurred by such Contributor as a result of -warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of -warranty and limitations of liability specific to any jurisdiction. - -4. Inability to Comply Due to Statute or Regulation -If it is impossible for You to comply with any of the terms of this License with respect to some or -all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply -with the terms of this License to the maximum extent possible; and (b) describe the limitations and -the code they affect. Such description must be placed in a text file included with all distributions -of the Covered Software under this License. Except to the extent prohibited by statute or -regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be -able to understand it. - -5. Termination -5.1. The rights granted under this License will terminate automatically if You fail to comply with -any of its terms. However, if You become compliant, then the rights granted under this License from -a particular Contributor are reinstated (a) provisionally, unless and until such Contributor -explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor -fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an -ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this -is the first time You have received notice of non-compliance with this License from such -Contributor, and You become compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent infringement claim -(excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a -Contributor Version directly or indirectly infringes any patent, then the rights granted to You by -any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements -(excluding distributors and resellers) which have been validly granted by You or Your distributors -under this License prior to termination shall survive termination. - -6. Disclaimer of Warranty -Covered Software is provided under this License on an “as is” basis, without warranty of any kind, -either expressed, implied, or statutory, including, without limitation, warranties that the Covered -Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The -entire risk as to the quality and performance of the Covered Software is with You. Should any -Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any -necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential -part of this License. No use of any Covered Software is authorized under this License except under -this disclaimer. - -7. Limitation of Liability -Under no circumstances and under no legal theory, whether tort (including negligence), contract, or -otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be -liable to You for any direct, indirect, special, incidental, or consequential damages of any -character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, -computer failure or malfunction, or any and all other commercial damages or losses, even if such -party shall have been informed of the possibility of such damages. This limitation of liability -shall not apply to liability for death or personal injury resulting from such party’s negligence to -the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion -or limitation of incidental or consequential damages, so this exclusion and limitation may not apply -to You. - -8. Litigation -Any litigation relating to this License may be brought only in the courts of a jurisdiction where -the defendant maintains its principal place of business and such litigation shall be governed by -laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this -Section shall prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous -This License represents the complete agreement concerning the subject matter hereof. If any -provision of this License is held to be unenforceable, such provision shall be reformed only to the -extent necessary to make it enforceable. Any law or regulation which provides that the language of a -contract shall be construed against the drafter shall not be used to construe this License against a -Contributor. - -10. Versions of the License -10.1. New Versions -Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the -license steward has the right to modify or publish new versions of this License. Each version will -be given a distinguishing version number. - -10.2. Effect of New Versions -You may distribute the Covered Software under the terms of the version of the License under which -You originally received the Covered Software, or under the terms of any subsequent version published -by the license steward. - -10.3. Modified Versions -If you create software not governed by this License, and you want to create a new license for such -software, you may create and use a modified version of this License if you rename the license and -remove any references to the name of the license steward (except to note that such modified license -differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses -If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the -terms of this version of the License, the notice described in Exhibit B of this License must be -attached. - -Exhibit A - Source Code Form License Notice -This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of -the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. -If it is not possible or desirable to put the notice in a particular file, then You may include the -notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be -likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice -This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public -License, v. 2.0. diff --git a/src/Mod/AddonManager/Resources/licenses/spdx.json b/src/Mod/AddonManager/Resources/licenses/spdx.json deleted file mode 100644 index a66972e749..0000000000 --- a/src/Mod/AddonManager/Resources/licenses/spdx.json +++ /dev/null @@ -1,7835 +0,0 @@ -{ - "licenseListVersion": "83c9f84", - "licenses": [ - { - "reference": "https://spdx.org/licenses/0BSD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/0BSD.json", - "referenceNumber": 530, - "name": "BSD Zero Clause License", - "licenseId": "0BSD", - "seeAlso": [ - "http://landley.net/toybox/license.html", - "https://opensource.org/licenses/0BSD" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/AAL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AAL.json", - "referenceNumber": 121, - "name": "Attribution Assurance License", - "licenseId": "AAL", - "seeAlso": [ - "https://opensource.org/licenses/attribution" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Abstyles.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Abstyles.json", - "referenceNumber": 499, - "name": "Abstyles License", - "licenseId": "Abstyles", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Abstyles" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AdaCore-doc.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AdaCore-doc.json", - "referenceNumber": 103, - "name": "AdaCore Doc License", - "licenseId": "AdaCore-doc", - "seeAlso": [ - "https://github.com/AdaCore/xmlada/blob/master/docs/index.rst", - "https://github.com/AdaCore/gnatcoll-core/blob/master/docs/index.rst", - "https://github.com/AdaCore/gnatcoll-db/blob/master/docs/index.rst" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Adobe-2006.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", - "referenceNumber": 471, - "name": "Adobe Systems Incorporated Source Code License Agreement", - "licenseId": "Adobe-2006", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/AdobeLicense" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Adobe-Display-PostScript.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Adobe-Display-PostScript.json", - "referenceNumber": 556, - "name": "Adobe Display PostScript License", - "licenseId": "Adobe-Display-PostScript", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L752" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Adobe-Glyph.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", - "referenceNumber": 585, - "name": "Adobe Glyph List License", - "licenseId": "Adobe-Glyph", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Adobe-Utopia.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Adobe-Utopia.json", - "referenceNumber": 89, - "name": "Adobe Utopia Font License", - "licenseId": "Adobe-Utopia", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/font/adobe-utopia-100dpi/-/blob/master/COPYING?ref_type\u003dheads" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ADSL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ADSL.json", - "referenceNumber": 535, - "name": "Amazon Digital Services License", - "licenseId": "ADSL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AFL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", - "referenceNumber": 174, - "name": "Academic Free License v1.1", - "licenseId": "AFL-1.1", - "seeAlso": [ - "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", - "http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AFL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", - "referenceNumber": 606, - "name": "Academic Free License v1.2", - "licenseId": "AFL-1.2", - "seeAlso": [ - "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", - "http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AFL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", - "referenceNumber": 219, - "name": "Academic Free License v2.0", - "licenseId": "AFL-2.0", - "seeAlso": [ - "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AFL-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", - "referenceNumber": 426, - "name": "Academic Free License v2.1", - "licenseId": "AFL-2.1", - "seeAlso": [ - "http://opensource.linux-mirror.org/licenses/afl-2.1.txt" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AFL-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", - "referenceNumber": 37, - "name": "Academic Free License v3.0", - "licenseId": "AFL-3.0", - "seeAlso": [ - "http://www.rosenlaw.com/AFL3.0.htm", - "https://opensource.org/licenses/afl-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Afmparse.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Afmparse.json", - "referenceNumber": 227, - "name": "Afmparse License", - "licenseId": "Afmparse", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Afmparse" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AGPL-1.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", - "referenceNumber": 327, - "name": "Affero General Public License v1.0", - "licenseId": "AGPL-1.0", - "seeAlso": [ - "http://www.affero.org/oagpl.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AGPL-1.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", - "referenceNumber": 75, - "name": "Affero General Public License v1.0 only", - "licenseId": "AGPL-1.0-only", - "seeAlso": [ - "http://www.affero.org/oagpl.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AGPL-1.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-or-later.json", - "referenceNumber": 421, - "name": "Affero General Public License v1.0 or later", - "licenseId": "AGPL-1.0-or-later", - "seeAlso": [ - "http://www.affero.org/oagpl.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AGPL-3.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", - "referenceNumber": 500, - "name": "GNU Affero General Public License v3.0", - "licenseId": "AGPL-3.0", - "seeAlso": [ - "https://www.gnu.org/licenses/agpl.txt", - "https://opensource.org/licenses/AGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AGPL-3.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", - "referenceNumber": 291, - "name": "GNU Affero General Public License v3.0 only", - "licenseId": "AGPL-3.0-only", - "seeAlso": [ - "https://www.gnu.org/licenses/agpl.txt", - "https://opensource.org/licenses/AGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/AGPL-3.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-or-later.json", - "referenceNumber": 398, - "name": "GNU Affero General Public License v3.0 or later", - "licenseId": "AGPL-3.0-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/agpl.txt", - "https://opensource.org/licenses/AGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Aladdin.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Aladdin.json", - "referenceNumber": 441, - "name": "Aladdin Free Public License", - "licenseId": "Aladdin", - "seeAlso": [ - "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/AMDPLPA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", - "referenceNumber": 423, - "name": "AMD\u0027s plpa_map.c License", - "licenseId": "AMDPLPA", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AML.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AML.json", - "referenceNumber": 17, - "name": "Apple MIT License", - "licenseId": "AML", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AML-glslang.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AML-glslang.json", - "referenceNumber": 254, - "name": "AML glslang variant License", - "licenseId": "AML-glslang", - "seeAlso": [ - "https://github.com/KhronosGroup/glslang/blob/main/LICENSE.txt#L949", - "https://docs.omniverse.nvidia.com/install-guide/latest/common/licenses.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/AMPAS.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/AMPAS.json", - "referenceNumber": 487, - "name": "Academy of Motion Picture Arts and Sciences BSD", - "licenseId": "AMPAS", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ANTLR-PD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", - "referenceNumber": 129, - "name": "ANTLR Software Rights Notice", - "licenseId": "ANTLR-PD", - "seeAlso": [ - "http://www.antlr2.org/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ANTLR-PD-fallback.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ANTLR-PD-fallback.json", - "referenceNumber": 171, - "name": "ANTLR Software Rights Notice with license fallback", - "licenseId": "ANTLR-PD-fallback", - "seeAlso": [ - "http://www.antlr2.org/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Apache-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", - "referenceNumber": 97, - "name": "Apache License 1.0", - "licenseId": "Apache-1.0", - "seeAlso": [ - "http://www.apache.org/licenses/LICENSE-1.0" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Apache-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", - "referenceNumber": 442, - "name": "Apache License 1.1", - "licenseId": "Apache-1.1", - "seeAlso": [ - "http://apache.org/licenses/LICENSE-1.1", - "https://opensource.org/licenses/Apache-1.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Apache-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", - "referenceNumber": 300, - "name": "Apache License 2.0", - "licenseId": "Apache-2.0", - "seeAlso": [ - "https://www.apache.org/licenses/LICENSE-2.0", - "https://opensource.org/licenses/Apache-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/APAFML.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/APAFML.json", - "referenceNumber": 513, - "name": "Adobe Postscript AFM License", - "licenseId": "APAFML", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/APL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", - "referenceNumber": 605, - "name": "Adaptive Public License 1.0", - "licenseId": "APL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/APL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/App-s2p.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/App-s2p.json", - "referenceNumber": 336, - "name": "App::s2p License", - "licenseId": "App-s2p", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/App-s2p" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/APSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", - "referenceNumber": 164, - "name": "Apple Public Source License 1.0", - "licenseId": "APSL-1.0", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0" - ], - "isOsiApproved": true, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/APSL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", - "referenceNumber": 154, - "name": "Apple Public Source License 1.1", - "licenseId": "APSL-1.1", - "seeAlso": [ - "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/APSL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", - "referenceNumber": 163, - "name": "Apple Public Source License 1.2", - "licenseId": "APSL-1.2", - "seeAlso": [ - "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/APSL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", - "referenceNumber": 59, - "name": "Apple Public Source License 2.0", - "licenseId": "APSL-2.0", - "seeAlso": [ - "http://www.opensource.apple.com/license/apsl/" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Arphic-1999.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Arphic-1999.json", - "referenceNumber": 446, - "name": "Arphic Public License", - "licenseId": "Arphic-1999", - "seeAlso": [ - "http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Artistic-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", - "referenceNumber": 108, - "name": "Artistic License 1.0", - "licenseId": "Artistic-1.0", - "seeAlso": [ - "https://opensource.org/licenses/Artistic-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", - "referenceNumber": 405, - "name": "Artistic License 1.0 w/clause 8", - "licenseId": "Artistic-1.0-cl8", - "seeAlso": [ - "https://opensource.org/licenses/Artistic-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", - "referenceNumber": 558, - "name": "Artistic License 1.0 (Perl)", - "licenseId": "Artistic-1.0-Perl", - "seeAlso": [ - "http://dev.perl.org/licenses/artistic.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Artistic-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", - "referenceNumber": 152, - "name": "Artistic License 2.0", - "licenseId": "Artistic-2.0", - "seeAlso": [ - "http://www.perlfoundation.org/artistic_license_2_0", - "https://www.perlfoundation.org/artistic-license-20.html", - "https://opensource.org/licenses/artistic-license-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.json", - "referenceNumber": 217, - "name": "ASWF Digital Assets License version 1.0", - "licenseId": "ASWF-Digital-Assets-1.0", - "seeAlso": [ - "https://github.com/AcademySoftwareFoundation/foundation/blob/main/digital_assets/aswf_digital_assets_license_v1.0.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.json", - "referenceNumber": 145, - "name": "ASWF Digital Assets License 1.1", - "licenseId": "ASWF-Digital-Assets-1.1", - "seeAlso": [ - "https://github.com/AcademySoftwareFoundation/foundation/blob/main/digital_assets/aswf_digital_assets_license_v1.1.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Baekmuk.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Baekmuk.json", - "referenceNumber": 524, - "name": "Baekmuk License", - "licenseId": "Baekmuk", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:Baekmuk?rd\u003dLicensing/Baekmuk" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Bahyph.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Bahyph.json", - "referenceNumber": 247, - "name": "Bahyph License", - "licenseId": "Bahyph", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Bahyph" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Barr.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Barr.json", - "referenceNumber": 465, - "name": "Barr License", - "licenseId": "Barr", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Barr" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Beerware.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Beerware.json", - "referenceNumber": 432, - "name": "Beerware License", - "licenseId": "Beerware", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Beerware", - "https://people.freebsd.org/~phk/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Bitstream-Charter.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Bitstream-Charter.json", - "referenceNumber": 369, - "name": "Bitstream Charter Font License", - "licenseId": "Bitstream-Charter", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Charter#License_Text", - "https://raw.githubusercontent.com/blackhole89/notekit/master/data/fonts/Charter%20license.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Bitstream-Vera.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Bitstream-Vera.json", - "referenceNumber": 245, - "name": "Bitstream Vera Font License", - "licenseId": "Bitstream-Vera", - "seeAlso": [ - "https://web.archive.org/web/20080207013128/http://www.gnome.org/fonts/", - "https://docubrain.com/sites/default/files/licenses/bitstream-vera.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BitTorrent-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", - "referenceNumber": 425, - "name": "BitTorrent Open Source License v1.0", - "licenseId": "BitTorrent-1.0", - "seeAlso": [ - "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1\u003d1.1\u0026r2\u003d1.1.1.1\u0026diff_format\u003ds" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BitTorrent-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", - "referenceNumber": 315, - "name": "BitTorrent Open Source License v1.1", - "licenseId": "BitTorrent-1.1", - "seeAlso": [ - "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/blessing.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/blessing.json", - "referenceNumber": 545, - "name": "SQLite Blessing", - "licenseId": "blessing", - "seeAlso": [ - "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln\u003d4-9", - "https://sqlite.org/src/artifact/df5091916dbb40e6" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", - "referenceNumber": 274, - "name": "Blue Oak Model License 1.0.0", - "licenseId": "BlueOak-1.0.0", - "seeAlso": [ - "https://blueoakcouncil.org/license/1.0.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Boehm-GC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Boehm-GC.json", - "referenceNumber": 458, - "name": "Boehm-Demers-Weiser GC License", - "licenseId": "Boehm-GC", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:MIT#Another_Minimal_variant_(found_in_libatomic_ops)", - "https://github.com/uim/libgcroots/blob/master/COPYING", - "https://github.com/ivmai/libatomic_ops/blob/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Borceux.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Borceux.json", - "referenceNumber": 18, - "name": "Borceux license", - "licenseId": "Borceux", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Borceux" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Brian-Gladman-3-Clause.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-3-Clause.json", - "referenceNumber": 511, - "name": "Brian Gladman 3-Clause License", - "licenseId": "Brian-Gladman-3-Clause", - "seeAlso": [ - "https://github.com/SWI-Prolog/packages-clib/blob/master/sha1/brg_endian.h" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-1-Clause.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", - "referenceNumber": 564, - "name": "BSD 1-Clause License", - "licenseId": "BSD-1-Clause", - "seeAlso": [ - "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision\u003d326823" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/BSD-2-Clause.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", - "referenceNumber": 13, - "name": "BSD 2-Clause \"Simplified\" License", - "licenseId": "BSD-2-Clause", - "seeAlso": [ - "https://opensource.org/licenses/BSD-2-Clause" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", - "referenceNumber": 262, - "name": "BSD 2-Clause FreeBSD License", - "licenseId": "BSD-2-Clause-FreeBSD", - "seeAlso": [ - "http://www.freebsd.org/copyright/freebsd-license.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", - "referenceNumber": 476, - "name": "BSD 2-Clause NetBSD License", - "licenseId": "BSD-2-Clause-NetBSD", - "seeAlso": [ - "http://www.netbsd.org/about/redistribution.html#default" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", - "referenceNumber": 363, - "name": "BSD-2-Clause Plus Patent License", - "licenseId": "BSD-2-Clause-Patent", - "seeAlso": [ - "https://opensource.org/licenses/BSDplusPatent" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", - "referenceNumber": 82, - "name": "BSD 2-Clause with views sentence", - "licenseId": "BSD-2-Clause-Views", - "seeAlso": [ - "http://www.freebsd.org/copyright/freebsd-license.html", - "https://people.freebsd.org/~ivoras/wine/patch-wine-nvidia.sh", - "https://github.com/protegeproject/protege/blob/master/license.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", - "referenceNumber": 355, - "name": "BSD 3-Clause \"New\" or \"Revised\" License", - "licenseId": "BSD-3-Clause", - "seeAlso": [ - "https://opensource.org/licenses/BSD-3-Clause", - "https://www.eclipse.org/org/documents/edl-v10.php" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-acpica.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-acpica.json", - "referenceNumber": 506, - "name": "BSD 3-Clause acpica variant", - "licenseId": "BSD-3-Clause-acpica", - "seeAlso": [ - "https://github.com/acpica/acpica/blob/master/source/common/acfileio.c#L119" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", - "referenceNumber": 387, - "name": "BSD with attribution", - "licenseId": "BSD-3-Clause-Attribution", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", - "referenceNumber": 102, - "name": "BSD 3-Clause Clear License", - "licenseId": "BSD-3-Clause-Clear", - "seeAlso": [ - "http://labs.metacarta.com/license-explanation.html#license" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-flex.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-flex.json", - "referenceNumber": 188, - "name": "BSD 3-Clause Flex variant", - "licenseId": "BSD-3-Clause-flex", - "seeAlso": [ - "https://github.com/westes/flex/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-HP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-HP.json", - "referenceNumber": 609, - "name": "Hewlett-Packard BSD variant license", - "licenseId": "BSD-3-Clause-HP", - "seeAlso": [ - "https://github.com/zdohnal/hplip/blob/master/COPYING#L939" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", - "referenceNumber": 303, - "name": "Lawrence Berkeley National Labs BSD variant license", - "licenseId": "BSD-3-Clause-LBNL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/LBNLBSD" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", - "referenceNumber": 475, - "name": "BSD 3-Clause Modification", - "licenseId": "BSD-3-Clause-Modification", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:BSD#Modification_Variant" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.json", - "referenceNumber": 308, - "name": "BSD 3-Clause No Military License", - "licenseId": "BSD-3-Clause-No-Military-License", - "seeAlso": [ - "https://gitlab.syncad.com/hive/dhive/-/blob/master/LICENSE", - "https://github.com/greymass/swift-eosio/blob/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json", - "referenceNumber": 541, - "name": "BSD 3-Clause No Nuclear License", - "licenseId": "BSD-3-Clause-No-Nuclear-License", - "seeAlso": [ - "http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam\u003d1467140197_43d516ce1776bd08a58235a7785be1cc" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json", - "referenceNumber": 486, - "name": "BSD 3-Clause No Nuclear License 2014", - "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", - "seeAlso": [ - "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json", - "referenceNumber": 559, - "name": "BSD 3-Clause No Nuclear Warranty", - "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", - "seeAlso": [ - "https://jogamp.org/git/?p\u003dgluegen.git;a\u003dblob_plain;f\u003dLICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.json", - "referenceNumber": 46, - "name": "BSD 3-Clause Open MPI variant", - "licenseId": "BSD-3-Clause-Open-MPI", - "seeAlso": [ - "https://www.open-mpi.org/community/license.php", - "http://www.netlib.org/lapack/LICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-3-Clause-Sun.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Sun.json", - "referenceNumber": 228, - "name": "BSD 3-Clause Sun Microsystems", - "licenseId": "BSD-3-Clause-Sun", - "seeAlso": [ - "https://github.com/xmlark/msv/blob/b9316e2f2270bc1606952ea4939ec87fbba157f3/xsdlib/src/main/java/com/sun/msv/datatype/regexp/InternalImpl.java" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-4-Clause.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", - "referenceNumber": 619, - "name": "BSD 4-Clause \"Original\" or \"Old\" License", - "licenseId": "BSD-4-Clause", - "seeAlso": [ - "http://directory.fsf.org/wiki/License:BSD_4Clause" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", - "referenceNumber": 194, - "name": "BSD 4 Clause Shortened", - "licenseId": "BSD-4-Clause-Shortened", - "seeAlso": [ - "https://metadata.ftp-master.debian.org/changelogs//main/a/arpwatch/arpwatch_2.1a15-7_copyright" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", - "referenceNumber": 332, - "name": "BSD-4-Clause (University of California-Specific)", - "licenseId": "BSD-4-Clause-UC", - "seeAlso": [ - "http://www.freebsd.org/copyright/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-4.3RENO.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-4.3RENO.json", - "referenceNumber": 85, - "name": "BSD 4.3 RENO License", - "licenseId": "BSD-4.3RENO", - "seeAlso": [ - "https://sourceware.org/git/?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dlibiberty/strcasecmp.c;h\u003d131d81c2ce7881fa48c363dc5bf5fb302c61ce0b;hb\u003dHEAD", - "https://git.openldap.org/openldap/openldap/-/blob/master/COPYRIGHT#L55-63" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-4.3TAHOE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-4.3TAHOE.json", - "referenceNumber": 354, - "name": "BSD 4.3 TAHOE License", - "licenseId": "BSD-4.3TAHOE", - "seeAlso": [ - "https://github.com/389ds/389-ds-base/blob/main/ldap/include/sysexits-compat.h#L15", - "https://git.savannah.gnu.org/cgit/indent.git/tree/doc/indent.texi?id\u003da74c6b4ee49397cf330b333da1042bffa60ed14f#n1788" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.json", - "referenceNumber": 200, - "name": "BSD Advertising Acknowledgement License", - "licenseId": "BSD-Advertising-Acknowledgement", - "seeAlso": [ - "https://github.com/python-excel/xlrd/blob/master/LICENSE#L33" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.json", - "referenceNumber": 427, - "name": "BSD with Attribution and HPND disclaimer", - "licenseId": "BSD-Attribution-HPND-disclaimer", - "seeAlso": [ - "https://github.com/cyrusimap/cyrus-sasl/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Inferno-Nettverk.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Inferno-Nettverk.json", - "referenceNumber": 151, - "name": "BSD-Inferno-Nettverk", - "licenseId": "BSD-Inferno-Nettverk", - "seeAlso": [ - "https://www.inet.no/dante/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Protection.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", - "referenceNumber": 592, - "name": "BSD Protection License", - "licenseId": "BSD-Protection", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Source-beginning-file.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Source-beginning-file.json", - "referenceNumber": 137, - "name": "BSD Source Code Attribution - beginning of file variant", - "licenseId": "BSD-Source-beginning-file", - "seeAlso": [ - "https://github.com/lattera/freebsd/blob/master/sys/cam/cam.c#L4" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Source-Code.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", - "referenceNumber": 433, - "name": "BSD Source Code Attribution", - "licenseId": "BSD-Source-Code", - "seeAlso": [ - "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Systemics.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Systemics.json", - "referenceNumber": 325, - "name": "Systemics BSD variant license", - "licenseId": "BSD-Systemics", - "seeAlso": [ - "https://metacpan.org/release/DPARIS/Crypt-DES-2.07/source/COPYRIGHT" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSD-Systemics-W3Works.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSD-Systemics-W3Works.json", - "referenceNumber": 340, - "name": "Systemics W3Works BSD variant license", - "licenseId": "BSD-Systemics-W3Works", - "seeAlso": [ - "https://metacpan.org/release/DPARIS/Crypt-Blowfish-2.14/source/COPYRIGHT#L7" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/BSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", - "referenceNumber": 73, - "name": "Boost Software License 1.0", - "licenseId": "BSL-1.0", - "seeAlso": [ - "http://www.boost.org/LICENSE_1_0.txt", - "https://opensource.org/licenses/BSL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/BUSL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", - "referenceNumber": 525, - "name": "Business Source License 1.1", - "licenseId": "BUSL-1.1", - "seeAlso": [ - "https://mariadb.com/bsl11/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/bzip2-1.0.5.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", - "referenceNumber": 438, - "name": "bzip2 and libbzip2 License v1.0.5", - "licenseId": "bzip2-1.0.5", - "seeAlso": [ - "https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html", - "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/bzip2-1.0.6.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", - "referenceNumber": 252, - "name": "bzip2 and libbzip2 License v1.0.6", - "licenseId": "bzip2-1.0.6", - "seeAlso": [ - "https://sourceware.org/git/?p\u003dbzip2.git;a\u003dblob;f\u003dLICENSE;hb\u003dbzip2-1.0.6", - "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/C-UDA-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", - "referenceNumber": 472, - "name": "Computational Use of Data Agreement v1.0", - "licenseId": "C-UDA-1.0", - "seeAlso": [ - "https://github.com/microsoft/Computational-Use-of-Data-Agreement/blob/master/C-UDA-1.0.md", - "https://cdla.dev/computational-use-of-data-agreement-v1-0/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CAL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", - "referenceNumber": 618, - "name": "Cryptographic Autonomy License 1.0", - "licenseId": "CAL-1.0", - "seeAlso": [ - "http://cryptographicautonomylicense.com/license-text.html", - "https://opensource.org/licenses/CAL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json", - "referenceNumber": 384, - "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", - "licenseId": "CAL-1.0-Combined-Work-Exception", - "seeAlso": [ - "http://cryptographicautonomylicense.com/license-text.html", - "https://opensource.org/licenses/CAL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Caldera.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Caldera.json", - "referenceNumber": 319, - "name": "Caldera License", - "licenseId": "Caldera", - "seeAlso": [ - "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Caldera-no-preamble.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Caldera-no-preamble.json", - "referenceNumber": 51, - "name": "Caldera License (without preamble)", - "licenseId": "Caldera-no-preamble", - "seeAlso": [ - "https://github.com/apache/apr/blob/trunk/LICENSE#L298C6-L298C29" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CATOSL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", - "referenceNumber": 437, - "name": "Computer Associates Trusted Open Source License 1.1", - "licenseId": "CATOSL-1.1", - "seeAlso": [ - "https://opensource.org/licenses/CATOSL-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CC-BY-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", - "referenceNumber": 226, - "name": "Creative Commons Attribution 1.0 Generic", - "licenseId": "CC-BY-1.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by/1.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", - "referenceNumber": 259, - "name": "Creative Commons Attribution 2.0 Generic", - "licenseId": "CC-BY-2.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by/2.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", - "referenceNumber": 165, - "name": "Creative Commons Attribution 2.5 Generic", - "licenseId": "CC-BY-2.5", - "seeAlso": [ - "https://creativecommons.org/licenses/by/2.5/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-2.5-AU.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5-AU.json", - "referenceNumber": 518, - "name": "Creative Commons Attribution 2.5 Australia", - "licenseId": "CC-BY-2.5-AU", - "seeAlso": [ - "https://creativecommons.org/licenses/by/2.5/au/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", - "referenceNumber": 370, - "name": "Creative Commons Attribution 3.0 Unported", - "licenseId": "CC-BY-3.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0-AT.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AT.json", - "referenceNumber": 101, - "name": "Creative Commons Attribution 3.0 Austria", - "licenseId": "CC-BY-3.0-AT", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/at/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0-AU.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AU.json", - "referenceNumber": 156, - "name": "Creative Commons Attribution 3.0 Australia", - "licenseId": "CC-BY-3.0-AU", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/au/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-DE.json", - "referenceNumber": 9, - "name": "Creative Commons Attribution 3.0 Germany", - "licenseId": "CC-BY-3.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0-IGO.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-IGO.json", - "referenceNumber": 211, - "name": "Creative Commons Attribution 3.0 IGO", - "licenseId": "CC-BY-3.0-IGO", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/igo/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0-NL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-NL.json", - "referenceNumber": 445, - "name": "Creative Commons Attribution 3.0 Netherlands", - "licenseId": "CC-BY-3.0-NL", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/nl/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-3.0-US.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-US.json", - "referenceNumber": 529, - "name": "Creative Commons Attribution 3.0 United States", - "licenseId": "CC-BY-3.0-US", - "seeAlso": [ - "https://creativecommons.org/licenses/by/3.0/us/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-4.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", - "referenceNumber": 40, - "name": "Creative Commons Attribution 4.0 International", - "licenseId": "CC-BY-4.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by/4.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-1.0.json", - "referenceNumber": 94, - "name": "Creative Commons Attribution Non Commercial 1.0 Generic", - "licenseId": "CC-BY-NC-1.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc/1.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.0.json", - "referenceNumber": 246, - "name": "Creative Commons Attribution Non Commercial 2.0 Generic", - "licenseId": "CC-BY-NC-2.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc/2.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.5.json", - "referenceNumber": 498, - "name": "Creative Commons Attribution Non Commercial 2.5 Generic", - "licenseId": "CC-BY-NC-2.5", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc/2.5/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0.json", - "referenceNumber": 469, - "name": "Creative Commons Attribution Non Commercial 3.0 Unported", - "licenseId": "CC-BY-NC-3.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc/3.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.json", - "referenceNumber": 112, - "name": "Creative Commons Attribution Non Commercial 3.0 Germany", - "licenseId": "CC-BY-NC-3.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc/3.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-4.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-4.0.json", - "referenceNumber": 70, - "name": "Creative Commons Attribution Non Commercial 4.0 International", - "licenseId": "CC-BY-NC-4.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc/4.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.json", - "referenceNumber": 360, - "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", - "licenseId": "CC-BY-NC-ND-1.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.json", - "referenceNumber": 395, - "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", - "licenseId": "CC-BY-NC-ND-2.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.json", - "referenceNumber": 172, - "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", - "licenseId": "CC-BY-NC-ND-2.5", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.json", - "referenceNumber": 358, - "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", - "licenseId": "CC-BY-NC-ND-3.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.json", - "referenceNumber": 139, - "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", - "licenseId": "CC-BY-NC-ND-3.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-nd/3.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.json", - "referenceNumber": 253, - "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", - "licenseId": "CC-BY-NC-ND-3.0-IGO", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-nd/3.0/igo/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.json", - "referenceNumber": 8, - "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", - "licenseId": "CC-BY-NC-ND-4.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.json", - "referenceNumber": 587, - "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", - "licenseId": "CC-BY-NC-SA-1.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.json", - "referenceNumber": 181, - "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", - "licenseId": "CC-BY-NC-SA-2.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.json", - "referenceNumber": 474, - "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Germany", - "licenseId": "CC-BY-NC-SA-2.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/2.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.json", - "referenceNumber": 196, - "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", - "licenseId": "CC-BY-NC-SA-2.0-FR", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/2.0/fr/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.json", - "referenceNumber": 420, - "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", - "licenseId": "CC-BY-NC-SA-2.0-UK", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/2.0/uk/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.json", - "referenceNumber": 521, - "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", - "licenseId": "CC-BY-NC-SA-2.5", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.json", - "referenceNumber": 379, - "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", - "licenseId": "CC-BY-NC-SA-3.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.json", - "referenceNumber": 278, - "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", - "licenseId": "CC-BY-NC-SA-3.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.json", - "referenceNumber": 44, - "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", - "licenseId": "CC-BY-NC-SA-3.0-IGO", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/3.0/igo/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.json", - "referenceNumber": 195, - "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", - "licenseId": "CC-BY-NC-SA-4.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-ND-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-1.0.json", - "referenceNumber": 331, - "name": "Creative Commons Attribution No Derivatives 1.0 Generic", - "licenseId": "CC-BY-ND-1.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd/1.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-ND-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.0.json", - "referenceNumber": 610, - "name": "Creative Commons Attribution No Derivatives 2.0 Generic", - "licenseId": "CC-BY-ND-2.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd/2.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-ND-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.5.json", - "referenceNumber": 91, - "name": "Creative Commons Attribution No Derivatives 2.5 Generic", - "licenseId": "CC-BY-ND-2.5", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd/2.5/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-ND-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0.json", - "referenceNumber": 485, - "name": "Creative Commons Attribution No Derivatives 3.0 Unported", - "licenseId": "CC-BY-ND-3.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd/3.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.json", - "referenceNumber": 538, - "name": "Creative Commons Attribution No Derivatives 3.0 Germany", - "licenseId": "CC-BY-ND-3.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd/3.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-ND-4.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-4.0.json", - "referenceNumber": 134, - "name": "Creative Commons Attribution No Derivatives 4.0 International", - "licenseId": "CC-BY-ND-4.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-nd/4.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-1.0.json", - "referenceNumber": 526, - "name": "Creative Commons Attribution Share Alike 1.0 Generic", - "licenseId": "CC-BY-SA-1.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/1.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0.json", - "referenceNumber": 30, - "name": "Creative Commons Attribution Share Alike 2.0 Generic", - "licenseId": "CC-BY-SA-2.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/2.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.json", - "referenceNumber": 222, - "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", - "licenseId": "CC-BY-SA-2.0-UK", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/2.0/uk/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.json", - "referenceNumber": 251, - "name": "Creative Commons Attribution Share Alike 2.1 Japan", - "licenseId": "CC-BY-SA-2.1-JP", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.5.json", - "referenceNumber": 47, - "name": "Creative Commons Attribution Share Alike 2.5 Generic", - "licenseId": "CC-BY-SA-2.5", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/2.5/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0.json", - "referenceNumber": 293, - "name": "Creative Commons Attribution Share Alike 3.0 Unported", - "licenseId": "CC-BY-SA-3.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/3.0/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.json", - "referenceNumber": 15, - "name": "Creative Commons Attribution Share Alike 3.0 Austria", - "licenseId": "CC-BY-SA-3.0-AT", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/3.0/at/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.json", - "referenceNumber": 586, - "name": "Creative Commons Attribution Share Alike 3.0 Germany", - "licenseId": "CC-BY-SA-3.0-DE", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/3.0/de/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.json", - "referenceNumber": 109, - "name": "Creative Commons Attribution-ShareAlike 3.0 IGO", - "licenseId": "CC-BY-SA-3.0-IGO", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/3.0/igo/legalcode" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC-BY-SA-4.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-4.0.json", - "referenceNumber": 86, - "name": "Creative Commons Attribution Share Alike 4.0 International", - "licenseId": "CC-BY-SA-4.0", - "seeAlso": [ - "https://creativecommons.org/licenses/by-sa/4.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CC-PDDC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", - "referenceNumber": 573, - "name": "Creative Commons Public Domain Dedication and Certification", - "licenseId": "CC-PDDC", - "seeAlso": [ - "https://creativecommons.org/licenses/publicdomain/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CC0-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", - "referenceNumber": 392, - "name": "Creative Commons Zero v1.0 Universal", - "licenseId": "CC0-1.0", - "seeAlso": [ - "https://creativecommons.org/publicdomain/zero/1.0/legalcode" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CDDL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", - "referenceNumber": 572, - "name": "Common Development and Distribution License 1.0", - "licenseId": "CDDL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/cddl1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CDDL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", - "referenceNumber": 367, - "name": "Common Development and Distribution License 1.1", - "licenseId": "CDDL-1.1", - "seeAlso": [ - "http://glassfish.java.net/public/CDDL+GPL_1_1.html", - "https://javaee.github.io/glassfish/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CDL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", - "referenceNumber": 491, - "name": "Common Documentation License 1.0", - "licenseId": "CDL-1.0", - "seeAlso": [ - "http://www.opensource.apple.com/cdl/", - "https://fedoraproject.org/wiki/Licensing/Common_Documentation_License", - "https://www.gnu.org/licenses/license-list.html#ACDL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", - "referenceNumber": 159, - "name": "Community Data License Agreement Permissive 1.0", - "licenseId": "CDLA-Permissive-1.0", - "seeAlso": [ - "https://cdla.io/permissive-1-0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", - "referenceNumber": 175, - "name": "Community Data License Agreement Permissive 2.0", - "licenseId": "CDLA-Permissive-2.0", - "seeAlso": [ - "https://cdla.dev/permissive-2-0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", - "referenceNumber": 221, - "name": "Community Data License Agreement Sharing 1.0", - "licenseId": "CDLA-Sharing-1.0", - "seeAlso": [ - "https://cdla.io/sharing-1-0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CECILL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", - "referenceNumber": 272, - "name": "CeCILL Free Software License Agreement v1.0", - "licenseId": "CECILL-1.0", - "seeAlso": [ - "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CECILL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", - "referenceNumber": 571, - "name": "CeCILL Free Software License Agreement v1.1", - "licenseId": "CECILL-1.1", - "seeAlso": [ - "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CECILL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", - "referenceNumber": 269, - "name": "CeCILL Free Software License Agreement v2.0", - "licenseId": "CECILL-2.0", - "seeAlso": [ - "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CECILL-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", - "referenceNumber": 569, - "name": "CeCILL Free Software License Agreement v2.1", - "licenseId": "CECILL-2.1", - "seeAlso": [ - "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CECILL-B.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", - "referenceNumber": 501, - "name": "CeCILL-B Free Software License Agreement", - "licenseId": "CECILL-B", - "seeAlso": [ - "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CECILL-C.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", - "referenceNumber": 503, - "name": "CeCILL-C Free Software License Agreement", - "licenseId": "CECILL-C", - "seeAlso": [ - "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", - "referenceNumber": 502, - "name": "CERN Open Hardware Licence v1.1", - "licenseId": "CERN-OHL-1.1", - "seeAlso": [ - "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", - "referenceNumber": 614, - "name": "CERN Open Hardware Licence v1.2", - "licenseId": "CERN-OHL-1.2", - "seeAlso": [ - "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CERN-OHL-P-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CERN-OHL-P-2.0.json", - "referenceNumber": 324, - "name": "CERN Open Hardware Licence Version 2 - Permissive", - "licenseId": "CERN-OHL-P-2.0", - "seeAlso": [ - "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CERN-OHL-S-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CERN-OHL-S-2.0.json", - "referenceNumber": 41, - "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", - "licenseId": "CERN-OHL-S-2.0", - "seeAlso": [ - "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CERN-OHL-W-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CERN-OHL-W-2.0.json", - "referenceNumber": 162, - "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", - "licenseId": "CERN-OHL-W-2.0", - "seeAlso": [ - "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CFITSIO.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CFITSIO.json", - "referenceNumber": 209, - "name": "CFITSIO License", - "licenseId": "CFITSIO", - "seeAlso": [ - "https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/f_user/node9.html", - "https://heasarc.gsfc.nasa.gov/docs/software/ftools/fv/doc/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/check-cvs.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/check-cvs.json", - "referenceNumber": 611, - "name": "check-cvs License", - "licenseId": "check-cvs", - "seeAlso": [ - "http://cvs.savannah.gnu.org/viewvc/cvs/ccvs/contrib/check_cvs.in?revision\u003d1.1.4.3\u0026view\u003dmarkup\u0026pathrev\u003dcvs1-11-23#l2" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/checkmk.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/checkmk.json", - "referenceNumber": 148, - "name": "Checkmk License", - "licenseId": "checkmk", - "seeAlso": [ - "https://github.com/libcheck/check/blob/master/checkmk/checkmk.in" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ClArtistic.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", - "referenceNumber": 202, - "name": "Clarified Artistic License", - "licenseId": "ClArtistic", - "seeAlso": [ - "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", - "http://www.ncftp.com/ncftp/doc/LICENSE.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Clips.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Clips.json", - "referenceNumber": 419, - "name": "Clips License", - "licenseId": "Clips", - "seeAlso": [ - "https://github.com/DrItanium/maya/blob/master/LICENSE.CLIPS" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CMU-Mach.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CMU-Mach.json", - "referenceNumber": 212, - "name": "CMU Mach License", - "licenseId": "CMU-Mach", - "seeAlso": [ - "https://www.cs.cmu.edu/~410/licenses.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CNRI-Jython.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", - "referenceNumber": 515, - "name": "CNRI Jython License", - "licenseId": "CNRI-Jython", - "seeAlso": [ - "http://www.jython.org/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CNRI-Python.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", - "referenceNumber": 124, - "name": "CNRI Python License", - "licenseId": "CNRI-Python", - "seeAlso": [ - "https://opensource.org/licenses/CNRI-Python" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", - "referenceNumber": 533, - "name": "CNRI Python Open Source GPL Compatible License Agreement", - "licenseId": "CNRI-Python-GPL-Compatible", - "seeAlso": [ - "http://www.python.org/download/releases/1.6.1/download_win/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/COIL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", - "referenceNumber": 265, - "name": "Copyfree Open Innovation License", - "licenseId": "COIL-1.0", - "seeAlso": [ - "https://coil.apotheon.org/plaintext/01.0.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Community-Spec-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", - "referenceNumber": 616, - "name": "Community Specification License 1.0", - "licenseId": "Community-Spec-1.0", - "seeAlso": [ - "https://github.com/CommunitySpecification/1.0/blob/master/1._Community_Specification_License-v1.md" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Condor-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", - "referenceNumber": 141, - "name": "Condor Public License v1.1", - "licenseId": "Condor-1.1", - "seeAlso": [ - "http://research.cs.wisc.edu/condor/license.html#condor", - "http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/copyleft-next-0.3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.0.json", - "referenceNumber": 110, - "name": "copyleft-next 0.3.0", - "licenseId": "copyleft-next-0.3.0", - "seeAlso": [ - "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/copyleft-next-0.3.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.1.json", - "referenceNumber": 296, - "name": "copyleft-next 0.3.1", - "licenseId": "copyleft-next-0.3.1", - "seeAlso": [ - "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Cornell-Lossless-JPEG.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Cornell-Lossless-JPEG.json", - "referenceNumber": 271, - "name": "Cornell Lossless JPEG License", - "licenseId": "Cornell-Lossless-JPEG", - "seeAlso": [ - "https://android.googlesource.com/platform/external/dng_sdk/+/refs/heads/master/source/dng_lossless_jpeg.cpp#16", - "https://www.mssl.ucl.ac.uk/~mcrw/src/20050920/proto.h", - "https://gitlab.freedesktop.org/libopenraw/libopenraw/blob/master/lib/ljpegdecompressor.cpp#L32" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CPAL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", - "referenceNumber": 383, - "name": "Common Public Attribution License 1.0", - "licenseId": "CPAL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/CPAL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", - "referenceNumber": 310, - "name": "Common Public License 1.0", - "licenseId": "CPL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/CPL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/CPOL-1.02.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", - "referenceNumber": 78, - "name": "Code Project Open License 1.02", - "licenseId": "CPOL-1.02", - "seeAlso": [ - "http://www.codeproject.com/info/cpol10.aspx" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/Cronyx.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Cronyx.json", - "referenceNumber": 104, - "name": "Cronyx License", - "licenseId": "Cronyx", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/font/alias/-/blob/master/COPYING", - "https://gitlab.freedesktop.org/xorg/font/cronyx-cyrillic/-/blob/master/COPYING", - "https://gitlab.freedesktop.org/xorg/font/misc-cyrillic/-/blob/master/COPYING", - "https://gitlab.freedesktop.org/xorg/font/screen-cyrillic/-/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Crossword.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Crossword.json", - "referenceNumber": 88, - "name": "Crossword License", - "licenseId": "Crossword", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Crossword" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CrystalStacker.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", - "referenceNumber": 608, - "name": "CrystalStacker License", - "licenseId": "CrystalStacker", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd\u003dLicensing/CrystalStacker" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", - "referenceNumber": 364, - "name": "CUA Office Public License v1.0", - "licenseId": "CUA-OPL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/CUA-OPL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Cube.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Cube.json", - "referenceNumber": 385, - "name": "Cube License", - "licenseId": "Cube", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Cube" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/curl.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/curl.json", - "referenceNumber": 243, - "name": "curl License", - "licenseId": "curl", - "seeAlso": [ - "https://github.com/bagder/curl/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/D-FSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/D-FSL-1.0.json", - "referenceNumber": 302, - "name": "Deutsche Freie Software Lizenz", - "licenseId": "D-FSL-1.0", - "seeAlso": [ - "http://www.dipp.nrw.de/d-fsl/lizenzen/", - "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt", - "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt", - "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl", - "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz", - "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license", - "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file", - "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DEC-3-Clause.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DEC-3-Clause.json", - "referenceNumber": 453, - "name": "DEC 3-Clause License", - "licenseId": "DEC-3-Clause", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L239" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/diffmark.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/diffmark.json", - "referenceNumber": 350, - "name": "diffmark license", - "licenseId": "diffmark", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/diffmark" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DL-DE-BY-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DL-DE-BY-2.0.json", - "referenceNumber": 266, - "name": "Data licence Germany – attribution – version 2.0", - "licenseId": "DL-DE-BY-2.0", - "seeAlso": [ - "https://www.govdata.de/dl-de/by-2-0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DL-DE-ZERO-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DL-DE-ZERO-2.0.json", - "referenceNumber": 540, - "name": "Data licence Germany – zero – version 2.0", - "licenseId": "DL-DE-ZERO-2.0", - "seeAlso": [ - "https://www.govdata.de/dl-de/zero-2-0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DOC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DOC.json", - "referenceNumber": 496, - "name": "DOC License", - "licenseId": "DOC", - "seeAlso": [ - "http://www.cs.wustl.edu/~schmidt/ACE-copying.html", - "https://www.dre.vanderbilt.edu/~schmidt/ACE-copying.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Dotseqn.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", - "referenceNumber": 229, - "name": "Dotseqn License", - "licenseId": "Dotseqn", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Dotseqn" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DRL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", - "referenceNumber": 365, - "name": "Detection Rule License 1.0", - "licenseId": "DRL-1.0", - "seeAlso": [ - "https://github.com/Neo23x0/sigma/blob/master/LICENSE.Detection.Rules.md" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DRL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DRL-1.1.json", - "referenceNumber": 130, - "name": "Detection Rule License 1.1", - "licenseId": "DRL-1.1", - "seeAlso": [ - "https://github.com/SigmaHQ/Detection-Rule-License/blob/6ec7fbde6101d101b5b5d1fcb8f9b69fbc76c04a/LICENSE.Detection.Rules.md" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/DSDP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/DSDP.json", - "referenceNumber": 123, - "name": "DSDP License", - "licenseId": "DSDP", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/DSDP" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/dtoa.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/dtoa.json", - "referenceNumber": 410, - "name": "David M. Gay dtoa License", - "licenseId": "dtoa", - "seeAlso": [ - "https://github.com/SWI-Prolog/swipl-devel/blob/master/src/os/dtoa.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/dvipdfm.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", - "referenceNumber": 198, - "name": "dvipdfm License", - "licenseId": "dvipdfm", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/dvipdfm" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ECL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", - "referenceNumber": 373, - "name": "Educational Community License v1.0", - "licenseId": "ECL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/ECL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/ECL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", - "referenceNumber": 158, - "name": "Educational Community License v2.0", - "licenseId": "ECL-2.0", - "seeAlso": [ - "https://opensource.org/licenses/ECL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/eCos-2.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", - "referenceNumber": 344, - "name": "eCos license version 2.0", - "licenseId": "eCos-2.0", - "seeAlso": [ - "https://www.gnu.org/licenses/ecos-license.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/EFL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", - "referenceNumber": 69, - "name": "Eiffel Forum License v1.0", - "licenseId": "EFL-1.0", - "seeAlso": [ - "http://www.eiffel-nice.org/license/forum.txt", - "https://opensource.org/licenses/EFL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/EFL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", - "referenceNumber": 409, - "name": "Eiffel Forum License v2.0", - "licenseId": "EFL-2.0", - "seeAlso": [ - "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", - "https://opensource.org/licenses/EFL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/eGenix.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/eGenix.json", - "referenceNumber": 216, - "name": "eGenix.com Public License 1.1.0", - "licenseId": "eGenix", - "seeAlso": [ - "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", - "https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Elastic-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Elastic-2.0.json", - "referenceNumber": 389, - "name": "Elastic License 2.0", - "licenseId": "Elastic-2.0", - "seeAlso": [ - "https://www.elastic.co/licensing/elastic-license", - "https://github.com/elastic/elasticsearch/blob/master/licenses/ELASTIC-LICENSE-2.0.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Entessa.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Entessa.json", - "referenceNumber": 29, - "name": "Entessa Public License v1.0", - "licenseId": "Entessa", - "seeAlso": [ - "https://opensource.org/licenses/Entessa" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/EPICS.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EPICS.json", - "referenceNumber": 31, - "name": "EPICS Open License", - "licenseId": "EPICS", - "seeAlso": [ - "https://epics.anl.gov/license/open.php" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/EPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", - "referenceNumber": 92, - "name": "Eclipse Public License 1.0", - "licenseId": "EPL-1.0", - "seeAlso": [ - "http://www.eclipse.org/legal/epl-v10.html", - "https://opensource.org/licenses/EPL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/EPL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", - "referenceNumber": 593, - "name": "Eclipse Public License 2.0", - "licenseId": "EPL-2.0", - "seeAlso": [ - "https://www.eclipse.org/legal/epl-2.0", - "https://www.opensource.org/licenses/EPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ErlPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", - "referenceNumber": 167, - "name": "Erlang Public License v1.1", - "licenseId": "ErlPL-1.1", - "seeAlso": [ - "http://www.erlang.org/EPLICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/etalab-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", - "referenceNumber": 478, - "name": "Etalab Open License 2.0", - "licenseId": "etalab-2.0", - "seeAlso": [ - "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", - "https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/EUDatagrid.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", - "referenceNumber": 48, - "name": "EU DataGrid Software License", - "licenseId": "EUDatagrid", - "seeAlso": [ - "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", - "https://opensource.org/licenses/EUDatagrid" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/EUPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", - "referenceNumber": 270, - "name": "European Union Public License 1.0", - "licenseId": "EUPL-1.0", - "seeAlso": [ - "http://ec.europa.eu/idabc/en/document/7330.html", - "http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id\u003d31096" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/EUPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", - "referenceNumber": 20, - "name": "European Union Public License 1.1", - "licenseId": "EUPL-1.1", - "seeAlso": [ - "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", - "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf", - "https://opensource.org/licenses/EUPL-1.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/EUPL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", - "referenceNumber": 62, - "name": "European Union Public License 1.2", - "licenseId": "EUPL-1.2", - "seeAlso": [ - "https://joinup.ec.europa.eu/page/eupl-text-11-12", - "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf", - "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/2020-03/EUPL-1.2%20EN.txt", - "https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt", - "http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri\u003dCELEX:32017D0863", - "https://opensource.org/licenses/EUPL-1.2" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Eurosym.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Eurosym.json", - "referenceNumber": 464, - "name": "Eurosym License", - "licenseId": "Eurosym", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Eurosym" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Fair.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Fair.json", - "referenceNumber": 557, - "name": "Fair License", - "licenseId": "Fair", - "seeAlso": [ - "https://web.archive.org/web/20150926120323/http://fairlicense.org/", - "https://opensource.org/licenses/Fair" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/FBM.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FBM.json", - "referenceNumber": 115, - "name": "Fuzzy Bitmap License", - "licenseId": "FBM", - "seeAlso": [ - "https://github.com/SWI-Prolog/packages-xpce/blob/161a40cd82004f731ba48024f9d30af388a7edf5/src/img/gifwrite.c#L21-L26" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FDK-AAC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", - "referenceNumber": 168, - "name": "Fraunhofer FDK AAC Codec Library", - "licenseId": "FDK-AAC", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/FDK-AAC", - "https://directory.fsf.org/wiki/License:Fdk" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Ferguson-Twofish.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Ferguson-Twofish.json", - "referenceNumber": 414, - "name": "Ferguson Twofish License", - "licenseId": "Ferguson-Twofish", - "seeAlso": [ - "https://github.com/wernerd/ZRTPCPP/blob/6b3cd8e6783642292bad0c21e3e5e5ce45ff3e03/cryptcommon/twofish.c#L113C3-L127" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Frameworx-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", - "referenceNumber": 287, - "name": "Frameworx Open License 1.0", - "licenseId": "Frameworx-1.0", - "seeAlso": [ - "https://opensource.org/licenses/Frameworx-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/FreeBSD-DOC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", - "referenceNumber": 257, - "name": "FreeBSD Documentation License", - "licenseId": "FreeBSD-DOC", - "seeAlso": [ - "https://www.freebsd.org/copyright/freebsd-doc-license/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FreeImage.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FreeImage.json", - "referenceNumber": 144, - "name": "FreeImage Public License v1.0", - "licenseId": "FreeImage", - "seeAlso": [ - "http://freeimage.sourceforge.net/freeimage-license.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FSFAP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FSFAP.json", - "referenceNumber": 1, - "name": "FSF All Permissive License", - "licenseId": "FSFAP", - "seeAlso": [ - "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.json", - "referenceNumber": 313, - "name": "FSF All Permissive License (without Warranty)", - "licenseId": "FSFAP-no-warranty-disclaimer", - "seeAlso": [ - "https://git.savannah.gnu.org/cgit/wget.git/tree/util/trunc.c?h\u003dv1.21.3\u0026id\u003d40747a11e44ced5a8ac628a41f879ced3e2ebce9#n6" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FSFUL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FSFUL.json", - "referenceNumber": 5, - "name": "FSF Unlimited License", - "licenseId": "FSFUL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FSFULLR.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", - "referenceNumber": 603, - "name": "FSF Unlimited License (with License Retention)", - "licenseId": "FSFULLR", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FSFULLRWD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FSFULLRWD.json", - "referenceNumber": 406, - "name": "FSF Unlimited License (With License Retention and Warranty Disclaimer)", - "licenseId": "FSFULLRWD", - "seeAlso": [ - "https://lists.gnu.org/archive/html/autoconf/2012-04/msg00061.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/FTL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/FTL.json", - "referenceNumber": 562, - "name": "Freetype Project License", - "licenseId": "FTL", - "seeAlso": [ - "http://freetype.fis.uniroma2.it/FTL.TXT", - "http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT", - "http://gitlab.freedesktop.org/freetype/freetype/-/raw/master/docs/FTL.TXT" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Furuseth.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Furuseth.json", - "referenceNumber": 27, - "name": "Furuseth License", - "licenseId": "Furuseth", - "seeAlso": [ - "https://git.openldap.org/openldap/openldap/-/blob/master/COPYRIGHT?ref_type\u003dheads#L39-51" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/fwlw.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/fwlw.json", - "referenceNumber": 402, - "name": "fwlw License", - "licenseId": "fwlw", - "seeAlso": [ - "https://mirrors.nic.cz/tex-archive/macros/latex/contrib/fwlw/README" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GCR-docs.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GCR-docs.json", - "referenceNumber": 98, - "name": "Gnome GCR Documentation License", - "licenseId": "GCR-docs", - "seeAlso": [ - "https://github.com/GNOME/gcr/blob/master/docs/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GD.json", - "referenceNumber": 326, - "name": "GD License", - "licenseId": "GD", - "seeAlso": [ - "https://libgd.github.io/manuals/2.3.0/files/license-txt.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", - "referenceNumber": 90, - "name": "GNU Free Documentation License v1.1", - "licenseId": "GFDL-1.1", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-only.json", - "referenceNumber": 514, - "name": "GNU Free Documentation License v1.1 only - invariants", - "licenseId": "GFDL-1.1-invariants-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.json", - "referenceNumber": 381, - "name": "GNU Free Documentation License v1.1 or later - invariants", - "licenseId": "GFDL-1.1-invariants-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.json", - "referenceNumber": 173, - "name": "GNU Free Documentation License v1.1 only - no invariants", - "licenseId": "GFDL-1.1-no-invariants-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json", - "referenceNumber": 301, - "name": "GNU Free Documentation License v1.1 or later - no invariants", - "licenseId": "GFDL-1.1-no-invariants-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", - "referenceNumber": 309, - "name": "GNU Free Documentation License v1.1 only", - "licenseId": "GFDL-1.1-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.1-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-or-later.json", - "referenceNumber": 351, - "name": "GNU Free Documentation License v1.1 or later", - "licenseId": "GFDL-1.1-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", - "referenceNumber": 239, - "name": "GNU Free Documentation License v1.2", - "licenseId": "GFDL-1.2", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-only.json", - "referenceNumber": 615, - "name": "GNU Free Documentation License v1.2 only - invariants", - "licenseId": "GFDL-1.2-invariants-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.json", - "referenceNumber": 42, - "name": "GNU Free Documentation License v1.2 or later - invariants", - "licenseId": "GFDL-1.2-invariants-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.json", - "referenceNumber": 179, - "name": "GNU Free Documentation License v1.2 only - no invariants", - "licenseId": "GFDL-1.2-no-invariants-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json", - "referenceNumber": 595, - "name": "GNU Free Documentation License v1.2 or later - no invariants", - "licenseId": "GFDL-1.2-no-invariants-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", - "referenceNumber": 224, - "name": "GNU Free Documentation License v1.2 only", - "licenseId": "GFDL-1.2-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.2-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-or-later.json", - "referenceNumber": 72, - "name": "GNU Free Documentation License v1.2 or later", - "licenseId": "GFDL-1.2-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", - "referenceNumber": 345, - "name": "GNU Free Documentation License v1.3", - "licenseId": "GFDL-1.3", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-only.json", - "referenceNumber": 61, - "name": "GNU Free Documentation License v1.3 only - invariants", - "licenseId": "GFDL-1.3-invariants-only", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.json", - "referenceNumber": 258, - "name": "GNU Free Documentation License v1.3 or later - invariants", - "licenseId": "GFDL-1.3-invariants-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.json", - "referenceNumber": 22, - "name": "GNU Free Documentation License v1.3 only - no invariants", - "licenseId": "GFDL-1.3-no-invariants-only", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json", - "referenceNumber": 374, - "name": "GNU Free Documentation License v1.3 or later - no invariants", - "licenseId": "GFDL-1.3-no-invariants-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", - "referenceNumber": 323, - "name": "GNU Free Documentation License v1.3 only", - "licenseId": "GFDL-1.3-only", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GFDL-1.3-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-or-later.json", - "referenceNumber": 449, - "name": "GNU Free Documentation License v1.3 or later", - "licenseId": "GFDL-1.3-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/fdl-1.3.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Giftware.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Giftware.json", - "referenceNumber": 311, - "name": "Giftware License", - "licenseId": "Giftware", - "seeAlso": [ - "http://liballeg.org/license.html#allegro-4-the-giftware-license" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GL2PS.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GL2PS.json", - "referenceNumber": 87, - "name": "GL2PS License", - "licenseId": "GL2PS", - "seeAlso": [ - "http://www.geuz.org/gl2ps/COPYING.GL2PS" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Glide.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Glide.json", - "referenceNumber": 566, - "name": "3dfx Glide License", - "licenseId": "Glide", - "seeAlso": [ - "http://www.users.on.net/~triforce/glidexp/COPYING.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Glulxe.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Glulxe.json", - "referenceNumber": 3, - "name": "Glulxe License", - "licenseId": "Glulxe", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Glulxe" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GLWTPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", - "referenceNumber": 454, - "name": "Good Luck With That Public License", - "licenseId": "GLWTPL", - "seeAlso": [ - "https://github.com/me-shaon/GLWTPL/commit/da5f6bc734095efbacb442c0b31e33a65b9d6e85" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/gnuplot.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/gnuplot.json", - "referenceNumber": 177, - "name": "gnuplot License", - "licenseId": "gnuplot", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Gnuplot" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-1.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", - "referenceNumber": 452, - "name": "GNU General Public License v1.0 only", - "licenseId": "GPL-1.0", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-1.0+.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", - "referenceNumber": 448, - "name": "GNU General Public License v1.0 or later", - "licenseId": "GPL-1.0+", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-1.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", - "referenceNumber": 305, - "name": "GNU General Public License v1.0 only", - "licenseId": "GPL-1.0-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-1.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GPL-1.0-or-later.json", - "referenceNumber": 230, - "name": "GNU General Public License v1.0 or later", - "licenseId": "GPL-1.0-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", - "referenceNumber": 264, - "name": "GNU General Public License v2.0 only", - "licenseId": "GPL-2.0", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "https://opensource.org/licenses/GPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0+.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", - "referenceNumber": 77, - "name": "GNU General Public License v2.0 or later", - "licenseId": "GPL-2.0+", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "https://opensource.org/licenses/GPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", - "referenceNumber": 600, - "name": "GNU General Public License v2.0 only", - "licenseId": "GPL-2.0-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt", - "https://opensource.org/licenses/GPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-or-later.json", - "referenceNumber": 54, - "name": "GNU General Public License v2.0 or later", - "licenseId": "GPL-2.0-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", - "https://opensource.org/licenses/GPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json", - "referenceNumber": 393, - "name": "GNU General Public License v2.0 w/Autoconf exception", - "licenseId": "GPL-2.0-with-autoconf-exception", - "seeAlso": [ - "http://ac-archive.sourceforge.net/doc/copyright.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.json", - "referenceNumber": 361, - "name": "GNU General Public License v2.0 w/Bison exception", - "licenseId": "GPL-2.0-with-bison-exception", - "seeAlso": [ - "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.json", - "referenceNumber": 527, - "name": "GNU General Public License v2.0 w/Classpath exception", - "licenseId": "GPL-2.0-with-classpath-exception", - "seeAlso": [ - "https://www.gnu.org/software/classpath/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-with-font-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-font-exception.json", - "referenceNumber": 400, - "name": "GNU General Public License v2.0 w/Font exception", - "licenseId": "GPL-2.0-with-font-exception", - "seeAlso": [ - "https://www.gnu.org/licenses/gpl-faq.html#FontException" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.json", - "referenceNumber": 343, - "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", - "licenseId": "GPL-2.0-with-GCC-exception", - "seeAlso": [ - "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-3.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", - "referenceNumber": 488, - "name": "GNU General Public License v3.0 only", - "licenseId": "GPL-3.0", - "seeAlso": [ - "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "https://opensource.org/licenses/GPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-3.0+.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", - "referenceNumber": 283, - "name": "GNU General Public License v3.0 or later", - "licenseId": "GPL-3.0+", - "seeAlso": [ - "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "https://opensource.org/licenses/GPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-3.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", - "referenceNumber": 495, - "name": "GNU General Public License v3.0 only", - "licenseId": "GPL-3.0-only", - "seeAlso": [ - "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "https://opensource.org/licenses/GPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-3.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/GPL-3.0-or-later.json", - "referenceNumber": 372, - "name": "GNU General Public License v3.0 or later", - "licenseId": "GPL-3.0-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/gpl-3.0-standalone.html", - "https://opensource.org/licenses/GPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json", - "referenceNumber": 489, - "name": "GNU General Public License v3.0 w/Autoconf exception", - "licenseId": "GPL-3.0-with-autoconf-exception", - "seeAlso": [ - "https://www.gnu.org/licenses/autoconf-exception-3.0.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.json", - "referenceNumber": 352, - "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", - "licenseId": "GPL-3.0-with-GCC-exception", - "seeAlso": [ - "https://www.gnu.org/licenses/gcc-exception-3.1.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Graphics-Gems.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Graphics-Gems.json", - "referenceNumber": 275, - "name": "Graphics Gems License", - "licenseId": "Graphics-Gems", - "seeAlso": [ - "https://github.com/erich666/GraphicsGems/blob/master/LICENSE.md" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/gSOAP-1.3b.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", - "referenceNumber": 346, - "name": "gSOAP Public License v1.3b", - "licenseId": "gSOAP-1.3b", - "seeAlso": [ - "http://www.cs.fsu.edu/~engelen/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HaskellReport.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", - "referenceNumber": 560, - "name": "Haskell Language Report License", - "licenseId": "HaskellReport", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/hdparm.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/hdparm.json", - "referenceNumber": 249, - "name": "hdparm License", - "licenseId": "hdparm", - "seeAlso": [ - "https://github.com/Distrotech/hdparm/blob/4517550db29a91420fb2b020349523b1b4512df2/LICENSE.TXT" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Hippocratic-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", - "referenceNumber": 10, - "name": "Hippocratic License 2.1", - "licenseId": "Hippocratic-2.1", - "seeAlso": [ - "https://firstdonoharm.dev/version/2/1/license.html", - "https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HP-1986.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HP-1986.json", - "referenceNumber": 11, - "name": "Hewlett-Packard 1986 License", - "licenseId": "HP-1986", - "seeAlso": [ - "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/machine/hppa/memchr.S;h\u003d1cca3e5e8867aa4bffef1f75a5c1bba25c0c441e;hb\u003dHEAD#l2" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HP-1989.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HP-1989.json", - "referenceNumber": 418, - "name": "Hewlett-Packard 1989 License", - "licenseId": "HP-1989", - "seeAlso": [ - "https://github.com/bleargh45/Data-UUID/blob/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND.json", - "referenceNumber": 416, - "name": "Historical Permission Notice and Disclaimer", - "licenseId": "HPND", - "seeAlso": [ - "https://opensource.org/licenses/HPND", - "http://lists.opensource.org/pipermail/license-discuss_lists.opensource.org/2002-November/006304.html" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/HPND-DEC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-DEC.json", - "referenceNumber": 206, - "name": "Historical Permission Notice and Disclaimer - DEC variant", - "licenseId": "HPND-DEC", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/app/xkbcomp/-/blob/master/COPYING?ref_type\u003dheads#L69" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-doc.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-doc.json", - "referenceNumber": 450, - "name": "Historical Permission Notice and Disclaimer - documentation variant", - "licenseId": "HPND-doc", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/lib/libxext/-/blob/master/COPYING?ref_type\u003dheads#L185-197", - "https://gitlab.freedesktop.org/xorg/lib/libxtst/-/blob/master/COPYING?ref_type\u003dheads#L70-77" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-doc-sell.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-doc-sell.json", - "referenceNumber": 113, - "name": "Historical Permission Notice and Disclaimer - documentation sell variant", - "licenseId": "HPND-doc-sell", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/lib/libxtst/-/blob/master/COPYING?ref_type\u003dheads#L108-117", - "https://gitlab.freedesktop.org/xorg/lib/libxext/-/blob/master/COPYING?ref_type\u003dheads#L153-162" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-export-US.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-export-US.json", - "referenceNumber": 329, - "name": "HPND with US Government export control warning", - "licenseId": "HPND-export-US", - "seeAlso": [ - "https://www.kermitproject.org/ck90.html#source" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-export-US-modify.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-export-US-modify.json", - "referenceNumber": 304, - "name": "HPND with US Government export control warning and modification rqmt", - "licenseId": "HPND-export-US-modify", - "seeAlso": [ - "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L1157-L1182", - "https://github.com/pythongssapi/k5test/blob/v0.10.3/K5TEST-LICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-Kevlin-Henney.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-Kevlin-Henney.json", - "referenceNumber": 553, - "name": "Historical Permission Notice and Disclaimer - Kevlin Henney variant", - "licenseId": "HPND-Kevlin-Henney", - "seeAlso": [ - "https://github.com/mruby/mruby/blob/83d12f8d52522cdb7c8cc46fad34821359f453e6/mrbgems/mruby-dir/src/Win/dirent.c#L127-L140" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-Markus-Kuhn.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-Markus-Kuhn.json", - "referenceNumber": 223, - "name": "Historical Permission Notice and Disclaimer - Markus Kuhn variant", - "licenseId": "HPND-Markus-Kuhn", - "seeAlso": [ - "https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c", - "https://sourceware.org/git/?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dreadline/readline/support/wcwidth.c;h\u003d0f5ec995796f4813abbcf4972aec0378ab74722a;hb\u003dHEAD#l55" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-MIT-disclaimer.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-MIT-disclaimer.json", - "referenceNumber": 100, - "name": "Historical Permission Notice and Disclaimer with MIT disclaimer", - "licenseId": "HPND-MIT-disclaimer", - "seeAlso": [ - "https://metacpan.org/release/NLNETLABS/Net-DNS-SEC-1.22/source/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-Pbmplus.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-Pbmplus.json", - "referenceNumber": 260, - "name": "Historical Permission Notice and Disclaimer - Pbmplus variant", - "licenseId": "HPND-Pbmplus", - "seeAlso": [ - "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/netpbm.c#l8" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.json", - "referenceNumber": 170, - "name": - "Historical Permission Notice and Disclaimer - sell xserver variant with MIT disclaimer", - "licenseId": "HPND-sell-MIT-disclaimer-xserver", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L1781" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-sell-regexpr.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-sell-regexpr.json", - "referenceNumber": 580, - "name": "Historical Permission Notice and Disclaimer - sell regexpr variant", - "licenseId": "HPND-sell-regexpr", - "seeAlso": [ - "https://gitlab.com/bacula-org/bacula/-/blob/Branch-11.0/bacula/LICENSE-FOSS?ref_type\u003dheads#L245" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-sell-variant.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", - "referenceNumber": 79, - "name": "Historical Permission Notice and Disclaimer - sell variant", - "licenseId": "HPND-sell-variant", - "seeAlso": [ - "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h\u003dv4.19" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.json", - "referenceNumber": 318, - "name": "HPND sell variant with MIT disclaimer", - "licenseId": "HPND-sell-variant-MIT-disclaimer", - "seeAlso": [ - "https://github.com/sigmavirus24/x11-ssh-askpass/blob/master/README" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HPND-UC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HPND-UC.json", - "referenceNumber": 531, - "name": - "Historical Permission Notice and Disclaimer - University of California variant", - "licenseId": "HPND-UC", - "seeAlso": [ - "https://core.tcl-lang.org/tk/file?name\u003dcompat/unistd.h" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/HTMLTIDY.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", - "referenceNumber": 120, - "name": "HTML Tidy License", - "licenseId": "HTMLTIDY", - "seeAlso": [ - "https://github.com/htacg/tidy-html5/blob/next/README/LICENSE.md" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/IBM-pibs.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", - "referenceNumber": 596, - "name": "IBM PowerPC Initialization and Boot Software", - "licenseId": "IBM-pibs", - "seeAlso": [ - "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003darch/powerpc/cpu/ppc4xx/miiphy.c;h\u003d297155fdafa064b955e53e9832de93bfb0cfb85b;hb\u003d9fab4bf4cc077c21e43941866f3f2c196f28670d" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ICU.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ICU.json", - "referenceNumber": 330, - "name": "ICU License", - "licenseId": "ICU", - "seeAlso": [ - "http://source.icu-project.org/repos/icu/icu/trunk/license.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/IEC-Code-Components-EULA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/IEC-Code-Components-EULA.json", - "referenceNumber": 356, - "name": "IEC Code Components End-user licence agreement", - "licenseId": "IEC-Code-Components-EULA", - "seeAlso": [ - "https://www.iec.ch/webstore/custserv/pdf/CC-EULA.pdf", - "https://www.iec.ch/CCv1", - "https://www.iec.ch/copyright" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/IJG.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/IJG.json", - "referenceNumber": 314, - "name": "Independent JPEG Group License", - "licenseId": "IJG", - "seeAlso": [ - "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev\u003d1.2" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/IJG-short.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/IJG-short.json", - "referenceNumber": 316, - "name": "Independent JPEG Group License - short", - "licenseId": "IJG-short", - "seeAlso": [ - "https://sourceforge.net/p/xmedcon/code/ci/master/tree/libs/ljpg/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ImageMagick.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", - "referenceNumber": 391, - "name": "ImageMagick License", - "licenseId": "ImageMagick", - "seeAlso": [ - "http://www.imagemagick.org/script/license.php" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/iMatix.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/iMatix.json", - "referenceNumber": 295, - "name": "iMatix Standard Function Library Agreement", - "licenseId": "iMatix", - "seeAlso": [ - "http://legacy.imatix.com/html/sfl/sfl4.htm#license" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Imlib2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Imlib2.json", - "referenceNumber": 547, - "name": "Imlib2 License", - "licenseId": "Imlib2", - "seeAlso": [ - "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", - "https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Info-ZIP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", - "referenceNumber": 490, - "name": "Info-ZIP License", - "licenseId": "Info-ZIP", - "seeAlso": [ - "http://www.info-zip.org/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Inner-Net-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Inner-Net-2.0.json", - "referenceNumber": 435, - "name": "Inner Net License v2.0", - "licenseId": "Inner-Net-2.0", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Inner_Net_License", - "https://sourceware.org/git/?p\u003dglibc.git;a\u003dblob;f\u003dLICENSES;h\u003d530893b1dc9ea00755603c68fb36bd4fc38a7be8;hb\u003dHEAD#l207" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Intel.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Intel.json", - "referenceNumber": 399, - "name": "Intel Open Source License", - "licenseId": "Intel", - "seeAlso": [ - "https://opensource.org/licenses/Intel" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Intel-ACPI.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", - "referenceNumber": 306, - "name": "Intel ACPI Software License Agreement", - "licenseId": "Intel-ACPI", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Interbase-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", - "referenceNumber": 237, - "name": "Interbase Public License v1.0", - "licenseId": "Interbase-1.0", - "seeAlso": [ - "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/IPA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/IPA.json", - "referenceNumber": 561, - "name": "IPA Font License", - "licenseId": "IPA", - "seeAlso": [ - "https://opensource.org/licenses/IPA" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/IPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", - "referenceNumber": 53, - "name": "IBM Public License v1.0", - "licenseId": "IPL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/IPL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ISC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ISC.json", - "referenceNumber": 322, - "name": "ISC License", - "licenseId": "ISC", - "seeAlso": [ - "https://www.isc.org/licenses/", - "https://www.isc.org/downloads/software-support-policy/isc-license/", - "https://opensource.org/licenses/ISC" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ISC-Veillard.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ISC-Veillard.json", - "referenceNumber": 284, - "name": "ISC Veillard variant", - "licenseId": "ISC-Veillard", - "seeAlso": [ - "https://raw.githubusercontent.com/GNOME/libxml2/4c2e7c651f6c2f0d1a74f350cbda95f7df3e7017/hash.c", - "https://github.com/GNOME/libxml2/blob/master/dict.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Jam.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Jam.json", - "referenceNumber": 505, - "name": "Jam License", - "licenseId": "Jam", - "seeAlso": [ - "https://www.boost.org/doc/libs/1_35_0/doc/html/jam.html", - "https://web.archive.org/web/20160330173339/https://swarm.workshop.perforce.com/files/guest/perforce_software/jam/src/README" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/JasPer-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", - "referenceNumber": 60, - "name": "JasPer License", - "licenseId": "JasPer-2.0", - "seeAlso": [ - "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/JPL-image.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/JPL-image.json", - "referenceNumber": 509, - "name": "JPL Image Use Policy", - "licenseId": "JPL-image", - "seeAlso": [ - "https://www.jpl.nasa.gov/jpl-image-use-policy" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/JPNIC.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/JPNIC.json", - "referenceNumber": 579, - "name": "Japan Network Information Center License", - "licenseId": "JPNIC", - "seeAlso": [ - "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/JSON.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/JSON.json", - "referenceNumber": 155, - "name": "JSON License", - "licenseId": "JSON", - "seeAlso": [ - "http://www.json.org/license.html" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/Kastrup.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Kastrup.json", - "referenceNumber": 570, - "name": "Kastrup License", - "licenseId": "Kastrup", - "seeAlso": [ - "https://ctan.math.utah.edu/ctan/tex-archive/macros/generic/kastrup/binhex.dtx" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Kazlib.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Kazlib.json", - "referenceNumber": 551, - "name": "Kazlib License", - "licenseId": "Kazlib", - "seeAlso": [ - "http://git.savannah.gnu.org/cgit/kazlib.git/tree/except.c?id\u003d0062df360c2d17d57f6af19b0e444c51feb99036" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Knuth-CTAN.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Knuth-CTAN.json", - "referenceNumber": 504, - "name": "Knuth CTAN License", - "licenseId": "Knuth-CTAN", - "seeAlso": [ - "https://ctan.org/license/knuth" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LAL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", - "referenceNumber": 468, - "name": "Licence Art Libre 1.2", - "licenseId": "LAL-1.2", - "seeAlso": [ - "http://artlibre.org/licence/lal/licence-art-libre-12/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LAL-1.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", - "referenceNumber": 118, - "name": "Licence Art Libre 1.3", - "licenseId": "LAL-1.3", - "seeAlso": [ - "https://artlibre.org/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Latex2e.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Latex2e.json", - "referenceNumber": 597, - "name": "Latex2e License", - "licenseId": "Latex2e", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Latex2e" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Latex2e-translated-notice.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Latex2e-translated-notice.json", - "referenceNumber": 276, - "name": "Latex2e with translated notice permission", - "licenseId": "Latex2e-translated-notice", - "seeAlso": [ - "https://git.savannah.gnu.org/cgit/indent.git/tree/doc/indent.texi?id\u003da74c6b4ee49397cf330b333da1042bffa60ed14f#n74" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Leptonica.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Leptonica.json", - "referenceNumber": 192, - "name": "Leptonica License", - "licenseId": "Leptonica", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Leptonica" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", - "referenceNumber": 68, - "name": "GNU Library General Public License v2 only", - "licenseId": "LGPL-2.0", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.0+.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", - "referenceNumber": 492, - "name": "GNU Library General Public License v2 or later", - "licenseId": "LGPL-2.0+", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", - "referenceNumber": 434, - "name": "GNU Library General Public License v2 only", - "licenseId": "LGPL-2.0-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-or-later.json", - "referenceNumber": 157, - "name": "GNU Library General Public License v2 or later", - "licenseId": "LGPL-2.0-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.1.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", - "referenceNumber": 623, - "name": "GNU Lesser General Public License v2.1 only", - "licenseId": "LGPL-2.1", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "https://opensource.org/licenses/LGPL-2.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.1+.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", - "referenceNumber": 357, - "name": "GNU Lesser General Public License v2.1 or later", - "licenseId": "LGPL-2.1+", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "https://opensource.org/licenses/LGPL-2.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.1-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", - "referenceNumber": 35, - "name": "GNU Lesser General Public License v2.1 only", - "licenseId": "LGPL-2.1-only", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "https://opensource.org/licenses/LGPL-2.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-2.1-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-or-later.json", - "referenceNumber": 349, - "name": "GNU Lesser General Public License v2.1 or later", - "licenseId": "LGPL-2.1-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", - "https://opensource.org/licenses/LGPL-2.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-3.0.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", - "referenceNumber": 617, - "name": "GNU Lesser General Public License v3.0 only", - "licenseId": "LGPL-3.0", - "seeAlso": [ - "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", - "https://opensource.org/licenses/LGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-3.0+.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", - "referenceNumber": 52, - "name": "GNU Lesser General Public License v3.0 or later", - "licenseId": "LGPL-3.0+", - "seeAlso": [ - "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", - "https://opensource.org/licenses/LGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-3.0-only.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", - "referenceNumber": 307, - "name": "GNU Lesser General Public License v3.0 only", - "licenseId": "LGPL-3.0-only", - "seeAlso": [ - "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", - "https://opensource.org/licenses/LGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPL-3.0-or-later.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-or-later.json", - "referenceNumber": 64, - "name": "GNU Lesser General Public License v3.0 or later", - "licenseId": "LGPL-3.0-or-later", - "seeAlso": [ - "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", - "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", - "https://opensource.org/licenses/LGPL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LGPLLR.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", - "referenceNumber": 268, - "name": "Lesser General Public License For Linguistic Resources", - "licenseId": "LGPLLR", - "seeAlso": [ - "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Libpng.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Libpng.json", - "referenceNumber": 484, - "name": "libpng License", - "licenseId": "Libpng", - "seeAlso": [ - "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/libpng-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", - "referenceNumber": 16, - "name": "PNG Reference Library version 2", - "licenseId": "libpng-2.0", - "seeAlso": [ - "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/libselinux-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", - "referenceNumber": 67, - "name": "libselinux public domain notice", - "licenseId": "libselinux-1.0", - "seeAlso": [ - "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/libtiff.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/libtiff.json", - "referenceNumber": 466, - "name": "libtiff License", - "licenseId": "libtiff", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/libtiff" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/libutil-David-Nugent.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/libutil-David-Nugent.json", - "referenceNumber": 66, - "name": "libutil David Nugent License", - "licenseId": "libutil-David-Nugent", - "seeAlso": [ - "http://web.mit.edu/freebsd/head/lib/libutil/login_ok.3", - "https://cgit.freedesktop.org/libbsd/tree/man/setproctitle.3bsd" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", - "referenceNumber": 248, - "name": "Licence Libre du Québec – Permissive version 1.1", - "licenseId": "LiLiQ-P-1.1", - "seeAlso": [ - "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", - "http://opensource.org/licenses/LiLiQ-P-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", - "referenceNumber": 71, - "name": "Licence Libre du Québec – Réciprocité version 1.1", - "licenseId": "LiLiQ-R-1.1", - "seeAlso": [ - "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", - "http://opensource.org/licenses/LiLiQ-R-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", - "referenceNumber": 143, - "name": "Licence Libre du Québec – Réciprocité forte version 1.1", - "licenseId": "LiLiQ-Rplus-1.1", - "seeAlso": [ - "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", - "http://opensource.org/licenses/LiLiQ-Rplus-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Linux-man-pages-1-para.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-1-para.json", - "referenceNumber": 279, - "name": "Linux man-pages - 1 paragraph", - "licenseId": "Linux-man-pages-1-para", - "seeAlso": [ - "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/getcpu.2#n4" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", - "referenceNumber": 286, - "name": "Linux man-pages Copyleft", - "licenseId": "Linux-man-pages-copyleft", - "seeAlso": [ - "https://www.kernel.org/doc/man-pages/licenses.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.json", - "referenceNumber": 136, - "name": "Linux man-pages Copyleft - 2 paragraphs", - "licenseId": "Linux-man-pages-copyleft-2-para", - "seeAlso": [ - "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/move_pages.2#n5", - "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/migrate_pages.2#n8" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.json", - "referenceNumber": 21, - "name": "Linux man-pages Copyleft Variant", - "licenseId": "Linux-man-pages-copyleft-var", - "seeAlso": [ - "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/set_mempolicy.2#n5" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Linux-OpenIB.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", - "referenceNumber": 161, - "name": "Linux Kernel Variant of OpenIB.org license", - "licenseId": "Linux-OpenIB", - "seeAlso": [ - "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LOOP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LOOP.json", - "referenceNumber": 233, - "name": "Common Lisp LOOP License", - "licenseId": "LOOP", - "seeAlso": [ - "https://gitlab.com/embeddable-common-lisp/ecl/-/blob/develop/src/lsp/loop.lsp", - "http://git.savannah.gnu.org/cgit/gcl.git/tree/gcl/lsp/gcl_loop.lsp?h\u003dVersion_2_6_13pre", - "https://sourceforge.net/p/sbcl/sbcl/ci/master/tree/src/code/loop.lisp", - "https://github.com/cl-adams/adams/blob/master/LICENSE.md", - "https://github.com/blakemcbride/eclipse-lisp/blob/master/lisp/loop.lisp", - "https://gitlab.common-lisp.net/cmucl/cmucl/-/blob/master/src/code/loop.lisp" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LPD-document.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPD-document.json", - "referenceNumber": 294, - "name": "LPD Documentation License", - "licenseId": "LPD-document", - "seeAlso": [ - "https://github.com/Cyan4973/xxHash/blob/dev/doc/xxhash_spec.md", - "https://www.ietf.org/rfc/rfc1952.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", - "referenceNumber": 390, - "name": "Lucent Public License Version 1.0", - "licenseId": "LPL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/LPL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/LPL-1.02.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", - "referenceNumber": 459, - "name": "Lucent Public License v1.02", - "licenseId": "LPL-1.02", - "seeAlso": [ - "http://plan9.bell-labs.com/plan9/license.html", - "https://opensource.org/licenses/LPL-1.02" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LPPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", - "referenceNumber": 183, - "name": "LaTeX Project Public License v1.0", - "licenseId": "LPPL-1.0", - "seeAlso": [ - "http://www.latex-project.org/lppl/lppl-1-0.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LPPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", - "referenceNumber": 408, - "name": "LaTeX Project Public License v1.1", - "licenseId": "LPPL-1.1", - "seeAlso": [ - "http://www.latex-project.org/lppl/lppl-1-1.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LPPL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", - "referenceNumber": 24, - "name": "LaTeX Project Public License v1.2", - "licenseId": "LPPL-1.2", - "seeAlso": [ - "http://www.latex-project.org/lppl/lppl-1-2.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LPPL-1.3a.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", - "referenceNumber": 366, - "name": "LaTeX Project Public License v1.3a", - "licenseId": "LPPL-1.3a", - "seeAlso": [ - "http://www.latex-project.org/lppl/lppl-1-3a.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/LPPL-1.3c.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", - "referenceNumber": 396, - "name": "LaTeX Project Public License v1.3c", - "licenseId": "LPPL-1.3c", - "seeAlso": [ - "http://www.latex-project.org/lppl/lppl-1-3c.txt", - "https://opensource.org/licenses/LPPL-1.3c" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/lsof.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/lsof.json", - "referenceNumber": 403, - "name": "lsof License", - "licenseId": "lsof", - "seeAlso": [ - "https://github.com/lsof-org/lsof/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.json", - "referenceNumber": 588, - "name": "Lucida Bitmap Fonts License", - "licenseId": "Lucida-Bitmap-Fonts", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/font/bh-100dpi/-/blob/master/COPYING?ref_type\u003dheads" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.json", - "referenceNumber": 539, - "name": "LZMA SDK License (versions 9.11 to 9.20)", - "licenseId": "LZMA-SDK-9.11-to-9.20", - "seeAlso": [ - "https://www.7-zip.org/sdk.html", - "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/LZMA-SDK-9.22.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.22.json", - "referenceNumber": 497, - "name": "LZMA SDK License (versions 9.22 and beyond)", - "licenseId": "LZMA-SDK-9.22", - "seeAlso": [ - "https://www.7-zip.org/sdk.html", - "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/magaz.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/magaz.json", - "referenceNumber": 380, - "name": "magaz License", - "licenseId": "magaz", - "seeAlso": [ - "https://mirrors.nic.cz/tex-archive/macros/latex/contrib/magaz/magaz.tex" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/mailprio.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/mailprio.json", - "referenceNumber": 339, - "name": "mailprio License", - "licenseId": "mailprio", - "seeAlso": [ - "https://fossies.org/linux/sendmail/contrib/mailprio" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MakeIndex.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", - "referenceNumber": 404, - "name": "MakeIndex License", - "licenseId": "MakeIndex", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MakeIndex" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Martin-Birgmeier.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Martin-Birgmeier.json", - "referenceNumber": 2, - "name": "Martin Birgmeier License", - "licenseId": "Martin-Birgmeier", - "seeAlso": [ - "https://github.com/Perl/perl5/blob/blead/util.c#L6136" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/McPhee-slideshow.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/McPhee-slideshow.json", - "referenceNumber": 107, - "name": "McPhee Slideshow License", - "licenseId": "McPhee-slideshow", - "seeAlso": [ - "https://mirror.las.iastate.edu/tex-archive/graphics/metapost/contrib/macros/slideshow/slideshow.mp" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/metamail.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/metamail.json", - "referenceNumber": 519, - "name": "metamail License", - "licenseId": "metamail", - "seeAlso": [ - "https://github.com/Dual-Life/mime-base64/blob/master/Base64.xs#L12" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Minpack.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Minpack.json", - "referenceNumber": 621, - "name": "Minpack License", - "licenseId": "Minpack", - "seeAlso": [ - "http://www.netlib.org/minpack/disclaimer", - "https://gitlab.com/libeigen/eigen/-/blob/master/COPYING.MINPACK" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MirOS.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MirOS.json", - "referenceNumber": 516, - "name": "The MirOS Licence", - "licenseId": "MirOS", - "seeAlso": [ - "https://opensource.org/licenses/MirOS" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/MIT.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT.json", - "referenceNumber": 292, - "name": "MIT License", - "licenseId": "MIT", - "seeAlso": [ - "https://opensource.org/license/mit/" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/MIT-0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-0.json", - "referenceNumber": 83, - "name": "MIT No Attribution", - "licenseId": "MIT-0", - "seeAlso": [ - "https://github.com/aws/mit-0", - "https://romanrm.net/mit-zero", - "https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/MIT-advertising.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", - "referenceNumber": 317, - "name": "Enlightenment License (e16)", - "licenseId": "MIT-advertising", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-CMU.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", - "referenceNumber": 382, - "name": "CMU License", - "licenseId": "MIT-CMU", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:MIT?rd\u003dLicensing/MIT#CMU_Style", - "https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-enna.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", - "referenceNumber": 256, - "name": "enna License", - "licenseId": "MIT-enna", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MIT#enna" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-feh.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", - "referenceNumber": 231, - "name": "feh License", - "licenseId": "MIT-feh", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MIT#feh" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-Festival.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-Festival.json", - "referenceNumber": 235, - "name": "MIT Festival Variant", - "licenseId": "MIT-Festival", - "seeAlso": [ - "https://github.com/festvox/flite/blob/master/COPYING", - "https://github.com/festvox/speech_tools/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", - "referenceNumber": 34, - "name": "MIT License Modern Variant", - "licenseId": "MIT-Modern-Variant", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:MIT#Modern_Variants", - "https://ptolemy.berkeley.edu/copyright.htm", - "https://pirlwww.lpl.arizona.edu/resources/guide/software/PerlTk/Tixlic.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/MIT-open-group.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", - "referenceNumber": 460, - "name": "MIT Open Group variant", - "licenseId": "MIT-open-group", - "seeAlso": [ - "https://gitlab.freedesktop.org/xorg/app/iceauth/-/blob/master/COPYING", - "https://gitlab.freedesktop.org/xorg/app/xvinfo/-/blob/master/COPYING", - "https://gitlab.freedesktop.org/xorg/app/xsetroot/-/blob/master/COPYING", - "https://gitlab.freedesktop.org/xorg/app/xauth/-/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-testregex.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-testregex.json", - "referenceNumber": 32, - "name": "MIT testregex Variant", - "licenseId": "MIT-testregex", - "seeAlso": [ - "https://github.com/dotnet/runtime/blob/55e1ac7c07df62c4108d4acedf78f77574470ce5/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/AttRegexTests.cs#L12-L28" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MIT-Wu.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MIT-Wu.json", - "referenceNumber": 320, - "name": "MIT Tom Wu Variant", - "licenseId": "MIT-Wu", - "seeAlso": [ - "https://github.com/chromium/octane/blob/master/crypto.js" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MITNFA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MITNFA.json", - "referenceNumber": 534, - "name": "MIT +no-false-attribs license", - "licenseId": "MITNFA", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MITNFA" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MMIXware.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MMIXware.json", - "referenceNumber": 197, - "name": "MMIXware License", - "licenseId": "MMIXware", - "seeAlso": [ - "https://gitlab.lrz.de/mmix/mmixware/-/blob/master/boilerplate.w" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Motosoto.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Motosoto.json", - "referenceNumber": 439, - "name": "Motosoto License", - "licenseId": "Motosoto", - "seeAlso": [ - "https://opensource.org/licenses/Motosoto" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/MPEG-SSG.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MPEG-SSG.json", - "referenceNumber": 169, - "name": "MPEG Software Simulation", - "licenseId": "MPEG-SSG", - "seeAlso": [ - "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/converter/ppm/ppmtompeg/jrevdct.c#l1189" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/mpi-permissive.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/mpi-permissive.json", - "referenceNumber": 65, - "name": "mpi Permissive License", - "licenseId": "mpi-permissive", - "seeAlso": [ - "https://sources.debian.org/src/openmpi/4.1.0-10/ompi/debuggers/msgq_interface.h/?hl\u003d19#L19" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/mpich2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/mpich2.json", - "referenceNumber": 189, - "name": "mpich2 License", - "licenseId": "mpich2", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/MIT" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", - "referenceNumber": 127, - "name": "Mozilla Public License 1.0", - "licenseId": "MPL-1.0", - "seeAlso": [ - "http://www.mozilla.org/MPL/MPL-1.0.html", - "https://opensource.org/licenses/MPL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/MPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", - "referenceNumber": 482, - "name": "Mozilla Public License 1.1", - "licenseId": "MPL-1.1", - "seeAlso": [ - "http://www.mozilla.org/MPL/MPL-1.1.html", - "https://opensource.org/licenses/MPL-1.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/MPL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", - "referenceNumber": 342, - "name": "Mozilla Public License 2.0", - "licenseId": "MPL-2.0", - "seeAlso": [ - "https://www.mozilla.org/MPL/2.0/", - "https://opensource.org/licenses/MPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json", - "referenceNumber": 463, - "name": "Mozilla Public License 2.0 (no copyleft exception)", - "licenseId": "MPL-2.0-no-copyleft-exception", - "seeAlso": [ - "https://www.mozilla.org/MPL/2.0/", - "https://opensource.org/licenses/MPL-2.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/mplus.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/mplus.json", - "referenceNumber": 436, - "name": "mplus Font License", - "licenseId": "mplus", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:Mplus?rd\u003dLicensing/mplus" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MS-LPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MS-LPL.json", - "referenceNumber": 550, - "name": "Microsoft Limited Public License", - "licenseId": "MS-LPL", - "seeAlso": [ - "https://www.openhub.net/licenses/mslpl", - "https://github.com/gabegundy/atlserver/blob/master/License.txt", - "https://en.wikipedia.org/wiki/Shared_Source_Initiative#Microsoft_Limited_Public_License_(Ms-LPL)" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MS-PL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MS-PL.json", - "referenceNumber": 215, - "name": "Microsoft Public License", - "licenseId": "MS-PL", - "seeAlso": [ - "http://www.microsoft.com/opensource/licenses.mspx", - "https://opensource.org/licenses/MS-PL" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/MS-RL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MS-RL.json", - "referenceNumber": 190, - "name": "Microsoft Reciprocal License", - "licenseId": "MS-RL", - "seeAlso": [ - "http://www.microsoft.com/opensource/licenses.mspx", - "https://opensource.org/licenses/MS-RL" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/MTLL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MTLL.json", - "referenceNumber": 26, - "name": "Matrix Template Library License", - "licenseId": "MTLL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MulanPSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", - "referenceNumber": 555, - "name": "Mulan Permissive Software License, Version 1", - "licenseId": "MulanPSL-1.0", - "seeAlso": [ - "https://license.coscl.org.cn/MulanPSL/", - "https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/MulanPSL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", - "referenceNumber": 376, - "name": "Mulan Permissive Software License, Version 2", - "licenseId": "MulanPSL-2.0", - "seeAlso": [ - "https://license.coscl.org.cn/MulanPSL2" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Multics.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Multics.json", - "referenceNumber": 613, - "name": "Multics License", - "licenseId": "Multics", - "seeAlso": [ - "https://opensource.org/licenses/Multics" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Mup.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Mup.json", - "referenceNumber": 184, - "name": "Mup License", - "licenseId": "Mup", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Mup" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NAIST-2003.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", - "referenceNumber": 473, - "name": "Nara Institute of Science and Technology License (2003)", - "licenseId": "NAIST-2003", - "seeAlso": [ - "https://enterprise.dejacode.com/licenses/public/naist-2003/#license-text", - "https://github.com/nodejs/node/blob/4a19cc8947b1bba2b2d27816ec3d0edf9b28e503/LICENSE#L343" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NASA-1.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", - "referenceNumber": 328, - "name": "NASA Open Source Agreement 1.3", - "licenseId": "NASA-1.3", - "seeAlso": [ - "http://ti.arc.nasa.gov/opensource/nosa/", - "https://opensource.org/licenses/NASA-1.3" - ], - "isOsiApproved": true, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/Naumen.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Naumen.json", - "referenceNumber": 232, - "name": "Naumen Public License", - "licenseId": "Naumen", - "seeAlso": [ - "https://opensource.org/licenses/Naumen" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/NBPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", - "referenceNumber": 321, - "name": "Net Boolean Public License v1", - "licenseId": "NBPL-1.0", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d37b4b3f6cc4bf34e1d3dec61e69914b9819d8894" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NCGL-UK-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NCGL-UK-2.0.json", - "referenceNumber": 80, - "name": "Non-Commercial Government Licence", - "licenseId": "NCGL-UK-2.0", - "seeAlso": [ - "http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NCSA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NCSA.json", - "referenceNumber": 7, - "name": "University of Illinois/NCSA Open Source License", - "licenseId": "NCSA", - "seeAlso": [ - "http://otm.illinois.edu/uiuc_openSource", - "https://opensource.org/licenses/NCSA" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Net-SNMP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", - "referenceNumber": 456, - "name": "Net-SNMP License", - "licenseId": "Net-SNMP", - "seeAlso": [ - "http://net-snmp.sourceforge.net/about/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NetCDF.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NetCDF.json", - "referenceNumber": 282, - "name": "NetCDF license", - "licenseId": "NetCDF", - "seeAlso": [ - "http://www.unidata.ucar.edu/software/netcdf/copyright.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Newsletr.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Newsletr.json", - "referenceNumber": 236, - "name": "Newsletr License", - "licenseId": "Newsletr", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Newsletr" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NGPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NGPL.json", - "referenceNumber": 536, - "name": "Nethack General Public License", - "licenseId": "NGPL", - "seeAlso": [ - "https://opensource.org/licenses/NGPL" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/NICTA-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NICTA-1.0.json", - "referenceNumber": 444, - "name": "NICTA Public Software License, Version 1.0", - "licenseId": "NICTA-1.0", - "seeAlso": [ - "https://opensource.apple.com/source/mDNSResponder/mDNSResponder-320.10/mDNSPosix/nss_ReadMe.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NIST-PD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", - "referenceNumber": 250, - "name": "NIST Public Domain Notice", - "licenseId": "NIST-PD", - "seeAlso": [ - "https://github.com/tcheneau/simpleRPL/blob/e645e69e38dd4e3ccfeceb2db8cba05b7c2e0cd3/LICENSE.txt", - "https://github.com/tcheneau/Routing/blob/f09f46fcfe636107f22f2c98348188a65a135d98/README.md" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NIST-PD-fallback.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", - "referenceNumber": 186, - "name": "NIST Public Domain Notice with license fallback", - "licenseId": "NIST-PD-fallback", - "seeAlso": [ - "https://github.com/usnistgov/jsip/blob/59700e6926cbe96c5cdae897d9a7d2656b42abe3/LICENSE", - "https://github.com/usnistgov/fipy/blob/86aaa5c2ba2c6f1be19593c5986071cf6568cc34/LICENSE.rst" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NIST-Software.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NIST-Software.json", - "referenceNumber": 33, - "name": "NIST Software License", - "licenseId": "NIST-Software", - "seeAlso": [ - "https://github.com/open-quantum-safe/liboqs/blob/40b01fdbb270f8614fde30e65d30e9da18c02393/src/common/rand/rand_nist.c#L1-L15" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NLOD-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", - "referenceNumber": 119, - "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", - "licenseId": "NLOD-1.0", - "seeAlso": [ - "http://data.norge.no/nlod/en/1.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NLOD-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", - "referenceNumber": 601, - "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", - "licenseId": "NLOD-2.0", - "seeAlso": [ - "http://data.norge.no/nlod/en/2.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NLPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NLPL.json", - "referenceNumber": 594, - "name": "No Limit Public License", - "licenseId": "NLPL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/NLPL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Nokia.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Nokia.json", - "referenceNumber": 574, - "name": "Nokia Open Source License", - "licenseId": "Nokia", - "seeAlso": [ - "https://opensource.org/licenses/nokia" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/NOSL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NOSL.json", - "referenceNumber": 160, - "name": "Netizen Open Source License", - "licenseId": "NOSL", - "seeAlso": [ - "http://bits.netizen.com.au/licenses/NOSL/nosl.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Noweb.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Noweb.json", - "referenceNumber": 180, - "name": "Noweb License", - "licenseId": "Noweb", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Noweb" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", - "referenceNumber": 388, - "name": "Netscape Public License v1.0", - "licenseId": "NPL-1.0", - "seeAlso": [ - "http://www.mozilla.org/MPL/NPL/1.0/" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/NPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", - "referenceNumber": 598, - "name": "Netscape Public License v1.1", - "licenseId": "NPL-1.1", - "seeAlso": [ - "http://www.mozilla.org/MPL/NPL/1.1/" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/NPOSL-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", - "referenceNumber": 620, - "name": "Non-Profit Open Software License 3.0", - "licenseId": "NPOSL-3.0", - "seeAlso": [ - "https://opensource.org/licenses/NOSL3.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/NRL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NRL.json", - "referenceNumber": 55, - "name": "NRL License", - "licenseId": "NRL", - "seeAlso": [ - "http://web.mit.edu/network/isakmp/nrllicense.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/NTP.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NTP.json", - "referenceNumber": 19, - "name": "NTP License", - "licenseId": "NTP", - "seeAlso": [ - "https://opensource.org/licenses/NTP" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/NTP-0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/NTP-0.json", - "referenceNumber": 25, - "name": "NTP No Attribution", - "licenseId": "NTP-0", - "seeAlso": [ - "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Nunit.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/Nunit.json", - "referenceNumber": 589, - "name": "Nunit License", - "licenseId": "Nunit", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Nunit" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/O-UDA-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", - "referenceNumber": 238, - "name": "Open Use of Data Agreement v1.0", - "licenseId": "O-UDA-1.0", - "seeAlso": [ - "https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md", - "https://cdla.dev/open-use-of-data-agreement-v1-0/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OCCT-PL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", - "referenceNumber": 149, - "name": "Open CASCADE Technology Public License", - "licenseId": "OCCT-PL", - "seeAlso": [ - "http://www.opencascade.com/content/occt-public-license" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OCLC-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", - "referenceNumber": 417, - "name": "OCLC Research Public License 2.0", - "licenseId": "OCLC-2.0", - "seeAlso": [ - "http://www.oclc.org/research/activities/software/license/v2final.htm", - "https://opensource.org/licenses/OCLC-2.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/ODbL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", - "referenceNumber": 105, - "name": "Open Data Commons Open Database License v1.0", - "licenseId": "ODbL-1.0", - "seeAlso": [ - "http://www.opendatacommons.org/licenses/odbl/1.0/", - "https://opendatacommons.org/licenses/odbl/1-0/" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ODC-By-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", - "referenceNumber": 493, - "name": "Open Data Commons Attribution License v1.0", - "licenseId": "ODC-By-1.0", - "seeAlso": [ - "https://opendatacommons.org/licenses/by/1.0/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OFFIS.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFFIS.json", - "referenceNumber": 84, - "name": "OFFIS License", - "licenseId": "OFFIS", - "seeAlso": [ - "https://sourceforge.net/p/xmedcon/code/ci/master/tree/libs/dicom/README" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OFL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", - "referenceNumber": 56, - "name": "SIL Open Font License 1.0", - "licenseId": "OFL-1.0", - "seeAlso": [ - "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OFL-1.0-no-RFN.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFL-1.0-no-RFN.json", - "referenceNumber": 394, - "name": "SIL Open Font License 1.0 with no Reserved Font Name", - "licenseId": "OFL-1.0-no-RFN", - "seeAlso": [ - "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", - "referenceNumber": 532, - "name": "SIL Open Font License 1.0 with Reserved Font Name", - "licenseId": "OFL-1.0-RFN", - "seeAlso": [ - "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OFL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", - "referenceNumber": 337, - "name": "SIL Open Font License 1.1", - "licenseId": "OFL-1.1", - "seeAlso": [ - "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", - "https://opensource.org/licenses/OFL-1.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OFL-1.1-no-RFN.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFL-1.1-no-RFN.json", - "referenceNumber": 507, - "name": "SIL Open Font License 1.1 with no Reserved Font Name", - "licenseId": "OFL-1.1-no-RFN", - "seeAlso": [ - "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", - "https://opensource.org/licenses/OFL-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", - "referenceNumber": 578, - "name": "SIL Open Font License 1.1 with Reserved Font Name", - "licenseId": "OFL-1.1-RFN", - "seeAlso": [ - "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", - "https://opensource.org/licenses/OFL-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/OGC-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", - "referenceNumber": 543, - "name": "OGC Software License, Version 1.0", - "licenseId": "OGC-1.0", - "seeAlso": [ - "https://www.ogc.org/ogc/software/1.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", - "referenceNumber": 23, - "name": "Taiwan Open Government Data License, version 1.0", - "licenseId": "OGDL-Taiwan-1.0", - "seeAlso": [ - "https://data.gov.tw/license" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", - "referenceNumber": 210, - "name": "Open Government Licence - Canada", - "licenseId": "OGL-Canada-2.0", - "seeAlso": [ - "https://open.canada.ca/en/open-government-licence-canada" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OGL-UK-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", - "referenceNumber": 205, - "name": "Open Government Licence v1.0", - "licenseId": "OGL-UK-1.0", - "seeAlso": [ - "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OGL-UK-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", - "referenceNumber": 386, - "name": "Open Government Licence v2.0", - "licenseId": "OGL-UK-2.0", - "seeAlso": [ - "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OGL-UK-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", - "referenceNumber": 415, - "name": "Open Government Licence v3.0", - "licenseId": "OGL-UK-3.0", - "seeAlso": [ - "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OGTSL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OGTSL.json", - "referenceNumber": 544, - "name": "Open Group Test Suite License", - "licenseId": "OGTSL", - "seeAlso": [ - "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", - "https://opensource.org/licenses/OGTSL" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/OLDAP-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", - "referenceNumber": 377, - "name": "Open LDAP Public License v1.1", - "licenseId": "OLDAP-1.1", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d806557a5ad59804ef3a44d5abfbe91d706b0791f" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", - "referenceNumber": 548, - "name": "Open LDAP Public License v1.2", - "licenseId": "OLDAP-1.2", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d42b0383c50c299977b5893ee695cf4e486fb0dc7" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-1.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", - "referenceNumber": 455, - "name": "Open LDAP Public License v1.3", - "licenseId": "OLDAP-1.3", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003de5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-1.4.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", - "referenceNumber": 38, - "name": "Open LDAP Public License v1.4", - "licenseId": "OLDAP-1.4", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dc9f95c2f3f2ffb5e0ae55fe7388af75547660941" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", - "referenceNumber": 234, - "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", - "licenseId": "OLDAP-2.0", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcbf50f4e1185a21abd4c0a54d3f4341fe28f36ea" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", - "referenceNumber": 397, - "name": "Open LDAP Public License v2.0.1", - "licenseId": "OLDAP-2.0.1", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db6d68acd14e51ca3aab4428bf26522aa74873f0e" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", - "referenceNumber": 39, - "name": "Open LDAP Public License v2.1", - "licenseId": "OLDAP-2.1", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db0d176738e96a0d3b9f85cb51e140a86f21be715" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", - "referenceNumber": 142, - "name": "Open LDAP Public License v2.2", - "licenseId": "OLDAP-2.2", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d470b0c18ec67621c85881b2733057fecf4a1acc3" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", - "referenceNumber": 583, - "name": "Open LDAP Public License v2.2.1", - "licenseId": "OLDAP-2.2.1", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d4bc786f34b50aa301be6f5600f58a980070f481e" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", - "referenceNumber": 153, - "name": "Open LDAP Public License 2.2.2", - "licenseId": "OLDAP-2.2.2", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003ddf2cc1e21eb7c160695f5b7cffd6296c151ba188" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", - "referenceNumber": 590, - "name": "Open LDAP Public License v2.3", - "licenseId": "OLDAP-2.3", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dd32cf54a32d581ab475d23c810b0a7fbaf8d63c3" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.4.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", - "referenceNumber": 584, - "name": "Open LDAP Public License v2.4", - "licenseId": "OLDAP-2.4", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcd1284c4a91a8a380d904eee68d1583f989ed386" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", - "referenceNumber": 204, - "name": "Open LDAP Public License v2.5", - "licenseId": "OLDAP-2.5", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d6852b9d90022e8593c98205413380536b1b5a7cf" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.6.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", - "referenceNumber": 604, - "name": "Open LDAP Public License v2.6", - "licenseId": "OLDAP-2.6", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d1cae062821881f41b73012ba816434897abf4205" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.7.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", - "referenceNumber": 125, - "name": "Open LDAP Public License v2.7", - "licenseId": "OLDAP-2.7", - "seeAlso": [ - "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d47c2415c1df81556eeb39be6cad458ef87c534a2" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OLDAP-2.8.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", - "referenceNumber": 528, - "name": "Open LDAP Public License v2.8", - "licenseId": "OLDAP-2.8", - "seeAlso": [ - "http://www.openldap.org/software/release/license.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/OLFL-1.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OLFL-1.3.json", - "referenceNumber": 63, - "name": "Open Logistics Foundation License Version 1.3", - "licenseId": "OLFL-1.3", - "seeAlso": [ - "https://openlogisticsfoundation.org/licenses/", - "https://opensource.org/license/olfl-1-3/" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/OML.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OML.json", - "referenceNumber": 199, - "name": "Open Market License", - "licenseId": "OML", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Open_Market_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OpenPBS-2.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OpenPBS-2.3.json", - "referenceNumber": 45, - "name": "OpenPBS v2.3 Software License", - "licenseId": "OpenPBS-2.3", - "seeAlso": [ - "https://github.com/adaptivecomputing/torque/blob/master/PBS_License.txt", - "https://www.mcs.anl.gov/research/projects/openpbs/PBS_License.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OpenSSL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", - "referenceNumber": 508, - "name": "OpenSSL License", - "licenseId": "OpenSSL", - "seeAlso": [ - "http://www.openssl.org/source/license.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OpenSSL-standalone.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OpenSSL-standalone.json", - "referenceNumber": 542, - "name": "OpenSSL License - standalone", - "licenseId": "OpenSSL-standalone", - "seeAlso": [ - "https://library.netapp.com/ecm/ecm_download_file/ECMP1196395", - "https://hstechdocs.helpsystems.com/manuals/globalscape/archive/cuteftp6/open_ssl_license_agreement.htm" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", - "referenceNumber": 411, - "name": "Open Public License v1.0", - "licenseId": "OPL-1.0", - "seeAlso": [ - "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", - "https://fedoraproject.org/wiki/Licensing/Open_Public_License" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/OPL-UK-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OPL-UK-3.0.json", - "referenceNumber": 378, - "name": "United Kingdom Open Parliament Licence v3.0", - "licenseId": "OPL-UK-3.0", - "seeAlso": [ - "https://www.parliament.uk/site-information/copyright-parliament/open-parliament-licence/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OPUBL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", - "referenceNumber": 479, - "name": "Open Publication License v1.0", - "licenseId": "OPUBL-1.0", - "seeAlso": [ - "http://opencontent.org/openpub/", - "https://www.debian.org/opl", - "https://www.ctan.org/license/opl" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/OSET-PL-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", - "referenceNumber": 244, - "name": "OSET Public License version 2.1", - "licenseId": "OSET-PL-2.1", - "seeAlso": [ - "http://www.osetfoundation.org/public-license", - "https://opensource.org/licenses/OPL-2.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/OSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", - "referenceNumber": 281, - "name": "Open Software License 1.0", - "licenseId": "OSL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/OSL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OSL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", - "referenceNumber": 146, - "name": "Open Software License 1.1", - "licenseId": "OSL-1.1", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/OSL1.1" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OSL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", - "referenceNumber": 290, - "name": "Open Software License 2.0", - "licenseId": "OSL-2.0", - "seeAlso": [ - "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OSL-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", - "referenceNumber": 375, - "name": "Open Software License 2.1", - "licenseId": "OSL-2.1", - "seeAlso": [ - "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", - "https://opensource.org/licenses/OSL-2.1" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/OSL-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", - "referenceNumber": 122, - "name": "Open Software License 3.0", - "licenseId": "OSL-3.0", - "seeAlso": [ - "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", - "https://opensource.org/licenses/OSL-3.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/PADL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PADL.json", - "referenceNumber": 347, - "name": "PADL License", - "licenseId": "PADL", - "seeAlso": [ - "https://git.openldap.org/openldap/openldap/-/blob/master/libraries/libldap/os-local.c?ref_type\u003dheads#L19-23" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Parity-6.0.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", - "referenceNumber": 241, - "name": "The Parity Public License 6.0.0", - "licenseId": "Parity-6.0.0", - "seeAlso": [ - "https://paritylicense.com/versions/6.0.0.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Parity-7.0.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", - "referenceNumber": 440, - "name": "The Parity Public License 7.0.0", - "licenseId": "Parity-7.0.0", - "seeAlso": [ - "https://paritylicense.com/versions/7.0.0.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/PDDL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", - "referenceNumber": 208, - "name": "Open Data Commons Public Domain Dedication \u0026 License 1.0", - "licenseId": "PDDL-1.0", - "seeAlso": [ - "http://opendatacommons.org/licenses/pddl/1.0/", - "https://opendatacommons.org/licenses/pddl/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/PHP-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", - "referenceNumber": 334, - "name": "PHP License v3.0", - "licenseId": "PHP-3.0", - "seeAlso": [ - "http://www.php.net/license/3_0.txt", - "https://opensource.org/licenses/PHP-3.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/PHP-3.01.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", - "referenceNumber": 447, - "name": "PHP License v3.01", - "licenseId": "PHP-3.01", - "seeAlso": [ - "http://www.php.net/license/3_01.txt" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Pixar.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Pixar.json", - "referenceNumber": 520, - "name": "Pixar License", - "licenseId": "Pixar", - "seeAlso": [ - "https://github.com/PixarAnimationStudios/OpenSubdiv/raw/v3_5_0/LICENSE.txt", - "https://graphics.pixar.com/opensubdiv/docs/license.html", - "https://github.com/PixarAnimationStudios/OpenSubdiv/blob/v3_5_0/opensubdiv/version.cpp#L2-L22" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Plexus.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Plexus.json", - "referenceNumber": 135, - "name": "Plexus Classworlds License", - "licenseId": "Plexus", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/pnmstitch.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/pnmstitch.json", - "referenceNumber": 563, - "name": "pnmstitch License", - "licenseId": "pnmstitch", - "seeAlso": [ - "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/editor/pnmstitch.c#l2" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json", - "referenceNumber": 297, - "name": "PolyForm Noncommercial License 1.0.0", - "licenseId": "PolyForm-Noncommercial-1.0.0", - "seeAlso": [ - "https://polyformproject.org/licenses/noncommercial/1.0.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json", - "referenceNumber": 576, - "name": "PolyForm Small Business License 1.0.0", - "licenseId": "PolyForm-Small-Business-1.0.0", - "seeAlso": [ - "https://polyformproject.org/licenses/small-business/1.0.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/PostgreSQL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", - "referenceNumber": 443, - "name": "PostgreSQL License", - "licenseId": "PostgreSQL", - "seeAlso": [ - "http://www.postgresql.org/about/licence", - "https://opensource.org/licenses/PostgreSQL" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/PSF-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", - "referenceNumber": 510, - "name": "Python Software Foundation License 2.0", - "licenseId": "PSF-2.0", - "seeAlso": [ - "https://opensource.org/licenses/Python-2.0" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/psfrag.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/psfrag.json", - "referenceNumber": 99, - "name": "psfrag License", - "licenseId": "psfrag", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/psfrag" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/psutils.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/psutils.json", - "referenceNumber": 242, - "name": "psutils License", - "licenseId": "psutils", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/psutils" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Python-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", - "referenceNumber": 57, - "name": "Python License 2.0", - "licenseId": "Python-2.0", - "seeAlso": [ - "https://opensource.org/licenses/Python-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Python-2.0.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Python-2.0.1.json", - "referenceNumber": 298, - "name": "Python License 2.0.1", - "licenseId": "Python-2.0.1", - "seeAlso": [ - "https://www.python.org/download/releases/2.0.1/license/", - "https://docs.python.org/3/license.html", - "https://github.com/python/cpython/blob/main/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/python-ldap.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/python-ldap.json", - "referenceNumber": 193, - "name": "Python ldap License", - "licenseId": "python-ldap", - "seeAlso": [ - "https://github.com/python-ldap/python-ldap/blob/main/LICENCE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Qhull.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Qhull.json", - "referenceNumber": 577, - "name": "Qhull License", - "licenseId": "Qhull", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Qhull" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/QPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", - "referenceNumber": 240, - "name": "Q Public License 1.0", - "licenseId": "QPL-1.0", - "seeAlso": [ - "http://doc.qt.nokia.com/3.3/license.html", - "https://opensource.org/licenses/QPL-1.0", - "https://doc.qt.io/archives/3.3/license.html" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.json", - "referenceNumber": 431, - "name": "Q Public License 1.0 - INRIA 2004 variant", - "licenseId": "QPL-1.0-INRIA-2004", - "seeAlso": [ - "https://github.com/maranget/hevea/blob/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/radvd.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/radvd.json", - "referenceNumber": 255, - "name": "radvd License", - "licenseId": "radvd", - "seeAlso": [ - "https://github.com/radvd-project/radvd/blob/master/COPYRIGHT" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Rdisc.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Rdisc.json", - "referenceNumber": 348, - "name": "Rdisc License", - "licenseId": "Rdisc", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Rdisc_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/RHeCos-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", - "referenceNumber": 470, - "name": "Red Hat eCos Public License v1.1", - "licenseId": "RHeCos-1.1", - "seeAlso": [ - "http://ecos.sourceware.org/old-license.html" - ], - "isOsiApproved": false, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/RPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", - "referenceNumber": 312, - "name": "Reciprocal Public License 1.1", - "licenseId": "RPL-1.1", - "seeAlso": [ - "https://opensource.org/licenses/RPL-1.1" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/RPL-1.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", - "referenceNumber": 117, - "name": "Reciprocal Public License 1.5", - "licenseId": "RPL-1.5", - "seeAlso": [ - "https://opensource.org/licenses/RPL-1.5" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/RPSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", - "referenceNumber": 512, - "name": "RealNetworks Public Source License v1.0", - "licenseId": "RPSL-1.0", - "seeAlso": [ - "https://helixcommunity.org/content/rpsl", - "https://opensource.org/licenses/RPSL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/RSA-MD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", - "referenceNumber": 96, - "name": "RSA Message-Digest License", - "licenseId": "RSA-MD", - "seeAlso": [ - "http://www.faqs.org/rfcs/rfc1321.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/RSCPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/RSCPL.json", - "referenceNumber": 341, - "name": "Ricoh Source Code Public License", - "licenseId": "RSCPL", - "seeAlso": [ - "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", - "https://opensource.org/licenses/RSCPL" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Ruby.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Ruby.json", - "referenceNumber": 602, - "name": "Ruby License", - "licenseId": "Ruby", - "seeAlso": [ - "https://www.ruby-lang.org/en/about/license.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/SAX-PD.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", - "referenceNumber": 178, - "name": "Sax Public Domain Notice", - "licenseId": "SAX-PD", - "seeAlso": [ - "http://www.saxproject.org/copying.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SAX-PD-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SAX-PD-2.0.json", - "referenceNumber": 567, - "name": "Sax Public Domain Notice 2.0", - "licenseId": "SAX-PD-2.0", - "seeAlso": [ - "http://www.saxproject.org/copying.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Saxpath.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Saxpath.json", - "referenceNumber": 14, - "name": "Saxpath License", - "licenseId": "Saxpath", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Saxpath_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SCEA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SCEA.json", - "referenceNumber": 429, - "name": "SCEA Shared Source License", - "licenseId": "SCEA", - "seeAlso": [ - "http://research.scea.com/scea_shared_source_license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SchemeReport.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SchemeReport.json", - "referenceNumber": 263, - "name": "Scheme Language Report License", - "licenseId": "SchemeReport", - "seeAlso": [], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Sendmail.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Sendmail.json", - "referenceNumber": 581, - "name": "Sendmail License", - "licenseId": "Sendmail", - "seeAlso": [ - "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", - "https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Sendmail-8.23.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", - "referenceNumber": 133, - "name": "Sendmail License 8.23", - "licenseId": "Sendmail-8.23", - "seeAlso": [ - "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", - "https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SGI-B-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", - "referenceNumber": 187, - "name": "SGI Free Software License B v1.0", - "licenseId": "SGI-B-1.0", - "seeAlso": [ - "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SGI-B-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", - "referenceNumber": 147, - "name": "SGI Free Software License B v1.1", - "licenseId": "SGI-B-1.1", - "seeAlso": [ - "http://oss.sgi.com/projects/FreeB/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SGI-B-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", - "referenceNumber": 285, - "name": "SGI Free Software License B v2.0", - "licenseId": "SGI-B-2.0", - "seeAlso": [ - "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/SGI-OpenGL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SGI-OpenGL.json", - "referenceNumber": 207, - "name": "SGI OpenGL License", - "licenseId": "SGI-OpenGL", - "seeAlso": [ - "https://gitlab.freedesktop.org/mesa/glw/-/blob/master/README?ref_type\u003dheads" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SGP4.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SGP4.json", - "referenceNumber": 467, - "name": "SGP4 Permission Notice", - "licenseId": "SGP4", - "seeAlso": [ - "https://celestrak.org/publications/AIAA/2006-6753/faq.php" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SHL-0.5.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", - "referenceNumber": 568, - "name": "Solderpad Hardware License v0.5", - "licenseId": "SHL-0.5", - "seeAlso": [ - "https://solderpad.org/licenses/SHL-0.5/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SHL-0.51.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", - "referenceNumber": 150, - "name": "Solderpad Hardware License, Version 0.51", - "licenseId": "SHL-0.51", - "seeAlso": [ - "https://solderpad.org/licenses/SHL-0.51/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SimPL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", - "referenceNumber": 412, - "name": "Simple Public License 2.0", - "licenseId": "SimPL-2.0", - "seeAlso": [ - "https://opensource.org/licenses/SimPL-2.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/SISSL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SISSL.json", - "referenceNumber": 201, - "name": "Sun Industry Standards Source License v1.1", - "licenseId": "SISSL", - "seeAlso": [ - "http://www.openoffice.org/licenses/sissl_license.html", - "https://opensource.org/licenses/SISSL" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/SISSL-1.2.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", - "referenceNumber": 546, - "name": "Sun Industry Standards Source License v1.2", - "licenseId": "SISSL-1.2", - "seeAlso": [ - "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SL.json", - "referenceNumber": 131, - "name": "SL License", - "licenseId": "SL", - "seeAlso": [ - "https://github.com/mtoyoda/sl/blob/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Sleepycat.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", - "referenceNumber": 333, - "name": "Sleepycat License", - "licenseId": "Sleepycat", - "seeAlso": [ - "https://opensource.org/licenses/Sleepycat" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/SMLNJ.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", - "referenceNumber": 95, - "name": "Standard ML of New Jersey License", - "licenseId": "SMLNJ", - "seeAlso": [ - "https://www.smlnj.org/license.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/SMPPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SMPPL.json", - "referenceNumber": 517, - "name": "Secure Messaging Protocol Public License", - "licenseId": "SMPPL", - "seeAlso": [ - "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SNIA.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SNIA.json", - "referenceNumber": 480, - "name": "SNIA Public License 1.1", - "licenseId": "SNIA", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/snprintf.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/snprintf.json", - "referenceNumber": 43, - "name": "snprintf License", - "licenseId": "snprintf", - "seeAlso": [ - "https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/bsd-snprintf.c#L2" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Soundex.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Soundex.json", - "referenceNumber": 338, - "name": "Soundex License", - "licenseId": "Soundex", - "seeAlso": [ - "https://metacpan.org/release/RJBS/Text-Soundex-3.05/source/Soundex.pm#L3-11" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Spencer-86.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", - "referenceNumber": 461, - "name": "Spencer License 86", - "licenseId": "Spencer-86", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Spencer-94.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", - "referenceNumber": 413, - "name": "Spencer License 94", - "licenseId": "Spencer-94", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", - "https://metacpan.org/release/KNOK/File-MMagic-1.30/source/COPYING#L28" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Spencer-99.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", - "referenceNumber": 582, - "name": "Spencer License 99", - "licenseId": "Spencer-99", - "seeAlso": [ - "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", - "referenceNumber": 359, - "name": "Sun Public License v1.0", - "licenseId": "SPL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/SPL-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ssh-keyscan.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ssh-keyscan.json", - "referenceNumber": 483, - "name": "ssh-keyscan License", - "licenseId": "ssh-keyscan", - "seeAlso": [ - "https://github.com/openssh/openssh-portable/blob/master/LICENCE#L82" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SSH-OpenSSH.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", - "referenceNumber": 537, - "name": "SSH OpenSSH license", - "licenseId": "SSH-OpenSSH", - "seeAlso": [ - "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SSH-short.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SSH-short.json", - "referenceNumber": 451, - "name": "SSH short notice", - "licenseId": "SSH-short", - "seeAlso": [ - "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", - "http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1", - "https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SSLeay-standalone.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SSLeay-standalone.json", - "referenceNumber": 607, - "name": "SSLeay License - standalone", - "licenseId": "SSLeay-standalone", - "seeAlso": [ - "https://www.tq-group.com/filedownloads/files/software-license-conditions/OriginalSSLeay/OriginalSSLeay.pdf" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SSPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", - "referenceNumber": 599, - "name": "Server Side Public License, v 1", - "licenseId": "SSPL-1.0", - "seeAlso": [ - "https://www.mongodb.com/licensing/server-side-public-license" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/StandardML-NJ.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", - "referenceNumber": 622, - "name": "Standard ML of New Jersey License", - "licenseId": "StandardML-NJ", - "seeAlso": [ - "https://www.smlnj.org/license.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", - "referenceNumber": 280, - "name": "SugarCRM Public License v1.1.3", - "licenseId": "SugarCRM-1.1.3", - "seeAlso": [ - "http://www.sugarcrm.com/crm/SPL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SunPro.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SunPro.json", - "referenceNumber": 49, - "name": "SunPro License", - "licenseId": "SunPro", - "seeAlso": [ - "https://github.com/freebsd/freebsd-src/blob/main/lib/msun/src/e_acosh.c", - "https://github.com/freebsd/freebsd-src/blob/main/lib/msun/src/e_lgammal.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/SWL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SWL.json", - "referenceNumber": 407, - "name": "Scheme Widget Library (SWL) Software License Agreement", - "licenseId": "SWL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/SWL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/swrule.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/swrule.json", - "referenceNumber": 220, - "name": "swrule License", - "licenseId": "swrule", - "seeAlso": [ - "https://ctan.math.utah.edu/ctan/tex-archive/macros/generic/misc/swrule.sty" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Symlinks.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Symlinks.json", - "referenceNumber": 213, - "name": "Symlinks License", - "licenseId": "Symlinks", - "seeAlso": [ - "https://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg11494.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", - "referenceNumber": 401, - "name": "TAPR Open Hardware License v1.0", - "licenseId": "TAPR-OHL-1.0", - "seeAlso": [ - "https://www.tapr.org/OHL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TCL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TCL.json", - "referenceNumber": 166, - "name": "TCL/TK License", - "licenseId": "TCL", - "seeAlso": [ - "http://www.tcl.tk/software/tcltk/license.html", - "https://fedoraproject.org/wiki/Licensing/TCL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TCP-wrappers.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", - "referenceNumber": 0, - "name": "TCP Wrappers License", - "licenseId": "TCP-wrappers", - "seeAlso": [ - "http://rc.quest.com/topics/openssh/license.php#tcpwrappers" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TermReadKey.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TermReadKey.json", - "referenceNumber": 214, - "name": "TermReadKey License", - "licenseId": "TermReadKey", - "seeAlso": [ - "https://github.com/jonathanstowe/TermReadKey/blob/master/README#L9-L10" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TGPPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TGPPL-1.0.json", - "referenceNumber": 185, - "name": "Transitive Grace Period Public Licence 1.0", - "licenseId": "TGPPL-1.0", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/TGPPL", - "https://tahoe-lafs.org/trac/tahoe-lafs/browser/trunk/COPYING.TGPPL.rst" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TMate.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TMate.json", - "referenceNumber": 591, - "name": "TMate Open Source License", - "licenseId": "TMate", - "seeAlso": [ - "http://svnkit.com/license.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TORQUE-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", - "referenceNumber": 422, - "name": "TORQUE v2.5+ Software License v1.1", - "licenseId": "TORQUE-1.1", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TOSL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TOSL.json", - "referenceNumber": 12, - "name": "Trusster Open Source License", - "licenseId": "TOSL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/TOSL" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TPDL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TPDL.json", - "referenceNumber": 575, - "name": "Time::ParseDate License", - "licenseId": "TPDL", - "seeAlso": [ - "https://metacpan.org/pod/Time::ParseDate#LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TPL-1.0.json", - "referenceNumber": 565, - "name": "THOR Public License 1.0", - "licenseId": "TPL-1.0", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing:ThorPublicLicense" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TTWL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TTWL.json", - "referenceNumber": 111, - "name": "Text-Tabs+Wrap License", - "licenseId": "TTWL", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/TTWL", - "https://github.com/ap/Text-Tabs/blob/master/lib.modern/Text/Tabs.pm#L148" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TTYP0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TTYP0.json", - "referenceNumber": 225, - "name": "TTYP0 License", - "licenseId": "TTYP0", - "seeAlso": [ - "https://people.mpi-inf.mpg.de/~uwe/misc/uw-ttyp0/" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", - "referenceNumber": 362, - "name": "Technische Universitaet Berlin License 1.0", - "licenseId": "TU-Berlin-1.0", - "seeAlso": [ - "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", - "referenceNumber": 261, - "name": "Technische Universitaet Berlin License 2.0", - "licenseId": "TU-Berlin-2.0", - "seeAlso": [ - "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/UCAR.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/UCAR.json", - "referenceNumber": 93, - "name": "UCAR License", - "licenseId": "UCAR", - "seeAlso": [ - "https://github.com/Unidata/UDUNITS-2/blob/master/COPYRIGHT" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/UCL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", - "referenceNumber": 612, - "name": "Upstream Compatibility License v1.0", - "licenseId": "UCL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/UCL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/ulem.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ulem.json", - "referenceNumber": 481, - "name": "ulem License", - "licenseId": "ulem", - "seeAlso": [ - "https://mirrors.ctan.org/macros/latex/contrib/ulem/README" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Unicode-3.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Unicode-3.0.json", - "referenceNumber": 203, - "name": "Unicode License v3", - "licenseId": "Unicode-3.0", - "seeAlso": [ - "https://www.unicode.org/license.txt" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", - "referenceNumber": 273, - "name": "Unicode License Agreement - Data Files and Software (2015)", - "licenseId": "Unicode-DFS-2015", - "seeAlso": [ - "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", - "referenceNumber": 477, - "name": "Unicode License Agreement - Data Files and Software (2016)", - "licenseId": "Unicode-DFS-2016", - "seeAlso": [ - "https://www.unicode.org/license.txt", - "http://web.archive.org/web/20160823201924/http://www.unicode.org/copyright.html#License", - "http://www.unicode.org/copyright.html" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/Unicode-TOU.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", - "referenceNumber": 36, - "name": "Unicode Terms of Use", - "licenseId": "Unicode-TOU", - "seeAlso": [ - "http://web.archive.org/web/20140704074106/http://www.unicode.org/copyright.html", - "http://www.unicode.org/copyright.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/UnixCrypt.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/UnixCrypt.json", - "referenceNumber": 353, - "name": "UnixCrypt License", - "licenseId": "UnixCrypt", - "seeAlso": [ - "https://foss.heptapod.net/python-libs/passlib/-/blob/branch/stable/LICENSE#L70", - "https://opensource.apple.com/source/JBoss/JBoss-737/jboss-all/jetty/src/main/org/mortbay/util/UnixCrypt.java.auto.html", - "https://archive.eclipse.org/jetty/8.0.1.v20110908/xref/org/eclipse/jetty/http/security/UnixCrypt.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Unlicense.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Unlicense.json", - "referenceNumber": 50, - "name": "The Unlicense", - "licenseId": "Unlicense", - "seeAlso": [ - "https://unlicense.org/" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/UPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", - "referenceNumber": 28, - "name": "Universal Permissive License v1.0", - "licenseId": "UPL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/UPL" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/URT-RLE.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/URT-RLE.json", - "referenceNumber": 549, - "name": "Utah Raster Toolkit Run Length Encoded License", - "licenseId": "URT-RLE", - "seeAlso": [ - "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/converter/other/pnmtorle.c", - "https://sourceforge.net/p/netpbm/code/HEAD/tree/super_stable/converter/other/rletopnm.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Vim.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Vim.json", - "referenceNumber": 554, - "name": "Vim License", - "licenseId": "Vim", - "seeAlso": [ - "http://vimdoc.sourceforge.net/htmldoc/uganda.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/VOSTROM.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", - "referenceNumber": 106, - "name": "VOSTROM Public License for Open Source", - "licenseId": "VOSTROM", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/VOSTROM" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/VSL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", - "referenceNumber": 128, - "name": "Vovida Software License v1.0", - "licenseId": "VSL-1.0", - "seeAlso": [ - "https://opensource.org/licenses/VSL-1.0" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/W3C.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/W3C.json", - "referenceNumber": 522, - "name": "W3C Software Notice and License (2002-12-31)", - "licenseId": "W3C", - "seeAlso": [ - "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", - "https://opensource.org/licenses/W3C" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/W3C-19980720.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", - "referenceNumber": 126, - "name": "W3C Software Notice and License (1998-07-20)", - "licenseId": "W3C-19980720", - "seeAlso": [ - "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/W3C-20150513.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", - "referenceNumber": 368, - "name": "W3C Software Notice and Document License (2015-05-13)", - "licenseId": "W3C-20150513", - "seeAlso": [ - "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/w3m.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/w3m.json", - "referenceNumber": 277, - "name": "w3m License", - "licenseId": "w3m", - "seeAlso": [ - "https://github.com/tats/w3m/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Watcom-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", - "referenceNumber": 430, - "name": "Sybase Open Watcom Public License 1.0", - "licenseId": "Watcom-1.0", - "seeAlso": [ - "https://opensource.org/licenses/Watcom-1.0" - ], - "isOsiApproved": true, - "isFsfLibre": false - }, - { - "reference": "https://spdx.org/licenses/Widget-Workshop.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Widget-Workshop.json", - "referenceNumber": 371, - "name": "Widget Workshop License", - "licenseId": "Widget-Workshop", - "seeAlso": [ - "https://github.com/novnc/noVNC/blob/master/core/crypto/des.js#L24" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Wsuipa.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", - "referenceNumber": 81, - "name": "Wsuipa License", - "licenseId": "Wsuipa", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Wsuipa" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/WTFPL.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/WTFPL.json", - "referenceNumber": 74, - "name": "Do What The F*ck You Want To Public License", - "licenseId": "WTFPL", - "seeAlso": [ - "http://www.wtfpl.net/about/", - "http://sam.zoy.org/wtfpl/COPYING" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/wxWindows.html", - "isDeprecatedLicenseId": true, - "detailsUrl": "https://spdx.org/licenses/wxWindows.json", - "referenceNumber": 288, - "name": "wxWindows Library License", - "licenseId": "wxWindows", - "seeAlso": [ - "https://opensource.org/licenses/WXwindows" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/X11.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/X11.json", - "referenceNumber": 424, - "name": "X11 License", - "licenseId": "X11", - "seeAlso": [ - "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/X11-distribute-modifications-variant.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/X11-distribute-modifications-variant.json", - "referenceNumber": 494, - "name": "X11 License Distribution Modification Variant", - "licenseId": "X11-distribute-modifications-variant", - "seeAlso": [ - "https://github.com/mirror/ncurses/blob/master/COPYING" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Xdebug-1.03.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Xdebug-1.03.json", - "referenceNumber": 58, - "name": "Xdebug License v 1.03", - "licenseId": "Xdebug-1.03", - "seeAlso": [ - "https://github.com/xdebug/xdebug/blob/master/LICENSE" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Xerox.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Xerox.json", - "referenceNumber": 428, - "name": "Xerox License", - "licenseId": "Xerox", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Xerox" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Xfig.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Xfig.json", - "referenceNumber": 289, - "name": "Xfig License", - "licenseId": "Xfig", - "seeAlso": [ - "https://github.com/Distrotech/transfig/blob/master/transfig/transfig.c", - "https://fedoraproject.org/wiki/Licensing:MIT#Xfig_Variant", - "https://sourceforge.net/p/mcj/xfig/ci/master/tree/src/Makefile.am" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/XFree86-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", - "referenceNumber": 218, - "name": "XFree86 License 1.1", - "licenseId": "XFree86-1.1", - "seeAlso": [ - "http://www.xfree86.org/current/LICENSE4.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/xinetd.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/xinetd.json", - "referenceNumber": 138, - "name": "xinetd License", - "licenseId": "xinetd", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Xinetd_License" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.json", - "referenceNumber": 462, - "name": "xkeyboard-config Zinoviev License", - "licenseId": "xkeyboard-config-Zinoviev", - "seeAlso": [ - "https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/blob/master/COPYING?ref_type\u003dheads#L178" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/xlock.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/xlock.json", - "referenceNumber": 299, - "name": "xlock License", - "licenseId": "xlock", - "seeAlso": [ - "https://fossies.org/linux/tiff/contrib/ras/ras2tif.c" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Xnet.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Xnet.json", - "referenceNumber": 523, - "name": "X.Net License", - "licenseId": "Xnet", - "seeAlso": [ - "https://opensource.org/licenses/Xnet" - ], - "isOsiApproved": true - }, - { - "reference": "https://spdx.org/licenses/xpp.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/xpp.json", - "referenceNumber": 457, - "name": "XPP License", - "licenseId": "xpp", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/xpp" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/XSkat.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/XSkat.json", - "referenceNumber": 267, - "name": "XSkat License", - "licenseId": "XSkat", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/XSkat_License" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/YPL-1.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", - "referenceNumber": 191, - "name": "Yahoo! Public License v1.0", - "licenseId": "YPL-1.0", - "seeAlso": [ - "http://www.zimbra.com/license/yahoo_public_license_1.0.html" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/YPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", - "referenceNumber": 114, - "name": "Yahoo! Public License v1.1", - "licenseId": "YPL-1.1", - "seeAlso": [ - "http://www.zimbra.com/license/yahoo_public_license_1.1.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Zed.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Zed.json", - "referenceNumber": 182, - "name": "Zed License", - "licenseId": "Zed", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/Zed" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Zeeff.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Zeeff.json", - "referenceNumber": 4, - "name": "Zeeff License", - "licenseId": "Zeeff", - "seeAlso": [ - "ftp://ftp.tin.org/pub/news/utils/newsx/newsx-1.6.tar.gz" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Zend-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", - "referenceNumber": 140, - "name": "Zend License v2.0", - "licenseId": "Zend-2.0", - "seeAlso": [ - "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Zimbra-1.3.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", - "referenceNumber": 116, - "name": "Zimbra Public License v1.3", - "licenseId": "Zimbra-1.3", - "seeAlso": [ - "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html" - ], - "isOsiApproved": false, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/Zimbra-1.4.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", - "referenceNumber": 6, - "name": "Zimbra Public License v1.4", - "licenseId": "Zimbra-1.4", - "seeAlso": [ - "http://www.zimbra.com/legal/zimbra-public-license-1-4" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/Zlib.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/Zlib.json", - "referenceNumber": 132, - "name": "zlib License", - "licenseId": "Zlib", - "seeAlso": [ - "http://www.zlib.net/zlib_license.html", - "https://opensource.org/licenses/Zlib" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/zlib-acknowledgement.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", - "referenceNumber": 76, - "name": "zlib/libpng License with Acknowledgement", - "licenseId": "zlib-acknowledgement", - "seeAlso": [ - "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ZPL-1.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", - "referenceNumber": 176, - "name": "Zope Public License 1.1", - "licenseId": "ZPL-1.1", - "seeAlso": [ - "http://old.zope.org/Resources/License/ZPL-1.1" - ], - "isOsiApproved": false - }, - { - "reference": "https://spdx.org/licenses/ZPL-2.0.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", - "referenceNumber": 552, - "name": "Zope Public License 2.0", - "licenseId": "ZPL-2.0", - "seeAlso": [ - "http://old.zope.org/Resources/License/ZPL-2.0", - "https://opensource.org/licenses/ZPL-2.0" - ], - "isOsiApproved": true, - "isFsfLibre": true - }, - { - "reference": "https://spdx.org/licenses/ZPL-2.1.html", - "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", - "referenceNumber": 335, - "name": "Zope Public License 2.1", - "licenseId": "ZPL-2.1", - "seeAlso": [ - "http://old.zope.org/Resources/ZPL/" - ], - "isOsiApproved": true, - "isFsfLibre": true - } - ], - "releaseDate": "2024-02-03" -} diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager.ts b/src/Mod/AddonManager/Resources/translations/AddonManager.ts deleted file mode 100644 index c4d0a408c5..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager.ts +++ /dev/null @@ -1,2473 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - - - - - Repository URL - - - - - Branch - - - - - CompactView - - - - Icon - - - - - - <b>Package Name</b> - - - - - - Version - - - - - - Description - - - - - Update Available - - - - - UpdateAvailable - - - - - DependencyDialog - - - Dependencies - - - - - Dependency type - - - - - Name - - - - - Optional? - - - - - DependencyResolutionDialog - - - - Resolve Dependencies - - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - - FreeCAD Addons - - - - - Required Python modules - - - - - Optional Python modules - - - - - DeveloperModeDialog - - - Addon Developer Tools - - - - - Path to Addon - - - - - - Browse... - - - - - Metadata - - - - - Primary branch - - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - - Description - - - - - Discussion URL - - - - - Icon - - - - - Bugtracker URL - - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - - Set to today (CalVer style) - - - - - - - - (Optional) - - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - - README URL - - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - - Repository URL - - - - - Website URL - - - - - Documentation URL - - - - - Addon Name - - - - - Version - - - - - (Recommended) - - - - - Minimum Python - - - - - (Optional, only 3.x version supported) - - - - - Detect... - - - - - Addon Contents - - - - - Dialog - - - Addon Manager - - - - - Edit Tags - - - - - Comma-separated list of tags describing this item: - - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - - Add-on Manager: Warning! - - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - - Continue - - - - - Cancel - - - - - EditDependencyDialog - - - Edit Dependency - - - - - Dependency Type - - - - - Dependency - - - - - Package name, if "Other..." - - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - - Optional - - - - - ExpandedView - - - - Icon - - - - - - <h1>Package Name</h1> - - - - - - Version - - - - - - (tags) - - - - - - Description - - - - - - Maintainer - - - - - Update Available - - - - - labelSort - - - - - UpdateAvailable - - - - - Form - - - Licenses - - - - - License - - - - - License file - - - - - People - - - - - Kind - - - - - Name - - - - - Email - - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - - FreeCAD Version - - - - - Best-available branch, tag, or commit - - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - - - - - Minimum FreeCAD Version Supported - - - - - - Optional - - - - - Maximum FreeCAD Version Supported - - - - - Advanced version mapping... - - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - - Automatically check for updates at start (requires Git) - - - - - Download Macro metadata (approximately 10MB) - - - - - Cache update frequency - - - - - Manual (no automatic updates) - - - - - Daily - - - - - Weekly - - - - - Hide Addons without a license - - - - - Hide Addons with non-FSF Free/Libre license - - - - - Hide Addons with non-OSI-approved license - - - - - Hide Addons marked Python 2 Only - - - - - Hide Addons marked Obsolete - - - - - Hide Addons that require a newer version of FreeCAD - - - - - Custom repositories - - - - - Proxy - - - - - No proxy - - - - - User system proxy - - - - - User-defined proxy: - - - - - Score source URL - - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - - Path to Git executable (optional): - - - - - The path to the Git executable. Autodetected if needed and not specified. - - - - - Show option to change branches (requires Git) - - - - - Disable Git (fall back to ZIP downloads only) - - - - - Advanced Options - - - - - Activate Addon Manager options intended for developers of new Addons. - - - - - Addon developer mode - - - - - PackageDetails - - - Uninstalls a selected macro or workbench - - - - - Install - - - - - Uninstall - - - - - Update - - - - - Run Macro - - - - - Change branch - - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - - Package name - - - - - Installed version - - - - - Available version - - - - - Used by - - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - - Update all available - - - - - SelectFromList - - - Dialog - - - - - TextLabel - - - - - UpdateAllDialog - - - Updating Addons - - - - - Updating out-of-date addons... - - - - - addContentDialog - - - Content Item - - - - - Content type: - - - - - Macro - - - - - Preference Pack - - - - - Workbench - - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - - This is the only item in the Addon - - - - - Main macro file - - - - - The file with the macro's metadata in it - - - - - - - Browse... - - - - - Preference Pack Name - - - - - Workbench class name - - - - - Class that defines "Icon" data member - - - - - Subdirectory - - - - - Optional, defaults to name of content item - - - - - Icon - - - - - Optional, defaults to inheriting from top-level Addon - - - - - Tags... - - - - - Dependencies... - - - - - FreeCAD Versions... - - - - - Other Metadata - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - - Version - - - - - Description - - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - - Set to today (CalVer style) - - - - - Display Name - - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - - add_toolbar_button_dialog - - - Add button? - - - - - Add a toolbar button for this macro? - - - - - Yes - - - - - No - - - - - Never - - - - - change_branch - - - Change Branch - - - - - Change to branch: - - - - - copyrightInformationDialog - - - Copyright Information - - - - - Copyright holder: - - - - - Copyright year: - - - - - personDialog - - - Add Person - - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - - Name: - - - - - Email: - - - - - Email is required for maintainers, and optional for authors. - - - - - proxy_authentication - - - Proxy login required - - - - - Proxy requires authentication - - - - - Proxy: - - - - - Placeholder for proxy address - - - - - Realm: - - - - - Placeholder for proxy realm - - - - - Username - - - - - Password - - - - - selectLicenseDialog - - - Select a license - - - - - About... - - - - - License name: - - - - - Path to license file: - - - - - (if required by license) - - - - - Browse... - - - - - Create... - - - - - select_toolbar_dialog - - - - - - Select Toolbar - - - - - Select a toolbar to add this macro to: - - - - - Ask every time - - - - - toolbar_button - - - - Add button? - - - - - Add a toolbar button for this macro? - - - - - Yes - - - - - No - - - - - Never - - - - - AddonsInstaller - - - Starting up... - - - - - Worker process {} is taking a long time to stop... - - - - - Previous cache process was interrupted, restarting... - - - - - - Custom repo list changed, forcing recache... - - - - - - Addon manager - - - - - You must restart FreeCAD for changes to take effect. - - - - - Restart now - - - - - Restart later - - - - - - Refresh local cache - - - - - Creating addon list - - - - - Loading addon list - - - - - Creating macro list - - - - - Updating cache... - - - - - - Checking for updates... - - - - - Temporary installation of macro failed. - - - - - - Close - - - - - Update all addons - - - - - Check for updates - - - - - Python dependencies... - - - - - Developer tools... - - - - - Apply %n available update(s) - - - - - No updates available - - - - - - - Cannot launch a new installer until the previous one has finished. - - - - - - - - Maintainer - - - - - - - - Author - - - - - New Python Version Detected - - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - - Processing, please wait... - - - - - - Update - - - - - Updating... - - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - - Failed to convert the specified proxy port '{}' to a port number - - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - - Addon Manager: Unexpected {} response from server - - - - - Error with encrypted connection - - - - - - - Confirm remove - - - - - Are you sure you want to uninstall {}? - - - - - - - Removing Addon - - - - - Removing {} - - - - - - Uninstall complete - - - - - - Uninstall failed - - - - - Version {version} installed on {date} - - - - - Version {version} installed - - - - - Installed on {date} - - - - - - - - Installed - - - - - Currently on branch {}, name changed to {} - - - - - Git tag '{}' checked out, no updates possible - - - - - Update check in progress - - - - - Installation location - - - - - Repository URL - - - - - Changed to branch '{}' -- please restart to use Addon. - - - - - This Addon has been updated. Restart FreeCAD to see changes. - - - - - Disabled - - - - - Currently on branch {}, update available to version {} - - - - - Update available to version {} - - - - - This is the latest version available - - - - - WARNING: This addon is obsolete - - - - - WARNING: This addon is Python 2 only - - - - - WARNING: This addon requires FreeCAD {} - - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - - This Addon will be enabled next time you restart FreeCAD. - - - - - This Addon will be disabled next time you restart FreeCAD. - - - - - - - Success - - - - - Install - - - - - Uninstall - - - - - Enable - - - - - Disable - - - - - - Check for update - - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - - Run - - - - - Change branch... - - - - - Return to package list - - - - - Checking connection - - - - - Checking for connection to GitHub... - - - - - Connection failed - - - - - Missing dependency - - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - - Other... - For providing a license other than one listed - - - - - Select the corresponding license file in your Addon - - - - - Location for new license file - - - - - Received {} response code from server - - - - - Failed to install macro {} - - - - - Failed to create installation manifest file: - - - - - - Unrecognized content kind '{}' - - - - - Unable to locate icon at {} - - - - - Select an icon file for this content item - - - - - - - {} is not a subdirectory of {} - - - - - Select the subdirectory for this content item - - - - - Automatic - - - - - - Workbench - - - - - Addon - - - - - Python - - - - - Yes - - - - - Internal Workbench - - - - - External Addon - - - - - Python Package - - - - - - Other... - - - - - Too many to list - - - - - - - - - - Missing Requirement - - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - - Press OK to install anyway. - - - - - - Incompatible Python version - - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - - Optional dependency on {} ignored because it is not in the allow-list - - - - - - Installing dependencies - - - - - - Cannot execute Python - - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - - Cannot execute pip - - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - - Continue with installation of {} anyway? - - - - - - Package installation failed - - - - - See Report View for detailed failure log. - - - - - Installing Addon - - - - - Installing FreeCAD Addon '{}' - - - - - Cancelling - - - - - Cancelling installation of '{}' - - - - - {} was installed successfully - - - - - - Installation Failed - - - - - Failed to install {} - - - - - - Create new toolbar - - - - - - A macro installed with the FreeCAD Addon Manager - - - - - - Run - Indicates a macro that can be 'run' - - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - - XML failure while reading metadata from file {} - - - - - Invalid metadata in file {} - - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - - Name - - - - - Class - - - - - Description - - - - - Subdirectory - - - - - Files - - - - - Select the folder containing your Addon - - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - - - - - Scanning Addon for Python version compatibility - - - - - Minimum Python Version Detected - - - - - Vermin auto-detected a required version of Python 3.{} - - - - - Install Vermin? - - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - - Attempting to install Vermin from PyPi - - - - - - Installation failed - - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - - - - - Select an icon file for this package - - - - - Filter is valid - - - - - Filter regular expression is invalid - - - - - Search... - - - - - Click for details about package {} - - - - - Click for details about workbench {} - - - - - Click for details about macro {} - - - - - Maintainers: - - - - - Tags - - - - - {} ★ on GitHub - - - - - No ★, or not on GitHub - - - - - Created - - - - - Updated - - - - - Score: - - - - - - Up-to-date - - - - - - - - - Update available - - - - - - Pending restart - - - - - - DISABLED - - - - - Installed version - - - - - Unknown version - - - - - Installed on - - - - - Available version - - - - - Filter by... - - - - - Addon Type - - - - - - Any - - - - - Macro - - - - - Preference Pack - - - - - Installation Status - - - - - Not installed - - - - - Filter - - - - - DANGER: Developer feature - - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - - There are local changes - - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - - Local - Table header for local git ref name - - - - - Remote tracking - Table header for git remote tracking branch name - - - - - Last Updated - Table header for git update date - - - - - Installation of Python package {} failed - - - - - Installation of optional package failed - - - - - Installing required dependency {} - - - - - Installation of Addon {} failed - - - - - Downloaded {} for {} - - - - - Failed to decode {} file for Addon '{}' - - - - - Any dependency information in this file will be ignored - - - - - Unable to open macro wiki page at {} - - - - - Unable to fetch the code of this macro. - - - - - Unable to retrieve a description from the wiki for macro {} - - - - - Unable to open macro code URL {} - - - - - Unable to fetch macro-specified file {} from {} - - - - - Could not locate macro-specified file {} (expected at {}) - - - - - {}: Unrecognized internal workbench '{}' - - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - - Got an error when trying to import {} - - - - - An unknown error occurred - - - - - Could not find addon {} to remove it. - - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - - Removed extra installed file {} - - - - - Error while trying to remove extra installed file {} - - - - - Error while trying to remove macro file {}: - - - - - Failed to connect to GitHub. Check your connection and proxy settings. - - - - - WARNING: Duplicate addon {} ignored - - - - - Git is disabled, skipping Git macros - - - - - Attempting to change non-Git Macro setup to use Git - - - - - - An error occurred updating macros from GitHub, trying clean checkout... - - - - - Attempting to do a clean checkout... - - - - - Clean checkout succeeded - - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - - Checking {} for update - - - - - Unable to fetch Git updates for workbench {} - - - - - Git status failed for {} - - - - - Caching {} macro - - - - - Caching macros - - - - - Failed to read metadata from {name} - - - - - Failed to fetch code for macro '{name}' - - - - - Addon Manager: a worker process failed to complete while fetching {name} - - - - - Out of {num_macros} macros, {num_failed} timed out while processing - - - - - Addon Manager: a worker process failed to halt ({name}) - - - - - Timeout while fetching metadata for macro {} - - - - - Failed to kill process for macro {}! - - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - - Repository URL - Preferences header for custom repositories - - - - - Branch name - Preferences header for custom repositories - - - - - Basic Git update failed with the following message: - - - - - Backing up the original directory and re-cloning - - - - - Failed to clone {} into {} using Git - - - - - Git branch rename failed with the following message: - - - - - Installing - - - - - Succeeded - - - - - Failed - - - - - Update was cancelled - - - - - some addons may have been updated - - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - - Loading page for {} from {}... - - - - - Failed to download data from {} -- received response code {}. - - - - - Composite view - - - - - Expanded view - - - - - Compact view - - - - - Alphabetical - Sort order - - - - - Last Updated - Sort order - - - - - Date Created - Sort order - - - - - GitHub Stars - Sort order - - - - - Score - Sort order - - - - - Std_AddonMgr - - - &Addon manager - - - - - Manage external workbenches, macros, and preference packs - - - - - AddonInstaller - - - Finished removing {} - - - - - Failed to remove some files - - - - - Addons installer - - - Finished updating the following addons - - - - - Workbench - - - Auto-Created Macro Toolbar - - - - - QObject - - - Addon Manager - - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_af.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_af.qm deleted file mode 100644 index 4ca66c9a3b..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_af.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_af.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_af.ts deleted file mode 100644 index d8b56b375f..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_af.ts +++ /dev/null @@ -1,427 +0,0 @@ - - - - - AddonInstaller - - - Installed location - Installed location - - - - AddonsInstaller - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description for this macro. - Unable to retrieve a description for this macro. - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - - - - Checking for updates... - Checking for updates... - - - - Apply - Pas toe - - - - update(s) - update(s) - - - - No update available - No update available - - - - Macro successfully installed. The macro is now available from the Macros dialog. - Macro successfully installed. The macro is now available from the Macros dialog. - - - - Unable to install - Unable to install - - - - Addon successfully removed. Please restart FreeCAD - Addon successfully removed. Please restart FreeCAD - - - - Unable to remove this addon - Unable to remove this addon - - - - Macro successfully removed. - Macro successfully removed. - - - - Macro could not be removed. - Macro could not be removed. - - - - Unable to download addon list. - Unable to download addon list. - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Outdated GitPython detected, consider upgrading with pip. - Outdated GitPython detected, consider upgrading with pip. - - - - List of macros successfully retrieved. - List of macros successfully retrieved. - - - - Retrieving description... - Retrieving description... - - - - Retrieving info from - Retrieving info from - - - - An update is available for this addon. - An update is available for this addon. - - - - This addon is already installed. - This addon is already installed. - - - - Retrieving info from git - Retrieving info from git - - - - Retrieving info from wiki - Retrieving info from wiki - - - - GitPython not found. Using standard download instead. - GitPython not found. Using standard download instead. - - - - Your version of python doesn't appear to support ZIP files. Unable to proceed. - Your version of python doesn't appear to support ZIP files. Unable to proceed. - - - - Workbench successfully installed. Please restart FreeCAD to apply the changes. - Workbench successfully installed. Please restart FreeCAD to apply the changes. - - - - Missing workbench - Missing workbench - - - - Missing python module - Missing python module - - - - Missing optional python module (doesn't prevent installing) - Missing optional python module (doesn't prevent installing) - - - - Some errors were found that prevent to install this workbench - Some errors were found that prevent to install this workbench - - - - Please install the missing components first. - Please install the missing components first. - - - - Error: Unable to download - Error: Unable to download - - - - Successfully installed - Successfully installed - - - - GitPython not installed! Cannot retrieve macros from git - GitPython not installed! Cannot retrieve macros from git - - - - Installed - Installed - - - - Update available - Update available - - - - Restart required - Restart required - - - - This macro is already installed. - This macro is already installed. - - - - A macro has been installed and is available under Macro -> Macros menu - A macro has been installed and is available under Macro -> Macros menu - - - - This addon is marked as obsolete - This addon is marked as obsolete - - - - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - - - - Error: Unable to locate zip from - Error: Unable to locate zip from - - - - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - - - - This addon is marked as Python 2 Only - This addon is marked as Python 2 Only - - - - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - - - - User requested updating a Python 2 workbench on a system running Python 3 - - User requested updating a Python 2 workbench on a system running Python 3 - - - - - Workbench successfully updated. Please restart FreeCAD to apply the changes. - Workbench successfully updated. Please restart FreeCAD to apply the changes. - - - - User requested installing a Python 2 workbench on a system running Python 3 - - User requested installing a Python 2 workbench on a system running Python 3 - - - - - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - - - - Raw markdown displayed - Raw markdown displayed - - - - Python Markdown library is missing. - Python Markdown library is missing. - - - - Dialog - - - Workbenches - Workbenches - - - - Macros - Makros - - - - Execute - Voer uit - - - - Downloading info... - Downloading info... - - - - Update all - Update all - - - - Executes the selected macro, if installed - Executes the selected macro, if installed - - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Installs or updates the selected macro or workbench - Installs or updates the selected macro or workbench - - - - Download and apply all available updates - Download and apply all available updates - - - - Custom repositories (one per line): - Custom repositories (one per line): - - - - Sets configuration options for the Addon Manager - Sets configuration options for the Addon Manager - - - - Configure... - Configure... - - - - Addon manager options - Addon manager options - - - - Uninstall selected - Uninstall selected - - - - Install/update selected - Install/update selected - - - - Close - Maak toe - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires GitPython) - Automatically check for updates at start (requires GitPython) - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User defined proxy : - User defined proxy : - - - - Addon Manager - Addon Manager - - - - Close the Addon Manager - Close the Addon Manager - - - - You can use this window to specify additional addon repositories -to be scanned for available addons - You can use this window to specify additional addon repositories -to be scanned for available addons - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches and macros - Manage external workbenches and macros - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ar.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ar.qm deleted file mode 100644 index 0e993ebe56..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ar.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ar.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ar.ts deleted file mode 100644 index e0f6ddd45b..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ar.ts +++ /dev/null @@ -1,427 +0,0 @@ - - - - - AddonInstaller - - - Installed location - Installed location - - - - AddonsInstaller - - - Unable to fetch the code of this macro. - غير قادر على جلب رمز هذا الماكرو. - - - - Unable to retrieve a description for this macro. - غير قادر على استرداد وصف لهذا الماكرو. - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - الإضافات التي يمكن تثبيتها هنا ليست رسميا جزءا من FreeCAD، ولا يتم مراجعتها من قبل فريق FreeCAD. تأكد من معرفة ما تقوم بتثبيته! - - - - Addon manager - مدير الملحق - - - - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - يجب إعادة تشغيل FreeCAD حتى تصبح التغييرات نافذة المفعول. اضغط على موافق لإعادة تشغيل FreeCad الآن، أو إلغاء الأمر لإعادة التشغيل لاحقًا. - - - - Checking for updates... - يتم الآن التحقق من وجود تحديثات... - - - - Apply - Apply - - - - update(s) - تحديث (تحديثات) - - - - No update available - لا يوجد تحديث متوفر - - - - Macro successfully installed. The macro is now available from the Macros dialog. - تم تثبيت الماكرو بنجاح. الماكرو متوفر الآن من مربع حوار وحدات الماكرو. - - - - Unable to install - غير قادر على التثبيت - - - - Addon successfully removed. Please restart FreeCAD - تمت إزالة الملحق بنجاح. الرجاء إعادة تشغيل FreeCad - - - - Unable to remove this addon - تعذر إزالة هذا الملحق - - - - Macro successfully removed. - تمت إزالة الماكرو بنجاح. - - - - Macro could not be removed. - Macro could not be removed. - - - - Unable to download addon list. - Unable to download addon list. - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Outdated GitPython detected, consider upgrading with pip. - Outdated GitPython detected, consider upgrading with pip. - - - - List of macros successfully retrieved. - List of macros successfully retrieved. - - - - Retrieving description... - Retrieving description... - - - - Retrieving info from - Retrieving info from - - - - An update is available for this addon. - An update is available for this addon. - - - - This addon is already installed. - This addon is already installed. - - - - Retrieving info from git - Retrieving info from git - - - - Retrieving info from wiki - Retrieving info from wiki - - - - GitPython not found. Using standard download instead. - GitPython not found. Using standard download instead. - - - - Your version of python doesn't appear to support ZIP files. Unable to proceed. - Your version of python doesn't appear to support ZIP files. Unable to proceed. - - - - Workbench successfully installed. Please restart FreeCAD to apply the changes. - Workbench successfully installed. Please restart FreeCAD to apply the changes. - - - - Missing workbench - Missing workbench - - - - Missing python module - Missing python module - - - - Missing optional python module (doesn't prevent installing) - Missing optional python module (doesn't prevent installing) - - - - Some errors were found that prevent to install this workbench - Some errors were found that prevent to install this workbench - - - - Please install the missing components first. - Please install the missing components first. - - - - Error: Unable to download - Error: Unable to download - - - - Successfully installed - Successfully installed - - - - GitPython not installed! Cannot retrieve macros from git - GitPython not installed! Cannot retrieve macros from git - - - - Installed - Installed - - - - Update available - Update available - - - - Restart required - Restart required - - - - This macro is already installed. - This macro is already installed. - - - - A macro has been installed and is available under Macro -> Macros menu - A macro has been installed and is available under Macro -> Macros menu - - - - This addon is marked as obsolete - This addon is marked as obsolete - - - - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - - - - Error: Unable to locate zip from - Error: Unable to locate zip from - - - - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - - - - This addon is marked as Python 2 Only - This addon is marked as Python 2 Only - - - - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - - - - User requested updating a Python 2 workbench on a system running Python 3 - - User requested updating a Python 2 workbench on a system running Python 3 - - - - - Workbench successfully updated. Please restart FreeCAD to apply the changes. - Workbench successfully updated. Please restart FreeCAD to apply the changes. - - - - User requested installing a Python 2 workbench on a system running Python 3 - - User requested installing a Python 2 workbench on a system running Python 3 - - - - - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - - - - Raw markdown displayed - Raw markdown displayed - - - - Python Markdown library is missing. - Python Markdown library is missing. - - - - Dialog - - - Workbenches - Workbenches - - - - Macros - وحدات الماكرو - - - - Execute - تنفيد - - - - Downloading info... - Downloading info... - - - - Update all - Update all - - - - Executes the selected macro, if installed - Executes the selected macro, if installed - - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Installs or updates the selected macro or workbench - Installs or updates the selected macro or workbench - - - - Download and apply all available updates - Download and apply all available updates - - - - Custom repositories (one per line): - Custom repositories (one per line): - - - - Sets configuration options for the Addon Manager - Sets configuration options for the Addon Manager - - - - Configure... - Configure... - - - - Addon manager options - Addon manager options - - - - Uninstall selected - Uninstall selected - - - - Install/update selected - Install/update selected - - - - Close - إغلاق - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires GitPython) - Automatically check for updates at start (requires GitPython) - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User defined proxy : - User defined proxy : - - - - Addon Manager - Addon Manager - - - - Close the Addon Manager - Close the Addon Manager - - - - You can use this window to specify additional addon repositories -to be scanned for available addons - You can use this window to specify additional addon repositories -to be scanned for available addons - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches and macros - Manage external workbenches and macros - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_be.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_be.qm deleted file mode 100644 index 94de11a6d2..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_be.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_be.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_be.ts deleted file mode 100644 index 32a40e0ed5..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_be.ts +++ /dev/null @@ -1,2493 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Карыстальніцкае сховішча - - - - Repository URL - URL-адрас сховішча - - - - Branch - Галіна - - - - CompactView - - - - Icon - Гузік - - - - - <b>Package Name</b> - <b>Назва пакета</b> - - - - - Version - Версія - - - - - Description - Апісанне - - - - Update Available - Абнаўленне даступнае - - - - UpdateAvailable - Даступна абнаўленне - - - - DependencyDialog - - - Dependencies - Залежнасці - - - - Dependency type - Тып залежнасці - - - - Name - Назва - - - - Optional? - Неабавязковы? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Дазволіць залежнасці - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Дадатак мае наступныя абавязковыя і неабавязковыя залежнасці. Вы павінны ўсталяваць іх, перш чым гэты Дадатак можна будзе ўжываць. - -Вы жадаеце, каб Кіраванне дадаткамі ўсталёўвала іх аўтаматычна? Абярыце "Прапусціць", каб усталяваць Дадатак без устаноўкі залежнасцяў. - - - - FreeCAD Addons - Дадаткі FreeCAD - - - - Required Python modules - Неабходныя модулі Python - - - - Optional Python modules - Неабавязковыя модулі Python - - - - DeveloperModeDialog - - - Addon Developer Tools - Інструмент распрацоўкі дадаткаў - - - - Path to Addon - Шлях да дадаткаў - - - - - Browse... - Агляд... - - - - Metadata - Метададзеныя - - - - Primary branch - Першасная галіна - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Тлумачэнне таго, што дае Дадатак. Адлюстроўваецца ў Кіраванні дадаткамі. Для гэтага не абавязкова паказваць, што гэта дадатак для FreeCAD. - - - - Description - Апісанне - - - - Discussion URL - URL-адрас абмеркавання - - - - Icon - Гузік - - - - Bugtracker URL - URL-адрас рэгістрацыі памылак (bugtracker) - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Падтрымліваюцца стылі Semantic (1.2.3-бэта-версія) ці CalVer (2022.08.30) - - - - Set to today (CalVer style) - Задаць на сёння (стыль CalVer) - - - - - - - (Optional) - (Неабавязковы) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Адлюстроўваецца ў спісе Дадаткаў Кіравання дадаткамі's. Не павінна ўтрымліваць словы "FreeCAD" і павінна быць дапушчальным іменем каталога ва ўсіх падтрыманых аперацыйных сістэмах. - - - - README URL - URL-адрас README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - Парада: Паколькі гэтае адлюстроўваецца ў FreeCAD, у Кіраванні дадаткамі, няма неабходнасці займаць месца, кажучы нешта накшталт "Гэта дадатак FreeCAD..."- проста скажы, што ён робіць. - - - - Repository URL - URL-адрас сховішча - - - - Website URL - URL-адрас на інтэрнет-сайт - - - - Documentation URL - URL-адрас на дакументацыю - - - - Addon Name - Назва дадатка - - - - Version - Версія - - - - (Recommended) - (Прапанаваны) - - - - Minimum Python - Найменшая версія Python - - - - (Optional, only 3.x version supported) - (Неабавязкова, падтрымліваецца толькі версія 3.x) - - - - Detect... - Выявіць... - - - - Addon Contents - Змест дадатку - - - - Dialog - - - Addon Manager - Кіраванне дадаткамі - - - - Edit Tags - Змяніць меткі - - - - Comma-separated list of tags describing this item: - Спіс метак, падзеленыя коскамі, якія апісваюць элемент: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - Падказка: Звычайныя меткі ўключаюць "Assemply (Зборка)", "FEM (Метад канчатковых элементаў)", "Mesh (Паліганальную сетку)", "NURBS (Неаднародны рацыянальны B-сплайн)" і гэтак далей. - - - - Add-on Manager: Warning! - Кіраўнік дадаткаў: Увага! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Кіраўнік дадаткаў дае доступ да шырокай бібліятэцы карысных пашырэнняў FreeCAD. -Мы не даем ніякіх гарантый адносна іх бяспекі ці функцыянальнасці. - - - - Continue - Працягнуць - - - - Cancel - Скасаваць - - - - EditDependencyDialog - - - Edit Dependency - Змяніць залежнасць - - - - Dependency Type - Тып залежнасці - - - - Dependency - Залежнасць - - - - Package name, if "Other..." - Назва пакета, калі "Іншы..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - Заўвага: Калі абрана "Іншы...", пакет адсутнічае ў файле ALLOWED_PYTHON_PACKAGES.txt, і не будзе аўтаматычна ўсталяваны Кіраваннем дадаткамі. Адпраўце PR на <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> каб запытаць даданне пакета. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Калі сустракаецца неабавязковая залежнасць, Кіраванне дадаткамі прапануе ўсталяваць яе (калі гэта магчыма), але не будзе блакаваць устаноўку, калі карыстальнік вырашыць не ўсталёўваць пакет ці не зможа яго ўсталяваць. - - - - Optional - Неабавязковы - - - - ExpandedView - - - - Icon - Гузік - - - - - <h1>Package Name</h1> - <h1>Назва пакета</h1> - - - - - Version - Версія - - - - - (tags) - (меткі) - - - - - Description - Апісанне - - - - - Maintainer - Суправаджальнік - - - - Update Available - Абнаўленне даступнае - - - - labelSort - Парадкаваць надпісы - - - - UpdateAvailable - Даступна абнаўленне - - - - Form - - - Licenses - Ліцэнзіі - - - - License - Ліцэнзія - - - - License file - Файл ліцэнзіі - - - - People - Стваральнікі - - - - Kind - Тып - - - - Name - Назва - - - - Email - Электронная пошта - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Пашыранае супастаўленне версій - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Будучыя версіі Кіравання дадаткамі FreeCAD будуць падтрымліваць устаноўку распрацаўнікамі пэўнай галіны ці меткі для ўжывання з пэўнай версіяй FreeCAD (напрыклад, устаноўка пэўнай меткі ў якасці апошняй версіі вашага дадатку для падтрымкі версіі 0.19 і гэтак далей) - - - - FreeCAD Version - Версія FreeCAD - - - - Best-available branch, tag, or commit - Найлепшая даступная галіна, метка ці фіксацыя - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Падтрыманыя версіі FreeCAD - - - - Minimum FreeCAD Version Supported - Найменшая патрыманая версія FreeCAD - - - - - Optional - Неабавязковы - - - - Maximum FreeCAD Version Supported - Найбольшая патрыманая версія FreeCAD - - - - Advanced version mapping... - Пашыранае супастаўленне версій... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Налады Кіравання дадаткамі - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Калі щключана, то пры запуску варштату Кіравання дадаткамі ўсталяваныя дадаткі будуць правярацца на наяўнасць даступных абнаўленняў - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Спампаваць метададзеныя макрасаў (прыкладна 10 Мб) - - - - Cache update frequency - Частата абнаўлення кэшу - - - - Manual (no automatic updates) - Уручную (без аўтаматычных абнаўленняў) - - - - Daily - Штодзень - - - - Weekly - Штотыдзень - - - - Hide Addons without a license - Схаваць дадаткі без ліцэнзіі - - - - Hide Addons with non-FSF Free/Libre license - Схаваць дадаткі без ліцэнзіі FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Схаваць дадаткі без ліцэнзіі, якая не адобраная OSI - - - - Hide Addons marked Python 2 Only - Схаваць дадаткі, адзначаныя як толькі для Python 2 - - - - Hide Addons marked Obsolete - Схаваць дадаткі, адзначаныя як састарэлыя - - - - Hide Addons that require a newer version of FreeCAD - Схаваць дадаткі, якія патрабуюць больш новую версію FreeCAD - - - - Custom repositories - Карыстальніцкія сховішча - - - - Proxy - Проксі - - - - No proxy - Без проксі - - - - User system proxy - Сістэмны проксі карыстальніка - - - - User-defined proxy: - Карыстальніцкі проксі: - - - - Score source URL - URL-адрас крыніцы ацэнкі - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - URL-адрас для дадзеных ацэнкі дапаўненняў (падрабязнасці аб фарматаванні і размяшчэнні глядзіце ў вікі-старонкі Кіравання дадаткамі). - - - - Path to Git executable (optional): - Шлях да двайковага файла Git (неабавязкова): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Дадатковыя налады - - - - Activate Addon Manager options intended for developers of new Addons. - Задзейнічаць налады Кіравання дадаткамі, якія прызначаныя для распрацоўкі новых дадаткаў. - - - - Addon developer mode - Рэжым распрацоўкі дадаткаў - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Выдаліць абраны макрас ці варштат - - - - Install - Усталяваць - - - - Uninstall - Выдаліць - - - - Update - Абнавіць - - - - Run Macro - Выканаць макрас - - - - Change branch - Змяніць галіну - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Кіраваць залежнасцямі Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Наступныя пакеты Python былі ўсталяваныя лакальна Кіраваннем дадаткамі для задавальнення залежнасцяў дадаткаў. Месца ўстаноўкі: - - - - Package name - Назва пакета - - - - Installed version - Усталяваная версія - - - - Available version - Даступная версія - - - - Used by - Ужываецца ў - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Зорачка (*) ў слупку "Ужываецца ў" паказвае на неабавязковую залежнасць. Звярніце ўвагу, што ўжываецца толькі для запісаў прамога імпартавання ў дадатку. Магчыма, таксама былі ўсталяваныя іншыя пакеты Python, ад якіх залежаць гэтыя пакеты. - - - - Update all available - Усе даступныя абнаўленні - - - - SelectFromList - - - Dialog - Дыялогавае акно - - - - TextLabel - Тэкставы надпіс - - - - UpdateAllDialog - - - Updating Addons - Абнавіць дадаткі - - - - Updating out-of-date addons... - Абнавіць састарэлыя дадаткі... - - - - addContentDialog - - - Content Item - Змест элемента - - - - Content type: - Тып зместу: - - - - Macro - Макрас - - - - Preference Pack - Пакет перавагі - - - - Workbench - Варштат - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Калі гэта адзінае, што ёсць у дадатку, усе астатнія метададзеныя могуць быць успадкаваныя ад верхняга ўзроўню, і іх не трэба паказваць тут. - - - - This is the only item in the Addon - Гэта адзіны элемент у дадатку - - - - Main macro file - Файл галоўнага макрасу - - - - The file with the macro's metadata in it - Файл з метададзенымі макраса - - - - - - Browse... - Агляд... - - - - Preference Pack Name - Назва Пакета перавагі - - - - Workbench class name - Назва класа варштату - - - - Class that defines "Icon" data member - Клас, які вызначае элемент дадзеных "Гузік" - - - - Subdirectory - Укладзены каталог - - - - Optional, defaults to name of content item - Неабавязкова, першапачаткова ўжываецца назва элемента зместу - - - - Icon - Гузік - - - - Optional, defaults to inheriting from top-level Addon - Неабавязкова, першапачаткова ўспадкавана ад дадатку верхняга ўзроўню - - - - Tags... - Меткі... - - - - Dependencies... - Залежнасці... - - - - FreeCAD Versions... - Версіі FreeCAD... - - - - Other Metadata - Іншыя метададзеныя - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Адлюстроўваецца ў спісе дадаткаў Кіравання дадаткамі. Не варта ўключаць слова "FreeCAD". - - - - Version - Версія - - - - Description - Апісанне - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Падтрымліваюцца стылі Semantic (1.2.3-бэта-версія) ці CalVer (2022.08.30) - - - - Set to today (CalVer style) - Задаць на сёння (стыль CalVer) - - - - Display Name - Адлюстраваць назву - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Любыя палі, якія пакінутыя пустымі, успадкоўваюцца з метададзеных дадаткаў верхняга ўзроўню, таму тэхнічна яны ўсе неабавязковыя. Для дададткаў з некалькімі элементамі зместу, кожны элемент павінен утрымліваць унікальнае Адлюстроўванае імя і Апісанне. - - - - add_toolbar_button_dialog - - - Add button? - Дадаць кнопку? - - - - Add a toolbar button for this macro? - Дадаць кнопку на панэль інструментаў для макраса? - - - - Yes - Так - - - - No - Не - - - - Never - Ніколі - - - - change_branch - - - Change Branch - Змяніць галіну - - - - Change to branch: - Змяніць на галіну: - - - - copyrightInformationDialog - - - Copyright Information - Інфармацыя аб аўтарскіх правах - - - - Copyright holder: - Уладальнік аўтарскіх праў: - - - - Copyright year: - Год аўтарскіх праў: - - - - personDialog - - - Add Person - Дадаць асобу - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Суправаджальнік - той, у каго ёсць бягучы доступ да фіксацыі ў гэтым праекце. -Аўтар - любы іншы чалавек, якога вы жадаеце ўключыць. - - - - Name: - Назва: - - - - Email: - Электронная пошта: - - - - Email is required for maintainers, and optional for authors. - Электронная пошта неабходная для суправаджальнікаў, і неабавязковая для аўтараў. - - - - proxy_authentication - - - Proxy login required - Патрэбна імя карыстальніка проксі - - - - Proxy requires authentication - Проксі патрабуе аўтэнтыфікацыі - - - - Proxy: - Проксі: - - - - Placeholder for proxy address - Запаўняльнік для адраса проксі - - - - Realm: - Вобласць: - - - - Placeholder for proxy realm - Запаўняльнік для вобласці проксі - - - - Username - Імя карыстальніка - - - - Password - Пароль - - - - selectLicenseDialog - - - Select a license - Абраць ліцэнзію - - - - About... - Пра праграму... - - - - License name: - Назва ліцэнзіі: - - - - Path to license file: - Шлях да файла ліцэнзіі: - - - - (if required by license) - (калі патрабуецца ліцэнзія) - - - - Browse... - Агляд... - - - - Create... - Стварыць... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Абраць Панэль інструментаў - - - - Select a toolbar to add this macro to: - Абраць панэль інструментаў, каб дадаць макрас: - - - - Ask every time - Спытаць кожны раз - - - - toolbar_button - - - - Add button? - Дадаць кнопку? - - - - Add a toolbar button for this macro? - Дадаць кнопку на панэль інструментаў для макраса? - - - - Yes - Так - - - - No - Не - - - - Never - Ніколі - - - - AddonsInstaller - - - Starting up... - Запуск... - - - - Worker process {} is taking a long time to stop... - Працоўнаму працэсу {} патрабуецца шмат часу, каб спыніцца... - - - - Previous cache process was interrupted, restarting... - - Папярэдні працэс кэшу быў перапынены, перазапуск... - - - - - Custom repo list changed, forcing recache... - - Карыстальніцкі спіс сховішча зменены, паўторнае абнаўленне кэшу... - - - - - Addon manager - Кіраванне дадаткамі - - - - You must restart FreeCAD for changes to take effect. - Вы павінны перазапусціць FreeCAD, каб змены былі ўжытыя. - - - - Restart now - Перазапусціць зараз - - - - Restart later - Перазапусціць пазней - - - - - Refresh local cache - Абнавіць лакальны кэш - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Абнаўленне кэшу... - - - - - Checking for updates... - Праверыць наяўнасць абнаўленняў... - - - - Temporary installation of macro failed. - Адбылася памылка часовага ўсталявання макраса. - - - - - Close - Зачыніць - - - - Update all addons - Абнавіць усе дадаткі - - - - Check for updates - Праверыць наяўнасць абнаўленняў - - - - Python dependencies... - Залежнасці асяроддзя Python... - - - - Developer tools... - Інструмент распрацоўкі... - - - - Apply %n available update(s) - Прымяніць %n даступных абнаўленняў - - - - No updates available - Даступныя абнаўленні адсутнічаюць - - - - - - Cannot launch a new installer until the previous one has finished. - Не атрымалася запусціць новы ўстаноўшчык, каб скончыць працу папярэдняга. - - - - - - - Maintainer - Суправаджальнік - - - - - - - Author - Аўтар - - - - New Python Version Detected - Выяўлена новая версія Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Падобна на тое, што гэта першы раз, калі гэтая версія Python ужываецца з Кіраваннем дадаткамі. Ці жадаеце вы ўсталяваць для яго тыя ж аўтаматычна ўсталяваныя залежнасці? - - - - Processing, please wait... - Апрацоўка, калі ласка, пачакайце... - - - - - Update - Абнавіць - - - - Updating... - Абнаўленне... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Не атрымалася імпартаваць QtNetwork - падобна на тое, што ён не ўсталяваны ў вашай сістэме. Ваш пастаўшчык можа мець пакет для гэтай залежнасці (часта названы як "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Не атрымалася пераўтварыць паказаны порт проксі '{}' у нумар порта - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Памылка налады: усталяваны ўзаемавыключальныя налады проксі. Скінуць да першапачатковага значэння. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Памылка налады: паказаны карыстальніцкі проксі, але проксі не прадстаўлены. Скінуць да першапачатковага значэння. - - - - Addon Manager: Unexpected {} response from server - Кіраванне дадаткамі: Нечаканы адказ {} ад сервера - - - - Error with encrypted connection - Памылка з зашыфраваным злучэннем - - - - - - Confirm remove - Пацвердзіць выдаленне - - - - Are you sure you want to uninstall {}? - Вы ўпэўненыя, што жадаеце выдаліць {}? - - - - - - Removing Addon - Выдаленне Дадатку - - - - Removing {} - Выдаленне {} - - - - - Uninstall complete - Выдаленне завершана - - - - - Uninstall failed - Не атрымалася выдаліць - - - - Version {version} installed on {date} - Версія {version} усталяваная {date} - - - - Version {version} installed - Версія {version} усталяваная - - - - Installed on {date} - Дата ўсталявання {date} - - - - - - - Installed - Усталявана - - - - Currently on branch {}, name changed to {} - У бягучы час знаходзіцца ў галіне {}, назва змененая на {} - - - - Git tag '{}' checked out, no updates possible - Метка Git'{}' праверана, абнаўленняў няма - - - - Update check in progress - Выконваецца праверка абнаўленняў - - - - Installation location - Месцазнаходжанне ўстаноўкі - - - - Repository URL - URL-адрас сховішча - - - - Changed to branch '{}' -- please restart to use Addon. - Зменены на галіну '{}' -- калі ласка, перазапусціце, каб ужыць Дадатак. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Дадатак быў абноўлены. -Запусціце FreeCAD нанова, каб убачыць змены. - - - - Disabled - Адключана - - - - Currently on branch {}, update available to version {} - У бягучы час у галіне {}, даступна абнаўленне да версіі {} - - - - Update available to version {} - Даступна абнаўленне да версіі {} - - - - This is the latest version available - Гэта апошняя даступная версія - - - - WARNING: This addon is obsolete - УВАГА: Гэты дадатак састарэлы - - - - WARNING: This addon is Python 2 only - УВАГА: гэты дадатак прызначаны толькі для Python 2 - - - - WARNING: This addon requires FreeCAD {} - УВАГА: гэты дадатак патрабуе FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - УВАГА: Гэты дадатак у бягучы час усталяваны, але адключаны. Націснуць кнопку 'Уключыць', каб зноў уключыць яго. - - - - This Addon will be enabled next time you restart FreeCAD. - Гэты Дадатак будзе ўключаны пры наступным перазапуску FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Гэты Дадатак будзе адключаны пры наступным перазапуску FreeCAD. - - - - - - Success - Паспяхова завершана - - - - Install - Усталяваць - - - - Uninstall - Выдаліць - - - - Enable - Уключыць - - - - Disable - Адключыць - - - - - Check for update - Праверыць абнаўленне - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Праца - - - - Change branch... - Змяніць галіну... - - - - Return to package list - Вярнуцца да спісу пакетаў - - - - Checking connection - Праверка злучэння - - - - Checking for connection to GitHub... - Праверка злучэння з GitHub... - - - - Connection failed - Не атрымалася злучыцца - - - - Missing dependency - Залежнасці адсутнічаюць - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Не атрымалася імпартаваць QtNetwork -- падрабязнасці глядзіце ў Праглядзе справаздачы. -Кіраванне дадаткамі недаступнае. - - - - Other... - For providing a license other than one listed - Іншы... - - - - Select the corresponding license file in your Addon - Абярыце адпаведны файл ліцэнзіі ў вашым Дадатку - - - - Location for new license file - Месцазнаходжанне новага файла ліцэнзіі - - - - Received {} response code from server - Атрыманы {} код адказу сервера - - - - Failed to install macro {} - Не атрымалася ўсталяваць макрас {} - - - - Failed to create installation manifest file: - - Не атрымалася стварыць файл маніфесту ўстаноўкі: - - - - - Unrecognized content kind '{}' - Непрызнаны тып зместу '{}' - - - - Unable to locate icon at {} - Немагчыма знайсці гузік у {} - - - - Select an icon file for this content item - Абраць файл гузіку для гэтага элемента зместу - - - - - - {} is not a subdirectory of {} - {} не з'яўляецца ўкладзеным каталогам {} - - - - Select the subdirectory for this content item - Абраць укладзены каталог для гэтага элемента зместу - - - - Automatic - Аўтаматычна - - - - - Workbench - Варштат - - - - Addon - Дадатак - - - - Python - Python - - - - Yes - Так - - - - Internal Workbench - Унутраны варштат - - - - External Addon - Вонкавы Дадатак - - - - Python Package - Пакет Python - - - - - Other... - Іншы... - - - - Too many to list - Спіс зашмат доўгі для адлюстравання - - - - - - - - - Missing Requirement - Адсутнічаюць патрабаванні - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Дадатак '{}' патрабуе '{}', якія недаступныя ў вашай копіі FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Дадатак '{}' патрабуе наступныя варштаты, якія недаступныя ў вашай копіі FreeCAD: - - - - Press OK to install anyway. - Націсніце ОК, каб усталяваць у любым выпадку. - - - - - Incompatible Python version - Несумяшчальная версія Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Для гэтага дадатку патрабуюцца пакеты Python, якія не ўсталяваныя і не могуць быць усталяваныя аўтаматычна. -Каб ужыць гэты дадатак, вы павінны ўсталяваць наступныя пакеты Python уручную: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Дадатак (ці адна з яго залежнасці) патрабуе Python {}.{}, і вашая сістэма запушчаная {}.{}. Устаноўка адменена. - - - - Optional dependency on {} ignored because it is not in the allow-list - Неабавязковая залежнасць ад {} прапускаецца, паколькі яе няма ў спісе дазволеных - - - - - Installing dependencies - Устаноўка залежнасці - - - - - Cannot execute Python - Не атрымалася выканаць Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Не атрымалася аўтаматычна знайсці ваш выконваемы файл Python, альбо шлях зададзены няправільна. Калі ласка, праверце налады Перавагі Кіравання дадаткамі для паказанага шляху да Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Не атрымалася ўсталяваць залежнасці. Ці працягнуць устаноўку ў любым выпадку {}? - - - - - Cannot execute pip - Не атрымалася выканаць праграму pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Не атрымалася выканаць каманду pip, якая можа адсутнічаць у вашым усталяваным Python. -Калі ласка, пераканайцеся, што ў вашай сістэме ўсталяваны pip, і паўтарыце спробу. -Няўдалая каманда была: - - - - - Continue with installation of {} anyway? - Ці працягнуць устаноўку ў любым выпадку {}? - - - - - Package installation failed - Не атрымалася ўсталяваць пакет - - - - See Report View for detailed failure log. - Падрабязны часопіс збояў глядзіце ў Праглядзе справаздачы. - - - - Installing Addon - Устаноўка дадатку - - - - Installing FreeCAD Addon '{}' - Ўстаноўка дадаткаў FreeCAD '{}' - - - - Cancelling - Скасаванне - - - - Cancelling installation of '{}' - Скасаванне ўстаноўкі '{}' - - - - {} was installed successfully - {} быў паспяхова ўсталяваны - - - - - Installation Failed - Усталяваць не атрымалася - - - - Failed to install {} - Не атрымалася ўсталяваць {} - - - - - Create new toolbar - Стварыць новую панэль інструментаў - - - - - A macro installed with the FreeCAD Addon Manager - Макрасы, які ўсталяваныя з дапамогай Кіравання дадаткамі FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Выканаць - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Немагчыма прачытаць дадзеныя з GitHub: праверце сваё інтэрнэт-злучэнне і налады проксі, і паўтарыце спробу. - - - - XML failure while reading metadata from file {} - Не атрымалася прачытаць метададзеныя з файла XML {} - - - - Invalid metadata in file {} - Хібныя метададзеныя ў файле {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - УВАГА: шлях, які паказаны ў метададзеных package.xml, не адпавядае бягучай праверанай галіны. - - - - Name - Назва - - - - Class - Клас - - - - Description - Апісанне - - - - Subdirectory - Укладзены каталог - - - - Files - Файлы - - - - Select the folder containing your Addon - Абраць каталог, які змяшчае ваш Дадатак - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Vermin адсутнічае, скасаванне аперацыі. - - - - Scanning Addon for Python version compatibility - Сканаванне Дадатку на сумяшчальнасць з версіяй Python - - - - Minimum Python Version Detected - Выяўлена найменшая версія Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin аўтаматычна выявіў патрэбную версію Python 3.{} - - - - Install Vermin? - Усталяваць Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Для аўтаматычнага вызначэння патрэбнай версіі Python для дадатку патрабуецца Vermin (https://pypi.org/project/vermin/). ОК, каб усталяваць? - - - - Attempting to install Vermin from PyPi - Спроба ўсталяваць Vermin з PyPi - - - - - Installation failed - Усталяваць не атрымалася - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Не атрымалася ўсталяваць Vermin -- праверце Прагляд справаздачы, каб атрымаць падрабязную інфармацыю. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Не атрымалася імпартаваць vermin пасля ўстаноўкі -- не атрымалася прасканаваць Дадатак. - - - - Select an icon file for this package - Абраць файл гузіку для гэтага пакету - - - - Filter is valid - Фільтр дапушчальны - - - - Filter regular expression is invalid - Хібны рэгулярны выраз фільтра - - - - Search... - Пошук... - - - - Click for details about package {} - Націсніце, каб атрымаць падрабязную інфармацыю пра пакет {} - - - - Click for details about workbench {} - Націсніце, каб атрымаць падрабязную інфармацыю пра варштат {} - - - - Click for details about macro {} - Націсніце, каб атрымаць падрабязную інфармацыю пра макрас {} - - - - Maintainers: - Суправаджальнікі: - - - - Tags - Меткі - - - - {} ★ on GitHub - {} ★ на GitHub - - - - No ★, or not on GitHub - Без ★, альбо не на GitHub - - - - Created - Створана - - - - Updated - Абноўлена - - - - Score: - Ацэнкі: - - - - - Up-to-date - Актуальная - - - - - - - - Update available - Даступна абнаўленне - - - - - Pending restart - У чаканні перазапуску - - - - - DISABLED - ВЫКЛЮЧАНЫ - - - - Installed version - Усталяваная версія - - - - Unknown version - Невядомая версія - - - - Installed on - Усталяваны на - - - - Available version - Даступная версія - - - - Filter by... - Фільтраваць па... - - - - Addon Type - Тып дадатку - - - - - Any - Любы - - - - Macro - Макрас - - - - Preference Pack - Пакет перавагі - - - - Installation Status - Стан устаноўкі - - - - Not installed - Не ўсталяваны - - - - Filter - Фільтр - - - - DANGER: Developer feature - НЕБЯСПЕКА: функцыя распрацоўкі - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - НЕБЯСПЕКА: Пераключэнне галін прызначана для распрацоўкі і бэта-тэстараў, і можа прывесці да пашкоджання дакументаў, якія не сумяшчальныя з зваротнай сувяззю, нестабільнасці, збояў і/ці заўчаснай цеплавой смерці сусвету. Вы жадаеце працягнуць? - - - - There are local changes - Ёсць лакальныя змены - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - УВАГА: у сховішчы ёсць незафіксаваныя лакальныя змены. Вы ўпэўненыя, што жадаеце змяніць галіну (і прынесці змены з сабою)? - - - - Local - Table header for local git ref name - Лакальны - - - - Remote tracking - Table header for git remote tracking branch name - Падаленае адсочванне - - - - Last Updated - Table header for git update date - Апошняе абнаўленне - - - - Installation of Python package {} failed - Не атрымалася ўсталяваць пакет Python {} - - - - Installation of optional package failed - Не атрымалася ўсталяваць неабавязковы пакет - - - - Installing required dependency {} - Ўстаноўка неабходнай залежнасці {} - - - - Installation of Addon {} failed - Не атрымалася ўсталяваць дадатак {} - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Не атрымалася дэкадаваць файл {} для дадатку '{}' - - - - Any dependency information in this file will be ignored - Любая інфармацыя пра залежнасці ў файле будзе прапушчаная - - - - Unable to open macro wiki page at {} - Немагчыма адчыніць вікі-старонку макрасу ў {} - - - - Unable to fetch the code of this macro. - Немагчыма выняць код макраса. - - - - Unable to retrieve a description from the wiki for macro {} - Немагчыма атрымаць апісанне з вікі-старонкі для макраса {} - - - - Unable to open macro code URL {} - Немагчыма адчыніць URL-адрас {} коду макраса - - - - Unable to fetch macro-specified file {} from {} - Немагчыма выняць паказаны файл макраса {} з {} - - - - Could not locate macro-specified file {} (expected at {}) - Не атрымалася знайсці паказаны файл макраса {} (чакаецца ў {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Непрызнаны ўнутраны варштат '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Папярэджанне распрацоўкі дадатку: URL-адрас сховішча, які ўсталяваны ў файле package.xml для дадатку {} ({}) не адпавядае спасылку, з якога ён быў выняты ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Папярэджанне распрацоўкі дадатку: галіна сховішча, якая ўсталявана ў файле package.xml для дадатку {} ({}) не адпавядае галіне, з якой яна была вынята ({}) - - - - - Got an error when trying to import {} - Адбылася памылка пры спробе імпартаваць {} - - - - An unknown error occurred - Адбылася невядомая памылка - - - - Could not find addon {} to remove it. - Не атрымалася знайсці дадатак {} каб выдаліць. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Не атрымалася выканаць сцэнар uninstall.py дадатку. Прыступаем да выдалення... - - - - Removed extra installed file {} - Выдалены дадаткова ўсталяваны файл {} - - - - Error while trying to remove extra installed file {} - Памылка пры спробе выдаліць дадаткова ўсталяваны файл {} - - - - Error while trying to remove macro file {}: - Памылка пры спробе выдаліць файл макраса {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Не атрымалася падлучыцца да GitHub. Калі ласка, праверце вашае падключэнне і налады проксі. - - - - WARNING: Duplicate addon {} ignored - УВАГА: Паўторны дадатак {} прапушчаны - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Адбылася памылка пры абнаўленні макрасаў з GitHub, спроба зрабіць clean checkout... - - - - Attempting to do a clean checkout... - Спроба выканаць clean checkout... - - - - Clean checkout succeeded - Паспяховы clean checkout - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Не атрымалася абнавіць макрасы з GitHub -- паспрабуйце ачысціць кэш Кіравання дадаткамі. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Памылка злучэння з Wiki, FreeCAD ў бягучы час не можа атрымаць спіс макрасаў Wiki - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Не атрымалася прачытаць метададзеныя з {name} - - - - Failed to fetch code for macro '{name}' - Не атрымалася выняць код для макраса '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Кіраванне дадаткамі: працоўнаму працэсу не атрымалася выняць {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Для {num_macros} макрасаў скончыўся час чакання {num_failed} падчас апрацоўкі - - - - Addon Manager: a worker process failed to halt ({name}) - Кіраванне дадаткамі: не атрымалася спыніць працоўны працэс ({name}) - - - - Timeout while fetching metadata for macro {} - Выйшаў час чакання пры выманні метададзеных з макрасу {} - - - - Failed to kill process for macro {}! - - Не атрымалася завяршыць працэс для макраса {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Не атрымалася атрымаць статыстыку па дадатку з {} -- дакладнай будзе толькі ўпарадкаванне па алфавіце - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Не атрымалася атрымаць ацэнкі дадаткаў з '{}' -- упарадкаванне па ацэнках завяршылася памылкай - - - - - Repository URL - Preferences header for custom repositories - URL-адрас сховішча - - - - Branch name - Preferences header for custom repositories - Назва галіны - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Рэзервовае капіраванне зыходнага каталога і паўторнае кланаванне - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Не атрымалася пераназваць галіну Git з наступным паведамленнем: - - - - Installing - Усталяванне - - - - Succeeded - Паспяхова - - - - Failed - Не атрымалася - - - - Update was cancelled - Абнаўленне было скасавана - - - - some addons may have been updated - магчыма, некаторыя дадаткі былі абноўленыя - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Загрузка інфармацыі для {} з вікі-старонкі сістэмы макрасаў FreeCAD... - - - - Loading page for {} from {}... - Загрузка старонкі {} з {}... - - - - Failed to download data from {} -- received response code {}. - Не атрымалася спампаваць дадзеныя з {} - атрыманы код адказу {}. - - - - Composite view - Складовы выгляд - - - - Expanded view - Пашыраны выгляд - - - - Compact view - Кампактны выгляд - - - - Alphabetical - Sort order - Па алфавіце - - - - Last Updated - Sort order - Апошняе абнаўленне - - - - Date Created - Sort order - Дата стварэння - - - - GitHub Stars - Sort order - Зоркі на GitHub - - - - Score - Sort order - Ацэнкі - - - - Std_AddonMgr - - - &Addon manager - &Кіраванне дадаткамі - - - - Manage external workbenches, macros, and preference packs - Кіраваць вонкавымі варштатамі, макрасамі і пакетамі пераваг - - - - AddonInstaller - - - Finished removing {} - Скончана выдаленне {} - - - - Failed to remove some files - Не атрымалася выдаліць некаторыя файлы - - - - Addons installer - - - Finished updating the following addons - Скончана абнаўленне наступных дадаткаў - - - - Workbench - - - Auto-Created Macro Toolbar - Панэль інструментаў макрасаў, якія ствараюцца аўтаматычна - - - - QObject - - - Addon Manager - Кіраванне дадаткамі - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_bg.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_bg.qm deleted file mode 100644 index b952efbc82..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_bg.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_bg.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_bg.ts deleted file mode 100644 index 2f157dd6cf..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_bg.ts +++ /dev/null @@ -1,424 +0,0 @@ - - - - - AddonInstaller - - - Installed location - Инсталационна папка - - - - AddonsInstaller - - - Unable to fetch the code of this macro. - Кодът на макроса не може да се извлече. - - - - Unable to retrieve a description for this macro. - Описанието на макроса не може да се извлече. - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - Добавките, които могат да бъдат инсталирани тук, официално не се явяват част от FreeCAD и не са проверявани от екипа на FreeCAD. Уверете се, че знаете какво точно инсталирате! - - - - Addon manager - Управител на добавките - - - - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - Трябва да рестартирате FreeCAD, за да имат ефект извършените промени. Натиснете Ок, за да рестартирате сега FreeCAD, или Отказ, за да рестартирате по-късно. - - - - Checking for updates... - Проверка за обновяване... - - - - Apply - Прилагане - - - - update(s) - обновявания - - - - No update available - Няма обновяване на разположение - - - - Macro successfully installed. The macro is now available from the Macros dialog. - Успешно инсталиран макрос. Макросът сега е наличен от диалоговия прозорец с макроси. - - - - Unable to install - Не може да се инсталира - - - - Addon successfully removed. Please restart FreeCAD - Добавката е премахната успешно. Рестартирайте FreeCAD - - - - Unable to remove this addon - Добавката не може да се премахне - - - - Macro successfully removed. - Успешно премахнат макрос. - - - - Macro could not be removed. - Макросът не може да се премахне. - - - - Unable to download addon list. - Списъкът с добавки не може да се изтегли. - - - - Workbenches list was updated. - Списъкът с работни среди бе обновен. - - - - Outdated GitPython detected, consider upgrading with pip. - Засечен е остарял GitPython, обмислете да го надградите с помощта на pip. - - - - List of macros successfully retrieved. - Успешно извлечен е списъкът с макроси. - - - - Retrieving description... - Извлича се описание... - - - - Retrieving info from - Извличане на данни от - - - - An update is available for this addon. - Има обновяване за тази добавка. - - - - This addon is already installed. - Добавката вече я има. - - - - Retrieving info from git - Извличане на данни от git - - - - Retrieving info from wiki - Извличане на данни от уики - - - - GitPython not found. Using standard download instead. - Няма открит GitPython. Вместо това използвайте стандартно изтегляне. - - - - Your version of python doesn't appear to support ZIP files. Unable to proceed. - Вашата версия на python не поддържа ZIP файлове. Продължаването невъзможно. - - - - Workbench successfully installed. Please restart FreeCAD to apply the changes. - Работната среда бе обновена. Моля рестартирайте FreeCAD за прилагане на промените. - - - - Missing workbench - Работната среда не е налична - - - - Missing python module - Липсва модул на python - - - - Missing optional python module (doesn't prevent installing) - Липсва допълнителен модул на python (не предотвратява инсталирането) - - - - Some errors were found that prevent to install this workbench - Открити бяха грешки, които предотвратяват инсталирането на работната среда - - - - Please install the missing components first. - Първо инсталирайте липсващите компоненти. - - - - Error: Unable to download - Грешка: Не може да се изтегли - - - - Successfully installed - Успешно инсталирано - - - - GitPython not installed! Cannot retrieve macros from git - Не е инсталиран GitPython! Не може да извлечете данни за макроса от git - - - - Installed - Инсталирано - - - - Update available - Има налично обновление - - - - Restart required - Изисква се повторно пускане - - - - This macro is already installed. - Макросът вече е инсталиран. - - - - A macro has been installed and is available under Macro -> Macros menu - Макросът е инсталиран и наличен под менюто Макроси -> макрос - - - - This addon is marked as obsolete - Добавката е отбелязана като остаряла - - - - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - Това обикновено означава, че тя вече не се поддържа, и някоя по-напреднала добавка в този списък предлага същата функционалност. - - - - Error: Unable to locate zip from - Грешка: Не може да се намери zip от - - - - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - Получи се проблем при извличането на макроса от Git, вероятно изпълнимият файл Git.exe не е достъпен през променливата на средата PATH - - - - This addon is marked as Python 2 Only - Тази добавка е отбелязана като съвместима само с Python 2 - - - - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - Тази работна среда вероятно вече не се поддържа и инсталирането и в система с Python 3 вероятно ще доведе до грешки по време на стартиране или употреба. - - - - User requested updating a Python 2 workbench on a system running Python 3 - - Потребителят пожела обновяване на Python 2 работна среда в система използваща Python 3 - - - - - Workbench successfully updated. Please restart FreeCAD to apply the changes. - Работната среда бе обновена. Моля рестартирайте FreeCAD за прилагане на промените. - - - - User requested installing a Python 2 workbench on a system running Python 3 - - Потребителят пожела инсталиране на Python 2 работна среда в система използваща Python 3 - - - - - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - Изглежда има проблем при свързване с Wiki, свалянето на списъка с макроси от Wiki не е възможно в момента - - - - Raw markdown displayed - Показан е суровия изходния код - - - - Python Markdown library is missing. - Липсва библиотеката Python Markdown. - - - - Dialog - - - Workbenches - Workbenches - - - - Macros - Макроси - - - - Execute - Изпълнение - - - - Downloading info... - Данни за изтеглянето... - - - - Update all - Обновяване на всичко - - - - Executes the selected macro, if installed - Ако е инсталиран, стартирай избрания макрос - - - - Uninstalls a selected macro or workbench - Премахни избрания макрос или работна среда - - - - Installs or updates the selected macro or workbench - Инсталира или обновява избрания макрос или работна среда - - - - Download and apply all available updates - Изтегляне и прилагане на всички налични обновления - - - - Custom repositories (one per line): - Допълнителни източници (по един на ред): - - - - Sets configuration options for the Addon Manager - Настройва конфигурационни параметри на Мениджъра на добавки - - - - Configure... - Конфигуриране... - - - - Addon manager options - Опции на управителя на добавки - - - - Uninstall selected - Деинсталиране на избраното - - - - Install/update selected - Инсталиране/обновяване на избраното - - - - Close - Затваряне - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - Ако тази опция е избрана, при стартирането на Мениджъра на добавки, ще се извърши проверка за наличие на обновления на инсталираните добавки (това изисква в системата да има инсталиран GitPython) - - - - Automatically check for updates at start (requires GitPython) - Автоматична проверка за обновления преди стартиране (изисква GitPython) - - - - Proxy - Прокси - - - - No proxy - Без прокси - - - - User system proxy - Системно прокси - - - - User defined proxy : - Потребителско прокси: - - - - Addon Manager - Управление на добавките - - - - Close the Addon Manager - Затворете управлението на добавките - - - - You can use this window to specify additional addon repositories -to be scanned for available addons - Използвайте този прозорец за да добавите допълнителни хранилища за сканиране за добавки - - - - Std_AddonMgr - - - &Addon manager - &Управител на добавките - - - - Manage external workbenches and macros - Управление на външни workbench и макроси - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ca.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ca.qm deleted file mode 100644 index cbd42912d5..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ca.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ca.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ca.ts deleted file mode 100644 index 5851ce38cc..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ca.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Personalitza el repositori - - - - Repository URL - URL del repositori - - - - Branch - Branca - - - - CompactView - - - - Icon - Icona - - - - - <b>Package Name</b> - <b>Nom del paquet</b> - - - - - Version - Versió - - - - - Description - Descripció - - - - Update Available - Actualització disponible - - - - UpdateAvailable - Actualització disponible - - - - DependencyDialog - - - Dependencies - Dependències - - - - Dependency type - Tipus de dependència - - - - Name - Nom - - - - Optional? - Opcional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resol les dependències - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Aquest complement té les dependències requerides i opcionals següents. Les heu d'instal·lar abans que es pugui utilitzar el complement. - -Voleu que el gestor de complements les instal·li automàticament? Trieu "Ignora" per a instal·lar el complement sense instal·lar les dependències. - - - - FreeCAD Addons - Complements del FreeCAD - - - - Required Python modules - Mòduls Python necessaris - - - - Optional Python modules - Mòduls Python opcionals - - - - DeveloperModeDialog - - - Addon Developer Tools - Eines per a desenvolupadors del complement - - - - Path to Addon - Ruta cap al Complement - - - - - Browse... - Navega... - - - - Metadata - Metadades - - - - Primary branch - Branca primària - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explicació del que proporciona aquest complement. Es mostra al gestor de complements. Pot ser que no hi digui que es tracta d'un complement del FreeCAD. - - - - Description - Descripció - - - - Discussion URL - URL de discussió - - - - Icon - Icona - - - - Bugtracker URL - URL del rastrejador d'errors - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estils semàntics (1.2.3-beta) o CalVer (2022.08.30) compatibles - - - - Set to today (CalVer style) - Estableix a avui (estil CalVer) - - - - - - - (Optional) - (Opcional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Es mostra a la llista de complements del gestor de complements. No hauria d'incloure la paraula "FreeCAD", i ha de ser un nom de directori vàlid en tots els sistemes operatius compatibles. - - - - README URL - Adreça web al README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - PISTA: Donat que això es mostra a FreeCAD, en el Gestor de Complements, no cal ocupar espai dient coses com "Aquest és un complement de FreeCAD..." -- només digues què fa. - - - - Repository URL - URL del repositori - - - - Website URL - Adreça de la pàgina web - - - - Documentation URL - Adreça web a la documentació - - - - Addon Name - Nom del Complement - - - - Version - Versió - - - - (Recommended) - (Recomanat) - - - - Minimum Python - Versió mínima de Python - - - - (Optional, only 3.x version supported) - (Opcional, només està suportada la versió 3.x) - - - - Detect... - Detecta... - - - - Addon Contents - Contingut del Complement - - - - Dialog - - - Addon Manager - Gestor de complements - - - - Edit Tags - Edita les etiquetes - - - - Comma-separated list of tags describing this item: - Llista d'etiquetes separades per comes que descriuen aquest element: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - PISTA: Les etiquetes comunes inclouen "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Gestor de Complements: Advertència! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - El Gestor de Complements proporciona accés a una àmplia biblioteca d'extensions útils de FreeCAD de tercers. No es poden fer garanties quant a la seva seguretat o funcionalitat. - - - - Continue - Continua - - - - Cancel - Cancel·la - - - - EditDependencyDialog - - - Edit Dependency - Modificar dependències - - - - Dependency Type - Tipus de dependència - - - - Dependency - Dependència - - - - Package name, if "Other..." - Nom del paquet, si "Altre..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTA: Si "Altre..." està seleccionat, el paquet no està inclòs al fitxer ALLOWED_PYTHON_PACKAGES.txt, i no serà instal·lat automàticament del Gestor de complements. Envieu un PR a <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> per sol·licitar l'addició d'un paquet. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Si aquesta és una dependència opcional, el Gestor de complements l'oferirà per a instal·lar (quan sigui possible), però no bloquejarà la instal·lació si l'usuari decideix, o no pot, instal·lar el paquet. - - - - Optional - Opcional - - - - ExpandedView - - - - Icon - Icona - - - - - <h1>Package Name</h1> - <h1>Nom del paquet</h1> - - - - - Version - Versió - - - - - (tags) - (etiquetes) - - - - - Description - Descripció - - - - - Maintainer - Mantenidor - - - - Update Available - Actualització disponible - - - - labelSort - ordenació per etiquetes - - - - UpdateAvailable - Actualització disponible - - - - Form - - - Licenses - Llicències - - - - License - Llicència - - - - License file - Fitxer de llicència - - - - People - Gent - - - - Kind - Tipus - - - - Name - Nom - - - - Email - Correu electrònic - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Mapatge avançat de versions - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Les pròximes versions del Gestor de complements de FreeCAD donaran suport als desenvolupadors a establir una branca o etiqueta específica per utilitzar-la amb una versió específica de FreeCAD (p. ex., establir una etiqueta específica com a darrera versió del vostre complement per admetre la v0.19, etc.) - - - - FreeCAD Version - Versió del FreeCAD - - - - Best-available branch, tag, or commit - Millor branca, etiqueta o publicació disponible - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versions del FreeCAD admeses - - - - Minimum FreeCAD Version Supported - Versió mínima de FreeCAD admesa - - - - - Optional - Opcional - - - - Maximum FreeCAD Version Supported - Versió màxima del FreeCAD admesa - - - - Advanced version mapping... - Mapatge avançat de versions... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opcions del Gestor de complements - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Si seleccioneu aquesta opció, en iniciar el Gestor de complements, -es comprovarà si hi ha actualitzacions disponibles als complements instal·lats - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Descarrega les metadades de la Macro (aproximadament 10MB) - - - - Cache update frequency - Freqüència d'actualització de la memòria cau - - - - Manual (no automatic updates) - Manual (sense actualitzacions automàtiques) - - - - Daily - Diàriament - - - - Weekly - Setmanalment - - - - Hide Addons without a license - Oculta Complements sense llicència - - - - Hide Addons with non-FSF Free/Libre license - Oculta Complements sense llicència non-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Oculta Complements sense llicència non-OSI-approved - - - - Hide Addons marked Python 2 Only - Oculta Complements marcats com a Només Python 2 - - - - Hide Addons marked Obsolete - Ocultar Complements marcats com a Obsolets - - - - Hide Addons that require a newer version of FreeCAD - Oculta Complements que requereixen una nova versió de FreeCAD - - - - Custom repositories - Repositoris personalitzats - - - - Proxy - Servidor intermediari - - - - No proxy - Sense servidor intermediari - - - - User system proxy - Servidor intermediari del sistema de l'usuari - - - - User-defined proxy: - Servidor intermediari definit per l'usuari: - - - - Score source URL - Font URL de la puntuació - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - L'URL per les dades de puntuació del complement (vegeu pàgina de la wiki Addon Manager pel format i els detalls de l'allotjament). - - - - Path to Git executable (optional): - Ruta de l'executable Git (opcional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opcions avançades - - - - Activate Addon Manager options intended for developers of new Addons. - Habiliteu les opcions del Gestor de complements destinades als desenvolupadors de nous Complements. - - - - Addon developer mode - Mode de desenvolupament del complement - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Desinstal·la la macro seleccionada o el banc de treball - - - - Install - Instal·la - - - - Uninstall - Desinstal·la - - - - Update - Actualitza - - - - Run Macro - Executa la macro - - - - Change branch - Canvia de branca - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Administreu les dependències de Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Els paquets de Python següents han sigut instal·lats localment pel Gestor de complements per a satisfer dependències de complements. Ubicació d'instal·lació: - - - - Package name - Nom del paquet - - - - Installed version - Versió instal·lada - - - - Available version - Versió disponible - - - - Used by - Utilitzat per - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Un asterisc (*) a la columna "Utilitzat per" indica una dependència opcional. Tingueu en compte que Utilitzat per només registra les importacions directes al complement. També s'han instal·lat altres paquets Python dels quals depenen aquests paquets. - - - - Update all available - Actualitza tots els disponibles - - - - SelectFromList - - - Dialog - Diàleg - - - - TextLabel - Etiqueta de text - - - - UpdateAllDialog - - - Updating Addons - Actualitza els complements - - - - Updating out-of-date addons... - Actualitzant complements obsolets... - - - - addContentDialog - - - Content Item - Elements de contingut - - - - Content type: - Tipus de contingut: - - - - Macro - Macro - - - - Preference Pack - Paquets de preferències - - - - Workbench - Banc de treball - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Si això és l'únic que hi ha al complement, totes les altres metadades es poden heretar del nivell superior i no cal que les especifiqueu aquí. - - - - This is the only item in the Addon - Aquest és l'únic element en el complement - - - - Main macro file - Fitxer de macro principal - - - - The file with the macro's metadata in it - El fitxer amb les metadades de la macro - - - - - - Browse... - Navega... - - - - Preference Pack Name - Nom del paquet de preferències - - - - Workbench class name - Nom de la classe del banc de treball - - - - Class that defines "Icon" data member - Classe que defineix un membre de dades "Icona" - - - - Subdirectory - Subdirectori - - - - Optional, defaults to name of content item - Opcional, el valor predeterminat és el nom de l'element del contingut - - - - Icon - Icona - - - - Optional, defaults to inheriting from top-level Addon - Opcional, el valor predeterminat és heretat del nivell superior del complement - - - - Tags... - Etiquetes... - - - - Dependencies... - Dependències... - - - - FreeCAD Versions... - Versions del FreeCAD... - - - - Other Metadata - Altres metadades - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Mostrat a la llista de complements del Gestor de complements. No hauria d'incloure la paraula "FreeCAD". - - - - Version - Versió - - - - Description - Descripció - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estils semàntics (1.2.3-beta) o CalVer (2022.08.30) compatibles - - - - Set to today (CalVer style) - Estableix a avui (estil CalVer) - - - - Display Name - Nom a mostrar - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Tots els camps deixats en blanc s'hereten de les metadades del complement de nivell superior, de manera que tècnicament són tots opcionals. Per als complements amb diversos elements de contingut, cada element hauria de proporcionar un nom a mostrar i una descripció única. - - - - add_toolbar_button_dialog - - - Add button? - Afegir botó? - - - - Add a toolbar button for this macro? - Voleu afegir un botó a la barra d'eines per a aquesta macro? - - - - Yes - - - - - No - No - - - - Never - Mai - - - - change_branch - - - Change Branch - Canvia la branca - - - - Change to branch: - Canvia a la branca: - - - - copyrightInformationDialog - - - Copyright Information - Informació dels drets d'autor - - - - Copyright holder: - Titular dels drets d'autor: - - - - Copyright year: - Any dels drets d'autor: - - - - personDialog - - - Add Person - Afegeix una persona - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Un mantenidor és algú amb accés actual de commit en aquest projecte. Un autor és qualsevol altra persona a qui t'agradaria donar-li crèdit. - - - - Name: - Nom: - - - - Email: - Correu electrònic: - - - - Email is required for maintainers, and optional for authors. - El correu electrònic és obligatori per als mantenidors i opcional per als autors. - - - - proxy_authentication - - - Proxy login required - Cal iniciar sessió al servidor intermediari - - - - Proxy requires authentication - El servidor intermediari requereix autenticació - - - - Proxy: - Servidor intermediari: - - - - Placeholder for proxy address - Marcador de posició per a l'adreça del servidor intermediari - - - - Realm: - Domini: - - - - Placeholder for proxy realm - Marcador de posició pel domini del servidor intermediari - - - - Username - Nom d'usuari - - - - Password - Contrasenya - - - - selectLicenseDialog - - - Select a license - Selecciona una llicència - - - - About... - Quant a... - - - - License name: - Nom de la llicència: - - - - Path to license file: - Ruta de l'arxiu de la llicència: - - - - (if required by license) - (si és requerit per la llicència) - - - - Browse... - Navega... - - - - Create... - Crea... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Seleccionar Barra d'eines - - - - Select a toolbar to add this macro to: - Seleccioneu una barra d'eines per afegir aquesta macro a: - - - - Ask every time - Demana-m'ho sempre - - - - toolbar_button - - - - Add button? - Afegir botó? - - - - Add a toolbar button for this macro? - Voleu afegir un botó a la barra d'eines per a aquesta macro? - - - - Yes - - - - - No - No - - - - Never - Mai - - - - AddonsInstaller - - - Starting up... - S’està iniciant... - - - - Worker process {} is taking a long time to stop... - El procés de treball {} està trigant molta estona a aturar-se... - - - - Previous cache process was interrupted, restarting... - - El procés de memòria cau anterior ha sigut interromput, s'està reiniciant... - - - - - Custom repo list changed, forcing recache... - - S'ha canviat la llista de repositoris personalitzats, forçant la càrrega a memòria cau... - - - - - Addon manager - Gestor de complements - - - - You must restart FreeCAD for changes to take effect. - Has de reiniciar FreeCAD perquè els canvis tinguin efecte. - - - - Restart now - Reinicia ara - - - - Restart later - Reinicia més tard - - - - - Refresh local cache - Refrescar memòria cau local - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - S'està actualitzant la memòria cau... - - - - - Checking for updates... - S'estan comprovant les actualitzacions... - - - - Temporary installation of macro failed. - La instal·lació temporal de la macro ha fallat. - - - - - Close - Tanca - - - - Update all addons - Actualitza tots els complements - - - - Check for updates - Comprovar actualitzacions - - - - Python dependencies... - Dependències de Python... - - - - Developer tools... - Eines per a desenvolupadors... - - - - Apply %n available update(s) - Aplicar %n actualitzacions disponibles - - - - No updates available - No hi ha actualitzacions disponibles - - - - - - Cannot launch a new installer until the previous one has finished. - No es pot iniciar un nou instal·lador fins que s'hagi acabat l'anterior. - - - - - - - Maintainer - Mantenidor - - - - - - - Author - Autor - - - - New Python Version Detected - S'ha detectat una nova versió de Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Sembla que és la primera vegada que s'utilitza aquesta versió de Python amb el Gestor de complements. Voleu instal·lar-hi les mateixes dependències instal·lades automàticament? - - - - Processing, please wait... - Processant, si us plau, espereu... - - - - - Update - Actualitza - - - - Updating... - S'està actualitzant... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - No s'ha pogut importar QtNetwork -- no pareix com a instal·lat al teu sistema. El vostre proveïdor pot tenir un paquet per a aquesta dependència (sovint anomenat "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - No s'ha pogut convertir el port '{}' del servidor intermediari especificat "{}" a un número de port - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Error de paràmetre: s'han establert opcions de servidor intermediari mútuament excloents. S'està restablint al valor predeterminat. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Error de paràmetre: s'ha indicat el servidor intermediari d'usuari, però no s'ha proporcionat cap servidor intermediari. S'està restablint al valor predeterminat. - - - - Addon Manager: Unexpected {} response from server - Gestor de complements: Resposta {} inesperada del servidor - - - - Error with encrypted connection - Error amb la connexió encriptada - - - - - - Confirm remove - Confirma l'eliminació - - - - Are you sure you want to uninstall {}? - Estàs segur que vols desinstal·lar {}? - - - - - - Removing Addon - Eliminant complement - - - - Removing {} - Eliminant {} - - - - - Uninstall complete - Desinstal·lació completa - - - - - Uninstall failed - Desinstal·lació fallida - - - - Version {version} installed on {date} - Versió {version} instal·lada el dia {date} - - - - Version {version} installed - Versió {version} instal·lada - - - - Installed on {date} - Instal·lat el {date} - - - - - - - Installed - Instal·lat - - - - Currently on branch {}, name changed to {} - Actualment a la branca {}, el nom ha canviat a {} - - - - Git tag '{}' checked out, no updates possible - Etiqueta Git '{}' comprovada, no hi ha actualitzacions possibles - - - - Update check in progress - Comprovació d'actualitzacions en curs - - - - Installation location - Localització de la instal·lació - - - - Repository URL - URL del repositori - - - - Changed to branch '{}' -- please restart to use Addon. - Canviat a la branca '{}' -- si us plau, reinicieu per utilitzar el complement. - - - - This Addon has been updated. Restart FreeCAD to see changes. - S'ha actualitzat aquest complement. Reinicia FreeCAD per veure els canvis. - - - - Disabled - Deshabilitat - - - - Currently on branch {}, update available to version {} - Actualment a la branca {}, hi ha una actualització disponible a la versió {} - - - - Update available to version {} - Actualització disponible a la versió {} - - - - This is the latest version available - Aquesta és l'última versió disponible - - - - WARNING: This addon is obsolete - ADVERTÈNCIA: Aquest complement està obsolet - - - - WARNING: This addon is Python 2 only - ADVERTÈNCIA: Aquest complement només és per a Python 2 - - - - WARNING: This addon requires FreeCAD {} - ADVERTÈNCIA: Aquest complement necessita FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ADVERTÈNCIA: Aquest complement ja està instal·lat, però està deshabilitat. Prem el botó 'habilitar' per tornar-lo a habilitar. - - - - This Addon will be enabled next time you restart FreeCAD. - Aquest complement serà habilitat la pròxima vegada que reiniciïs FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Aquest complement serà deshabilitat la pròxima vegada que reiniciïs FreeCAD. - - - - - - Success - Èxit - - - - Install - Instal·la - - - - Uninstall - Desinstal·la - - - - Enable - Habilita - - - - Disable - Desactiva - - - - - Check for update - Cerca actualitzacions - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - executa - - - - Change branch... - Canvia de branca... - - - - Return to package list - Torna al llistat de paquets - - - - Checking connection - S’està comprovant la connexió - - - - Checking for connection to GitHub... - S'està comprovant la connexió a GitHub... - - - - Connection failed - La connexió ha fallat - - - - Missing dependency - Dependències faltant - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - No s'ha pogut importar QtNetwork -- vegeu Visualització d'informes per obtenir més informació. El Gestor de complements no està disponible. - - - - Other... - For providing a license other than one listed - Altres... - - - - Select the corresponding license file in your Addon - Selecciona el fitxer de llicència corresponent pel teu complement - - - - Location for new license file - Localització per un nou fitxer de llicència - - - - Received {} response code from server - S'ha rebut el codi de resposta {} del servidor - - - - Failed to install macro {} - No s'ha pogut instal·lar la macro {} - - - - Failed to create installation manifest file: - - No s'ha pogut crear el fitxer de manifest d'instal·lació: - - - - - Unrecognized content kind '{}' - No s'ha pogut reconèixer el tipus de contingut '{}' - - - - Unable to locate icon at {} - No s'ha pogut localitzar la icona a {} - - - - Select an icon file for this content item - Selecciona una icona per aquest element de contingut - - - - - - {} is not a subdirectory of {} - {} no és un subdirectori de {} - - - - Select the subdirectory for this content item - Selecciona el subdirectori per aquest element de contingut - - - - Automatic - Automàtica - - - - - Workbench - Banc de treball - - - - Addon - Complement - - - - Python - Python - - - - Yes - - - - - Internal Workbench - Banc de treball intern - - - - External Addon - Complement extern - - - - Python Package - Paquet de Python - - - - - Other... - Altres... - - - - Too many to list - Masses per llistar - - - - - - - - - Missing Requirement - Falten requisits - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - El complement '{}' requereix '{}', que no està disponible per a la teva còpia de FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - El complement '{}' requereix els següents bancs de treball, que no estan disponibles per a la teva còpia de FreeCAD: - - - - Press OK to install anyway. - Premeu OK per instal·lar-lo de totes maneres. - - - - - Incompatible Python version - Versió incompatible de Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Aquest complement requereix paquets de Python que no estan instal·lats i que no es poden instal·lar automàticament. Per a utilitzar aquest complement, heu d'instal·lar manualment els següents paquets de Python: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Aquest complement (o una de les seves dependències) requereix Python {}.{}, i el vostre sistema està executant {}.{}. S'ha cancel·lat la instal·lació. - - - - Optional dependency on {} ignored because it is not in the allow-list - La dependència opcional {} s'ha ignorat perquè no està en la llista permesa - - - - - Installing dependencies - Instal·lant dependències - - - - - Cannot execute Python - No s’ha pogut executar Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - No s'ha pogut localitzar automàticament l'executable de Python o el camí s'ha definit incorrectament. Si us plau, comproveu la configuració de preferències del Gestor de complements per al camí de Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - No s'han pogut instal·lar les dependències. Voleu continuar amb la instal·lació de {} de totes maneres? - - - - - Cannot execute pip - No s’ha pogut executar pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - No s'ha pogut executar pip, que pot ser absent a la instal·lació de Python. Assegureu-vos que el vostre sistema tingui pip instal·lat i torneu-ho a provar. La comanda que ha fallat és: - - - - - Continue with installation of {} anyway? - Voleu continuar amb la instal·lació de {} de totes maneres? - - - - - Package installation failed - La instal·lació del paquet ha fallat - - - - See Report View for detailed failure log. - Consulteu Visualització d'informes per obtenir un registre d'errors detallat. - - - - Installing Addon - Instal·lant el complement - - - - Installing FreeCAD Addon '{}' - Instal·lant el complement de FreeCAD '{}' - - - - Cancelling - Cancel·lant - - - - Cancelling installation of '{}' - Cancel·lant la instal·lació de '{}' - - - - {} was installed successfully - {} s'ha instal·lat correctament - - - - - Installation Failed - La instal·lació ha fallat - - - - Failed to install {} - No s'ha pogut instal·lar {} - - - - - Create new toolbar - Crea una nova barra d'eines - - - - - A macro installed with the FreeCAD Addon Manager - Una macro instal·lada amb el Gestor de complements de FreeCAD - - - - - Run - Indicates a macro that can be 'run' - executa - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - No es poden llegir dades de GitHub: comproveu la vostra connexió a Internet i la configuració del servidor intermediari i torneu-ho a provar. - - - - XML failure while reading metadata from file {} - Error XML durant la lectura de metadades del fitxer {} - - - - Invalid metadata in file {} - Fitxer invàlid de metadades {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ADVERTÈNCIA: El camí especificat a les metadades package.xml no coincideix amb la branca descarregada actualment. - - - - Name - Nom - - - - Class - Classe - - - - Description - Descripció - - - - Subdirectory - Subdirectori - - - - Files - Fitxers - - - - Select the folder containing your Addon - Selecciona la carpeta que conté el teu complement - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No hi ha Vermin, cancel·lant l'operació. - - - - Scanning Addon for Python version compatibility - Escanejant el complement per a la compatibilitat de la versió de Python - - - - Minimum Python Version Detected - S'ha detectat la versió mínima de Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin ha detectat automàticament una versió requerida de Python 3.{} - - - - Install Vermin? - Instal·lar Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - La detecció automàtica de la versió necessària de Python per a aquest complement requereix Vermin (https://pypi.org/project/vermin/). El vols instal·lar? - - - - Attempting to install Vermin from PyPi - Intentant la instal·lació de Vermin des de PyPi - - - - - Installation failed - La instal·lació ha fallat - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - La instal·lació de Vermin ha fallat -- consulteu la Visualització d'informes per obtenir més informació. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - No s'ha pogut importar vermin després de la instal·lació -- no es pot escanejar el complement. - - - - Select an icon file for this package - Selecciona una icona per aquest paquet - - - - Filter is valid - El filtre és vàlid - - - - Filter regular expression is invalid - L'expressió regular de filtre és invàlida - - - - Search... - Cerca... - - - - Click for details about package {} - Fes clic per veure els detalls sobre el paquet {} - - - - Click for details about workbench {} - Fes clic per veure els detalls sobre el banc de treball {} - - - - Click for details about macro {} - Fes clic per veure els detalls sobre la macro {} - - - - Maintainers: - Mantenidors: - - - - Tags - Etiquetes - - - - {} ★ on GitHub - {} ★ a GitHub - - - - No ★, or not on GitHub - Sense ★, o no hi és a GitHub - - - - Created - Creat - - - - Updated - Actualitzat - - - - Score: - Puntuació: - - - - - Up-to-date - Actualitzat - - - - - - - - Update available - Hi ha una actualització disponible - - - - - Pending restart - Pendent de reinici - - - - - DISABLED - DESHABILITAT - - - - Installed version - Versió instal·lada - - - - Unknown version - Versió desconeguda - - - - Installed on - Instal·lat el - - - - Available version - Versió disponible - - - - Filter by... - Filtra per... - - - - Addon Type - Tipus del Complement - - - - - Any - Qualsevol - - - - Macro - Macro - - - - Preference Pack - Paquets de preferències - - - - Installation Status - Estat de la instal·lació - - - - Not installed - No instal·lat - - - - Filter - Filtre - - - - DANGER: Developer feature - PERILL: Característica de desenvolupador - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - PERILL: El canvi de branques està pensat per a desenvolupadors i beta testers, i pot provocar documents trencats i no compatibles amb versions anteriors, inestabilitat, bloquejos i/o la mort prematura per calor de l'univers. Esteu segur que voleu continuar? - - - - There are local changes - Hi ha canvis locals - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ADVERTÈNCIA: Aquest repositori té canvis locals no confirmats. Esteu segur que voleu canviar de branca (portar els canvis amb vosaltres)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Seguiment remot - - - - Last Updated - Table header for git update date - Darrera actualització - - - - Installation of Python package {} failed - La instal·lació del paquet de Python {} ha fallat - - - - Installation of optional package failed - La instal·lació del paquet opcional ha fallat - - - - Installing required dependency {} - S'està instal·lant la dependència necessària {} - - - - Installation of Addon {} failed - La instal·lació del complement {} ha fallat - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - La descodificació del fitxer {} pel complement '{}' ha fallat - - - - Any dependency information in this file will be ignored - Qualsevol informació de dependències en aquest fitxer serà ignorada - - - - Unable to open macro wiki page at {} - No s'ha pogut obrir la pàgina de wiki de la macro a {} - - - - Unable to fetch the code of this macro. - No es pot obtenir el codi d'aquesta macro. - - - - Unable to retrieve a description from the wiki for macro {} - No es pot recuperar una descripció de la wiki per la macro {} - - - - Unable to open macro code URL {} - No es pot obrir l'URL del codi de la macro {} - - - - Unable to fetch macro-specified file {} from {} - No es pot obtenir el fitxer especificat per la macro {} de {} - - - - Could not locate macro-specified file {} (expected at {}) - No s'ha pogut localitzar el fitxer especificat per la macro {} (s'esperava {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Banc de treball intern no reconegut '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Advertiment per a desenvolupadors de complements: L'URL del repositori establert al fitxer package.xml pel complement {} ({}) no coincideix amb l'URL del qual s'ha obtingut ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Advertiment per a desenvolupadors de complements: La branca del repositori establerta al fitxer package.xml pel complement {} ({}) no coincideix amb la branca de la qual s'ha obtingut ({}) - - - - - Got an error when trying to import {} - S'ha produït un error en importar {} - - - - An unknown error occurred - S'ha produït un error desconegut - - - - Could not find addon {} to remove it. - No s'ha pogut trobar el complement {} per eliminar-lo. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - L'execució de l'script uninstall.py del complement ha fallat. Continuant amb la desinstal·lació... - - - - Removed extra installed file {} - S'ha eliminat el fitxer instal·lat addicional {} - - - - Error while trying to remove extra installed file {} - S'ha produït un error durant l'eliminació del fitxer instal·lat addicional {} - - - - Error while trying to remove macro file {}: - S'ha produït un error durant l'eliminació del fitxer de la macro {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - No s'ha pogut connectar amb GitHub: Comprova la teva connexió i la configuració del servidor intermediari. - - - - WARNING: Duplicate addon {} ignored - ADVERTÈNCIA: El complement {} duplicat s'ignora - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - S'ha produït un error en actualitzar les macros de GitHub, s'està intentant netejar el checkout... - - - - Attempting to do a clean checkout... - S'està intentant fer un checkout net... - - - - Clean checkout succeeded - Checkout net exitós - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Error en actualitzar les macros de GitHub -- intenti netejar la memòria cau del Gestor de complements. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error en connectar a la Wiki, FreeCAD no pot recuperar la llista de macros de la wiki en aquest moment - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - La lectura de metadades de {name} ha fallat - - - - Failed to fetch code for macro '{name}' - No s'ha pogut obtenir el codi per la macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Gestor de complements: no s'ha pogut completar un procés de treball mentre s'obté {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - De {num_macros} macros, {num_failed} s'han bloquejat durant el processament - - - - Addon Manager: a worker process failed to halt ({name}) - Gestor de complements: no s'ha pogut aturar un procés de treball ({name}) - - - - Timeout while fetching metadata for macro {} - S'ha esgotat el temps durant l'obtenció de metadades per a la macro {} - - - - Failed to kill process for macro {}! - - No s'ha pogut matar el procés per a la macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - No s'han pogut obtenir les estadístiques del complement de {} -- només l'ordenació alfabètica serà precisa - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - No s'ha pogut obtenir la puntuació del complement de '{}' l'ordenació per puntuació fallarà - - - - - Repository URL - Preferences header for custom repositories - URL del repositori - - - - Branch name - Preferences header for custom repositories - Nom de la branca - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Fent còpia de seguretat del directori original i tornant a clonar - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Error en el canvi de nom de la branca de git amb el missatge següent: - - - - Installing - Instal·lant - - - - Succeeded - Amb èxit - - - - Failed - Ha fallat - - - - Update was cancelled - S'ha cancel·lat l'actualització - - - - some addons may have been updated - alguns complements poden haver estat actualitzats - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - S'està carregant informació per a {} del wiki de FreeCAD Macro Recipies... - - - - Loading page for {} from {}... - Carregant pàgina per {} de {}... - - - - Failed to download data from {} -- received response code {}. - No s'han pogut baixar les dades de {} -- s'ha rebut el codi de resposta {}. - - - - Composite view - Vista composta - - - - Expanded view - Vista estesa - - - - Compact view - Vista compacta - - - - Alphabetical - Sort order - Alfabètic - - - - Last Updated - Sort order - Darrera actualització - - - - Date Created - Sort order - Data de creació - - - - GitHub Stars - Sort order - Estrelles de GitHub - - - - Score - Sort order - Puntuació - - - - Std_AddonMgr - - - &Addon manager - &Gestor de complements - - - - Manage external workbenches, macros, and preference packs - Administra bancs de treball externs, macros, i paquets de preferències - - - - AddonInstaller - - - Finished removing {} - S'ha completat l'eliminació de {} - - - - Failed to remove some files - No s'ha pogut esborrar alguns fitxers - - - - Addons installer - - - Finished updating the following addons - L'actualització dels següents complements s'ha completat - - - - Workbench - - - Auto-Created Macro Toolbar - Barra d'eines de macro creada automàticament - - - - QObject - - - Addon Manager - Gestor de complements - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_cs.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_cs.qm deleted file mode 100644 index d57db4fa15..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_cs.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_cs.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_cs.ts deleted file mode 100644 index deeacd2daf..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_cs.ts +++ /dev/null @@ -1,2484 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Vlastní repozitář - - - - Repository URL - URL adresa repozitáře - - - - Branch - Větev - - - - CompactView - - - - Icon - Ikona - - - - - <b>Package Name</b> - <b>Název balíčku</b> - - - - - Version - Verze - - - - - Description - Popis - - - - Update Available - Je dostupná aktualizace - - - - UpdateAvailable - Aktualizace k dispozici - - - - DependencyDialog - - - Dependencies - Závislosti - - - - Dependency type - Typ závislosti - - - - Name - Název - - - - Optional? - Volitelné? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Vyřešit závislosti - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Tento doplněk má následující povinné a volitelné závislosti. Před použitím tohoto doplňku je musíte nainstalovat. - -Přejete si, aby je správce doplňků automaticky nainstaloval? Vyberte "Ignorovat" pro instalaci doplňku bez instalace závislostí. - - - - FreeCAD Addons - Doplňky pro FreeCAD - - - - Required Python modules - Požadované Python moduly - - - - Optional Python modules - Volitelné Python moduly - - - - DeveloperModeDialog - - - Addon Developer Tools - Nástroje pro vývoj doplňků - - - - Path to Addon - Cesta k doplňku - - - - - Browse... - Procházet... - - - - Metadata - Metadata - - - - Primary branch - Hlavní větev - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Vysvětlení, co tento doplněk poskytuje, zobrazené ve správci doplňků. Není nutné uvádět, že se jedná o doplněk pro FreeCAD. - - - - Description - Popis - - - - Discussion URL - URL adresa diskuze - - - - Icon - Ikona - - - - Bugtracker URL - URL adresa pro sledování chyb - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) nebo CalVer (2022.08.30) styly podporovány - - - - Set to today (CalVer style) - Nastavit na dnešek (CalVer styl) - - - - - - - (Optional) - (Volitelné) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Zobrazeno v seznamu doplňků správce doplňků. Nemělo by obsahovat slovo "FreeCAD" a musí být platný název adresáře na všech podporovaných operačních systémech. - - - - README URL - URL adresa README souboru - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Protože je tento text zobrazen ve správci doplňků programu FreeCAD, není nutné plýtvat místem větami jako "Toto je doplněk pro FreeCAD..." -- Jen řekněte, co dělá. - - - - Repository URL - URL adresa repozitáře - - - - Website URL - URL adresa webové stránky - - - - Documentation URL - URL adresa dokumentace - - - - Addon Name - Název doplňku - - - - Version - Verze - - - - (Recommended) - (Doporučené) - - - - Minimum Python - Minimální verze Pythonu - - - - (Optional, only 3.x version supported) - (Volitelné, podporována pouze verze 3.x) - - - - Detect... - Detekovat... - - - - Addon Contents - Obsah doplňků - - - - Dialog - - - Addon Manager - Správce rozšíření - - - - Edit Tags - Upravit tagy - - - - Comma-separated list of tags describing this item: - Seznam štítků oddělených čárkami popisujících tuto položku: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - TIP: Běžné tagy zahrnují "Shromáždění", "MKP", "Síť", "NURBS", atd. - - - - Add-on Manager: Warning! - Správce doplňků: Varování! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Správce doplňků poskytuje přístup k rozsáhlé knihovně užitečných rozšíření FreeCADu třetích stran. Nelze poskytnout žádné záruky týkající se jejich bezpečnosti nebo funkčnosti. - - - - Continue - Pokračovat - - - - Cancel - Zrušit - - - - EditDependencyDialog - - - Edit Dependency - Upravit závislost - - - - Dependency Type - Typ závislosti - - - - Dependency - Závislost - - - - Package name, if "Other..." - Název balíčku, pokud "ostatní..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - POZNÁMKA: Pokud je vybrána "další...", balíček není v ALLOWED_PYTHON_PACKAGES. xt soubor a nebude automaticky nainstalován Správcem doplňků. Pošlete PR na <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> a požádejte o přidání balíčku. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Pokud se jedná o volitelnou závislost, správce doplňků nabídne instalaci (je-li to možné), ale nebude blokovat instalaci, pokud se uživatel rozhodne, že balíček nenainstaluje nebo nemůže. - - - - Optional - Volitelné - - - - ExpandedView - - - - Icon - Ikona - - - - - <h1>Package Name</h1> - <h1>Název balíčku</h1> - - - - - Version - Verze - - - - - (tags) - (štítky) - - - - - Description - Popis - - - - - Maintainer - Správce - - - - Update Available - Je dostupná aktualizace - - - - labelSort - Třídit štítky - - - - UpdateAvailable - Aktualizace k dispozici - - - - Form - - - Licenses - Licence - - - - License - Licence - - - - License file - Licenční soubory - - - - People - Lidé - - - - Kind - Druh - - - - Name - Název - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Pokročilé mapování verze - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Nadcházející verze FreeCAD Addon Manageru budou podporovat vývojáře'apos; nastavení konkrétní větve nebo tagu pro použití s konkrétní verzí FreeCADu (např. nastavení konkrétního tagu jako poslední verze vašeho Addonu pro podporu v0.19 atd.) - - - - FreeCAD Version - FreeCAD verze - - - - Best-available branch, tag, or commit - Nejlépe dostupná větev, značka nebo potvrzení - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Podporované verze FreeCAD - - - - Minimum FreeCAD Version Supported - Minimální verze FreeCAD je podporována - - - - - Optional - Volitelné - - - - Maximum FreeCAD Version Supported - Maximální počet podporovaných verzí FreeCAD - - - - Advanced version mapping... - Rozšířené mapování verze... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Možnosti správce doplňků - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Pokud je tato možnost vybrána, při spuštění Správce doplňků, -nainstalované doplňky zkontrolovány, zda jsou k dispozici aktualizace - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Stáhnout metadata pro makra (přibližně 10MB) - - - - Cache update frequency - Četnost aktualizace mezipaměti - - - - Manual (no automatic updates) - Ruční (bez automatických aktualizací) - - - - Daily - Denně - - - - Weekly - Týdně - - - - Hide Addons without a license - Skrýt doplňky bez licence - - - - Hide Addons with non-FSF Free/Libre license - Skrýt doplňky s licencí non-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Skrytí doplňků s licencí neschválenou společností OSI - - - - Hide Addons marked Python 2 Only - Skrýt doplňky označené pouze Python 2 - - - - Hide Addons marked Obsolete - Skrýt Zastaralé doplňky - - - - Hide Addons that require a newer version of FreeCAD - Skrýt doplňky, které vyžadují novější verzi FreeCADu - - - - Custom repositories - Vlastní repozitáře - - - - Proxy - Proxy - - - - No proxy - Nepoužívat proxy - - - - User system proxy - Proxy uživatelského systému - - - - User-defined proxy: - Uživatelem definované proxy: - - - - Score source URL - Zdrojová adresa URL skóre - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Adresa URL pro data Addon Score (podrobnosti o formátování a hostování naleznete na wiki stránce Addon Manager). - - - - Path to Git executable (optional): - Cesta pro spuštění Gitu (volitelné): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Pokročilá nastavení - - - - Activate Addon Manager options intended for developers of new Addons. - Aktivujte možnosti doplňků správce obsahu určené pro vývojáře nových doplňků. - - - - Addon developer mode - Režim pro vývojáře - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Odinstaluje vybrané makro nebo pracovní stůl - - - - Install - Instalovat - - - - Uninstall - Odinstalovat - - - - Update - Aktualizovat - - - - Run Macro - Spustit makro - - - - Change branch - Změnit větev - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Spravovat závislosti Pythonu - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Následující balíky Pythonu byly lokálně nainstalovány Správcem doplňků pro uspokojení závislostí doplňků. Umístění instalace: - - - - Package name - Název balíčku - - - - Installed version - Nainstalovaná verze - - - - Available version - Dostupná verze - - - - Used by - Použito - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Hvězdička (*) v "používaném ve sloupci" označuje volitelnou závislost. Všimněte si, že používají pouze přímé importy v doplňku. Ostatní balíky v Pythonu, na kterých závisí, mohou být také nainstalovány. - - - - Update all available - Aktualizovat všechny dostupné - - - - SelectFromList - - - Dialog - Dialogové okno - - - - TextLabel - Textový popisek - - - - UpdateAllDialog - - - Updating Addons - Aktualizace doplňků - - - - Updating out-of-date addons... - Aktualizace zastaralých doplňků... - - - - addContentDialog - - - Content Item - Položka obsahu - - - - Content type: - Typ obsahu: - - - - Macro - Makro - - - - Preference Pack - Předvolby balíčku - - - - Workbench - Pracovní prostředí - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Pokud je to jediná věc v Addon, lze všechna ostatní metadata zdědit z nejvyšší úrovně, a zde není třeba uvádět. - - - - This is the only item in the Addon - Toto je jediná položka v doplňku - - - - Main macro file - Hlavní makro soubor - - - - The file with the macro's metadata in it - Soubor s makro's metadaty v něm - - - - - - Browse... - Procházet... - - - - Preference Pack Name - Název balíčku předvoleb - - - - Workbench class name - Název třídy pracovního stolu - - - - Class that defines "Icon" data member - Třída definovaná "Ikona" datovým členem - - - - Subdirectory - Podadresář - - - - Optional, defaults to name of content item - Nepovinné, výchozí hodnota názvu položky obsahu - - - - Icon - Ikona - - - - Optional, defaults to inheriting from top-level Addon - Volitelné, výchozí zdědění z nejvyšší úrovně - - - - Tags... - Tagy... - - - - Dependencies... - Závislosti... - - - - FreeCAD Versions... - FreeCAD verze... - - - - Other Metadata - Další metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Zobrazeno ve správci doplňků's seznamu doplňků. Nemělo by obsahovat slovo "FreeCAD". - - - - Version - Verze - - - - Description - Popis - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) nebo CalVer (2022.08.30) styly podporovány - - - - Set to today (CalVer style) - Nastavit na dnešek (CalVer styl) - - - - Display Name - Zobrazit název - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Všechna pole, která zůstávají prázdná, jsou zděděna z metadat nejvyšší úrovně, takže jsou technicky nepovinná. Pro doplňky s více položkami obsahu by každá položka měla poskytnout jedinečný zobrazovaný název a popis. - - - - add_toolbar_button_dialog - - - Add button? - Přidat tlačítko? - - - - Add a toolbar button for this macro? - Přidat pro toto makro tlačítko panelu nástrojů? - - - - Yes - Ano - - - - No - Ne - - - - Never - Nikdy - - - - change_branch - - - Change Branch - Změnit větev - - - - Change to branch: - Změna větve: - - - - copyrightInformationDialog - - - Copyright Information - Informace o autorských právech - - - - Copyright holder: - Držitel autorských práv: - - - - Copyright year: - Autorská práva rok: - - - - personDialog - - - Add Person - Přidat osobu - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Správce je někdo s aktuálním přístupem k commitu na tento projekt. Autor je kdokoliv jiný,'byste rádi udělili kredit. - - - - Name: - Název: - - - - Email: - E-mail: - - - - Email is required for maintainers, and optional for authors. - E-mail je vyžadován pro správce a pro autory je volitelný. - - - - proxy_authentication - - - Proxy login required - Je vyžadováno přihlášení přes proxy - - - - Proxy requires authentication - Proxy vyžaduje autentizaci - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Zástupný symbol pro adresu proxy - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Zástupný symbol pro proxy říši - - - - Username - Jméno uživatele - - - - Password - Heslo - - - - selectLicenseDialog - - - Select a license - Vyberte licenci - - - - About... - O aplikaci... - - - - License name: - Název licence: - - - - Path to license file: - Cesta k licenčnímu souboru: - - - - (if required by license) - (vyžaduje-li to licence) - - - - Browse... - Procházet... - - - - Create... - Vytvořit... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Vybrat nástrojovou lištu - - - - Select a toolbar to add this macro to: - Vyberte nástrojovou lištu pro přidání tohoto makra do: - - - - Ask every time - Pokaždé se zeptat - - - - toolbar_button - - - - Add button? - Přidat tlačítko? - - - - Add a toolbar button for this macro? - Přidat pro toto makro tlačítko panelu nástrojů? - - - - Yes - Ano - - - - No - Ne - - - - Never - Nikdy - - - - AddonsInstaller - - - Starting up... - Zahájení... - - - - Worker process {} is taking a long time to stop... - Pracovní proces {} trvá dlouho, než se zastaví... - - - - Previous cache process was interrupted, restarting... - - Předchozí proces mezipaměti byl přerušen, restartuji... - - - - - Custom repo list changed, forcing recache... - - Seznam vlastních repozitářů byl změněn, vynucování recache... - - - - - Addon manager - Správce rozšíření - - - - You must restart FreeCAD for changes to take effect. - Aby se změny projevily, musíte FreeCAD restartovat. - - - - Restart now - Restartovat nyní - - - - Restart later - Restartovat později - - - - - Refresh local cache - Aktualizovat lokální mezipaměť - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Aktualizuji mezipaměť... - - - - - Checking for updates... - Hledání aktualizací... - - - - Temporary installation of macro failed. - Dočasná instalace makra selhala. - - - - - Close - Zavřít - - - - Update all addons - Aktualizace všech doplňků - - - - Check for updates - Zkontrolujte aktualizace - - - - Python dependencies... - Závislosti jazyka Python... - - - - Developer tools... - Nástroje pro vývojáře... - - - - Apply %n available update(s) - Použít %n dostupných aktualizací - - - - No updates available - Žádné dostupné aktualizace - - - - - - Cannot launch a new installer until the previous one has finished. - Nelze spustit nový instalační program, dokud nebude ukončena předchozí instalace. - - - - - - - Maintainer - Správce - - - - - - - Author - Autor - - - - New Python Version Detected - Byla zjištěna nová verze Pythonu - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Zdá se, že tato verze Pythonu byla poprvé použita spolu se Správcem doplňků. Přejete si nainstalovat stejné automaticky nainstalované závislosti? - - - - Processing, please wait... - Zpracovávání, čekejte prosím... - - - - - Update - Aktualizovat - - - - Updating... - Probíhá aktualizace... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Nepodařilo se importovat QtNetwork -- zdá se, že není nainstalován ve vašem systému. Váš poskytovatel může mít balíček pro tuto závislost (často nazývaný "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Nepodařilo se převést zadaný port proxy '{}' na číslo portu - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Chyba parametru: oboustranně exkluzivní nastavení proxy možností. Resetování na výchozí. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Chyba parametru: indikován uživatelský proxy server, ale není k dispozici. Resetování na výchozí. - - - - Addon Manager: Unexpected {} response from server - Správce doplňků: Neočekávaná {} odpověď od serveru - - - - Error with encrypted connection - Chyba šifrovaného připojení - - - - - - Confirm remove - Potvrdit odstranění - - - - Are you sure you want to uninstall {}? - Opravdu chcete odinstalovat {}? - - - - - - Removing Addon - Odstraňování doplňku - - - - Removing {} - Odstranění {} - - - - - Uninstall complete - Odinstalace dokončena - - - - - Uninstall failed - Odinstalace se nezdařila - - - - Version {version} installed on {date} - Verze {version} nainstalována v {date} - - - - Version {version} installed - Verze {version} nainstalována - - - - Installed on {date} - Nainstalováno na {date} - - - - - - - Installed - Nainstalováno - - - - Currently on branch {}, name changed to {} - Aktuálně na větvi {}, název změněn na {} - - - - Git tag '{}' checked out, no updates possible - Git značka '{}' prošla kontrolou, žádná aktualizace není možná - - - - Update check in progress - Probíhá kontrola aktualizací - - - - Installation location - Umístění instalace - - - - Repository URL - URL adresa repozitáře - - - - Changed to branch '{}' -- please restart to use Addon. - Změněno na větev '{}' -- restartujte prosím používání doplňku. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Tento doplněk byl aktualizován. Pro provedení změn restartujte FreeCAD. - - - - Disabled - Deaktivovány - - - - Currently on branch {}, update available to version {} - Aktuálně na větvi {}, k dispozici aktualizace na verzi {} - - - - Update available to version {} - K dispozici je aktualizace na verzi {} - - - - This is the latest version available - Jedná se o nejnovější dostupnou verzi - - - - WARNING: This addon is obsolete - VAROVÁNÍ: Tento doplněk je zastaralý - - - - WARNING: This addon is Python 2 only - UPOZORNĚNÍ: Tento doplněk je určen pouze pro Python 2. - - - - WARNING: This addon requires FreeCAD {} - VAROVÁNÍ: Tento doplněk vyžaduje FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - VAROVÁNÍ: Tento doplněk je v současné době nainstalován, ale je zakázán. Použijte tlačítko 'povolit' pro opětovné povolení. - - - - This Addon will be enabled next time you restart FreeCAD. - Tento doplněk bude povolen při příštím restartu FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Tento doplněk bude zakázán při příštím restartu FreeCAD. - - - - - - Success - Úspěšně - - - - Install - Instalovat - - - - Uninstall - Odinstalovat - - - - Enable - Povolit - - - - Disable - Vypnout - - - - - Check for update - Zkontrolujte aktualizaci - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Spustit - - - - Change branch... - Změna větve... - - - - Return to package list - Zpět na seznam balíčků - - - - Checking connection - Ověřování připojení - - - - Checking for connection to GitHub... - Kontrola připojení k GitHubu... - - - - Connection failed - Připojení se nezdařilo - - - - Missing dependency - Chybějící závislost - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Nepodařilo se importovat QtNetwork -- podrobnosti viz Zobrazení reportu. Správce doplňků není k dispozici. - - - - Other... - For providing a license other than one listed - Ostatní... - - - - Select the corresponding license file in your Addon - Vyberte odpovídající licenční soubor ve vašem doplňku - - - - Location for new license file - Umístění nového licenčního souboru - - - - Received {} response code from server - Obdržen {} kód odpovědi od serveru - - - - Failed to install macro {} - Nepodařilo se nainstalovat macro {} - - - - Failed to create installation manifest file: - - Nepodařilo se vytvořit instalační soubor: - - - - Unrecognized content kind '{}' - Nerozpoznaný typ obsahu '{}' - - - - Unable to locate icon at {} - Ikonu na {} nelze najít - - - - Select an icon file for this content item - Vyberte soubor ikony pro tuto položku obsahu - - - - - - {} is not a subdirectory of {} - {} není podadresář {} - - - - Select the subdirectory for this content item - Vyberte podadresář pro tuto položku obsahu - - - - Automatic - Automaticky - - - - - Workbench - Pracovní prostředí - - - - Addon - Doplňek - - - - Python - Python - - - - Yes - Ano - - - - Internal Workbench - Interní pracovní stůl - - - - External Addon - Externí doplněk - - - - Python Package - Python Package - - - - - Other... - Ostatní... - - - - Too many to list - Příliš mnoho k zobrazení seznamu - - - - - - - - - Missing Requirement - Chybějící požadavek - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Doplněk '{}' vyžaduje '{}', což není k dispozici ve vaší kopii FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Doplněk '{}' vyžaduje následující pracovní prostředí, která nejsou dostupná ve vaší kopii FreeCAD: - - - - Press OK to install anyway. - Stiskněte OK pro instalaci. - - - - - Incompatible Python version - Nekompatibilní verze Pythonu - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Tento doplněk vyžaduje balíky Pythonu, které nejsou nainstalovány a nelze je nainstalovat automaticky. Chcete-li použít tento doplněk, musíte nainstalovat následující balíky Pythonu ručně: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Tento doplněk (nebo jedna z jeho závislostí) vyžaduje Python {}.{} a váš systém používá {}.{}. Instalace zrušena. - - - - Optional dependency on {} ignored because it is not in the allow-list - Volitelná závislost na {} ignorována, protože není v seznamu povolenek - - - - - Installing dependencies - Instalace závislostí - - - - - Cannot execute Python - Python nelze spustit - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Nepodařilo se automaticky najít váš spustitelný program Pythonu, nebo je nastavena cesta nesprávně. Zkontrolujte prosím nastavení nastavení nastavení správce doplňků pro cestu k Pythonu. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Závislosti nelze nainstalovat. Chcete přesto pokračovat s instalací {} {}? - - - - - Cannot execute pip - Nelze spustit pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Nepodařilo se spustit funkci pip, která možná chybí v instalaci Pythonu. Ujistěte se prosím, že je v systému nainstalován program pip, a zkuste to znovu. Neúspěšný příkaz byl: - - - - - Continue with installation of {} anyway? - Chcete přesto pokračovat s instalací {}? - - - - - Package installation failed - Instalace balíčku se nezdařila - - - - See Report View for detailed failure log. - Detailní protokol selhání, viz Report View. - - - - Installing Addon - Instalovat doplňky - - - - Installing FreeCAD Addon '{}' - Instalace FreeCAD doplňku '{}' - - - - Cancelling - Rušení - - - - Cancelling installation of '{}' - Ruší se instalace '{}' - - - - {} was installed successfully - {} byl úspěšně nainstalován - - - - - Installation Failed - Instalace se nezdařila - - - - Failed to install {} - Nepodařilo se nainstalovat {} - - - - - Create new toolbar - Vytvořit nový panel nástrojů - - - - - A macro installed with the FreeCAD Addon Manager - Makro nainstalované ve správci doplňků FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Spustit - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Nelze číst data z GitHubu: zkontrolujte připojení k Internetu a nastavení proxy a zkuste to znovu. - - - - XML failure while reading metadata from file {} - XML selhal při čtení metadat ze souboru {} - - - - Invalid metadata in file {} - Neplatná metadata v souboru {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - VAROVÁNÍ: Cesta zadaná v souboru package.xml metadata neodpovídají aktuálně kontrolované větvi. - - - - Name - Název - - - - Class - Třída - - - - Description - Popis - - - - Subdirectory - Podadresář - - - - Files - Soubory - - - - Select the folder containing your Addon - Vyberte složku obsahující doplněk - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Žádné Vermin, zrušení operace. - - - - Scanning Addon for Python version compatibility - Skenování doplňku pro kompatibilitu verze Pythonu - - - - Minimum Python Version Detected - Zjištěna minimální verze Pythonu - - - - Vermin auto-detected a required version of Python 3.{} - Vermin automaticky detekoval požadovanou verzi Pythonu 3.{} - - - - Install Vermin? - Instalovat Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Automatická detekce požadované verze Pythonu pro tento doplněk vyžaduje Vermin (https://pypi.org/project/vermin/). Je instalace v pořádku? - - - - Attempting to install Vermin from PyPi - Pokus o instalaci Vermin z PyPi - - - - - Installation failed - Instalace se nezdařila - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Nepodařilo se nainstalovat Vermin -- Zkontrolujte Report View pro podrobnosti. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Nepodařilo se importovat vermin po instalaci -- Nelze skenovat Addon. - - - - Select an icon file for this package - Vyberte soubor ikony pro tento balíček - - - - Filter is valid - Filtr je platný - - - - Filter regular expression is invalid - Regulární výraz filtru je neplatný - - - - Search... - Hledat... - - - - Click for details about package {} - Klikněte pro podrobnosti o balíčku {} - - - - Click for details about workbench {} - Klikněte pro podrobnosti o pracovním prostředí {} - - - - Click for details about macro {} - Klikněte pro podrobnosti o makro {} - - - - Maintainers: - Správci: - - - - Tags - Štítky - - - - {} ★ on GitHub - {} ★ na GitHubu - - - - No ★, or not on GitHub - Ne ★, nebo není na GitHubu - - - - Created - Vytvořeno - - - - Updated - Aktualizováno - - - - Score: - Skóre: - - - - - Up-to-date - Aktualizováno - - - - - - - - Update available - K dispozici je aktualizace - - - - - Pending restart - Čekající restart - - - - - DISABLED - VYPNOUT - - - - Installed version - Nainstalovaná verze - - - - Unknown version - Neznámá verze - - - - Installed on - Nainstalováno - - - - Available version - Dostupná verze - - - - Filter by... - Filtrovat dle... - - - - Addon Type - Typ doplňku - - - - - Any - Jakýkoli - - - - Macro - Makro - - - - Preference Pack - Předvolby balíčku - - - - Installation Status - Stav instalace - - - - Not installed - Není nainstalováno - - - - Filter - Filtr - - - - DANGER: Developer feature - DANGER: Funkce vývojáře - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Přepínací větve jsou určeny pro vývojáře a beta testery a mohou mít za následek rozbití, dokumenty, které nejsou zpětně slučitelné, nestabilita, havárie a/nebo předčasná tepelná smrt vesmíru. Jste si jisti, že chcete pokračovat? - - - - There are local changes - Existují lokální změny - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - VAROVÁNÍ: Tento repozitář má neprovedené místní změny. Jste si jisti, že chcete změnit větve (přináší změny s vámi)? - - - - Local - Table header for local git ref name - Místní - - - - Remote tracking - Table header for git remote tracking branch name - Vzdálené sledování - - - - Last Updated - Table header for git update date - Poslední aktualizace - - - - Installation of Python package {} failed - Instalace Pythonu {} selhala - - - - Installation of optional package failed - Instalace volitelného balíčku selhala - - - - Installing required dependency {} - Instalace požadované závislosti {} - - - - Installation of Addon {} failed - Instalace doplňku {} selhala - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Nepodařilo se dekódovat {} soubor pro Addon '{}' - - - - Any dependency information in this file will be ignored - Informace o závislosti v tomto souboru budou ignorovány - - - - Unable to open macro wiki page at {} - Nelze otevřít makro wiki stránku na {} - - - - Unable to fetch the code of this macro. - Nelze načíst kód tohoto makra. - - - - Unable to retrieve a description from the wiki for macro {} - Nelze načíst popis z wiki pro makro {} - - - - Unable to open macro code URL {} - Nelze otevřít makro kód URL {} - - - - Unable to fetch macro-specified file {} from {} - Nelze načíst makrostanovený soubor {} od {} - - - - Could not locate macro-specified file {} (expected at {}) - Nelze najít makrospecifikovaný soubor {} (očekáváno v {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Nerozpoznaný interní pracovní stůl '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Varování pro vývojáře doplňku: URL adresa repozitáře nastavená v souboru addon {} ({}) neodpovídá URL adrese, ze které byla načtena ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Varování pro vývojáře doplňku: větev repozitáře nastavená v souboru package.xml pro addon {} ({}) neodpovídá větvi, ze které byla načtena ({}) - - - - - Got an error when trying to import {} - Došlo k chybě při pokusu o import {} - - - - An unknown error occurred - Došlo k neznámé chybě - - - - Could not find addon {} to remove it. - Doplněk {} nelze najít. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Provedení uninstall.py skriptu addon's selhalo. Pokračujte s odinstalování... - - - - Removed extra installed file {} - Odstraněný extra nainstalovaný soubor {} - - - - Error while trying to remove extra installed file {} - Chyba při pokusu o odstranění extra nainstalovaného souboru {} - - - - Error while trying to remove macro file {}: - Chyba při pokusu o odstranění makrosouboru {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Nepodařilo se připojit k GitHubu. Zkontrolujte nastavení připojení a proxy serveru. - - - - WARNING: Duplicate addon {} ignored - VAROVÁNÍ: Duplikovat doplněk {} ignorován - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Došlo k chybě při aktualizaci maker z GitHubu, pokusu o vyčištění pokladny... - - - - Attempting to do a clean checkout... - Pokus o vyčištění pokladny... - - - - Clean checkout succeeded - Vymazání platby bylo úspěšné - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Aktualizace maker z GitHubu se nezdařila – zkuste vymazat mezipaměť Správce doplňků. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Chyba při připojování k Wiki, FreeCAD momentálně nemůže načíst Wiki makro seznam - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Nepodařilo se přečíst metadata z {name} - - - - Failed to fetch code for macro '{name}' - Nepodařilo se načíst kód pro makro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Správce doplňků: při načítání {name} se nepodařilo dokončit proces pracovníka - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Z {num_macros} maker vypršel časový limit {num_failed} při zpracování - - - - Addon Manager: a worker process failed to halt ({name}) - Správce doplňků: proces pracovníka se nepodařilo zastavit ({name}) - - - - Timeout while fetching metadata for macro {} - Časový limit při načítání metadat pro makro {} - - - - Failed to kill process for macro {}! - - Nepodařilo se ukončit proces pro makro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Nepodařilo se získat statistiky doplňků z {} -- přesné bude pouze abecední řazení - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Nepodařilo se získat hodnocení doplňku z '{}' -- řazení podle skóre selže - - - - Repository URL - Preferences header for custom repositories - URL adresa repozitáře - - - - Branch name - Preferences header for custom repositories - Název pobočky - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Zálohování původního adresáře a opětovné klonování - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Přejmenování větve systému Git selhalo s následující zprávou: - - - - Installing - Instalace - - - - Succeeded - Úspěšně - - - - Failed - Selhalo - - - - Update was cancelled - Aktualizace byla zrušena - - - - some addons may have been updated - některé doplňky mohly být aktualizovány - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Načítání informací pro {} z wiki FreeCAD Macro Recipes... - - - - Loading page for {} from {}... - Načítání stránky pro {} z {}... - - - - Failed to download data from {} -- received response code {}. - Nepodařilo se stáhnout data z {} -- obdržel kód odpovědi {}. - - - - Composite view - Složené zobrazení - - - - Expanded view - Rozšířené zobrazení - - - - Compact view - Kompaktní zobrazení - - - - Alphabetical - Sort order - Abecední řazení - - - - Last Updated - Sort order - Poslední aktualizace - - - - Date Created - Sort order - Datum vytvoření - - - - GitHub Stars - Sort order - Příspěvky GitHub - - - - Score - Sort order - Výsledky - - - - Std_AddonMgr - - - &Addon manager - &Správce doplňků - - - - Manage external workbenches, macros, and preference packs - Správa externích pracovních prostředí, maker a balíčků preferencí - - - - AddonInstaller - - - Finished removing {} - Dokončeno odstranění {} - - - - Failed to remove some files - Nepodařilo se odstranit některé soubory - - - - Addons installer - - - Finished updating the following addons - Aktualizace následujících doplňků dokončena - - - - Workbench - - - Auto-Created Macro Toolbar - Automaticky vytvořený panel nástrojů makra - - - - QObject - - - Addon Manager - Správce rozšíření - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_da.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_da.qm deleted file mode 100644 index 9686119424..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_da.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_da.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_da.ts deleted file mode 100644 index 13cced8e0f..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_da.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Tilpasset repo - - - - Repository URL - Repo-URL - - - - Branch - Gren - - - - CompactView - - - - Icon - Ikon - - - - - <b>Package Name</b> - <b>Pakkenavn</b> - - - - - Version - Version - - - - - Description - Beskrivelse - - - - Update Available - Opdatering tilgængelig - - - - UpdateAvailable - Opdatering tilgængelig - - - - DependencyDialog - - - Dependencies - Afhængigheder - - - - Dependency type - Afhængighedstype - - - - Name - Navn - - - - Optional? - Valgfri? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Løs afhængigheder - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Denne Tilføjelse har flg. krævede og valgfrie afhængigheder. Disse skal installeres, før denne Tilføjelse kan bruges. - -Skal Tilføjelseshåndtering installere dem automatisk? Vælg "Ignorér" for at installere Tilføjelse uden at installere afhængighederne. - - - - FreeCAD Addons - FreeCAD-tilføjelser - - - - Required Python modules - Obligatoriske Python-moduler - - - - Optional Python modules - Valgfrie Python-moduler - - - - DeveloperModeDialog - - - Addon Developer Tools - Tilføjelsesudviklerværktøjer - - - - Path to Addon - Sti til Tilføjelse - - - - - Browse... - Gennemse... - - - - Metadata - Metadata - - - - Primary branch - Primære gren - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Forklaring af, hvad denne Tilføjelse leverer. Vil fremgå under Tilføjelseshåndtering. Det er ikke nødvendigt at angive, at dette er en FreeCAD-tilføjelse. - - - - Description - Beskrivelse - - - - Discussion URL - Debat-URL - - - - Icon - Ikon - - - - Bugtracker URL - Bugtracker-URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) eller CalVer (2022.08.30) stilarter understøttes - - - - Set to today (CalVer style) - Sæt til i dag (CalVer-stil) - - - - - - - (Optional) - (Valgfri) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Vist på Tilføjelseshåndtering-listen over Tilføjelser. Bør ikke omfatte ordet "FreeCAD", og skal være et gyldigt mappenavn på alle understøttende operativsystemer. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Da dette vises i FreeCAD i Addon Manager, er det er ikke nødvendigt at bruge plads på info såsom "Dette er en FreeCAD Addon." – blot info, hvad den gør. - - - - Repository URL - Repo-URL - - - - Website URL - Websteds-URL - - - - Documentation URL - Dokumentation-URL - - - - Addon Name - Tilføjelsesnavn - - - - Version - Version - - - - (Recommended) - (Anbefalet) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Valgfri, kun version 3.x understøttes) - - - - Detect... - Detektér... - - - - Addon Contents - Tilføjelsesindhold - - - - Dialog - - - Addon Manager - Tilføjelseshåndtering - - - - Edit Tags - Redigér tag - - - - Comma-separated list of tags describing this item: - Kommasepareret liste over tags, som beskriver dette element: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - TIP: Fælles-tags omfatter "Assembly", "FEM", "Mesh", "NURBS" mv. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Continue - - - - Cancel - Annuller - - - - EditDependencyDialog - - - Edit Dependency - Redigér Afhængighed - - - - Dependency Type - Afhængighedstype - - - - Dependency - Afhængighed - - - - Package name, if "Other..." - Pakkenavn, hvis "Andet..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - BEMÆRK: Hvis "Andet..." er valgt, er pakken ikke i ALLOWED_PYTHON_PAKNINGER.txt-filen og installeres ikke automatisk af Tilføjelseshåndtering. Indsend en PR på <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> for at anmode om tilføjelse af en pakke. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Er denne en valgfri afhængighed, vil Tilføjelseshåndtering tilbyde at installere den (når muligt), men vil ikke blokere installationen, hvis brugeren vælger ikke at – eller ikke kan – installere pakken. - - - - Optional - Valgfri - - - - ExpandedView - - - - Icon - Ikon - - - - - <h1>Package Name</h1> - <h1>Pakkenavn</h1> - - - - - Version - Version - - - - - (tags) - (tags) - - - - - Description - Beskrivelse - - - - - Maintainer - Vedligeholder - - - - Update Available - Opdatering tilgængelig - - - - labelSort - etiketsortering - - - - UpdateAvailable - Opdatering tilgængelig - - - - Form - - - Licenses - Licenser - - - - License - Licens - - - - License file - Licensfil - - - - People - Personer - - - - Kind - Art - - - - Name - Navn - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Avanceret versionsassociering - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Kommende versioner af FreeCAD Tilføjelseshåndtering vil understøtte, at udviklere indstiller en bestemt gren eller tag til brug med en bestemt version af FreeCAD (f. eks. sætte et bestemt tag som den sidste Tilføjelsesversion understøttet af v0.19 mv.) - - - - FreeCAD Version - FreeCAD-version - - - - Best-available branch, tag, or commit - Best-tilgængelig gren, tag eller commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Understøttede FreeCAD-versioner - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD-version understøttet - - - - - Optional - Valgfri - - - - Maximum FreeCAD Version Supported - Minimum FreeCAD-version understøttet - - - - Advanced version mapping... - Avanceret versionsassociering... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Tilføjelseshåndteringsindstillinger - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Er denne mulighed markeret, kontrolleres -installerede tilføjelser for opdateringer ifm. start af Tilføjelseshåndtering - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Download Makro-metadata (ca. 10MB) - - - - Cache update frequency - Cacheopdateringsfrekvens - - - - Manual (no automatic updates) - Manuelt (ingen automatiske opdateringer) - - - - Daily - Dagligt - - - - Weekly - Ugentligt - - - - Hide Addons without a license - Skjul tilføjelser uden en licens - - - - Hide Addons with non-FSF Free/Libre license - Skjul tilføjelser med ikke-FSF Free/Libre licens - - - - Hide Addons with non-OSI-approved license - Skjul tilføjelser med ikke-OSI godkendt licens - - - - Hide Addons marked Python 2 Only - Skjul kun tilføjelser markeret med Python 2 - - - - Hide Addons marked Obsolete - Skjul tilføjelser markeret Forældet - - - - Hide Addons that require a newer version of FreeCAD - Skjul tilføjelser, som kræver en nyere version af FreeCAD - - - - Custom repositories - Tilpasset repos - - - - Proxy - Proxy - - - - No proxy - Ingen proxy - - - - User system proxy - Benyt systemproxy - - - - User-defined proxy: - Brugerdefineret proxy: - - - - Score source URL - Scorekilde-URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - URL til Tilføjelsesscoredata (se Tilføjelseshåndterings wiki-side for formatering og hosting-detaljer). - - - - Path to Git executable (optional): - Sti til Git eksekverbar (valgfri): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Avancerede indstillinger - - - - Activate Addon Manager options intended for developers of new Addons. - Aktivér Tilføjelseshåndteringsvalgmuligheder beregnet til udviklere af nye Tilføjelser. - - - - Addon developer mode - Tilføjelsesudviklertilstand - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Afinstallerer en valgt makro eller arbejdsbord - - - - Install - Installation - - - - Uninstall - Afinstallation - - - - Update - Opdatering - - - - Run Macro - Kør makro - - - - Change branch - Skift gren - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Håndtér Python-afhængigheder - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Flg. Python-pakker er blevet installeret lokalt af Tilføjelseshåndtering for at tilfredsstille Tilføjelsesafhængigheder. Installationsplacering: - - - - Package name - Pakkenavn - - - - Installed version - Installeret version - - - - Available version - Tilgængelig version - - - - Used by - Brugt af - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - En stjerne (*) i "Bruges af"-kolonnen angiver en valgfri afhængighed. Bemærk, at Bruges af kun registrerer direkte import i tilføjelsen. Andre Python-pakker, som disse pakker afhænger af, kan også være blevet installeret. - - - - Update all available - Opdatering alle tilgængelige - - - - SelectFromList - - - Dialog - Dialog - - - - TextLabel - Tekstlabel - - - - UpdateAllDialog - - - Updating Addons - Opdaterer Tilføjelser - - - - Updating out-of-date addons... - Opdaterer forældede tilføjelser... - - - - addContentDialog - - - Content Item - Indholdselement - - - - Content type: - Indholdstype: - - - - Macro - Makro - - - - Preference Pack - Præferencepakke - - - - Workbench - Arbejdsbord - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Er dette det eneste i tilføjelsen, kan alle andre metadata arves fra det øverste niveau og behøves ikke specificeres her. - - - - This is the only item in the Addon - Dette er det eneste element i tilføjelsen - - - - Main macro file - Hovedmakrofil - - - - The file with the macro's metadata in it - Filen indeholdende makrometadataene - - - - - - Browse... - Gennemse... - - - - Preference Pack Name - Navn på præference pakke - - - - Workbench class name - Arbejdsbordklassenavn - - - - Class that defines "Icon" data member - Klasse, der definerer "Ikon"-datamedlem - - - - Subdirectory - Undermappe - - - - Optional, defaults to name of content item - Valgfri, standard er navnet på indholdselement - - - - Icon - Ikon - - - - Optional, defaults to inheriting from top-level Addon - Valgfri, standard er arvning fra topniveautilføjelse - - - - Tags... - Tags... - - - - Dependencies... - Afhængigheder... - - - - FreeCAD Versions... - FreeCAD-versioner... - - - - Other Metadata - Andre metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Vist i Tilføjelseshåndtering-listen over Addons. Bør ikke omfatte ordet "FreeCAD". - - - - Version - Version - - - - Description - Beskrivelse - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) eller CalVer (2022.08.30) stilarter understøttes - - - - Set to today (CalVer style) - Sæt til i dag (CalVer-stil) - - - - Display Name - Visningsnavn - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Evt. felter efterladt blanke arves fra de øverste niveau Tilføjelse-metadata, så teknisk set er de alle valgfrie. For tilføjelser med flere indholdselementer skal hvert element vise et unikt visningsnavn og -beskrivelse. - - - - add_toolbar_button_dialog - - - Add button? - Tilføj knap? - - - - Add a toolbar button for this macro? - Tilføj en værktøjsbjælkeknap for denne makro? - - - - Yes - Ja - - - - No - Nej - - - - Never - Aldrig - - - - change_branch - - - Change Branch - Skift gren - - - - Change to branch: - Skift til gren: - - - - copyrightInformationDialog - - - Copyright Information - Ophavsretsoplysninger - - - - Copyright holder: - Ophavsrettighedsindehaver: - - - - Copyright year: - Ophavsrettighedsår: - - - - personDialog - - - Add Person - Tilføj person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - En vedligeholder er en person med aktuel commit-rettighed til dette projekt. En forfatter er enhver anden, man gerne vil tildele rettighed. - - - - Name: - Navn: - - - - Email: - E-mail: - - - - Email is required for maintainers, and optional for authors. - E-mail er obligatorisk for vedligeholdere og valgfri for forfattere. - - - - proxy_authentication - - - Proxy login required - Proxylogin er obligatorisk - - - - Proxy requires authentication - Proxy kræver godkendelse - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Variabel til proxyadresse - - - - Realm: - Område: - - - - Placeholder for proxy realm - Variabel til proxyområde - - - - Username - Brugernavn - - - - Password - Adgangskode - - - - selectLicenseDialog - - - Select a license - Vælg en licens - - - - About... - Om... - - - - License name: - Licensnavn: - - - - Path to license file: - Sti til licensfil: - - - - (if required by license) - (såfremt krævet af licens) - - - - Browse... - Gennemse... - - - - Create... - Opret... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Vælg Værktøjsbjælke - - - - Select a toolbar to add this macro to: - Vælg en værktøjsbjælke at føje denne makro til: - - - - Ask every time - Spørg hver gang - - - - toolbar_button - - - - Add button? - Tilføj knap? - - - - Add a toolbar button for this macro? - Tilføj en værktøjsbjælkeknap for denne makro? - - - - Yes - Ja - - - - No - Nej - - - - Never - Aldrig - - - - AddonsInstaller - - - Starting up... - Starter op... - - - - Worker process {} is taking a long time to stop... - Worker-proces {} tager lang tid at stoppe... - - - - Previous cache process was interrupted, restarting... - - Tidligere cacheproces blev afbrudt, genstarter... - - - - - Custom repo list changed, forcing recache... - - Tilpasset repo-liste ændret, gennemtvinger cacheopfriskning... - - - - - Addon manager - Tilføjelseshåndtering - - - - You must restart FreeCAD for changes to take effect. - FreeCAD skal genstartes for at effektuere ændringerne. - - - - Restart now - Genstart nu - - - - Restart later - Genstart senere - - - - - Refresh local cache - Opfrisk lokal cache - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Updaterer cache… - - - - - Checking for updates... - Søger efter opdateringer... - - - - Temporary installation of macro failed. - Midlertidig installation af makro mislykkedes. - - - - - Close - Luk - - - - Update all addons - Opdatér alle tilføjelser - - - - Check for updates - Søg efter opdateringer - - - - Python dependencies... - Python-afhængigheder... - - - - Developer tools... - Udviklingsværktøjer... - - - - Apply %n available update(s) - Anvend %n tilgængelig(e) opdatering(er) - - - - No updates available - Ingen opdateringer tilgængelige - - - - - - Cannot launch a new installer until the previous one has finished. - Kan ikke starte en ny installer, før den foregående er færdig. - - - - - - - Maintainer - Vedligeholder - - - - - - - Author - Forfatter - - - - New Python Version Detected - Ny Python-version detekteret - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Det lader til at være første gang denne version af Python er blevet brugt sammen med Tilføjelseshåndtering. Installér de samme autoinstallerede afhængigheder til den? - - - - Processing, please wait... - Behandler, vent venligst... - - - - - Update - Opdatering - - - - Updating... - Opdaterer... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Kunne ikke importere QtNetwork – det synes ikke at være installeret på systemet. Udbyderen kan have en pakke til denne afhængighed (ofte kaldet "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Kunne ikke konvertere den angivne proxyport '{}' til et portnummer - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameterfejl: Gensidig eksklusiv proxyindstillingssæt. Nulstiller til standard. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameterfejl: Brugerproxy indikeret, men ingen proxy angivet. Nulstiller til standard. - - - - Addon Manager: Unexpected {} response from server - Tilføjelseshåndtering: Uventet {}-svar fra server - - - - Error with encrypted connection - Fejl på krypteret forbindelse - - - - - - Confirm remove - Bekræft fjernelse - - - - Are you sure you want to uninstall {}? - Sikker på, at {} skal afinstalleres? - - - - - - Removing Addon - Fjerner tilføjelse - - - - Removing {} - Fjerner {} - - - - - Uninstall complete - Afinstallation er færdig - - - - - Uninstall failed - Afinstallation mislykkedes - - - - Version {version} installed on {date} - Version {version} installeret pr. {date} - - - - Version {version} installed - Version {version} installeret - - - - Installed on {date} - Installeret pr. {date} - - - - - - - Installed - Installeret - - - - Currently on branch {}, name changed to {} - Aktuelt på gren {}, navn ændret til {} - - - - Git tag '{}' checked out, no updates possible - Git-tag '{}' tjekket ud, ingen opdateringer er mulige - - - - Update check in progress - Opdateringstjek i gang - - - - Installation location - Installationsplacering - - - - Repository URL - Repo-URL - - - - Changed to branch '{}' -- please restart to use Addon. - Ændret til gren '{}' – genstart for at anvende tilføjelsen. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Denne tilføjelse er blevet opdateret. Genstart FreeCAD for at se ændringer. - - - - Disabled - Deaktiveret - - - - Currently on branch {}, update available to version {} - Pt. på gren {}, opdatering tilgængelig til version {} - - - - Update available to version {} - Opdatering tilgængelig til version {} - - - - This is the latest version available - Dette er seneste tilgængelige version - - - - WARNING: This addon is obsolete - ADVARSEL: Denne tilføjelse er forældet - - - - WARNING: This addon is Python 2 only - ADVARSEL: Dette er en ren Python 2-tilføjelse - - - - WARNING: This addon requires FreeCAD {} - ADVARSEL: Denne tilføjelse kræver FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ADVARSEL: Denne tilføjelse er p.t. installeret, men deaktiveret. Brug knappen 'Aktivér' for at genaktivere. - - - - This Addon will be enabled next time you restart FreeCAD. - Denne Addon aktiveres ved næste FreeCAD-genstart. - - - - This Addon will be disabled next time you restart FreeCAD. - Denne Addon deaktiveres ved næste FreeCAD-genstart. - - - - - - Success - Succes - - - - Install - Installation - - - - Uninstall - Afinstallation - - - - Enable - Aktivér - - - - Disable - Deaktivér - - - - - Check for update - Tjek for opdateringer - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Kør - - - - Change branch... - Skift gren... - - - - Return to package list - Retur til pakkeliste - - - - Checking connection - Tjekker forbindelse - - - - Checking for connection to GitHub... - Tjekker forbindelse til GitHub... - - - - Connection failed - Forbindelse fejlede - - - - Missing dependency - Manglende afhængighed - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Kunne ikke importere QtNetwork – se Rapportvisning for detaljer. Tilføjelseshåndtering er utilgængelig. - - - - Other... - For providing a license other than one listed - Andet... - - - - Select the corresponding license file in your Addon - Vælg den modsvarende licensfil i tilføjelsen - - - - Location for new license file - Placering på ny licensfil - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Mislykkedes at installere makroen {} - - - - Failed to create installation manifest file: - - Mislykkedes at oprette installationsmanifestfil: - - - - - Unrecognized content kind '{}' - Ukendt indholdsart '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Vælg en ikonfil til dette indholdsemne - - - - - - {} is not a subdirectory of {} - {} er ikke en undermappe til {} - - - - Select the subdirectory for this content item - Vælg undermappen til dette indholdsemne - - - - Automatic - Automatisk - - - - - Workbench - Arbejdsbord - - - - Addon - Tilføjelse - - - - Python - Python - - - - Yes - Ja - - - - Internal Workbench - Internt Arbejdsbord - - - - External Addon - Ekstern Tilføjelse - - - - Python Package - Python-pakke - - - - - Other... - Andet... - - - - Too many to list - For mange at opliste - - - - - - - - - Missing Requirement - Manglende betingelse - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Tilføjelsen '{}' kræver '{}', der er utilgængelig i denne FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Tilføjelsen '{}' kræver flg. arbejdsborde, som er utilgængelige i denne FreeCAD: - - - - Press OK to install anyway. - Tryk OK for at installere alligevel. - - - - - Incompatible Python version - Inkompatibel Python-version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Denne tilføjelse kræver Python-pakker, som ikke er installeret, og som kan ikke installeres automatisk. For at bruge denne tilføjelse skal du installere følgende Python-pakker manuelt: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installation af afhængigheder - - - - - Cannot execute Python - Kan ikke eksekvere Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Automatisk lokalisering af Python-eksekverbare mislykkedes, eller forkert angivet sti. Tjek Tilføjelseshåndtering-præferenceindstillingen for stien til Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Afhængigheder kunne ikke installeres. Fortsæt installation af {} alligevel? - - - - - Cannot execute pip - Kan ikke eksekvere pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Mislykkedes at eksekvere pip, der måske mangler i Python-installationen. Tjek, at systemet har pip installeret og forsøg igen. Den fejlede kommando var: - - - - - Continue with installation of {} anyway? - Fortsæt med installation af {} alligevel? - - - - - Package installation failed - Pakkeinstallation mislykkedes - - - - See Report View for detailed failure log. - Se Rapportvisning for detaljeret fejllog. - - - - Installing Addon - Installerer Tilføjelse - - - - Installing FreeCAD Addon '{}' - Installerer FreeCAD-tilføjeelse '{}' - - - - Cancelling - Afbryder - - - - Cancelling installation of '{}' - Afbryder installationen af '{}' - - - - {} was installed successfully - {} er hermed installeret - - - - - Installation Failed - Installation mislykkedes - - - - Failed to install {} - Mislykkedes at installere {} - - - - - Create new toolbar - Opret ny værktøjsbjælke - - - - - A macro installed with the FreeCAD Addon Manager - En makro installeret med FreeCAD Tilføjelseshåndtering - - - - - Run - Indicates a macro that can be 'run' - Kør - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Kan ikke læse data fra GitHub: Tjek internetforbindelsen og proxyindstillingerne, og forsøg igen. - - - - XML failure while reading metadata from file {} - XML-fejl under metadatalæsning fra filen {} - - - - Invalid metadata in file {} - Ugyldig metadata i filen {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ADVARSEL: Sti angivet i package.xml-metadata matcher ikke p.t. udtjekkede gren. - - - - Name - Navn - - - - Class - Klasse - - - - Description - Beskrivelse - - - - Subdirectory - Undermappe - - - - Files - Filer - - - - Select the folder containing your Addon - Vælg mappen indeholdende tilføjelsen - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Ingen Vermin, afbryder handling. - - - - Scanning Addon for Python version compatibility - Skanner tilføjelse for Python-versionskompatibilitet - - - - Minimum Python Version Detected - Minimum Python-version detekteret - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detekterede en krævet version af Python 3.{} - - - - Install Vermin? - Installér Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detektering af den krævede Python-version til denne tilføjelse kræver Vermin (https://pypi.org/project/vermin/). OK at installere? - - - - Attempting to install Vermin from PyPi - Forsøger at installere Vermin fra PyPi - - - - - Installation failed - Installation mislykkedes - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Mislykkedes at installere Vermin – tjek Rapportvisning for detaljer. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Kunne ikke importere vermin efter installation – kan ikke skanne tilføjelse. - - - - Select an icon file for this package - Vælg en ikonfil til denne pakke - - - - Filter is valid - Filter er gyldigt - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Søg... - - - - Click for details about package {} - Klik for detaljer om pakken {} - - - - Click for details about workbench {} - Klik for detaljer om arbejdsbordet {} - - - - Click for details about macro {} - Klik for detaljer om makroen {} - - - - Maintainers: - Vedligeholdere: - - - - Tags - Tags - - - - {} ★ on GitHub - {} ★ på GitHub - - - - No ★, or not on GitHub - Ingen ★, eller ikke på GitHub - - - - Created - Oprettet - - - - Updated - Opdateret - - - - Score: - Score: - - - - - Up-to-date - Opdateret - - - - - - - - Update available - Opdatering tilgængelig - - - - - Pending restart - Afventer genstart - - - - - DISABLED - DEAKTIVERET - - - - Installed version - Installeret version - - - - Unknown version - Ukendt version - - - - Installed on - Installeret pr. - - - - Available version - Tilgængelig version - - - - Filter by... - Filtrér efter... - - - - Addon Type - Tilføjelsestype - - - - - Any - Enhver - - - - Macro - Makro - - - - Preference Pack - Præferencepakke - - - - Installation Status - Installationsstatus - - - - Not installed - Ikke installeret - - - - Filter - Filter - - - - DANGER: Developer feature - FARE: Udviklerfunktion - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - FARE: Skift af grene er beregnet til udviklere og betatestere, og det kan resultere i ødelagte, ikke-bagudkompatible dokumenter, ustabilitet, nedbrud og/eller for tidlig varmedød for universet. Fortsæt alligevel? - - - - There are local changes - Der er lokale ændringer - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ADVARSEL: Dette repo har ikke-committede lokale ændringer. Sikker på, at der skal skiftes grene (medbringende ændringerne)? - - - - Local - Table header for local git ref name - Lokal - - - - Remote tracking - Table header for git remote tracking branch name - Fjernsporing - - - - Last Updated - Table header for git update date - Senest opdateret - - - - Installation of Python package {} failed - Installation af Python-pakken {} mislykkedes - - - - Installation of optional package failed - Installation af den valgfrie pakke {} mislykkedes - - - - Installing required dependency {} - Installerer krævet afhængighed {} - - - - Installation of Addon {} failed - Installation af tilføjelsen {} mislykkedes - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Mislykkedes at afkode {}-filen til tilføjelsen '{}' - - - - Any dependency information in this file will be ignored - Enhver afhængighedsinformation i denne fil ignoreres - - - - Unable to open macro wiki page at {} - Kan ikke åbne makro wiki-siden på {} - - - - Unable to fetch the code of this macro. - Kan ikke hente denne makros kode. - - - - Unable to retrieve a description from the wiki for macro {} - Kan ikke hente en beskrivelse fra wiki'en til makroen {} - - - - Unable to open macro code URL {} - Kan ikke åbne makrokode-URL'en {} - - - - Unable to fetch macro-specified file {} from {} - Kan ikke hente makrospecificeret fil {} fra {} - - - - Could not locate macro-specified file {} (expected at {}) - Kunne ikke finde makrospecificeret fil {} (forventet på {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Ukendt internt arbejdsbord '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Tiløjelsesudvikleradvarsel: Repo-URL angivet i package.xml fil til tilføjelsen {} ({}) matcher ikke URL'en, den blev hentet fra ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Tiløjelsesudvikleradvarsel: Repo-grenen angivet i package.xml fil til tilføjelsen {} ({}) matcher ikke grenen, den blev hentet fra ({}) - - - - - Got an error when trying to import {} - Fik en fejl under forsøget på at importere {} - - - - An unknown error occurred - En ukendt fejl opstod - - - - Could not find addon {} to remove it. - Kunne ikke finde tilføjelsen {} for at fjerne den. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Eksekvering af tilføjelsens uninstall.py-script mislykkedes. Fortsætter afinstallationen... - - - - Removed extra installed file {} - Fjernede ekstra installeret fil {} - - - - Error while trying to remove extra installed file {} - Fejl under forsøget på at fjerne ekstra installeret fil {} - - - - Error while trying to remove macro file {}: - Fejl under forsøget på at fjerne makrofilen {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Kunne ikke oprette forbindelse til GitHub. Tjek forbindelsen og proxyindstillingerne. - - - - WARNING: Duplicate addon {} ignored - ADVARSEL: Dublettilføjelsen {} ignoreret - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - En fejl opstod under opdatering af makroer fra GitHub, forsøger ren tjekud... - - - - Attempting to do a clean checkout... - Forsøger at foretage en ren tjekud... - - - - Clean checkout succeeded - Ren tjekud lykkedes - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Mislykkedes at opdatere makroer fra GitHub – prøv at rydde Tilføjelseshåndtering-cachen. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Fejl ved tilslutning til Wiki. FreeCAD kan ikke p.t. hente Wiki-makrolisten - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Kunne ikke læse metadata fra {name} - - - - Failed to fetch code for macro '{name}' - Kunne ikke hente kode til makroen '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Tilføjelseshåndtering: En worker-proces kunne ikke færdiggøres under hentningen af {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Ud af {num_macros} makroer, fik {num_failed} timeout under behandling - - - - Addon Manager: a worker process failed to halt ({name}) - Tilføjelseshåndtering: En worker-proces kunne ikke standse ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout under hentning af metadata til makroen {} - - - - Failed to kill process for macro {}! - - Mislykkedes at standse processen for makroen {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Kunne ikke hente tilføjelsesstatistik fra {} – kun alfabetisk sortering vil være præcis - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Kunne ikke få tilføjelsesscore fra '{}' – sortering efter score vil mislykkes - - - - - Repository URL - Preferences header for custom repositories - Repo-URL - - - - Branch name - Preferences header for custom repositories - Grennavn - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Sikkerhedskopiering af den oprindelige mappe og genkloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Grenomdøbning mislykkedes med flg. meddelelse: - - - - Installing - Installerer - - - - Succeeded - Gennemført - - - - Failed - Mislykket - - - - Update was cancelled - Opdatering blev afbrudt - - - - some addons may have been updated - nogle tilføjelser kan være blevet opdateret - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Indlæser info for {} fra FreeCAD Makroopskrifter wiki... - - - - Loading page for {} from {}... - Indlæser side til {} fra {}... - - - - Failed to download data from {} -- received response code {}. - Mislykkedes at downloade data fra {} – modtaget svarkode {}. - - - - Composite view - Sammensat visning - - - - Expanded view - Udvidet visning - - - - Compact view - Kompakt visning - - - - Alphabetical - Sort order - Alfabetisk - - - - Last Updated - Sort order - Senest opdateret - - - - Date Created - Sort order - Oprettelsesdato - - - - GitHub Stars - Sort order - GitHub-stjerner - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - Tilføjelseshåndtering (&A) - - - - Manage external workbenches, macros, and preference packs - Håbdtér eksterne arbejdsborde, makroer og præferencepakker - - - - AddonInstaller - - - Finished removing {} - Fjernelse af {} udført - - - - Failed to remove some files - Kunne ikke fjerne visse filer - - - - Addons installer - - - Finished updating the following addons - Opdatering af flg. tilføjelser udført - - - - Workbench - - - Auto-Created Macro Toolbar - Autooprettet Makroværktøjsbjælke - - - - QObject - - - Addon Manager - Tilføjelseshåndtering - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_de.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_de.qm deleted file mode 100644 index a3ff0fcb82..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_de.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_de.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_de.ts deleted file mode 100644 index 92ab4f6864..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_de.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Eigenes Projektarchiv - - - - Repository URL - URL des Projektarchivs - - - - Branch - Zweig - - - - CompactView - - - - Icon - Symbol - - - - - <b>Package Name</b> - <b>Paketname</b> - - - - - Version - Version - - - - - Description - Beschreibung - - - - Update Available - Aktualisierung verfügbar - - - - UpdateAvailable - Aktualisierung verfügbar - - - - DependencyDialog - - - Dependencies - Abhängigkeiten - - - - Dependency type - Abhängigkeitstyp - - - - Name - Name - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Abhängigkeiten auflösen - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Diese Erweiterung hat die folgenden erforderlichen bzw. optionalen Abhängigkeiten. Sie müssen installiert werden, bevor dieses Addon verwendet werden kann. - -Soll der Addon-Manager sie automatisch installieren? "Ignorieren" wählen, um die Erweiterung zu installieren, ohne die Abhängigkeiten zu installieren. - - - - FreeCAD Addons - FreeCAD-Programmerweiterungen - - - - Required Python modules - Erforderliche Python-Module - - - - Optional Python modules - Optionale Python-Module - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon-Entwicklungswerkzeuge - - - - Path to Addon - Pfad zur Erweiterung - - - - - Browse... - Durchsuchen... - - - - Metadata - Metadaten - - - - Primary branch - Primärer Zweig - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Erläuterung der Eigenschaften dieser Erweiterung. Wird in der Erweiterungsverwaltung angezeigt. Der Hinweis, dass es sich um eine FreeCAD-Erweiterung handelt, ist nicht notwendig. - - - - Description - Beschreibung - - - - Discussion URL - URL der Diskussion - - - - Icon - Symbol - - - - Bugtracker URL - URL der Fehlerverfolgung - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Die Stie Semantic (1.2.3-beta) oder CalVer (2022.08.30) werden unterstützt - - - - Set to today (CalVer style) - Auf heute setzen (CalVer-Stil) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Wird in der Liste der Addons im Addon-Manager angezeigt. Sollte das Wort "FreeCAD"nicht enthalten und muss ein gültiger Verzeichnisname auf allen unterstützten Betriebssystemen sein. - - - - README URL - LIESMICH URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIPP: Da dies in FreeCAD angezeigt wird, im Addon-Manager, ist es unnötig, Platz zu verschwenden, für Aussagen wie "Dies ist ein FreeCAD-Addon..." -- Es reicht zu sagen, was es macht. - - - - Repository URL - URL des Projektarchivs - - - - Website URL - URL der Webseite - - - - Documentation URL - URL der Dokumentation - - - - Addon Name - Addon-Name - - - - Version - Version - - - - (Recommended) - (Empfohlen) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, nur Version 3.x unterstützt) - - - - Detect... - Erkennen... - - - - Addon Contents - Addon-Inhalte - - - - Dialog - - - Addon Manager - Addon-Manager - - - - Edit Tags - Schlagwörter bearbeiten - - - - Comma-separated list of tags describing this item: - Durch Kommas getrennte Liste von Tags, die dieses Element beschreiben: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HInweis: Gängige Tags einschließlich "Assembly", "FEM", "Mesh", "NURBS" usw. - - - - Add-on Manager: Warning! - Addon-Manager: Warnung! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Der Addon-Manager ermöglicht Zugriff auf eine umfangreiche Bibliothek nützlicher FreeCAD-Erweiterungen von Drittanbietern. Es gibt aber keine Garantie für deren Sicherheit oder Funktionalität. - - - - Continue - Fortsetzen - - - - Cancel - Abbrechen - - - - EditDependencyDialog - - - Edit Dependency - Abhängigkeit bearbeiten - - - - Dependency Type - Abhängigkeitstyp - - - - Dependency - Abhängigkeit - - - - Package name, if "Other..." - Paketname, wenn "Andere..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - HINWEIS: Wenn "Andere..." ausgewählt wurde, ist das Paket nicht in der Datei ALLOWED_PYTHON_PACKAGES. txt und wird nicht automatisch vom Addon-Manager installiert. Einen PR senden an <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-Addons</a>, um das Hinzufügen eines Paketes anzufragen. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Wenn dies eine optionale Abhängigkeit ist, wird der Addon-Manager anbieten, diese (wenn möglich) zu installieren, wird aber die Installation nicht blockieren, wenn der Benutzer das Paket nicht installieren möchte oder nicht installieren kann. - - - - Optional - Optional - - - - ExpandedView - - - - Icon - Symbol - - - - - <h1>Package Name</h1> - <h1>Paketname</h1> - - - - - Version - Version - - - - - (tags) - (Tags) - - - - - Description - Beschreibung - - - - - Maintainer - Betreuer - - - - Update Available - Aktualisierung verfügbar - - - - labelSort - labelSort - - - - UpdateAvailable - Aktualisierung verfügbar - - - - Form - - - Licenses - Lizenzen - - - - License - Lizenz - - - - License file - Lizenzdatei - - - - People - Personen - - - - Kind - Typ - - - - Name - Name - - - - Email - E-Mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Erweiterte Versionszuordnung - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Kommende Versionen des FreeCAD-Addon-Managers werden Entwickler dabei unterstützen, einen bestimmten Zweig oder Tag für die Verwendung mit einer bestimmten Version von FreeCAD festzulegen (z.B. durch Setzen eines bestimmten Tags für die letzte Version des Addons, das v0.19 noch unterstützt usw.) - - - - FreeCAD Version - FreeCAD-Version - - - - Best-available branch, tag, or commit - Bester verfügbarer Branch, Tag oder Commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Unterstützte FreeCAD-Versionen - - - - Minimum FreeCAD Version Supported - Unterstützte FreeCAD-Mindestversion - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximal unterstützte FreeCAD-Version - - - - Advanced version mapping... - Erweiterte Versionszuordnung... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon-Manager-Optionen - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Wenn diese Option ausgewählt ist, werden beim Starten des Addon-Managers -installierte Addons auf verfügbare Updates überprüft - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Makro-Metadaten herunterladen (ca. 10 MB) - - - - Cache update frequency - Häufigkeit der Cache-Aktualisierung - - - - Manual (no automatic updates) - Manuell (keine automatischen Aktualisierungen) - - - - Daily - Täglich - - - - Weekly - Wöchentlich - - - - Hide Addons without a license - Addons ohne Lizenz ausblenden - - - - Hide Addons with non-FSF Free/Libre license - Addons mit Nicht-FSF-Free- oder Libre-Lizenz ausblenden - - - - Hide Addons with non-OSI-approved license - Addons mit nicht-OSI-anerkannter Lizenz ausblenden - - - - Hide Addons marked Python 2 Only - Nur für Python 2 markierte Addons ausblenden - - - - Hide Addons marked Obsolete - Veraltete Addons ausblenden - - - - Hide Addons that require a newer version of FreeCAD - Addons ausblenden, die eine neuere Version von FreeCAD voraussetzen - - - - Custom repositories - Eigene Projektarchive - - - - Proxy - Proxy - - - - No proxy - Kein Proxy - - - - User system proxy - Benutzer-System-Proxy - - - - User-defined proxy: - Benutzerdefinierter Proxy: - - - - Score source URL - Bewertung Quellen-URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Die URL für die Bewertungs-Daten von Erweiterungen (siehe Dokumentation für Formatierung und Hosting Details). - - - - Path to Git executable (optional): - Pfad zu Git (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Erweiterte Wahlmöglichkeiten - - - - Activate Addon Manager options intended for developers of new Addons. - Addon-Manager-Optionen für Entwickler neuer Addons aktivieren. - - - - Addon developer mode - Addon-Entwickler-Modus - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Deinstalliert ein ausgewähltes Makro oder einen Arbeitsbereich - - - - Install - Installieren - - - - Uninstall - Deinstallieren - - - - Update - Aktualisierung - - - - Run Macro - Makro ausführen - - - - Change branch - Zweig wechseln - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Python-Abhängigkeiten verwalten - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Die folgenden Python-Pakete wurden lokal vom Addon-Manager installiert, um Addon-Abhängigkeiten zu erfüllen. Installationsort: - - - - Package name - Paketname - - - - Installed version - Installierte Version - - - - Available version - Verfügbare Version - - - - Used by - Verwendet von - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Ein in der "Verwendet von" Spalte eingetragener Stern (*) zeigt eine optionale Abhängigkeit an. Es ist zu beachten, dass Verwendet von nur direkte Importe ins Addon aufzeichnet. Andere Python-Pakete, von denen diese Pakete abhängen, könnten ebenfalls installiert worden sein. - - - - Update all available - Alle verfügbaren aktualisieren - - - - SelectFromList - - - Dialog - Dialog - - - - TextLabel - TextLabel - - - - UpdateAllDialog - - - Updating Addons - Addons aktualisieren - - - - Updating out-of-date addons... - Veraltete Addons werden aktualisiert... - - - - addContentDialog - - - Content Item - Bestandteil - - - - Content type: - Inhaltstyp: - - - - Macro - Makro - - - - Preference Pack - Voreinstellungspaket - - - - Workbench - Arbeitsbereich - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Wenn dies das einzige Element im Addon ist, können alle anderen Metadaten von der obersten Ebene übernommen werden und müssen hier nicht angegeben werden. - - - - This is the only item in the Addon - Dies ist das einzige Element im Addon - - - - Main macro file - Hauptmakrodatei - - - - The file with the macro's metadata in it - Die Datei, die die Metadaten des Makros enthält - - - - - - Browse... - Durchsuchen... - - - - Preference Pack Name - Name des Voreinstellunspakets - - - - Workbench class name - Name der Klasse des Arbeitsbereichs - - - - Class that defines "Icon" data member - Klasse, die das "Symbol" Datenelement definiert - - - - Subdirectory - Unterverzeichnis - - - - Optional, defaults to name of content item - Optional, Standardwert ist der Name des Inhaltselements - - - - Icon - Symbol - - - - Optional, defaults to inheriting from top-level Addon - Optional, erbt standardmäßig vom Top-Level Add-on - - - - Tags... - Schlagwörter... - - - - Dependencies... - Abhängigkeiten... - - - - FreeCAD Versions... - FreeCAD-Versionen... - - - - Other Metadata - Andere Metadaten - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Wird in der Liste der Addons im Addon-Manager angezeigt. Sollte das Wort "FreeCAD"nicht enthalten. - - - - Version - Version - - - - Description - Beschreibung - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Die Stie Semantic (1.2.3-beta) oder CalVer (2022.08.30) werden unterstützt - - - - Set to today (CalVer style) - Auf heute setzen (CalVer-Stil) - - - - Display Name - Angezeigename - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Alle nicht ausgefüllten Felder werden aus den Metadaten der obersten Ebene des Add-ons übernommen und sind daher technisch gesehen alle optional. Bei Add-ons mit mehreren Inhaltselementen sollte jedes Element einen eindeutigen Anzeigenamen und eine Beschreibung enthalten. - - - - add_toolbar_button_dialog - - - Add button? - Schaltfläche hinzufügen? - - - - Add a toolbar button for this macro? - Eine Symbolleistenschaltfläche für dieses Makro hinzufügen? - - - - Yes - Ja - - - - No - Nein - - - - Never - Nie - - - - change_branch - - - Change Branch - Git-Branch wechseln - - - - Change to branch: - Git-Branch wechseln: - - - - copyrightInformationDialog - - - Copyright Information - Copyright-Informationen - - - - Copyright holder: - Urheberrechtsinhaber: - - - - Copyright year: - Urheberrechtsjahr: - - - - personDialog - - - Add Person - Person Hinzufügen - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Ein Maintainer ist jemand mit aktuellem Commit-Zugriff auf dieses Projekt. Ein Autor ist jeder andere, dem man Anerkennung zuteil werden lassen möchte. - - - - Name: - Name: - - - - Email: - E-Mail: - - - - Email is required for maintainers, and optional for authors. - E-Mail ist für Betreuer erforderlich und für Autoren optional. - - - - proxy_authentication - - - Proxy login required - Proxy-Anmeldung erforderlich - - - - Proxy requires authentication - Proxy erfordert Authentifizierung - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Platzhalter für die Proxy-Adresse - - - - Realm: - Bereich: - - - - Placeholder for proxy realm - Platzhalter für Proxy-Realm - - - - Username - Benutzername - - - - Password - Kennwort - - - - selectLicenseDialog - - - Select a license - Eine Lizenz auswählen - - - - About... - Über... - - - - License name: - Lizenzname: - - - - Path to license file: - Pfad zur Lizenzdatei: - - - - (if required by license) - (falls von der Lizenz gefordert) - - - - Browse... - Durchsuchen... - - - - Create... - Erstellen... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Symbolleiste auswählen - - - - Select a toolbar to add this macro to: - Eine Symbolleiste wählen, um dieses Makro hinzuzufügen: - - - - Ask every time - Jedes Mal nachfragen - - - - toolbar_button - - - - Add button? - Schaltfläche hinzufügen? - - - - Add a toolbar button for this macro? - Eine Symbolleistenschaltfläche für dieses Makro hinzufügen? - - - - Yes - Ja - - - - No - Nein - - - - Never - Nie - - - - AddonsInstaller - - - Starting up... - Wird gestartet... - - - - Worker process {} is taking a long time to stop... - Arbeitsprozess {} braucht lange, um beendet zu werden... - - - - Previous cache process was interrupted, restarting... - - Vorheriger Cache-Prozess wurde unterbrochen, wird neu gestartet... - - - - - Custom repo list changed, forcing recache... - - Benutzerdefinierte Repo-Liste geändert, erzwinge den Recache... - - - - - Addon manager - Addon-Manager - - - - You must restart FreeCAD for changes to take effect. - FreeCAD muss neu gestartet werden, damit die Änderungen wirksam werden. - - - - Restart now - Jetzt neu starten - - - - Restart later - Später neu starten - - - - - Refresh local cache - Lokalen Cache aktualisieren - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Cache wird aktualisiert... - - - - - Checking for updates... - Sucht nach Updates... - - - - Temporary installation of macro failed. - Temporäre Installation des Makros fehlgeschlagen. - - - - - Close - Schließen - - - - Update all addons - Alle Erweiterungen aktualisieren - - - - Check for updates - Auf Aktualisierungen prüfen - - - - Python dependencies... - Python-Abhängigkeiten... - - - - Developer tools... - Entwicklerwerkzeuge... - - - - Apply %n available update(s) - %n verfügbare Aktualisierung(en) anwenden - - - - No updates available - Keine Aktualisierungen verfügbar - - - - - - Cannot launch a new installer until the previous one has finished. - Ein neuer Installer kann erst nach Beendigung des Vorherigen gestartet werden. - - - - - - - Maintainer - Betreuer - - - - - - - Author - Autor - - - - New Python Version Detected - Neue Python-Version erkannt - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Dies scheint das erste Mal zu sein, dass diese Version von Python mit dem Addon-Manager verwendet wurde. Sollen die gleichen automatisch installierten Abhängigkeiten für die neue Version installiert werden? - - - - Processing, please wait... - In Bearbeitung, bitte warten... - - - - - Update - Aktualisierung - - - - Updating... - Wird aktualisiert... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - QtNetwork konnte nicht importiert werden - es scheint nicht auf diesem System installiert zu sein. Dein Anbieter könnte ein Paket für diese Abhängigkeit haben (oft "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Konnte den angegebenen Proxy-Port '{}' nicht in eine Portnummer umwandeln - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameterfehler: sich gegenseitig ausschließende Proxy-Optionen eingestellt. Wird auf Standard zurückgesetzt. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameterfehler: Benutzerdefinierter Proxy ausgewählt, aber kein Proxy angegeben. Wird auf Standard zurückgesetzt. - - - - Addon Manager: Unexpected {} response from server - Addon-Manager: Unerwartete {} Antwort vom Server - - - - Error with encrypted connection - Fehler mit verschlüsselter Verbindung - - - - - - Confirm remove - Entfernen bestätigen - - - - Are you sure you want to uninstall {}? - Soll {} wirklich deinstalliert werden? - - - - - - Removing Addon - Addon wird entfernt - - - - Removing {} - {} wird entfernt - - - - - Uninstall complete - Deinstallation abgeschlossen - - - - - Uninstall failed - Deinstallation fehlgeschlagen - - - - Version {version} installed on {date} - Version {version} installiert am {date} - - - - Version {version} installed - Version {version} installiert - - - - Installed on {date} - Installiert am {date} - - - - - - - Installed - Installiert - - - - Currently on branch {}, name changed to {} - Derzeit auf Branch {}, Name geändert zu {} - - - - Git tag '{}' checked out, no updates possible - Git Tag '{}' ausgecheckt, keine Aktualisierungen möglich - - - - Update check in progress - Prüfung der Aktualisierung läuft - - - - Installation location - Speicherort für die Installation - - - - Repository URL - URL des Projektarchivs - - - - Changed to branch '{}' -- please restart to use Addon. - Änderung zu Branch '{}' -- bitte neu starten, um Erweiterung zu verwenden. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Diese Erweiterung wurde aktualisiert. FreeCAD neustarten, um Änderungen zu sehen. - - - - Disabled - Deaktiviert - - - - Currently on branch {}, update available to version {} - Derzeit auf Branch {}, Update verfügbar für Version {} - - - - Update available to version {} - Update verfügbar auf Version {} - - - - This is the latest version available - Dies ist die neueste verfügbare Version - - - - WARNING: This addon is obsolete - WARNUNG: Dieses Addon ist veraltet - - - - WARNING: This addon is Python 2 only - WARNUNG: Diese Erweiterung ist nur für Python 2 - - - - WARNING: This addon requires FreeCAD {} - WARNUNG: Diese Erweiterung benötigt FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNUNG: Dieses Add-on ist derzeit installiert, aber deaktiviert. Die Schaltfläche "Aktivieren" verwenden, um es wieder zu aktivieren. - - - - This Addon will be enabled next time you restart FreeCAD. - Dieses Addon wird beim nächsten Neustart von FreeCAD aktiviert. - - - - This Addon will be disabled next time you restart FreeCAD. - Dieses Addon wird beim nächsten Neustart von FreeCAD deaktiviert. - - - - - - Success - Erfolgreich - - - - Install - Installieren - - - - Uninstall - Deinstallieren - - - - Enable - Aktivieren - - - - Disable - Deaktivieren - - - - - Check for update - Auf Update prüfen - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Ausführen - - - - Change branch... - Git-Branch wechseln... - - - - Return to package list - Zurück zur Paketliste - - - - Checking connection - Verbindung wird überprüft - - - - Checking for connection to GitHub... - Verbindung zu GitHub wird überprüft... - - - - Connection failed - Verbindung fehlgeschlagen - - - - Missing dependency - Fehlende Abhängigkeit - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - QtNetwork konnte nicht importiert werden - Einzelheiten finden sich im Ausgabefenster. Der Addon-Manager ist nicht verfügbar. - - - - Other... - For providing a license other than one listed - Andere... - - - - Select the corresponding license file in your Addon - Die entsprechende Lizenzdatei des Addon auswählen - - - - Location for new license file - Speicherort für neue Lizenzdatei - - - - Received {} response code from server - {} Antwortcode vom Server erhalten - - - - Failed to install macro {} - Installieren des Makros {} fehlgeschlagen - - - - Failed to create installation manifest file: - - Fehler beim Erstellen der Installations-Manifest-Datei: - - - - - Unrecognized content kind '{}' - Unbekannter Inhaltstyp '{}' - - - - Unable to locate icon at {} - Symbol kann nicht gefunden werden bei {} - - - - Select an icon file for this content item - Eine Symboldatei für dieses Inhaltselement auswählen - - - - - - {} is not a subdirectory of {} - {} ist kein Unterverzeichnis von {} - - - - Select the subdirectory for this content item - Das Unterverzeichnis für dieses Inhaltselement auswählen - - - - Automatic - Automatisch - - - - - Workbench - Arbeitsbereich - - - - Addon - Addon - - - - Python - Python - - - - Yes - Ja - - - - Internal Workbench - Interner Arbeitsbereich - - - - External Addon - Externer Arbeitsbereich - - - - Python Package - Python-Paket - - - - - Other... - Andere... - - - - Too many to list - Zu viele zum Auflisten - - - - - - - - - Missing Requirement - Fehlende Voraussetzung - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Add-on '{}' benötigt '{}', was in FreeCAD nicht verfügbar ist. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' benötigt die folgenden Arbeitsbereiche, welche nicht in FreeCAD verfügbar sind: - - - - Press OK to install anyway. - OK drücken, um trotzdem zu installieren. - - - - - Incompatible Python version - Inkompatible Python-Version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Dieses Addon benötigt Python-Pakete, die nicht installiert sind und nicht automatisch installiert werden können. Um diesen Arbeitsbereich nutzen zu können, müssen die folgenden Python-Pakete manuell installiert werden: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Dieses Addon (oder eine seiner Abhängigkeiten) erfordert Python {}.{}, und auf dem System läuft {}.{}. Installation abgebrochen. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optionale Abhängigkeit von {} ignoriert, weil sie nicht in der Erlaubnisliste ist - - - - - Installing dependencies - Abhängigkeiten werden installiert - - - - - Cannot execute Python - Python kann nicht ausgeführt werden - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Konnte die ausführbare Python-Datei nicht automatisch lokalisieren, oder der Pfad ist falsch gesetzt. Bitte den Pfad zu Python in den Einstellungen des Addon-Managers überprüfen. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Abhängigkeiten konnten nicht installiert werden. Trotzdem mit der Installation von {} fortfahren? - - - - - Cannot execute pip - Pip kann nicht ausgeführt werden - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Die Ausführung von pip ist fehlgeschlagen, da sie möglicherweise nicht in der Python-Installation enthalten ist. Bitte sicherstellen, dass das System pip installiert hat und erneut versuchen. Der fehlgeschlagene Befehl war: - - - - - Continue with installation of {} anyway? - Trotzdem mit der Installation von {} fortfahren? - - - - - Package installation failed - Paketinstallation fehlgeschlagen - - - - See Report View for detailed failure log. - Ein detailliertes Fehlerprotokoll findet sich im Ausgabefenster. - - - - Installing Addon - Addon wird installiert - - - - Installing FreeCAD Addon '{}' - FreeCAD-Addon '{}' wird installiert - - - - Cancelling - Abbrechen - - - - Cancelling installation of '{}' - Installation von '{}' abbrechen - - - - {} was installed successfully - {} wurde erfolgreich installiert - - - - - Installation Failed - Installation fehlgeschlagen - - - - Failed to install {} - Installation von {} fehlgeschlagen - - - - - Create new toolbar - Neue Symbolleiste erstellen - - - - - A macro installed with the FreeCAD Addon Manager - Ein Makro, das mit dem FreeCAD Addon-Manager installiert wurde - - - - - Run - Indicates a macro that can be 'run' - Ausführen - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Daten von GitHub konnten nicht gelesen werden: Bitte die Internetverbindung und Proxy-Einstellungen überprüfen und neu versuchen. - - - - XML failure while reading metadata from file {} - XML-Fehler beim Lesen von Metadaten aus der Datei {} - - - - Invalid metadata in file {} - Ungültige Metadaten in Datei {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNUNG: Der in der package.xml Metadaten angegebene Pfad stimmt nicht mit der aktuell ausgecheckten Version überein. - - - - Name - Name - - - - Class - Klasse - - - - Description - Beschreibung - - - - Subdirectory - Unterverzeichnis - - - - Files - Dateien - - - - Select the folder containing your Addon - Den Ordner auswählen, der die Erweiterung enthält - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Kein Vermin, Abbruch der Operation. - - - - Scanning Addon for Python version compatibility - Untersuchen des Addons auf Kompatibilität mit Python-Versionen - - - - Minimum Python Version Detected - Ermittelte minimale Python-Version - - - - Vermin auto-detected a required version of Python 3.{} - Vermin hat automatisch eine erforderliche Version von Python 3.{} erkannt - - - - Install Vermin? - Vermin installieren? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Die automatische Erkennung der erforderlichen Python-Version für dieses Add-on erfordert Vermin (https://pypi.org/project/vermin/). Soll dies Installiert werden? - - - - Attempting to install Vermin from PyPi - Installationsversuch Vermin von PyPi - - - - - Installation failed - Installation fehlgeschlagen - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Vermin konnte nicht installiert werden -- Einzelheiten finden sich im Ausgabefenster. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Fehler beim Importieren von Vermin nach der Installation -- Addon kann nicht gescannt werden. - - - - Select an icon file for this package - Eine Symboldatei für dieses Paket auswählen - - - - Filter is valid - Filter ist gültig - - - - Filter regular expression is invalid - Der Filter regulärer Ausdruck ist ungültig - - - - Search... - Suche... - - - - Click for details about package {} - Klicken für Details zum Paket {} - - - - Click for details about workbench {} - Klicken für Details zum Arbeitsbereich {} - - - - Click for details about macro {} - Klicken für Details zum Makro {} - - - - Maintainers: - Betreuer: - - - - Tags - Schlagwörter - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - Kein ★, oder nicht auf GitHub - - - - Created - Erstellt - - - - Updated - Aktualisiert - - - - Score: - Bewertung: - - - - - Up-to-date - Auf dem neuesten Stand - - - - - - - - Update available - Aktualisierung verfügbar - - - - - Pending restart - Ausstehender Neustart - - - - - DISABLED - DEAKTIVIERT - - - - Installed version - Installierte Version - - - - Unknown version - Unbekannte Version - - - - Installed on - Installiert am - - - - Available version - Verfügbare Version - - - - Filter by... - Filtern nach... - - - - Addon Type - Erweiterungs-Typ - - - - - Any - Alle - - - - Macro - Makro - - - - Preference Pack - Voreinstellungspaket - - - - Installation Status - Installationsstatus - - - - Not installed - Nicht installiert - - - - Filter - Filter - - - - DANGER: Developer feature - VORSICHT: Entwicklerfunktion - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - VORSICHT: Das Wechseln von Branches ist für Entwickler und Beta-Tester gedacht und kann zu Störungen, nicht rückwärtskompatiblen Dokumenten, Instabilität, Abstürze und/oder den vorzeitigen Untergang des Universums erzeugen. Wirklich fortfahren? - - - - There are local changes - Es gibt lokale Änderungen - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNUNG: Dieses Repo hat nicht gespeicherte lokale Änderungen. Wirklich den Branch wechseln (die Änderungen werden mitgenommen)? - - - - Local - Table header for local git ref name - Lokal - - - - Remote tracking - Table header for git remote tracking branch name - Entfernte Nachverfolgung (Remote) - - - - Last Updated - Table header for git update date - Zuletzt aktualisiert - - - - Installation of Python package {} failed - Installation des Python-Pakets {} fehlgeschlagen - - - - Installation of optional package failed - Installation des optionalen Pakets fehlgeschlagen - - - - Installing required dependency {} - Installieren der benötigten Abhängigkeit {} - - - - Installation of Addon {} failed - Installation des Addons {} fehlgeschlagen - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Datei {} für Add-on '{}' konnte nicht dekodiert werden - - - - Any dependency information in this file will be ignored - Alle Abhängigkeitsinformationen in dieser Datei werden ignoriert - - - - Unable to open macro wiki page at {} - Makro-Wiki-Seite unter {} kann nicht geöffnet werden - - - - Unable to fetch the code of this macro. - Der Code dieses Makros konnte nicht abgerufen werden. - - - - Unable to retrieve a description from the wiki for macro {} - Konnte keine Beschreibung aus dem Wiki für Makro {} holen - - - - Unable to open macro code URL {} - Makro-Code kann nicht geöffnet werden URL {} - - - - Unable to fetch macro-specified file {} from {} - Makrospezifizierte Datei {} von {} konnte nicht abgerufen werden - - - - Could not locate macro-specified file {} (expected at {}) - Datei {} konnte nicht gefunden werden (erwartet um {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unbekannter interner Arbeitsbereich '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Add-on Entwickler Warnung: Die in der Datei package.xml für das Add-on {} ({}) angegebene Repository-URL stimmt nicht mit der URL überein, von der es abgerufen wurde ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Add-on Entwickler Warnung: Der in der package.xml-Datei für das Add-on {} ({}) angegebene Repository-Branch stimmt nicht mit dem Branch überein, aus dem es geholt wurde ({}) - - - - - Got an error when trying to import {} - Fehler beim Importieren von {} - - - - An unknown error occurred - Ein unbekannter Fehler ist aufgetreten - - - - Could not find addon {} to remove it. - Addon {} konnte nicht gefunden werden, um es zu entfernen. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Ausführung des Addon's Uninstall.py Skripts fehlgeschlagen. Fortfahren mit der Deinstallation... - - - - Removed extra installed file {} - Zusätzlich installierte Datei {} entfernt - - - - Error while trying to remove extra installed file {} - Fehler beim Versuch, die zusätzlich installierte Datei {} zu entfernen - - - - Error while trying to remove macro file {}: - Fehler beim Entfernen der Makrodatei {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Verbindung zu GitHub fehlgeschlagen. Bitte die Verbindungs- und Proxy-Einstellungen überprüfen. - - - - WARNING: Duplicate addon {} ignored - WARNUNG: Duplizieren des Addons {} wird ignoriert - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Fehler beim Aktualisieren von Makros von GitHub, sauberer Checkout-Versuch wird ausgeführt... - - - - Attempting to do a clean checkout... - Sauberer Checkout-Versuch... - - - - Clean checkout succeeded - Sauberer Checkout war erfolgreich - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Aktualisierung der GitHub Makros fehlgeschlagen -- Löschen des Caches des Addon-Managers versuchen. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Fehler beim Verbinden mit dem Wiki, FreeCAD kann die Wiki-Makroliste zu diesem Zeitpunkt nicht abrufen - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Fehler beim Lesen der Metadaten von {name} - - - - Failed to fetch code for macro '{name}' - Fehler beim Abrufen des Codes für Makro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon-Manager: Ein Arbeitsprozess konnte während des Abrufs von {name} nicht abgeschlossen werden - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Von {num_macros} Makros wurden {num_failed} während der Verarbeitung nicht rechtzeitig beendet - - - - Addon Manager: a worker process failed to halt ({name}) - Addon-Manager: Ein Arbeitsprozess ({name}) konnte nicht angehalten werden - - - - Timeout while fetching metadata for macro {} - Timeout beim Abrufen von Metadaten für Makro {} - - - - Failed to kill process for macro {}! - - Fehler beim Beenden des Prozesses für Makro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Fehler beim Abrufen der Erweiterungs-Statistiken von {} -- nur alphabetisch sortieren wird genau sein - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Fehler beim Abrufen der Erweiterungs-Bewertungen von '{}' -- Sortierung nach Bewertung wird fehlschlagen - - - - - Repository URL - Preferences header for custom repositories - URL des Projektarchivs - - - - Branch name - Preferences header for custom repositories - Zweigname - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Sichern des ursprünglichen Ordners und erneutes Klonen - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Umbenennen des Git Branches mit der folgenden Nachricht fehlgeschlagen: - - - - Installing - Wird installiert - - - - Succeeded - Erfolgreich - - - - Failed - Fehlgeschlagen - - - - Update was cancelled - Aktualisierung wurde abgebrochen - - - - some addons may have been updated - Einige Addons wurden möglicherweise aktualisiert - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Laden der Info für {} aus dem FreeCAD Makro Rezeptenwiki... - - - - Loading page for {} from {}... - Lade Seite für {} von {}... - - - - Failed to download data from {} -- received response code {}. - Fehler beim Herunterladen der Daten von {} -- Empfangener Antwortcode {}. - - - - Composite view - Zusammengesetzte Ansicht - - - - Expanded view - Erweiterte Ansicht - - - - Compact view - Kompakte Ansicht - - - - Alphabetical - Sort order - Alphabetisch - - - - Last Updated - Sort order - Zuletzt aktualisiert - - - - Date Created - Sort order - Erstellungsdatum - - - - GitHub Stars - Sort order - GitHub Sterne - - - - Score - Sort order - Bewertung - - - - Std_AddonMgr - - - &Addon manager - &Addon-Manager - - - - Manage external workbenches, macros, and preference packs - Verwaltet externe Arbeitsbereiche, Makros und Voreinstellungspakete - - - - AddonInstaller - - - Finished removing {} - Entfernen von {} abgeschlossen - - - - Failed to remove some files - Einige Dateien konnten nicht entfernt werden - - - - Addons installer - - - Finished updating the following addons - Aktualisierung der folgenden Addons fertiggestellt - - - - Workbench - - - Auto-Created Macro Toolbar - Automatisch erstellte Makro-Symbolleiste - - - - QObject - - - Addon Manager - Addon-Manager - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_el.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_el.qm deleted file mode 100644 index 3d4cf3d6c9..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_el.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_el.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_el.ts deleted file mode 100644 index c0e7ed384e..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_el.ts +++ /dev/null @@ -1,2488 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Προσαρμοσμένο αποθετήριο - - - - Repository URL - URL Χώρου Αποθήκευσης - - - - Branch - Κλάδος - - - - CompactView - - - - Icon - Εικονίδιο - - - - - <b>Package Name</b> - <b>Όνομα πακέτου</b> - - - - - Version - Έκδοση - - - - - Description - Περιγραφή - - - - Update Available - Διαθέσιμη Ενημέρωση - - - - UpdateAvailable - Διαθέσιμη ενημέρωση - - - - DependencyDialog - - - Dependencies - Εξαρτήσεις - - - - Dependency type - Τύπος εξάρτησης - - - - Name - Όνομα - - - - Optional? - Προαιρετικό; - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Επίλυση Εξαρτήσεων - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Αυτό το πρόσθετο έχει τις ακόλουθες απαιτούμενες και προαιρετικές εξαρτήσεις. Πρέπει να τα εγκαταστήσετε για να μπορέσει να χρησιμοποιηθεί αυτό το πρόσθετο. - -Θέλετε ο Διαχειριστής πρόσθετων να τα εγκαταστήσει αυτόματα; Επιλέξτε "Παράβλεψη" για να εγκαταστήσετε το πρόσθετο χωρίς να εγκαταστήσετε τις εξαρτήσεις. - - - - FreeCAD Addons - Πρόσθετα FreeCAD - - - - Required Python modules - Απαιτούμενες ενότητες Python - - - - Optional Python modules - Προαιρετικές ενότητες Python - - - - DeveloperModeDialog - - - Addon Developer Tools - Πρόσθετα Εργαλεία Προγραμματιστή - - - - Path to Addon - Διαδρομή προς το πρόσθετο - - - - - Browse... - Περιήγηση... - - - - Metadata - Μεταδεδομένα - - - - Primary branch - Κύριος κλάδος - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Επεξήγηση το τι παρέχει αυτό το Πρόσθετο. Εμφανίζεται στη Διαχείριση Πρόσθετου. Δεν είναι απαραίτητο να δηλωθεί ότι πρόκειται για ένα πρόσθετο FreeCAD. - - - - Description - Περιγραφή - - - - Discussion URL - URL Συζήτησης - - - - Icon - Εικονίδιο - - - - Bugtracker URL - URL εντοπισμού σφαλμάτων - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Σημασιολογικά (1.2.3-beta) ή CalVer (2022.08.30) στυλ που υποστηρίζονται -Υποστηριζόμενα στυλ Σημασιολογικού (1.2.3-beta) ή με ημερομηνία Έκδοσης (30/8/2022) - - - - Set to today (CalVer style) - Ορισμός σε σημερινή έκδοση (CalVer στυλ) - - - - - - - (Optional) - (Προαιρετικό) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Εμφανίζεται στο Addon Manager's λίστα των Addons. Δεν πρέπει να συμπεριλάβετε τη λέξη "FreeCAD", και πρέπει να είναι ένα έγκυρο όνομα καταλόγου σε όλα τα λειτουργικά συστήματα υποστήριξης. - - - - README URL - ΔΙΑΒΑΣΤΕ τη διεύθυνση URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Εφόσον αυτό εμφανίζεται στη Διαχείριση Πρόσθετων του FreeCAD , δεν είναι απαραίτητο να καταλαμβάνετε χώρο λέγοντας πράγματα όπως "Αυτό είναι ένα FreeCAD Addon. ." - απλά πείτε τι κάνει. - - - - Repository URL - URL Χώρου Αποθήκευσης - - - - Website URL - URL Ιστοσελίδας - - - - Documentation URL - URL τεκμηρίωσης - - - - Addon Name - Όνομα Πρόσθετου - - - - Version - Έκδοση - - - - (Recommended) - (Προτείνεται) - - - - Minimum Python - Ελάχιστη Python - - - - (Optional, only 3.x version supported) - (Προαιρετικά, υποστηρίζεται μόνο έκδοση 3.x) - - - - Detect... - Ανίχνευση... - - - - Addon Contents - Περιεχόμενα Πρόσθετου - - - - Dialog - - - Addon Manager - Διαχειριστής Πρόσθετων - - - - Edit Tags - Επεξεργασία Ετικετών - - - - Comma-separated list of tags describing this item: - Λίστα ετικετών χωρισμένη με κόμματα που περιγράφουν αυτό το αντικείμενο: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - ΣΥΜΒΟΥΛΗ: Οι κοινές ετικέτες περιλαμβάνουν "Συναρμολόγηση", "FEM", "Πλέγμα", "NURBS", κ.λ.π. - - - - Add-on Manager: Warning! - Διαχείριση Πρόσθετων: Προειδοποίηση! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Ο Διαχειριστής Πρόσθετων παρέχει πρόσβαση σε μια εκτεταμένη βιβλιοθήκη χρήσιμων επεκτάσεων FreeCAD τρίτων. Δεν μπορούν να γίνουν εγγυήσεις σχετικά με την ασφάλεια ή τη λειτουργικότητά τους. - - - - Continue - Συνεχίστε - - - - Cancel - Ακύρωση - - - - EditDependencyDialog - - - Edit Dependency - Επεξεργασία Εξάρτησης - - - - Dependency Type - Τύπος Εξάρτησης - - - - Dependency - Εξάρτηση - - - - Package name, if "Other..." - Όνομα πακέτου, εάν "Άλλο..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - ΣΗΜΕΙΩΣΗ: Αν επιλεγεί "Άλλα..." το πακέτο δεν βρίσκεται στα ALLOWED_PYTHON_PACKAGES. xt αρχείο, και δεν θα εγκατασταθεί αυτόματα από το Διαχειριστής Πρόσθετων. Υποβάλετε ένα PR στο <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> για να ζητήσετε την προσθήκη ενός πακέτου. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Αν αυτή είναι μια προαιρετική εξάρτηση, η Διαχείριση Πρόσθετου θα προσφέρει τη δυνατότητα να την εγκαταστήσει (όταν είναι δυνατόν), αλλά δε θα μπλοκάρει την εγκατάσταση αν ο χρήστης δεν επιλέξει, ή δεν μπορεί να εγκαταστήσει το πακέτο. - - - - Optional - Προαιρετικό - - - - ExpandedView - - - - Icon - Εικονίδιο - - - - - <h1>Package Name</h1> - <h1>Όνομα πακέτου</h1> - - - - - Version - Έκδοση - - - - - (tags) - (ετικέτες) - - - - - Description - Περιγραφή - - - - - Maintainer - Συντηρητής - - - - Update Available - Διαθέσιμη Ενημέρωση - - - - labelSort - Ταξινόμηση - - - - UpdateAvailable - Διαθέσιμη ενημέρωση - - - - Form - - - Licenses - Άδειες - - - - License - Άδεια - - - - License file - Αρχείο άδειας - - - - People - Άνθρωποι - - - - Kind - Είδος - - - - Name - Όνομα - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Προηγμένη Αντιστοίχιση Έκδοσης - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Οι επερχόμενες εκδόσεις του FreeCAD Διαχειριστής Πρόσθετων θα υποστηρίξουν τους προγραμματιστές' ορίζοντας έναν συγκεκριμένο κλάδο ή ετικέτα για χρήση με μια συγκεκριμένη έκδοση του FreeCAD (π. χ. ορίζοντας μια συγκεκριμένη ετικέτα ως την τελευταία έκδοση του πρόσθετου σας για υποστήριξη v0.19 κλπ.) - - - - FreeCAD Version - Έκδοση FreeCAD - - - - Best-available branch, tag, or commit - Ο καλύτερος διαθέσιμος κλάδος, ετικέτα ή υποβολή - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Υποστηριζόμενες Εκδόσεις FreeCAD - - - - Minimum FreeCAD Version Supported - Ελάχιστη Υποστηριζόμενη Έκδοση FreeCAD - - - - - Optional - Προαιρετικό - - - - Maximum FreeCAD Version Supported - Μέγιστη Υποστηριζόμενη Έκδοση FreeCAD - - - - Advanced version mapping... - Προηγμένη Αντιστοίχιση Έκδοσης... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Επιλογές διαχείρισης πρόσθετων - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Εάν είναι ενεργοποιημένη αυτή η επιλογή, κατά την εκκίνηση του Διαχειριστή Προσθέτων. Τα εγκατεστημένα Πρόσθετα θα ελεγχθούν για διαθέσιμες ενημερώσεις - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Λήψη μεταδεδομένων μακροεντολών (περίπου 10MB) - - - - Cache update frequency - Συχνότητα ενημέρωσης προσωρινής μνήμης - - - - Manual (no automatic updates) - Χειροκίνητη (δεν υπάρχουν αυτόματες ενημερώσεις) - - - - Daily - Καθημερινά - - - - Weekly - Εβδομαδιαία - - - - Hide Addons without a license - Απόκρυψη Πρόσθετων χωρίς άδεια - - - - Hide Addons with non-FSF Free/Libre license - Απόκρυψη προσθέτων με άδεια μη-FSF δωρεάν/Libre - - - - Hide Addons with non-OSI-approved license - Απόκρυψη προσθέτων με άδεια μη εγκεκριμένη από OSI - - - - Hide Addons marked Python 2 Only - Απόκρυψη προσθέτων που επισημαίνονται μόνο Python 2 - - - - Hide Addons marked Obsolete - Απόκρυψη προσθέτων που είναι παρωχημένα - - - - Hide Addons that require a newer version of FreeCAD - Απόκρυψη Πρόσθετων που απαιτούν μια νεότερη έκδοση του FreeCAD - - - - Custom repositories - Προσαρμοσμένα αποθετήρια - - - - Proxy - Διακομιστής - - - - No proxy - Χωρίς διακομιστή - - - - User system proxy - Διακομιστής συστήματος χρήστη - - - - User-defined proxy: - Διακομιστή ορισμένου Χρήστη: - - - - Score source URL - URL πηγής βαθμολογίας - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Η διεύθυνση URL για τα δεδομένα του Addon Score (δείτε τη σελίδα wiki του Addon Manager για τη μορφοποίηση και τις λεπτομέρειες φιλοξενίας). - - - - Path to Git executable (optional): - Διαδρομή προς το εκτελέσιμο Git (προαιρετικό): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Προχωρημένες Ρυθμίσεις - - - - Activate Addon Manager options intended for developers of new Addons. - Ενεργοποιήστε τις επιλογές Διαχειριστή Προσθέτων που προορίζονται για προγραμματιστές νέων Πρόσθετων. - - - - Addon developer mode - Λειτουργία Πρόσθετου προγραμματιστή - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Απεγκαθιστά μια επιλεγμένη μακροεντολή ή πάγκο εργασίας - - - - Install - Εγκατάσταση - - - - Uninstall - Απεγκατάσταση - - - - Update - Ενημέρωση - - - - Run Macro - Εκτέλεση Μακροεντολής - - - - Change branch - Αλλαγή τοποθεσίας - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Διαχείριση Εξαρτήσεων Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Τα ακόλουθα πακέτα Python έχουν εγκατασταθεί τοπικά από το Διαχειριστή Προσθέτων για να ικανοποιήσουν τις εξαρτήσεις του Πρόσθετο: - - - - Package name - Όνομα πακέτου - - - - Installed version - Εγκατεστημένη έκδοση - - - - Available version - Διαθέσιμη έκδοση - - - - Used by - Χρησιμοποιείται από - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Ένας αστερίσκος (*) στο "Χρησιμοποιείται από τη στήλη" υποδηλώνει μια προαιρετική εξάρτηση. Σημειώστε ότι χρησιμοποιείται μόνο με τις άμεσες εισαγωγές στο Πρόσθετο. Μπορεί να έχουν εγκατασταθεί και άλλα πακέτα Python από τα οποία εξαρτώνται αυτά τα πακέτα. - - - - Update all available - Ενημέρωση όλων των διαθέσιμων - - - - SelectFromList - - - Dialog - Διάλογος - - - - TextLabel - Ετικέτα κειμένου - - - - UpdateAllDialog - - - Updating Addons - Ενημέρωση Πρόσθετων - - - - Updating out-of-date addons... - Ενημέρωση μη ενημερωμένων προσθέτων... - - - - addContentDialog - - - Content Item - Αντικείμενα Περιεχομένου - - - - Content type: - Τύπος περιεχομένου: - - - - Macro - Μακροεντολή - - - - Preference Pack - Πακέτο Προτιμήσεων - - - - Workbench - Πάγκος εργασίας - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Εάν αυτό είναι το μόνο πράγμα στο πρόσθετο, όλα τα άλλα μεταδιδόμενα μπορούν να κληρονομηθούν από το ανώτερο επίπεδο και δε χρειάζεται να καθοριστούν εδώ. - - - - This is the only item in the Addon - Αυτό είναι το μόνο αντικείμενο στο Πρόσθετο - - - - Main macro file - Κύριο αρχείο μακροεντολής - - - - The file with the macro's metadata in it - Το αρχείο με την μακροεντολή's μεταδεδομένα σε αυτό - - - - - - Browse... - Περιήγηση... - - - - Preference Pack Name - Όνομα Πακέτου Προτίμησης - - - - Workbench class name - Όνομα κλάσης πάγκου εργασίας - - - - Class that defines "Icon" data member - Κλάση που ορίζει το μέλος δεδομένων "Icon" - - - - Subdirectory - Υποκατάλογος - - - - Optional, defaults to name of content item - Προαιρετικό, προκαθορισμένο όνομα του στοιχείου - - - - Icon - Εικονίδιο - - - - Optional, defaults to inheriting from top-level Addon - Προαιρετικό, προεπιλογή για εισαγωγή από πρόσθετο ανώτατου επιπέδου - - - - Tags... - Ετικέτες… - - - - Dependencies... - Εξαρτήσεις... - - - - FreeCAD Versions... - Έκδοση FreeCAD... - - - - Other Metadata - Άλλα Μεταδεδομένα - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Εμφανίζεται στη λίστα Διαχείριση Προσθέτων's των Addons. Δε θα πρέπει να συμπεριλαμβάνει τη λέξη "FreeCAD". - - - - Version - Έκδοση - - - - Description - Περιγραφή - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Σημασιολογικά (1.2.3-beta) ή CalVer (2022.08.30) στυλ που υποστηρίζονται -Υποστηριζόμενα στυλ Σημασιολογικού (1.2.3-beta) ή με ημερομηνία Έκδοσης (30/8/2022) - - - - Set to today (CalVer style) - Ορισμός σε σημερινή έκδοση (CalVer στυλ) - - - - Display Name - Εμφάνιση Ονόματος - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Τυχόν πεδία που παραμένουν κενά κληρονομούνται από τα ανώτερα μεταδεδομένα του Addon, οπότε τεχνικά είναι όλα προαιρετικά. Για τα Πρόσθετα με πολλαπλά στοιχεία περιεχομένου, κάθε στοιχείο θα πρέπει να παρέχει ένα μοναδικό Εμφανιζόμενο Όνομα και Περιγραφή. - - - - add_toolbar_button_dialog - - - Add button? - Προσθήκη κουμπιού? - - - - Add a toolbar button for this macro? - Προσθήκη κουμπιού γραμμής εργαλείων για αυτή την μακροεντολή; - - - - Yes - Ναι - - - - No - Όχι - - - - Never - Ποτέ - - - - change_branch - - - Change Branch - Αλλαγή Κλάδου - - - - Change to branch: - Αλλαγή σε κλάδο: - - - - copyrightInformationDialog - - - Copyright Information - Πληροφορίες Πνευματικών Δικαιωμάτων - - - - Copyright holder: - Κάτοχος πνευματικών δικαιωμάτων: - - - - Copyright year: - Έτος πνευματικών δικαιωμάτων: - - - - personDialog - - - Add Person - Προσθήκη ατόμου - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Ένας συντηρητής είναι κάποιος με τρέχουσα πρόσβαση σε αυτό το έργο. Συντάκτης είναι οποιοσδήποτε άλλος 'θα θέλατε να αποδώσετε τα εύσημα. - - - - Name: - Όνομα: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Απαιτείται email για συντηρητές, και προαιρετικό για τους συγγραφείς. - - - - proxy_authentication - - - Proxy login required - Απαιτείται σύνδεση διακομιστή - - - - Proxy requires authentication - Ο διακομιστής απαιτεί ταυτοποίηση - - - - Proxy: - Διακομιστής: - - - - Placeholder for proxy address - Υποκατάσταση θέσης για διεύθυνση διακομιστή - - - - Realm: - Τομέας: - - - - Placeholder for proxy realm - Προσωρινή καταχώρηση τομέα Διακομιστή - - - - Username - Όνομα χρήστη - - - - Password - Κωδικός Πρόσβασης - - - - selectLicenseDialog - - - Select a license - Επιλέξτε Άδεια - - - - About... - Σχετικά με... - - - - License name: - Όνομα αδείας: - - - - Path to license file: - Διαδρομή για το αρχείο άδειας: - - - - (if required by license) - (εάν απαιτείται από την άδεια) - - - - Browse... - Περιήγηση... - - - - Create... - Δημιουργία... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Επιλογή γραμμής εργαλείων - - - - Select a toolbar to add this macro to: - Επιλέξτε μια γραμμή εργαλείων για να προσθέσετε αυτή την μακροεντολή: - - - - Ask every time - Να γίνεται ερώτηση κάθε φορά - - - - toolbar_button - - - - Add button? - Προσθήκη κουμπιού? - - - - Add a toolbar button for this macro? - Προσθήκη κουμπιού γραμμής εργαλείων για αυτή την μακροεντολή? - - - - Yes - Ναι - - - - No - Όχι - - - - Never - Ποτέ - - - - AddonsInstaller - - - Starting up... - Εκκίνηση... - - - - Worker process {} is taking a long time to stop... - Η διαδικασία εργασίας {} αργεί πολύ να σταματήσει... - - - - Previous cache process was interrupted, restarting... - - Η προηγούμενη διεργασία cache διακόπηκε, επανεκκίνηση... - - - - - Custom repo list changed, forcing recache... - - Η προσαρμοσμένη λίστα αποθεμάτων άλλαξε, επιβάλλεται εκ νέου προσωρινή αποθήκευση... - - - - - Addon manager - Διαχειριστής Πρόσθετων - - - - You must restart FreeCAD for changes to take effect. - Πρέπει να επανεκκινήσετε το FreeCAD για να τεθούν σε ισχύ οι αλλαγές. - - - - Restart now - Επανεκκίνηση τώρα - - - - Restart later - Επανεκκίνηση αργότερα - - - - - Refresh local cache - Ανανέωση τοπικής προσωρινής μνήμης - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Ενημέρωση προσωρινής μνήμης... - - - - - Checking for updates... - Έλεγχος για ενημερώσεις... - - - - Temporary installation of macro failed. - Η προσωρινή εγκατάσταση της μακροεντολής απέτυχε. - - - - - Close - Κλείσιμο - - - - Update all addons - Ενημέρωση όλων των προσθέτων - - - - Check for updates - Έλεγχος για ενημερώσεις - - - - Python dependencies... - Εξαρτήσεις για Python... - - - - Developer tools... - Εργαλεία για προγραμματιστές... - - - - Apply %n available update(s) - Εφαρμογή %n διαθέσιμων ενημερώσεων(ων) - - - - No updates available - Δεν υπάρχουν διαθέσιμες ενημερώσεις - - - - - - Cannot launch a new installer until the previous one has finished. - Δεν είναι δυνατή η εκκίνηση ενός νέου προγράμματος εγκατάστασης μέχρι να τελειώσει η προηγούμενη. - - - - - - - Maintainer - Συντηρητής - - - - - - - Author - Συγγραφέας - - - - New Python Version Detected - Ανιχνεύθηκε Νέα Έκδοση Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Αυτή φαίνεται να είναι η πρώτη φορά που αυτή η έκδοση της Python χρησιμοποιείται με το Διαχειριστή Προσθέτων. Θέλετε να εγκαταστήσετε τις ίδιες αυτόματο-εγκατεστημένες εξαρτήσεις? - - - - Processing, please wait... - Γίνεται επεξεργασία, παρακαλώ περιμένετε... - - - - - Update - Ενημέρωση - - - - Updating... - Ενημέρωση... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Αδυναμία εισαγωγής του QtNetwork -- δε φαίνεται να είναι εγκατεστημένο στο σύστημά σας. Ο πάροχος σας μπορεί να έχει ένα πακέτο για αυτή την εξάρτηση (συχνά ονομάζεται "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Αποτυχία μετατροπής της καθορισμένης θύρας διαμεσολαβητή '{}' σε αριθμό θύρας - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Σφάλμα παραμέτρου: Ορίστηκαν αμοιβαία αποκλειστικές επιλογές διακομιστή μεσολάβησης. Επαναφορά στην προεπιλογή. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Σφάλμα παραμέτρων: υποδεικνύεται ο διαμεσολαβητής χρήστη, αλλά δεν παρέχεται διαμεσολαβητής. Επαναφορά στην προεπιλογή. - - - - Addon Manager: Unexpected {} response from server - Διαχειριστής Πρόσθετων: Μη αναμενόμενη απάντηση {} από τον διακομιστή - - - - Error with encrypted connection - Σφάλμα με κρυπτογραφημένη σύνδεση - - - - - - Confirm remove - Επιβεβαίωση διαγραφής - - - - Are you sure you want to uninstall {}? - Είστε βέβαιοι ότι θέλετε να απεγκαταστήσετε {}; - - - - - - Removing Addon - Αφαίρεση Πρόσθετου - - - - Removing {} - Αφαίρεση {} - - - - - Uninstall complete - Η απεγκατάσταση ολοκληρώθηκε - - - - - Uninstall failed - Η απεγκατάσταση έχει αποτύχει - - - - Version {version} installed on {date} - Η έκδοση {version} εγκαταστάθηκε στο {date} - - - - Version {version} installed - Η έκδοση {version} εγκαταστάθηκε - - - - Installed on {date} - Εγκαταστάθηκε στο {date} - - - - - - - Installed - Εγκαταστάθηκε - - - - Currently on branch {}, name changed to {} - Αυτή τη στιγμή στον κλάδο {}, το όνομα άλλαξε σε {} - - - - Git tag '{}' checked out, no updates possible - Ετικέτα Git '{}' έλεγχος, δεν είναι δυνατή η ενημέρωση - - - - Update check in progress - Έλεγχος ενημέρωσης σε εξέλιξη - - - - Installation location - Θέση εγκατάστασης - - - - Repository URL - URL Χώρου Αποθήκευσης - - - - Changed to branch '{}' -- please restart to use Addon. - Αλλαγές στο '{}' -- Κάντε επανεκκίνηση για να χρησιμοποιήσετε το Πρόσθετο. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Αυτό το πρόσθετο έχει ενημερωθεί. Επανεκκίνηση το FreeCAD για να δείτε τις αλλαγές. - - - - Disabled - Απενεργοποιημένο - - - - Currently on branch {}, update available to version {} - Αυτή τη στιγμή στον κλάδο {}, διαθέσιμη ενημέρωση για την έκδοση {} - - - - Update available to version {} - Διαθέσιμη ενημέρωση για την έκδοση {} - - - - This is the latest version available - Αυτή είναι η τελευταία διαθέσιμη έκδοση - - - - WARNING: This addon is obsolete - ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτό το πρόσθετο είναι παρωχημένο - - - - WARNING: This addon is Python 2 only - ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτό το πρόσθετο είναι μόνο Python 2 - - - - WARNING: This addon requires FreeCAD {} - ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτό το πρόσθετο απαιτεί FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτό το πρόσθετο είναι εγκατεστημένο, αλλά απενεργοποιημένο. Χρησιμοποιήστε το κουμπί 'ενεργοποίηση' για να ενεργοποιηθεί ξανά. - - - - This Addon will be enabled next time you restart FreeCAD. - Αυτό το πρόσθετο θα ενεργοποιηθεί την επόμενη φορά που θα κάνετε επανεκκίνηση του FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Αυτό το πρόσθετο θα ενεργοποιηθεί την επόμενη φορά που θα κάνετε επανεκκίνηση του FreeCAD. - - - - - - Success - Επιτυχώς - - - - Install - Εγκατάσταση - - - - Uninstall - Απεγκατάσταση - - - - Enable - Ενεργοποίηση - - - - Disable - Απενεργοποίηση - - - - - Check for update - Έλεγχος για ενημερώσεις - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Εκτέλεση - - - - Change branch... - Αλλαγή Κλάδου... - - - - Return to package list - Επιστροφή στη λίστα πακέτων - - - - Checking connection - Ελέγξτε τη σύνδεση - - - - Checking for connection to GitHub... - Έλεγχος για σύνδεση με το GitHub... - - - - Connection failed - Αποτυχία σύνδεσης - - - - Missing dependency - Λείπει εξάρτηση - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Δεν ήταν δυνατή η εισαγωγή του QtNetwork -- ανατρέξτε στην Προβολή αναφοράς για λεπτομέρειες. Διαχειριστής πρόσθετων Μη διαθέσιμο. - - - - Other... - For providing a license other than one listed - Άλλο... - - - - Select the corresponding license file in your Addon - Επιλέξτε το αντίστοιχο αρχείο άδειας χρήσης στο πρόσθετο σας - - - - Location for new license file - Τοποθεσία για νέο αρχείο άδειας - - - - Received {} response code from server - Λήφθηκε κωδικός απόκρισης {} από το διακομιστή - - - - Failed to install macro {} - Αποτυχία εγκατάστασης μακροεντολής {} - - - - Failed to create installation manifest file: - - Αποτυχία δημιουργίας αρχείου δήλωσης εγκατάστασης: - - - - Unrecognized content kind '{}' - Μη αναγνωρισμένο είδος περιεχομένου '{}' - - - - Unable to locate icon at {} - Αδυναμία εντοπισμού εικονιδίου στο {} - - - - Select an icon file for this content item - Επιλέξτε ένα αρχείο εικονιδίων για αυτό το στοιχείο - - - - - - {} is not a subdirectory of {} - {} δεν είναι ένας υποκατάλογος του {} - - - - Select the subdirectory for this content item - Επιλέξτε τον υποκατάλογο αυτού του στοιχείου περιεχομένου - - - - Automatic - Αυτόματη - - - - - Workbench - Πάγκος εργασίας - - - - Addon - Πρόσθετα - - - - Python - Python - - - - Yes - Ναι - - - - Internal Workbench - Εσωτερικός Πάγκος Εργασίας - - - - External Addon - Εξωτερικό Πρόσθετο - - - - Python Package - Πακέτο Python - - - - - Other... - Άλλο... - - - - Too many to list - Πάρα πολλά στη λίστα - - - - - - - - - Missing Requirement - Λείπουν προαπαιτούμενα - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Το Πρόσθετο '{}' απαιτεί '{}', το οποίο δεν είναι διαθέσιμο στο αντίγραφο του FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Το Πρόσθετο '{}' απαιτεί τους παρακάτω πάγκους εργασίας, οι οποίοι δεν είναι διαθέσιμοι στο αντίγραφο του FreeCAD: - - - - Press OK to install anyway. - Πατήστε OK για εγκατάσταση. - - - - - Incompatible Python version - Μη συμβατή έκδοση Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Αυτό το πρόσθετο απαιτεί Python πακέτα που δεν είναι εγκατεστημένα και δεν μπορούν να εγκατασταθούν αυτόματα. Για να χρησιμοποιήσετε αυτό το πρόσθετο πρέπει να εγκαταστήσετε τα ακόλουθα πακέτα Python χειροκίνητα: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Αυτό το Πρόσθετο (ή τα εξαρτήματά του) απαιτεί Python {}.{}, και το σύστημά σας εκτελείται {}.{}. Η εγκατάσταση ακυρώθηκε. - - - - Optional dependency on {} ignored because it is not in the allow-list - Η προαιρετική εξάρτηση από {} αγνοήθηκε επειδή δεν είναι στη λίστα επιτρεπτών - - - - - Installing dependencies - Εγκατάσταση εξαρτήσεων - - - - - Cannot execute Python - Αδυναμία εκτέλεσης Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Απέτυχε ο αυτόματος εντοπισμός του εκτελέσιμου αρχείου Python ή η διαδρομή έχει οριστεί εσφαλμένα. Ελέγξτε τη ρύθμιση προτιμήσεων του Διαχειριστή Προσθέτων για τη διαδρομή προς την Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Δεν ήταν δυνατή η εγκατάσταση των εξαρτήσεων. Θέλετε να συνεχίστε με την εγκατάσταση της {}; - - - - - Cannot execute pip - Αδυναμία εκτέλεσης pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Αποτυχία εκτέλεσης του pip, το οποίο μπορεί να λείπει από την εγκατάσταση της Python. Βεβαιωθείτε ότι το σύστημά σας έχει εγκατασταθεί το pip, προσπαθήστε ξανά. Η αποτυχημένη εντολή ήταν: - - - - - Continue with installation of {} anyway? - Θέλετε οπωσδήποτε να συνεχίσετε με την εγκατάσταση του {} ; - - - - - Package installation failed - Η εγκατάσταση του πακέτου απέτυχε - - - - See Report View for detailed failure log. - Δείτε την Αναφορά Προβολής για λεπτομερή καταγραφή αποτυχίας. - - - - Installing Addon - Εγκατάσταση Πρόσθετου - - - - Installing FreeCAD Addon '{}' - Εγκατάσταση Πρόσθετου FreeCAD '{}' - - - - Cancelling - Ακύρωση - - - - Cancelling installation of '{}' - Ακύρωση εγκατάστασης '{}' - - - - {} was installed successfully - εγκαταστάθηκε επιτυχώς - - - - - Installation Failed - Η εγκατάσταση απέτυχε - - - - Failed to install {} - Αποτυχία εγκατάστασης - - - - - Create new toolbar - Δημιουργία νέας γραμμής εργαλείων - - - - - A macro installed with the FreeCAD Addon Manager - Μια μακροεντολή που έχει εγκατασταθεί με το FreeCAD Διαχειριστή Προσθέτων - - - - - Run - Indicates a macro that can be 'run' - Εκτέλεση - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Δεν είναι δυνατή η ανάγνωση δεδομένων από το GitHub: ελέγξτε τη σύνδεσή σας στο Διαδίκτυο και τις ρυθμίσεις διακομιστή και δοκιμάστε ξανά. - - - - XML failure while reading metadata from file {} - Αποτυχία XML κατά την ανάγνωση μεταδεδομένων από το αρχείο {} - - - - Invalid metadata in file {} - Μη έγκυρα μεταδεδομένα στο αρχείο {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η διαδρομή που καθορίζεται στο package.xml metadata δεν ταιριάζει με αυτόν τον κλάδο που έχει ολοκληρωθεί. - - - - Name - Όνομα - - - - Class - Κλάση - - - - Description - Περιγραφή - - - - Subdirectory - Υποκατάλογος - - - - Files - Αρχεία - - - - Select the folder containing your Addon - Επιλέξτε το φάκελο που περιέχει το πρόσθετο σας - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Χωρίς Vermin, ακύρωση λειτουργίας. - - - - Scanning Addon for Python version compatibility - Σάρωση πρόσθετου για συμβατότητα έκδοσης Python - - - - Minimum Python Version Detected - Εντοπίστηκε Ελάχιστη Έκδοση Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin αυτόματη ανίχνευση μιας απαιτούμενης έκδοσης της Python 3.{} - - - - Install Vermin? - Εγκατάσταση Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Η αυτόματη ανίχνευση της απαιτούμενης έκδοσης της Python για αυτό το πρόσθετο απαιτεί Vermin (https://pypi.org/project/vermin/). Εντάξει για την εγκατάσταση? - - - - Attempting to install Vermin from PyPi - Προσπάθεια εγκατάστασης του Vermin από την PyPi - - - - - Installation failed - Αποτυχία εγκατάστασης - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Αποτυχία εγκατάστασης του Vermin -- ελέγξτε την Αναφορά Προβολή για λεπτομέρειες. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Αποτυχία εισαγωγής Vermin μετά την εγκατάσταση -- Δεν είναι δυνατή η σάρωση Πρόσθετο. - - - - Select an icon file for this package - Επιλέξτε ένα αρχείο εικονιδίων για αυτό το πακέτο - - - - Filter is valid - Το φίλτρο είναι έγκυρο - - - - Filter regular expression is invalid - Η τυπική έκφραση του φίλτρου δεν είναι έγκυρη - - - - Search... - Αναζήτηση... - - - - Click for details about package {} - Κάντε κλικ για λεπτομέρειες σχετικά με το πακέτο {} - - - - Click for details about workbench {} - Κάντε κλικ για λεπτομέρειες σχετικά με τον πάγκο εργασίας {} - - - - Click for details about macro {} - Κάντε κλικ για λεπτομέρειες σχετικά με τη μακροεντολή {} - - - - Maintainers: - Συντηρητές: - - - - Tags - Ετικέτες - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - Όχι ★ ή όχι στο GitHub - - - - Created - Δημιουργήθηκε - - - - Updated - Ενημερώθηκε - - - - Score: - Βαθμολογία: - - - - - Up-to-date - Ενημερωμένο - - - - - - - - Update available - Διαθέσιμη ενημέρωση - - - - - Pending restart - Εκκρεμής επανεκκίνηση - - - - - DISABLED - ΑΠΕΝΕΓΟΠΟΙΗΣΗ - - - - Installed version - Εγκατεστημένη έκδοση - - - - Unknown version - Άγνωστη έκδοση - - - - Installed on - Εγκαταστάθηκε στο - - - - Available version - Διαθέσιμη έκδοση - - - - Filter by... - Φίλτρο από... - - - - Addon Type - Τύπος Πρόσθετου - - - - - Any - Οποιαδήποτε - - - - Macro - Μακροεντολή - - - - Preference Pack - Πακέτο Προτιμήσεων - - - - Installation Status - Κατάσταση Εγκατάστασης - - - - Not installed - Δεν έγινε εγκατάσταση - - - - Filter - Φίλτρο - - - - DANGER: Developer feature - ΚΙΝΔΥΝΟΣ: Λειτουργία προγραμματιστή - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - ΚΙΝΔΥΝΟΣ: Η εναλλαγή τμημάτων προορίζεται για προγραμματιστές και δοκιμαστές beta, αυτό μπορεί να έχει ως αποτέλεσμα σπασμένα έγγραφα, μη συμβατά, αστάθεια, σφάλματα ή/και ξαφνική απώλεια. -Είσαι σίγουρος ότι θέλεις να συνεχίσεις; - - - - There are local changes - Υπάρχουν τοπικές αλλαγές - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ΠΡΟΣΟΧΗ: Αυτό το repo έχει τοπικές αλλαγές που δεν έχουν πραγματοποιηθεί. Είστε σίγουροι ότι θέλετε να αλλάξετε κλάδο (φέρνοντας τις αλλαγές μαζί σας); - - - - Local - Table header for local git ref name - Τοπικό - - - - Remote tracking - Table header for git remote tracking branch name - Απομακρυσμένη παρακολούθηση - - - - Last Updated - Table header for git update date - Τελευταία Ενημέρωση - - - - Installation of Python package {} failed - Η εγκατάσταση του πακέτου Python {} απέτυχε - - - - Installation of optional package failed - Η εγκατάσταση του προαιρετικού πακέτου απέτυχε - - - - Installing required dependency {} - Εγκατάσταση της απαιτούμενης εξάρτησης {} - - - - Installation of Addon {} failed - Η εγκατάσταση του Πρόσθετου {} απέτυχε - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Αποτυχία αποκωδικοποίησης του αρχείου {} για το Πρόσθετο '{}' - - - - Any dependency information in this file will be ignored - Οποιαδήποτε πληροφορία εξάρτησης σε αυτό το αρχείο θα αγνοηθεί - - - - Unable to open macro wiki page at {} - Αδυναμία ανοίγματος σελίδας macro wiki στο {} - - - - Unable to fetch the code of this macro. - Δεν είναι δυνατή η λήψη του κώδικα αυτής της μακροεντολής. - - - - Unable to retrieve a description from the wiki for macro {} - Δεν είναι δυνατή η ανάκτηση μιας περιγραφής από το wiki για την μακροεντολή {} - - - - Unable to open macro code URL {} - Αδυναμία άνοιγμα του URL κωδικού μακροεντολής {} - - - - Unable to fetch macro-specified file {} from {} - Αδύνατη η ανάκτηση του αρχείου που καθορίστηκε μακροεντολή {} από {} - - - - Could not locate macro-specified file {} (expected at {}) - Αδύνατος ο εντοπισμός του αρχείου {} (αναμένεται στις {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Μη αναγνωρισμένος εσωτερικός πάγκος εργασίας '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Προειδοποίηση Πρόσθετου Προγραμματιστή: Το URL του Αποθετηρίου έχει οριστεί στο αρχείο package.xml για πρόσθετο {} ({}) δεν ταιριάζει με το URL που ανακτήθηκε από ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Προειδοποίηση Πρόσθετου Προγραμματιστή: Ο κλάδος αποθετηρίου που ορίστηκε στο αρχείο package.xml για πρόσθετο {} ({}) δεν ταιριάζει με τον κλάδο που ανακτήθηκε από ({}) - - - - - Got an error when trying to import {} - Παρουσιάστηκε σφάλμα κατά την προσπάθεια εισαγωγής του {} - - - - An unknown error occurred - Η λειτουργία απέτυχε λόγω άγνωστου σφάλματος. - - - - Could not find addon {} to remove it. - Δεν ήταν δυνατή η εύρεση του πρόσθετου {} για την κατάργησή του. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Η εκτέλεση του 's uninstall.py Πρόσθετου απέτυχε. Συνέχεια με την απεγκατάσταση... - - - - Removed extra installed file {} - Καταργήθηκε το επιπλέον εγκατεστημένο αρχείο {} - - - - Error while trying to remove extra installed file {} - Σφάλμα κατά την προσπάθεια κατάργησης επιπλέον εγκατεστημένου αρχείου {} - - - - Error while trying to remove macro file {}: - Σφάλμα κατά την αφαίρεση του αρχείου μακροεντολής {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Αποτυχία σύνδεσης στο GitHub. Ελέγξτε τη σύνδεσή σας και τις ρυθμίσεις διαμεσολαβητή. - - - - WARNING: Duplicate addon {} ignored - ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Το διπλό πρόσθετο {} αγνοήθηκε - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Παρουσιάστηκε σφάλμα στην ενημέρωση των μακροεντολών από το GitHub, κατά την προσπάθεια Αποχώρησης… - - - - Attempting to do a clean checkout... - Προσπάθεια καθαρισμού Αποχώρηση... - - - - Clean checkout succeeded - Η κάθαρση ολοκληρώθηκε με επιτυχής έξοδος - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Αποτυχία ενημέρωσης μακροεντολών από το GitHub -- δοκιμάστε να καθαρίσετε την κρυφή μνήμη του Διαχειριστή Προσθέτων's. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Σφάλμα κατά τη σύνδεση με το Wiki, το FreeCAD δεν μπορεί να ανακτήσει τη λίστα μακροεντολών του Wiki αυτή τη στιγμή - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Αποτυχία ανάγνωσης μεταδεδομένων από {name} - - - - Failed to fetch code for macro '{name}' - Αποτυχία λήψης κώδικα για μακροεντολή '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Διαχειριστής Πρόσθετων: μια διαδικασία εργασίας απέτυχε να ολοκληρωθεί κατά τη λήψη του {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Από {num_macros} μακροεντολές, {num_failed} έληξε το χρονικό όριο κατά την επεξεργασία - - - - Addon Manager: a worker process failed to halt ({name}) - Διαχειριστής Πρόσθετων: μια διαδικασία εργασίας απέτυχε να σταματήσει ({name}) - - - - Timeout while fetching metadata for macro {} - Λήξη χρονικού ορίου κατά την ανάκτηση μεταδεδομένων για μακροεντολή {} - - - - Failed to kill process for macro {}! - - Αποτυχία τερματισμού της διαδικασίας για τη μακροεντολή {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Αποτυχία λήψης στατιστικών στοιχείων Πρόσθετου από το {} -- μόνο η αλφαβητική ταξινόμηση θα είναι ακριβής - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Αποτυχία λήψης βαθμολογίας πρόσθετου από '{}' -- η ταξινόμηση κατά βαθμολογία θα αποτύχει - - - - - Repository URL - Preferences header for custom repositories - URL Χώρου Αποθήκευσης - - - - Branch name - Preferences header for custom repositories - Όνομα κλάδου - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Δημιουργία αντιγράφων ασφαλείας του αρχικού καταλόγου και επανα-κλωνοποίηση - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Η μετονομασία κλάδων Git απέτυχε με το ακόλουθο μήνυμα: - - - - Installing - Εγκατάσταση - - - - Succeeded - Επιτεύχθηκε - - - - Failed - Απέτυχε - - - - Update was cancelled - Ακύρωση Ενημέρωσης - - - - some addons may have been updated - κάποια πρόσθετα μπορεί να έχουν ενημερωθεί - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Φόρτωση πληροφοριών για το {} από το wiki μακροεντολών FreeCAD... - - - - Loading page for {} from {}... - Φόρτωση σελίδας για {} από {}... - - - - Failed to download data from {} -- received response code {}. - Αποτυχία λήψης δεδομένων από {} -- κωδικός απάντησης {}. - - - - Composite view - Σύνθετη προβολή - - - - Expanded view - Εκτεταμένη προβολή - - - - Compact view - Συνεπτυγμένη προβολή - - - - Alphabetical - Sort order - Αλφαβητικά - - - - Last Updated - Sort order - Τελευταία Ενημέρωση - - - - Date Created - Sort order - Ημερομηνία Δημιουργίας - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Βαθμολογία - - - - Std_AddonMgr - - - &Addon manager - &Διαχειριστής Πρόσθετων - - - - Manage external workbenches, macros, and preference packs - Διαχείριση εξωτερικών πάγκων εργασίας, μακροεντολών και πακέτων προτιμήσεων - - - - AddonInstaller - - - Finished removing {} - Ολοκληρώθηκε η αφαίρεση {} - - - - Failed to remove some files - Αποτυχία κατάργησης μερικών αρχείων - - - - Addons installer - - - Finished updating the following addons - Ολοκληρώθηκε η ενημέρωση των ακόλουθων Πρόσθετων - - - - Workbench - - - Auto-Created Macro Toolbar - Γραμμή εργαλείων μακροεντολών που δημιουργήθηκε αυτόματα - - - - QObject - - - Addon Manager - Διαχειριστής Πρόσθετων - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_es-AR.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_es-AR.qm deleted file mode 100644 index a79c430e5e..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_es-AR.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_es-AR.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_es-AR.ts deleted file mode 100644 index 1b50b201da..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_es-AR.ts +++ /dev/null @@ -1,2485 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repositorio personalizado - - - - Repository URL - URL del repositorio - - - - Branch - Rama - - - - CompactView - - - - Icon - Ícono - - - - - <b>Package Name</b> - <b>Nombre del paquete</b> - - - - - Version - Versión - - - - - Description - Descripción - - - - Update Available - Actualización disponible - - - - UpdateAvailable - Actualización disponible - - - - DependencyDialog - - - Dependencies - Dependencias - - - - Dependency type - Tipo de dependencia - - - - Name - Nombre - - - - Optional? - Opcional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolver dependencias - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Este complemento tiene las siguientes dependencias requeridas y opcionales. Debes instalarlas antes de que este complemento pueda ser usado. - -¿Quieres que el gestor de complementos los instale automáticamente? Elige "Ignorar" para instalar el complemento sin instalar las dependencias. - - - - FreeCAD Addons - Complementos FreeCAD - - - - Required Python modules - Módulos Python requeridos - - - - Optional Python modules - Módulos Python opcionales - - - - DeveloperModeDialog - - - Addon Developer Tools - Herramientas de desarrollo de complementos - - - - Path to Addon - Ruta al complemento - - - - - Browse... - Navegar... - - - - Metadata - Metadatos - - - - Primary branch - Rama primaria - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explicación de lo que proporciona este complemento. Se muestra en el administrador de complementos. No es necesario que esto indique que este es un complemento de FreeCAD. - - - - Description - Descripción - - - - Discussion URL - URL de discusión - - - - Icon - Ícono - - - - Bugtracker URL - URL del Bugtracker - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilos semánticos (1.2.3-beta) o CalVer (2022.08.30) compatibles - - - - Set to today (CalVer style) - Establecer al día de hoy (estilo CalVer) - - - - - - - (Optional) - (Opcional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Se muestra en la lista del Administrador de complemento's. No debe incluir la palabra "FreeCAD", y debe ser un nombre de directorio válido en todos los sistemas operativos soportados. - - - - README URL - URL del Léame - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - NOTA: Puesto que esto se muestra en FreeCAD, en el Administrador de Complementos, no es necesario ocupar espacio diciendo cosas como "Este es un complemento FreeCAD..." -- simplemente diga lo que hace. - - - - Repository URL - URL del repositorio - - - - Website URL - URL del sitio web - - - - Documentation URL - URL de la documentación - - - - Addon Name - Nombre del complemento - - - - Version - Versión - - - - (Recommended) - (Recomendado) - - - - Minimum Python - Python mínimo - - - - (Optional, only 3.x version supported) - (Opcional, solamente se admite la versión 3.x) - - - - Detect... - Detectar... - - - - Addon Contents - Contenidos del complemento - - - - Dialog - - - Addon Manager - Administrador de Complementos - - - - Edit Tags - Editar etiquetas - - - - Comma-separated list of tags describing this item: - Lista separada por comas de etiquetas que describen este elemento: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - PISTA: Las etiquetas comunes incluyen "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Administrador de complementos: ¡Advertencia! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - El Administrador de complementos proporciona acceso a una amplia biblioteca de útiles extensiones de terceros para FreeCAD. No se pueden ofrecer garantías sobre su seguridad o funcionalidad. - - - - Continue - Continuo - - - - Cancel - Cancelar - - - - EditDependencyDialog - - - Edit Dependency - Editar dependencias - - - - Dependency Type - Tipo de dependencia - - - - Dependency - Dependencia - - - - Package name, if "Other..." - Nombre del paquete, si "Otro..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTA: Si "Otros..." está seleccionado, el paquete no está en el archivo ALLOWED_PYTHON_PACKAGES.txt y no será instalado automáticamente por el administrador de complementos. Envía un PR en <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> para solicitar la adición de un paquete. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Si esta es una dependencia opcional, el administrador de complementos ofrecerá instalarla (cuando sea posible), pero no bloqueará la instalación si el usuario elige o no puede instalar el paquete. - - - - Optional - Opcional - - - - ExpandedView - - - - Icon - Ícono - - - - - <h1>Package Name</h1> - <h1>Nombre del paquete</h1> - - - - - Version - Versión - - - - - (tags) - (etiquetas) - - - - - Description - Descripción - - - - - Maintainer - Mantenedor - - - - Update Available - Actualización disponible - - - - labelSort - Ordenar por etiquetas - - - - UpdateAvailable - Actualización disponible - - - - Form - - - Licenses - Licencias - - - - License - Licencia - - - - License file - Archivo de licencia - - - - People - Personas - - - - Kind - Tipo - - - - Name - Nombre - - - - Email - Correo electrónico - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Mapeo avanzado de versión - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Las próximas versiones del administrador de complementos de FreeCAD soportarán que los desarrolladores configuren una rama o etiqueta específica para su uso con una versión específica de FreeCAD (ej. establecer una etiqueta específica como la última versión de su complemento para soportar v0.19, etc.) - - - - FreeCAD Version - Versión de FreeCAD - - - - Best-available branch, tag, or commit - Mejor rama, etiqueta o confirmación - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versiones FreeCAD soportadas - - - - Minimum FreeCAD Version Supported - Versión mínima de FreeCAD soportada - - - - - Optional - Opcional - - - - Maximum FreeCAD Version Supported - Versión máxima de FreeCAD soportada - - - - Advanced version mapping... - Mapeo avanzado de versión... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opciones del administrador de complementos - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Si se selecciona esta opción, al ejecutar el Administrador de Complementos, -los complementos instalados se comprobarán si hay actualizaciones disponibles - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Descargar metadatos de macros (aproximadamente 10MB) - - - - Cache update frequency - Frecuencia de actualización del caché - - - - Manual (no automatic updates) - Manual (sin actualizaciones automáticas) - - - - Daily - Diariamente - - - - Weekly - Semanal - - - - Hide Addons without a license - Ocultar complementos sin licencia - - - - Hide Addons with non-FSF Free/Libre license - Ocultar complementos con licencia libre sin FSF - - - - Hide Addons with non-OSI-approved license - Ocultar complementos con licencia no aprobada OSI - - - - Hide Addons marked Python 2 Only - Ocultar complementos marcados Python 2 solamente - - - - Hide Addons marked Obsolete - Ocultar complementos marcados como obsoletos - - - - Hide Addons that require a newer version of FreeCAD - Ocultar complementos que requieren una versión más reciente de FreeCAD - - - - Custom repositories - Repositorios personalizados - - - - Proxy - Proxy - - - - No proxy - Sin proxy - - - - User system proxy - Proxy del sistema de usuario - - - - User-defined proxy: - Proxy definido por el usuario: - - - - Score source URL - URL de la fuente de puntuación - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - La URL para los datos de la puntuación del complemento (ver página de la Wiki del Administrador de Complementos para el formato y los detalles del alojamiento). - - - - Path to Git executable (optional): - Ruta al ejecutable de Git (opcional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opciones avanzadas - - - - Activate Addon Manager options intended for developers of new Addons. - Activar opciones del Administrador de Complementos destinadas a los desarrolladores de nuevos complementos. - - - - Addon developer mode - Modo de desarrollador de complementos - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Desinstala un macro o banco de trabajo seleccionado - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Update - Actualizar - - - - Run Macro - Ejecutar Macro - - - - Change branch - Cambiar rama - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Administrar dependencias de Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Los siguientes paquetes de Python han sido instalados localmente por el administrador de complementos para satisfacer las dependencias del complemento. Ubicación de la instalación: - - - - Package name - Nombre del paquete - - - - Installed version - Versión instalada - - - - Available version - Versión disponible - - - - Used by - Usado por - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Un asterisco (*) en la columna "Usado por" columna indica una dependencia opcional. Nota: Tenga en cuenta que sólo se utiliza para registrar las importaciones directas en el complemento. Otros paquetes Python de los que dependen pueden haber sido instalados también. - - - - Update all available - Instalar todas las actualizaciones disponibles - - - - SelectFromList - - - Dialog - Diálogo - - - - TextLabel - EtiquetaTexto - - - - UpdateAllDialog - - - Updating Addons - Actualización de Complementos o Extensiones - - - - Updating out-of-date addons... - Actualizando complementos obsoletos - - - - addContentDialog - - - Content Item - Elementos de contenido - - - - Content type: - Tipo de contenido: - - - - Macro - Macro - - - - Preference Pack - Paquete de preferencias - - - - Workbench - Banco de trabajo - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Si esto es lo único en el complemento, todos los otros metadatos pueden ser heredados desde el nivel superior, y no necesita ser especificado aquí. - - - - This is the only item in the Addon - Este es el único elemento del complemento - - - - Main macro file - Archivo de macro principal - - - - The file with the macro's metadata in it - El archivo con los metadatos de macro's en él - - - - - - Browse... - Navegar... - - - - Preference Pack Name - Nombre del paquete de preferencias - - - - Workbench class name - Nombre de la clase del banco de trabajo - - - - Class that defines "Icon" data member - Clase que define el "ícono" de miembro de datos - - - - Subdirectory - Subdirectorio - - - - Optional, defaults to name of content item - Opcional, el valor predeterminado es el nombre del elemento de contenido - - - - Icon - Ícono - - - - Optional, defaults to inheriting from top-level Addon - Opcional, el valor por defecto es heredado del complemento de nivel superior - - - - Tags... - Etiquetas... - - - - Dependencies... - Dependencias... - - - - FreeCAD Versions... - Versiones de FreeCAD... - - - - Other Metadata - Otros metadatos - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Mostrado en la lista de complementos del administrador de complementos. No debe incluir la palabra "FreeCAD". - - - - Version - Versión - - - - Description - Descripción - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilos semánticos (1.2.3-beta) o CalVer (2022.08.30) compatibles - - - - Set to today (CalVer style) - Establecer al día de hoy (estilo CalVer) - - - - Display Name - Mostrar Nombre - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Los campos que se dejan en blanco se heredan de los metadatos del complemento de nivel superior, por lo que técnicamente son todos opcionales. Para complementos con varios elementos de contenido, cada elemento debe proporcionar un nombre y una descripción únicos. - - - - add_toolbar_button_dialog - - - Add button? - ¿Añadir botón? - - - - Add a toolbar button for this macro? - ¿Añadir un botón de barra de herramientas para esta macro? - - - - Yes - - - - - No - No - - - - Never - Nunca - - - - change_branch - - - Change Branch - Cambiar Rama - - - - Change to branch: - Cambiar a rama: - - - - copyrightInformationDialog - - - Copyright Information - Información de derechos de autor - - - - Copyright holder: - Titular de derechos de autor: - - - - Copyright year: - Año de copyright: - - - - personDialog - - - Add Person - Añadir persona - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Un mantenedor es alguien con acceso actual al commit en este proyecto. Un autor es cualquiera más al que te gustaría dar crédito. - - - - Name: - Nombre: - - - - Email: - Correo electrónico: - - - - Email is required for maintainers, and optional for authors. - Se requiere correo electrónico para los mantenedores, y opcional para los autores. - - - - proxy_authentication - - - Proxy login required - Se requiere inicio de sesión del proxy - - - - Proxy requires authentication - El proxy requiere autenticación - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Marcador de posición para la dirección del proxy - - - - Realm: - Dominio: - - - - Placeholder for proxy realm - Marcador de posición para el domino proxy - - - - Username - Usuario - - - - Password - Contraseña - - - - selectLicenseDialog - - - Select a license - Seleccionar una licencia - - - - About... - Acerca... - - - - License name: - Nombre de la licencia: - - - - Path to license file: - Ruta de acceso al archivo de licencia: - - - - (if required by license) - (si es requerido por la licencia) - - - - Browse... - Navegar... - - - - Create... - Crear... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Seleccionar barra de herramientas - - - - Select a toolbar to add this macro to: - Seleccione una barra de herramientas para añadir esta macro a: - - - - Ask every time - Preguntar cada vez - - - - toolbar_button - - - - Add button? - ¿Añadir botón? - - - - Add a toolbar button for this macro? - ¿Añadir un botón de barra de herramientas para esta macro? - - - - Yes - - - - - No - No - - - - Never - Nunca - - - - AddonsInstaller - - - Starting up... - Iniciando... - - - - Worker process {} is taking a long time to stop... - Proceso en ejecución {} está tomando mucho tiempo en culminar. - - - - Previous cache process was interrupted, restarting... - - El proceso en memoria anterior fue interrumpido, reiniciando... - - - - Custom repo list changed, forcing recache... - - Se cambió la lista personalizada de repositorios, forzando carga en memoria... - - - - Addon manager - Administrador de complementos - - - - You must restart FreeCAD for changes to take effect. - Debe reiniciar FreeCAD para que los cambios surtan efecto. - - - - Restart now - Reiniciar ahora - - - - Restart later - Reiniciar más adelante - - - - - Refresh local cache - Actualizar caché local - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Actualizando la información en memoria - - - - - Checking for updates... - Buscando actualizaciones... - - - - Temporary installation of macro failed. - La instalación temporal de la macro falló. - - - - - Close - Cerrar - - - - Update all addons - Actualizar todos los complementos - - - - Check for updates - Comprobar actualizaciones - - - - Python dependencies... - Dependencias de Python... - - - - Developer tools... - Herramientas del desarrollador... - - - - Apply %n available update(s) - Aplicar %n actualización(es) disponible(s) - - - - No updates available - No hay actualizaciones disponibles - - - - - - Cannot launch a new installer until the previous one has finished. - No se puede iniciar un nuevo instalador hasta que el anterior haya terminado. - - - - - - - Maintainer - Mantenedor - - - - - - - Author - Autor - - - - New Python Version Detected - Nueva versión de Python detectada - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Esta parece ser la primera vez que esta versión de Python se usa con el Administrador de Complementos. ¿Quiere instalar las mismas dependencias autoinstaladas? - - - - Processing, please wait... - Procesando, por favor, espere... - - - - - Update - Actualizar - - - - Updating... - Actualizando... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - No se pudo importar QtNetwork -- parece que no está instalado en su sistema. Su proveedor puede tener un paquete para esta dependencia (a menudo llamado "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Error al convertir el puerto proxy especificado '{}' a un número de puerto - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Error de parámetro: conjunto de opciones de proxy mutuamente exclusivas. Reiniciando a valores predeterminados. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Error de parámetro: se indicado proxy de usuario pero no se proporcionó proxy. Reiniciando al valor predeterminado. - - - - Addon Manager: Unexpected {} response from server - Administrador de complementos: Respuesta {} inesperada del servidor - - - - Error with encrypted connection - Error con conexión cifrada - - - - - - Confirm remove - Confirmar eliminación - - - - Are you sure you want to uninstall {}? - ¿Está seguro que desea desinstalar {}? - - - - - - Removing Addon - Eliminando complemento - - - - Removing {} - Eliminando {} - - - - - Uninstall complete - Desinstalación completa - - - - - Uninstall failed - Desinstalación fallida - - - - Version {version} installed on {date} - Versión {version} instalada el {date} - - - - Version {version} installed - Versión {version} instalada - - - - Installed on {date} - Instalado el {date} - - - - - - - Installed - Instalado - - - - Currently on branch {}, name changed to {} - Actualmente en la rama {}, nombre cambiado a {} - - - - Git tag '{}' checked out, no updates possible - Etiqueta Git '{}' marcada, no es posible actualizar - - - - Update check in progress - Comprobación de actualizaciones en progreso - - - - Installation location - Ubicación de instalación - - - - Repository URL - URL del repositorio - - - - Changed to branch '{}' -- please restart to use Addon. - Cambiado a rama '{}' -- por favor reinicie para usar el complemento. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Este complemento ha sido actualizado. Reinicie FreeCAD para ver los cambios. - - - - Disabled - Deshabilitado - - - - Currently on branch {}, update available to version {} - Actualmente en la rama {}, actualización disponible a la versión {} - - - - Update available to version {} - Actualización disponible a la versión {} - - - - This is the latest version available - Esta es la última versión disponible - - - - WARNING: This addon is obsolete - ATENCIÓN: Este complemento está obsoleto - - - - WARNING: This addon is Python 2 only - ADVERTENCIA: Este complemento es sólo Python 2 - - - - WARNING: This addon requires FreeCAD {} - ADVERTENCIA: Este complemento requiere FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ADVERTENCIA: Este complemento está actualmente instalado, pero desactivado. Utilice el botón 'habilitar' para reactivarlo. - - - - This Addon will be enabled next time you restart FreeCAD. - Este complemento se habilitará la próxima vez que reinicie FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Este complemento se desactivará la próxima vez que reinicie FreeCAD. - - - - - - Success - Éxito - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Enable - Habilitar - - - - Disable - Desactivar - - - - - Check for update - Buscar actualizaciones - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Ejecutar - - - - Change branch... - Cambiar rama... - - - - Return to package list - Volver a la lista de paquetes - - - - Checking connection - Comprobando conexión - - - - Checking for connection to GitHub... - Comprobando conexión a GitHub... - - - - Connection failed - Conexión fallida - - - - Missing dependency - Falta dependencia - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - No se pudo importar QtNetwork -- vea la vista de informes para más detalles. Administrador de complementos no disponible. - - - - Other... - For providing a license other than one listed - Otros... - - - - Select the corresponding license file in your Addon - Seleccione el archivo de licencia correspondiente en su complemento - - - - Location for new license file - Ubicación del nuevo archivo de licencia - - - - Received {} response code from server - Recibido {} código de respuesta del servidor - - - - Failed to install macro {} - Error al instalar macro {} - - - - Failed to create installation manifest file: - - Error al crear archivo manifest de instalación: - - - - - Unrecognized content kind '{}' - Tipo de contenido no reconocido '{}' - - - - Unable to locate icon at {} - No se puede localizar el icono en {} - - - - Select an icon file for this content item - Seleccione un archivo de icono para este elemento de contenido - - - - - - {} is not a subdirectory of {} - {} no es un subdirectorio de {} - - - - Select the subdirectory for this content item - Seleccione el subdirectorio para este artículo de contenido - - - - Automatic - Automático - - - - - Workbench - Banco de trabajo - - - - Addon - Complemento - - - - Python - Python - - - - Yes - - - - - Internal Workbench - Banco de trabajo - - - - External Addon - Complemento externo - - - - Python Package - Paquete de Python - - - - - Other... - Otros... - - - - Too many to list - Demasiado para enlistar - - - - - - - - - Missing Requirement - Requisitos faltantes - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - El complemento '{}' requiere '{}', el cual no está disponible en su copia de FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - El complemento '{}' requiere los siguientes bancos de trabajo, los cuales no están disponibles en su copia de FreeCAD: - - - - Press OK to install anyway. - Pulse OK para instalar de todos modos. - - - - - Incompatible Python version - Versión de Python incompatible - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Este complemento requiere paquetes de Python que no están instalados y no se pueden instalar automáticamente. Para utilizar este complemento debe instalar manualmente los siguientes paquetes de Python: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Este complemento (o una de sus dependencias) requiere Python {}.{}, y su sistema está ejecutando {}.{}. La instalación ha sido cancelada. - - - - Optional dependency on {} ignored because it is not in the allow-list - Dependencia opcional de {} ignorada porque no está en la lista permitida - - - - - Installing dependencies - Instalando dependencias - - - - - Cannot execute Python - No se puede ejecutar Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - No se pudo localizar automáticamente el ejecutable de Python, o la ruta está configurada incorrectamente. Por favor, compruebe la configuración de preferencias del administrador de complementos para la ruta a Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - No se pudieron instalar las dependencias. ¿Continuar con la instalación de {} de cualquier forma? - - - - - Cannot execute pip - No se puede ejecutar pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Fallo al ejecutar pip, podría faltar en tu instalación de Python. Por favor, asegúrese de que su sistema tiene pip instalado y vuelva a intentarlo. El comando fallido fue: - - - - - Continue with installation of {} anyway? - ¿Continuar con la instalación de {} de todos modos? - - - - - Package installation failed - Error al instalar el paquete - - - - See Report View for detailed failure log. - Consulte Ver Informe para registro detallado de errores. - - - - Installing Addon - Instalando Complemento - - - - Installing FreeCAD Addon '{}' - Instalando complemento de FreeCAD '{}' - - - - Cancelling - Cancelando - - - - Cancelling installation of '{}' - Cancelando instalación de '{}' - - - - {} was installed successfully - {} fue instalado satisfactoriamente - - - - - Installation Failed - Instalación fallida - - - - Failed to install {} - Error al instalar {} - - - - - Create new toolbar - Crear nueva barra de herramientas - - - - - A macro installed with the FreeCAD Addon Manager - Una macro instalada con el Administrador de Complementos de FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Ejecutar - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - No se han podido leer los datos de GitHub: comprueba tu conexión a Internet y la configuración del proxy e intente de nuevo. - - - - XML failure while reading metadata from file {} - Fallo en archivo XML mientras se leían los metadatos del archivo {} - - - - Invalid metadata in file {} - Metadatos no válidos en el archivo {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - PRECAUCIÓN: La ruta especificada en los metadatos de package.xml no coincide con la rama que se ha realizado actualmente. - - - - Name - Nombre - - - - Class - Clase - - - - Description - Descripción - - - - Subdirectory - Subdirectorio - - - - Files - Archivos - - - - Select the folder containing your Addon - Seleccione la carpeta que contiene su complemento - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Sin Vermin, cancelando operación. - - - - Scanning Addon for Python version compatibility - Examinando el complemento para compatibilidad con la versión de Python - - - - Minimum Python Version Detected - Versión mínima de Python detectada - - - - Vermin auto-detected a required version of Python 3.{} - Vermin ha detectado una versión requerida de Python 3.{} - - - - Install Vermin? - ¿Instalar Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Para detectar automáticamente la versión requerida de Python para este complemento requiere Vermin (https://pypi.org/project/vermin/). ¿Acepta la instalación? - - - - Attempting to install Vermin from PyPi - Intentando instalar Vermin desde PyPi - - - - - Installation failed - Instalación fallida - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Error al instalar Vermin -- compruebe la vista del informe para más detalles. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Error al importar Vermin después de la instalación -- no se puede escanear el complemento. - - - - Select an icon file for this package - Seleccione un ícono para este paquete - - - - Filter is valid - El filtro es válido - - - - Filter regular expression is invalid - La expresión regular del filtro no es válida - - - - Search... - Búsqueda... - - - - Click for details about package {} - Haga clic para obtener detalles sobre el paquete {} - - - - Click for details about workbench {} - Haga clic para obtener detalles sobre el banco de trabajo {} - - - - Click for details about macro {} - Haga clic para obtener detalles sobre la macro {} - - - - Maintainers: - Mantenedores: - - - - Tags - Etiquetas - - - - {} ★ on GitHub - {} ★ en GitHub - - - - No ★, or not on GitHub - Sin ★ o no en GitHub - - - - Created - Creado - - - - Updated - Actualizado - - - - Score: - Puntuación: - - - - - Up-to-date - Al día - - - - - - - - Update available - Actualización disponible - - - - - Pending restart - Reinicio pendiente - - - - - DISABLED - DESHABILITADO - - - - Installed version - Versión instalada - - - - Unknown version - Versión desconocida - - - - Installed on - Instalado el - - - - Available version - Versión disponible - - - - Filter by... - Filtrar por... - - - - Addon Type - Tipo de complemento - - - - - Any - Cualquiera - - - - Macro - Macro - - - - Preference Pack - Paquete de preferencias - - - - Installation Status - Estado de la instalación - - - - Not installed - No instalado - - - - Filter - Filtro - - - - DANGER: Developer feature - PELIGRO: Función de desarrollador - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - PELIGRO: Cambiar las ramas está destinado para desarrolladores y beta testers y puede resultar en rupturas, documentos no compatibles hacia atrás, inestabilidad, cierres abruptos y/o la prematura muerte térmica del universo. ¿Está seguro de que desea continuar? - - - - There are local changes - Hay cambios locales - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ADVERTENCIA: Este repositorio tiene cambios locales no confirmados. ¿Está seguro que desea cambiar de rama (trayendo los cambios contigo)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Rastreo remoto - - - - Last Updated - Table header for git update date - Última actualización - - - - Installation of Python package {} failed - La instalación del paquete de Python {} falló - - - - Installation of optional package failed - La instalación del paquete opcional falló - - - - Installing required dependency {} - Instalando dependencia requerida {} - - - - Installation of Addon {} failed - La instalación del complemento {} falló - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Error al decodificar archivo {} para el complemento '{}' - - - - Any dependency information in this file will be ignored - Cualquier información de dependencia en este archivo será ignorada - - - - Unable to open macro wiki page at {} - No se puede abrir la página de la wiki de la macro en {} - - - - Unable to fetch the code of this macro. - No se puede obtener el código de esta macro. - - - - Unable to retrieve a description from the wiki for macro {} - No se puede recuperar una descripción de la wiki para la macro {} - - - - Unable to open macro code URL {} - No se puede abrir la URL del código de la macro {} - - - - Unable to fetch macro-specified file {} from {} - No se puede obtener el archivo especificado macro {} de {} - - - - Could not locate macro-specified file {} (expected at {}) - No se pudo encontrar el archivo especificado macro {} (se esperaba en {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Banco de trabajo interno no reconocido '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Advertencia de desarrollador de complementos: la URL del repositorio establecida en el archivo package.xml para el complemento {} ({}) no coincide con la URL de la que fue obtenida ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Advertencia de desarrollador de complementos: la rama de repositorio establecida en el archivo package.xml para el complemento {} ({}) no coincide con la rama de la que fue obtenida ({}) - - - - - Got an error when trying to import {} - Se ha producido un error al intentar importar {} - - - - An unknown error occurred - Se produjo un error desconocido - - - - Could not find addon {} to remove it. - No se pudo encontrar el complemento {} para eliminarlo. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Falló la ejecución del script uninstall.py del complemento. Procediendo con la desinstalación... - - - - Removed extra installed file {} - Archivo extra instalado {} eliminado - - - - Error while trying to remove extra installed file {} - Error al intentar eliminar el archivo extra instalado {} - - - - Error while trying to remove macro file {}: - Error al intentar eliminar el archivo macro {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Error al conectar a GitHub. Compruebe su conexión y configuración de proxy. - - - - WARNING: Duplicate addon {} ignored - ADVERTENCIA: Duplicar complemento {} ignorado - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Se ha producido un error al actualizar macros desde GitHub, intentando limpiar el checkout... - - - - Attempting to do a clean checkout... - Intentando hacer una comprobación limpia... - - - - Clean checkout succeeded - Comprobación limpia exitosa - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Error al actualizar macros de GitHub -- intente limpiar la caché del administrador de complementos. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error al conectar a la Wiki, FreeCAD no puede recuperar la lista de macros de la Wiki en este momento - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Error al leer los metadatos de {name} - - - - Failed to fetch code for macro '{name}' - Error al obtener el código para el macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Administrador de complementos: no se pudo completar un proceso al obtener {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - De {num_macros} macros, a {num_failed} se les agotó el tiempo durante el procesamiento - - - - Addon Manager: a worker process failed to halt ({name}) - Administrador de complementos: un proceso de trabajo falló al detenerse ({name}) - - - - Timeout while fetching metadata for macro {} - Tiempo de espera agotado al buscar metadatos para la macro {} - - - - Failed to kill process for macro {}! - - ¡Error al matar el proceso para macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Error al obtener estadísticas del complemento de {} -- solo ordenar alfabeticamente será preciso - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - No se pudo obtener la puntuación del complemento de '{}' -- ordenar por puntuación fallará - - - - - Repository URL - Preferences header for custom repositories - URL del repositorio - - - - Branch name - Preferences header for custom repositories - Nombre de rama - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Copia de seguridad del directorio original y re-clonando - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Error al renombrar la rama Git con el siguiente mensaje: - - - - Installing - Instalando - - - - Succeeded - Éxito - - - - Failed - Falló - - - - Update was cancelled - Actualización cancelada - - - - some addons may have been updated - algunos complementos pueden haber sido actualizados - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Cargando información para {} de la wiki de Recetas de Macros de FreeCAD... - - - - Loading page for {} from {}... - Cargando página para {} desde {}... - - - - Failed to download data from {} -- received response code {}. - Error al descargar datos de {} -- código de respuesta recibido {}. - - - - Composite view - Vista compuesta - - - - Expanded view - Vista extendida - - - - Compact view - Vista compacta - - - - Alphabetical - Sort order - Alfabético - - - - Last Updated - Sort order - Última actualización - - - - Date Created - Sort order - Fecha de creación - - - - GitHub Stars - Sort order - Estrellas de GitHub - - - - Score - Sort order - Puntaje - - - - Std_AddonMgr - - - &Addon manager - &Administrador de complementos - - - - Manage external workbenches, macros, and preference packs - Administrar bancos de trabajo externos, macros y paquetes de preferencias - - - - AddonInstaller - - - Finished removing {} - Se terminó de eliminar {} - - - - Failed to remove some files - Error al eliminar algunos archivos - - - - Addons installer - - - Finished updating the following addons - Finalizó la actualización de los siguientes complementos - - - - Workbench - - - Auto-Created Macro Toolbar - Barra de herramientas de macro creada automáticamente - - - - QObject - - - Addon Manager - Administrador de Complementos - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_es-ES.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_es-ES.qm deleted file mode 100644 index d57db3806f..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_es-ES.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_es-ES.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_es-ES.ts deleted file mode 100644 index 2557902758..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_es-ES.ts +++ /dev/null @@ -1,2485 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repositorio personalizado - - - - Repository URL - URL del repositorio - - - - Branch - Rama - - - - CompactView - - - - Icon - Icono - - - - - <b>Package Name</b> - <b>Nombre del paquete</b> - - - - - Version - Versión - - - - - Description - Descripción - - - - Update Available - Actualización disponible - - - - UpdateAvailable - Actualización disponible - - - - DependencyDialog - - - Dependencies - Dependencias - - - - Dependency type - Tipo de dependencia - - - - Name - Nombre - - - - Optional? - ¿Opcional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolver dependencias - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Este complemento tiene las siguientes dependencias requeridas y opcionales. Debe instalarlas antes de que este complemento pueda ser usado. - -¿Quiere que el administrador de complementos los instale automáticamente? Elija "Ignorar" para instalar el complemento sin instalar las dependencias. - - - - FreeCAD Addons - Complementos de FreeCAD - - - - Required Python modules - Módulos Python requeridos - - - - Optional Python modules - Módulos Python opcionales - - - - DeveloperModeDialog - - - Addon Developer Tools - Herramientas de desarrollo de complementos - - - - Path to Addon - Ruta al complemento - - - - - Browse... - Examinar... - - - - Metadata - Metadatos - - - - Primary branch - Rama primaria - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explicación de lo que proporciona este complemento. Se muestra en el administrador de complementos. No es necesario que esto indique que este es un complemento de FreeCAD. - - - - Description - Descripción - - - - Discussion URL - URL de discusión - - - - Icon - Icono - - - - Bugtracker URL - URL del Bugtracker - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilos semánticos (1.2.3-beta) o CalVer (2022.08.30) compatibles - - - - Set to today (CalVer style) - Establecer al día de hoy (estilo CalVer) - - - - - - - (Optional) - (Opcional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Se muestra en la lista de complementos del administrador de complementos. No debe incluir la palabra "FreeCAD", y debe ser un nombre de directorio válido en todos los sistemas operativos soportados. - - - - README URL - URL del Léame - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Dado que esto se muestra en FreeCAD, en el administrador de complementos, no es necesario ocupar espacio diciendo cosas como "Este es un complemento FreeCAD...." -- simplemente mencione lo que hace. - - - - Repository URL - URL del repositorio - - - - Website URL - URL del sitio web - - - - Documentation URL - URL de la documentación - - - - Addon Name - Nombre del complemento - - - - Version - Versión - - - - (Recommended) - (Recomendado) - - - - Minimum Python - Python mínimo - - - - (Optional, only 3.x version supported) - (Opcional, sólo se admite la versión 3.x) - - - - Detect... - Detectar... - - - - Addon Contents - Contenidos del complemento - - - - Dialog - - - Addon Manager - Administrador de complementos - - - - Edit Tags - Editar etiquetas - - - - Comma-separated list of tags describing this item: - Listado separado por comas de etiquetas que describen este elemento: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - PISTA: Las etiquetas comunes incluyen "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Administrador de complementos: ¡Advertencia! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - El Administrador de complementos proporciona acceso a una amplia biblioteca de útiles extensiones de terceros para FreeCAD. No se pueden ofrecer garantías sobre su seguridad o funcionalidad. - - - - Continue - Continuar - - - - Cancel - Cancelar - - - - EditDependencyDialog - - - Edit Dependency - Editar dependencias - - - - Dependency Type - Tipo de dependencia - - - - Dependency - Dependencia - - - - Package name, if "Other..." - Nombre del paquete, si "Otro..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTA: Si "Otros..." está seleccionado, el paquete no está en el archivo ALLOWED_PYTHON_PACKAGES.txt y no será instalado automáticamente por el administrador de complementos. Envía un PR en <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> para solicitar la adición de un paquete. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Si esta es una dependencia opcional, el administrador de complementos ofrecerá instalarla (cuando sea posible), pero no bloqueará la instalación si el usuario elige o no puede instalar el paquete. - - - - Optional - Opcional - - - - ExpandedView - - - - Icon - Icono - - - - - <h1>Package Name</h1> - <h1>Nombre del paquete</h1> - - - - - Version - Versión - - - - - (tags) - (etiquetas) - - - - - Description - Descripción - - - - - Maintainer - Mantenedor - - - - Update Available - Actualización disponible - - - - labelSort - Ordenar por etiquetas - - - - UpdateAvailable - Actualización disponible - - - - Form - - - Licenses - Licencias - - - - License - Licencia - - - - License file - Archivo de licencia - - - - People - Personas - - - - Kind - Tipo - - - - Name - Nombre - - - - Email - Correo electrónico - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Mapeo avanzado de versión - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Las próximas versiones del administrador de complementos de FreeCAD soportarán que los desarrolladores configuren una rama o etiqueta específica para su uso con una versión específica de FreeCAD (ej. establecer una etiqueta específica como la última versión de su complemento para soportar v0.19, etc.) - - - - FreeCAD Version - Versión de FreeCAD - - - - Best-available branch, tag, or commit - Mejor rama, etiqueta o confirmación - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versiones FreeCAD soportadas - - - - Minimum FreeCAD Version Supported - Versión mínima de FreeCAD soportada - - - - - Optional - Opcional - - - - Maximum FreeCAD Version Supported - Versión máxima de FreeCAD soportada - - - - Advanced version mapping... - Mapeo avanzado de versión... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opciones del administrador de complementos - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Si se selecciona esta opción, al iniciar el Administrador de Complementos, -se comprobarán los complementos instalados para ver si hay actualizaciones disponibles - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Descargar metadatos de macro (aproximadamente 10MB) - - - - Cache update frequency - Frecuencia de actualización del caché - - - - Manual (no automatic updates) - Manual (sin actualizaciones automáticas) - - - - Daily - Diario - - - - Weekly - Semanal - - - - Hide Addons without a license - Ocultar complementos sin licencia - - - - Hide Addons with non-FSF Free/Libre license - Ocultar complementos con licencia libre sin FSF - - - - Hide Addons with non-OSI-approved license - Ocultar complementos con licencia no aprobada OSI - - - - Hide Addons marked Python 2 Only - Ocultar complementos marcados como sólo Python 2 - - - - Hide Addons marked Obsolete - Ocultar complementos marcados como obsoletos - - - - Hide Addons that require a newer version of FreeCAD - Ocultar complementos que requieran una versión más reciente de FreeCAD - - - - Custom repositories - Repositorios personalizados - - - - Proxy - Proxy - - - - No proxy - Sin proxy - - - - User system proxy - Usar proxy del sistema - - - - User-defined proxy: - Proxy definido por el usuario: - - - - Score source URL - URL de la fuente de puntaje - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - La URL para los datos de la puntuación del complemento (ver página de la Wiki del Administrador de Complementos para el formato y los detalles del alojamiento). - - - - Path to Git executable (optional): - Ruta al ejecutable de Git (opcional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opciones avanzadas - - - - Activate Addon Manager options intended for developers of new Addons. - Activar opciones de administrador de complementos destinadas a los desarrolladores de nuevos complementos. - - - - Addon developer mode - Modo de desarrollador de complementos - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Desinstala un macro o banco de trabajo seleccionado - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Update - Actualizar - - - - Run Macro - Ejecutar Macro - - - - Change branch - Cambiar rama - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Administrar dependencias de Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Los siguientes paquetes de Python han sido instalados localmente por el administrador de complementos para satisfacer las dependencias del complemento. Ubicación de la instalación: - - - - Package name - Nombre del paquete - - - - Installed version - Versión instalada - - - - Available version - Versión disponible - - - - Used by - Usado por - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Un asterisco (*) en la columna "Usado por" columna indica una dependencia opcional. Nota: Tenga en cuenta que sólo se utiliza para registrar las importaciones directas en el complemento. Otros paquetes Python de los que dependen pueden haber sido instalados también. - - - - Update all available - Instalar todas las actualizaciones disponibles - - - - SelectFromList - - - Dialog - Diálogo - - - - TextLabel - Etiqueta Texto - - - - UpdateAllDialog - - - Updating Addons - Actualización de Complementos o Extensiones - - - - Updating out-of-date addons... - Actualizando complementos obsoletos - - - - addContentDialog - - - Content Item - Elementos de contenido - - - - Content type: - Tipo de contenido: - - - - Macro - Macro - - - - Preference Pack - Paquete de preferencias - - - - Workbench - Banco de trabajo - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Si esto es lo único en el complemento, todos los otros metadatos pueden ser heredados desde el nivel superior, y no necesita ser especificado aquí. - - - - This is the only item in the Addon - Este es el único elemento del complemento - - - - Main macro file - Archivo de macro principal - - - - The file with the macro's metadata in it - El archivo con los metadatos de macro's en él - - - - - - Browse... - Examinar... - - - - Preference Pack Name - Nombre del paquete de preferencias - - - - Workbench class name - Nombre de la clase del banco de trabajo - - - - Class that defines "Icon" data member - Clase que define el "ícono" de miembro de datos - - - - Subdirectory - Subdirectorio - - - - Optional, defaults to name of content item - Opcional, el valor predeterminado es el nombre del elemento de contenido - - - - Icon - Icono - - - - Optional, defaults to inheriting from top-level Addon - Opcional, el valor por defecto es heredado del complemento de nivel superior - - - - Tags... - Etiquetas... - - - - Dependencies... - Dependencias... - - - - FreeCAD Versions... - Versiones de FreeCAD... - - - - Other Metadata - Otros metadatos - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Mostrado en la lista de complementos del administrador de complementos. No debe incluir la palabra "FreeCAD". - - - - Version - Versión - - - - Description - Descripción - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilos semánticos (1.2.3-beta) o CalVer (2022.08.30) compatibles - - - - Set to today (CalVer style) - Establecer al día de hoy (estilo CalVer) - - - - Display Name - Mostrar Nombre - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Los campos que se dejan en blanco se heredan de los metadatos del complemento de nivel superior, por lo que técnicamente son todos opcionales. Para complementos con varios elementos de contenido, cada elemento debe proporcionar un nombre y una descripción únicos. - - - - add_toolbar_button_dialog - - - Add button? - ¿Añadir botón? - - - - Add a toolbar button for this macro? - ¿Añadir un botón de barra de herramientas para esta macro? - - - - Yes - - - - - No - No - - - - Never - Nunca - - - - change_branch - - - Change Branch - Cambiar Rama - - - - Change to branch: - Cambiar a rama: - - - - copyrightInformationDialog - - - Copyright Information - Información de derechos de autor - - - - Copyright holder: - Titular de derechos de autor: - - - - Copyright year: - Año de copyright: - - - - personDialog - - - Add Person - Añadir persona - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Un mantenedor es alguien con acceso actual al commit en este proyecto. Un autor es cualquiera más al que te gustaría dar crédito. - - - - Name: - Nombre: - - - - Email: - Correo electrónico: - - - - Email is required for maintainers, and optional for authors. - Se requiere correo electrónico para los mantenedores, y opcional para los autores. - - - - proxy_authentication - - - Proxy login required - Se requiere inicio de sesión del proxy - - - - Proxy requires authentication - El proxy requiere autenticación - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Marcador de posición para la dirección del proxy - - - - Realm: - Dominio: - - - - Placeholder for proxy realm - Marcador de posición para el domino proxy - - - - Username - Usuario - - - - Password - Contraseña - - - - selectLicenseDialog - - - Select a license - Seleccionar una licencia - - - - About... - Acerca... - - - - License name: - Nombre de la licencia: - - - - Path to license file: - Ruta de acceso al archivo de licencia: - - - - (if required by license) - (si es requerido por la licencia) - - - - Browse... - Examinar... - - - - Create... - Crear... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Seleccionar barra de herramientas - - - - Select a toolbar to add this macro to: - Seleccione una barra de herramientas para añadir esta macro a: - - - - Ask every time - Preguntar cada vez - - - - toolbar_button - - - - Add button? - ¿Añadir botón? - - - - Add a toolbar button for this macro? - ¿Añadir un botón de barra de herramientas para esta macro? - - - - Yes - - - - - No - No - - - - Never - Nunca - - - - AddonsInstaller - - - Starting up... - Iniciando... - - - - Worker process {} is taking a long time to stop... - Proceso en ejecución {} está tomando mucho tiempo en culminar. - - - - Previous cache process was interrupted, restarting... - - El proceso en memoria anterior fue interrumpido, reiniciando... - - - - Custom repo list changed, forcing recache... - - Se cambió la lista personalizada de repositorios, forzando carga en memoria... - - - - Addon manager - Administrador de complementos - - - - You must restart FreeCAD for changes to take effect. - Debe reiniciar FreeCAD para que los cambios surtan efecto. - - - - Restart now - Reiniciar ahora - - - - Restart later - Reiniciar más adelante - - - - - Refresh local cache - Actualizar caché local - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Actualizando la información en memoria - - - - - Checking for updates... - Buscando actualizaciones... - - - - Temporary installation of macro failed. - La instalación temporal de la macro falló. - - - - - Close - Cerrar - - - - Update all addons - Actualizar todos los complementos - - - - Check for updates - Comprobar actualizaciones - - - - Python dependencies... - Dependencias de Python... - - - - Developer tools... - Herramientas del desarrollador... - - - - Apply %n available update(s) - Aplicar %n actualización(es) disponible(s) - - - - No updates available - No hay actualizaciones disponibles - - - - - - Cannot launch a new installer until the previous one has finished. - No se puede iniciar un nuevo instalador hasta que el anterior haya terminado. - - - - - - - Maintainer - Mantenedor - - - - - - - Author - Autor - - - - New Python Version Detected - Nueva versión de Python detectada - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Esta parece ser la primera vez que esta versión de Python se usa con el Administrador de Complementos. ¿Quiere instalar las mismas dependencias autoinstaladas? - - - - Processing, please wait... - Procesando, por favor, espere... - - - - - Update - Actualizar - - - - Updating... - Actualizando... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - No se pudo importar QtNetwork -- parece que no está instalado en su sistema. Su proveedor puede tener un paquete para esta dependencia (a menudo llamado "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Error al convertir el puerto proxy especificado '{}' a un número de puerto - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Error de parámetro: conjunto de opciones de proxy mutuamente exclusivas. Reiniciando a valores predeterminados. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Error de parámetro: se indicado proxy de usuario pero no se proporcionó proxy. Reiniciando al valor predeterminado. - - - - Addon Manager: Unexpected {} response from server - Administrador de complementos: Respuesta {} inesperada del servidor - - - - Error with encrypted connection - Error con conexión cifrada - - - - - - Confirm remove - Confirmar eliminación - - - - Are you sure you want to uninstall {}? - ¿Está seguro que desea desinstalar {}? - - - - - - Removing Addon - Eliminando complemento - - - - Removing {} - Eliminando {} - - - - - Uninstall complete - Desinstalación completa - - - - - Uninstall failed - Desinstalación fallida - - - - Version {version} installed on {date} - Versión {version} instalada el {date} - - - - Version {version} installed - Versión {version} instalada - - - - Installed on {date} - Instalado el {date} - - - - - - - Installed - Instalado - - - - Currently on branch {}, name changed to {} - Actualmente en la rama {}, nombre cambiado a {} - - - - Git tag '{}' checked out, no updates possible - Etiqueta Git '{}' marcada, no es posible actualizar - - - - Update check in progress - Comprobación de actualizaciones en progreso - - - - Installation location - Ubicación de instalación - - - - Repository URL - URL del repositorio - - - - Changed to branch '{}' -- please restart to use Addon. - Cambiado a rama '{}' -- por favor reinicie para usar el complemento. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Este complemento ha sido actualizado. Reinicie FreeCAD para ver los cambios. - - - - Disabled - Deshabilitado - - - - Currently on branch {}, update available to version {} - Actualmente en la rama {}, actualización disponible a la versión {} - - - - Update available to version {} - Actualización disponible a la versión {} - - - - This is the latest version available - Esta es la última versión disponible - - - - WARNING: This addon is obsolete - ATENCIÓN: Este complemento está obsoleto - - - - WARNING: This addon is Python 2 only - ADVERTENCIA: Este complemento es sólo Python 2 - - - - WARNING: This addon requires FreeCAD {} - ADVERTENCIA: Este complemento requiere FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ADVERTENCIA: Este complemento está actualmente instalado, pero desactivado. Utilice el botón 'habilitar' para reactivarlo. - - - - This Addon will be enabled next time you restart FreeCAD. - Este complemento se habilitará la próxima vez que reinicie FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Este complemento se desactivará la próxima vez que reinicie FreeCAD. - - - - - - Success - Éxito - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Enable - Habilitar - - - - Disable - Deshabilitar - - - - - Check for update - Buscar actualizaciones - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Ejecutar - - - - Change branch... - Cambiar rama... - - - - Return to package list - Volver a la lista de paquetes - - - - Checking connection - Comprobando conexión - - - - Checking for connection to GitHub... - Comprobando conexión a GitHub... - - - - Connection failed - Conexión fallida - - - - Missing dependency - Falta dependencia - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - No se pudo importar QtNetwork -- vea la Vista del Reporte para más detalles. El Administrador de complementos no está disponible. - - - - Other... - For providing a license other than one listed - Otros... - - - - Select the corresponding license file in your Addon - Seleccione el archivo de licencia correspondiente en su complemento - - - - Location for new license file - Ubicación del nuevo archivo de licencia - - - - Received {} response code from server - Recibido {} código de respuesta del servidor - - - - Failed to install macro {} - Error al instalar macro {} - - - - Failed to create installation manifest file: - - Error al crear archivo manifest de instalación: - - - - - Unrecognized content kind '{}' - Tipo de contenido no reconocido '{}' - - - - Unable to locate icon at {} - No se puede localizar el icono en {} - - - - Select an icon file for this content item - Seleccione un archivo de icono para este elemento de contenido - - - - - - {} is not a subdirectory of {} - {} no es un subdirectorio de {} - - - - Select the subdirectory for this content item - Seleccione el subdirectorio para este artículo de contenido - - - - Automatic - Automático - - - - - Workbench - Banco de trabajo - - - - Addon - Complemento - - - - Python - Python - - - - Yes - - - - - Internal Workbench - Banco de trabajo - - - - External Addon - Complemento externo - - - - Python Package - Paquete de Python - - - - - Other... - Otros... - - - - Too many to list - Demasiado para enlistar - - - - - - - - - Missing Requirement - Requisitos faltantes - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - El complemento '{}' requiere '{}', el cual no está disponible en su copia de FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - El complemento '{}' requiere los siguientes bancos de trabajo, los cuales no están disponibles en su copia de FreeCAD: - - - - Press OK to install anyway. - Pulse OK para instalar de todos modos. - - - - - Incompatible Python version - Versión de Python incompatible - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Este complemento requiere paquetes de Python que no están instalados y no se pueden instalar automáticamente. Para utilizar este complemento debe instalar manualmente los siguientes paquetes de Python: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Este complemento (o una de sus dependencias) requiere Python {}.{}, y su sistema está ejecutando {}.{}. La instalación ha sido cancelada. - - - - Optional dependency on {} ignored because it is not in the allow-list - Dependencia opcional de {} ignorada porque no está en la lista permitida - - - - - Installing dependencies - Instalando dependencias - - - - - Cannot execute Python - No se puede ejecutar Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - No se pudo localizar automáticamente el ejecutable de Python, o la ruta está configurada incorrectamente. Por favor, compruebe la configuración de preferencias del Administrador de complementos para la ruta a Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - No se pudieron instalar las dependencias. ¿Continuar con la instalación de {} de cualquier forma? - - - - - Cannot execute pip - No se puede ejecutar pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Fallo al ejecutar pip, podría faltar en tu instalación de Python. Por favor, asegúrese de que su sistema tiene pip instalado y vuelva a intentarlo. El comando fallido fue: - - - - - Continue with installation of {} anyway? - ¿Continuar con la instalación de {} de todos modos? - - - - - Package installation failed - Error al instalar el paquete - - - - See Report View for detailed failure log. - Consulte Ver Informe para registro detallado de errores. - - - - Installing Addon - Instalando Complemento - - - - Installing FreeCAD Addon '{}' - Instalando complemento de FreeCAD '{}' - - - - Cancelling - Cancelando - - - - Cancelling installation of '{}' - Cancelando instalación de '{}' - - - - {} was installed successfully - {} fue instalado satisfactoriamente - - - - - Installation Failed - Instalación fallida - - - - Failed to install {} - Error al instalar {} - - - - - Create new toolbar - Crear nueva barra de herramientas - - - - - A macro installed with the FreeCAD Addon Manager - Una macro instalada con el administrador de complementos de FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Ejecutar - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - No se han podido leer los datos de GitHub: comprueba tu conexión a Internet y la configuración del proxy e intente de nuevo. - - - - XML failure while reading metadata from file {} - Fallo en archivo XML mientras se leían los metadatos del archivo {} - - - - Invalid metadata in file {} - Metadatos no válidos en el archivo {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - PRECAUCIÓN: La ruta especificada en los metadatos de package.xml no coincide con la rama que se ha realizado actualmente. - - - - Name - Nombre - - - - Class - Clase - - - - Description - Descripción - - - - Subdirectory - Subdirectorio - - - - Files - Archivos - - - - Select the folder containing your Addon - Seleccione la carpeta que contiene su complemento - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Sin Vermin, cancelando operación. - - - - Scanning Addon for Python version compatibility - Examinando el complemento para compatibilidad con la versión de Python - - - - Minimum Python Version Detected - Versión mínima de Python detectada - - - - Vermin auto-detected a required version of Python 3.{} - Vermin ha detectado una versión requerida de Python 3.{} - - - - Install Vermin? - ¿Instalar Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Para detectar automáticamente la versión requerida de Python para este complemento requiere Vermin (https://pypi.org/project/vermin/). ¿Acepta la instalación? - - - - Attempting to install Vermin from PyPi - Intentando instalar Vermin desde PyPi - - - - - Installation failed - Instalación fallida - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Error al instalar Vermin -- compruebe la vista del informe para más detalles. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Error al importar Vermin después de la instalación -- no se puede escanear el complemento. - - - - Select an icon file for this package - Seleccione un ícono para este paquete - - - - Filter is valid - El filtro es válido - - - - Filter regular expression is invalid - La expresión regular del filtro no es válida - - - - Search... - Buscar... - - - - Click for details about package {} - Haga clic para obtener detalles sobre el paquete {} - - - - Click for details about workbench {} - Haga clic para obtener detalles sobre el banco de trabajo {} - - - - Click for details about macro {} - Haga clic para obtener detalles sobre la macro {} - - - - Maintainers: - Mantenedores: - - - - Tags - Etiquetas - - - - {} ★ on GitHub - {} ★ en GitHub - - - - No ★, or not on GitHub - Sin ★, o no está en GitHub - - - - Created - Creado - - - - Updated - Actualizado - - - - Score: - Puntuación: - - - - - Up-to-date - Al día - - - - - - - - Update available - Actualización disponible - - - - - Pending restart - Reinicio pendiente - - - - - DISABLED - DESHABILITADO - - - - Installed version - Versión instalada - - - - Unknown version - Versión desconocida - - - - Installed on - Instalado el - - - - Available version - Versión disponible - - - - Filter by... - Filtrar por... - - - - Addon Type - Tipo de complemento - - - - - Any - Cualquiera - - - - Macro - Macro - - - - Preference Pack - Paquete de preferencias - - - - Installation Status - Estado de la instalación - - - - Not installed - No instalado - - - - Filter - Filtro - - - - DANGER: Developer feature - PELIGRO: Función de desarrollador - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - PELIGRO: Cambiar las ramas está destinado para desarrolladores y beta testers y puede resultar en rupturas, documentos no compatibles hacia atrás, inestabilidad, cierres abruptos y/o la prematura muerte térmica del universo. ¿Está seguro de que desea continuar? - - - - There are local changes - Hay cambios locales - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ADVERTENCIA: Este repositorio tiene cambios locales no confirmados. ¿Está seguro que desea cambiar de rama (trayendo los cambios contigo)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Rastreo remoto - - - - Last Updated - Table header for git update date - Actualizado por última vez - - - - Installation of Python package {} failed - La instalación del paquete de Python {} falló - - - - Installation of optional package failed - La instalación del paquete opcional falló - - - - Installing required dependency {} - Instalando dependencia requerida {} - - - - Installation of Addon {} failed - La instalación del complemento {} falló - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Error al decodificar archivo {} para el complemento '{}' - - - - Any dependency information in this file will be ignored - Cualquier información de dependencia en este archivo será ignorada - - - - Unable to open macro wiki page at {} - No se puede abrir la página de la wiki de la macro en {} - - - - Unable to fetch the code of this macro. - No se puede obtener el código de esta macro. - - - - Unable to retrieve a description from the wiki for macro {} - No se puede recuperar una descripción de la wiki para la macro {} - - - - Unable to open macro code URL {} - No se puede abrir la URL del código de la macro {} - - - - Unable to fetch macro-specified file {} from {} - No se puede obtener el archivo especificado macro {} de {} - - - - Could not locate macro-specified file {} (expected at {}) - No se pudo encontrar el archivo especifico para la macro {} (se esperaba en {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Banco de trabajo interno no reconocido '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Advertencia de desarrollador de complementos: la URL del repositorio establecida en el archivo package.xml para el complemento {} ({}) no coincide con la URL de la que fue obtenida ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Advertencia de desarrollador de complementos: la rama de repositorio establecida en el archivo package.xml para el complemento {} ({}) no coincide con la rama de la que fue obtenida ({}) - - - - - Got an error when trying to import {} - Se ha producido un error al intentar importar {} - - - - An unknown error occurred - Se produjo un error desconocido - - - - Could not find addon {} to remove it. - No se pudo encontrar el complemento {} para eliminarlo. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Falló la ejecución del script uninstall.py del complemento. Procediendo con la desinstalación... - - - - Removed extra installed file {} - Archivo extra instalado {} eliminado - - - - Error while trying to remove extra installed file {} - Error al intentar eliminar el archivo extra instalado {} - - - - Error while trying to remove macro file {}: - Error al intentar eliminar el archivo macro {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Error al conectar a GitHub. Compruebe su conexión y configuración de proxy. - - - - WARNING: Duplicate addon {} ignored - ADVERTENCIA: Duplicar complemento {} ignorado - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Se ha producido un error al actualizar macros desde GitHub, intentando limpiar el checkout... - - - - Attempting to do a clean checkout... - Intentando hacer una comprobación limpia... - - - - Clean checkout succeeded - Comprobación limpia exitosa - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Error al actualizar macros de GitHub -- intente limpiar la caché del administrador de complementos. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error al conectar a la Wiki, FreeCAD no puede recuperar la lista de macros de la Wiki en este momento - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Error al leer los metadatos de {name} - - - - Failed to fetch code for macro '{name}' - Error al obtener el código para el macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Administrador de complementos: no se pudo completar un proceso al obtener {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - De {num_macros} macros, a {num_failed} se les agotó el tiempo durante el procesamiento - - - - Addon Manager: a worker process failed to halt ({name}) - Administrador de complementos: un proceso de trabajo falló al detenerse ({name}) - - - - Timeout while fetching metadata for macro {} - Tiempo de espera agotado al buscar metadatos para la macro {} - - - - Failed to kill process for macro {}! - - ¡Error al matar el proceso para macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - No se pudieron obtener las estadísticas del complemento de {} -- solo ordenar alfabeticamente será preciso - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - No se pudo obtener la puntuación del complemento de '{}' -- ordenar por puntuación fallará - - - - - Repository URL - Preferences header for custom repositories - URL del repositorio - - - - Branch name - Preferences header for custom repositories - Nombre de rama - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Copia de seguridad del directorio original y re-clonando - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Error al renombrar la rama Git con el siguiente mensaje: - - - - Installing - Instalando - - - - Succeeded - Éxito - - - - Failed - Falló - - - - Update was cancelled - La actualización fue cancelada - - - - some addons may have been updated - algunos complementos podrían haber sido actualizados - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Cargando información para {} de la wiki de Recetas de Macros de FreeCAD... - - - - Loading page for {} from {}... - Cargando página de {} de {}... - - - - Failed to download data from {} -- received response code {}. - Error al descargar datos de {} -- código de respuesta recibido {}. - - - - Composite view - Vista compuesta - - - - Expanded view - Vista extendida - - - - Compact view - Vista compacta - - - - Alphabetical - Sort order - Alfabético - - - - Last Updated - Sort order - Actualizado por última vez - - - - Date Created - Sort order - Fecha de creación - - - - GitHub Stars - Sort order - Estrellas en GitHub - - - - Score - Sort order - Puntuación - - - - Std_AddonMgr - - - &Addon manager - &Administrador de complementos - - - - Manage external workbenches, macros, and preference packs - Administrar bancos de trabajo externos, macros y paquetes de preferencias - - - - AddonInstaller - - - Finished removing {} - Se terminó de eliminar {} - - - - Failed to remove some files - Error al eliminar algunos archivos - - - - Addons installer - - - Finished updating the following addons - Finalizó la actualización de los siguientes complementos - - - - Workbench - - - Auto-Created Macro Toolbar - Barra de herramientas de macros creada automáticamente - - - - QObject - - - Addon Manager - Administrador de complementos - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_eu.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_eu.qm deleted file mode 100644 index 600350a54a..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_eu.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_eu.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_eu.ts deleted file mode 100644 index 6232fc26b4..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_eu.ts +++ /dev/null @@ -1,2486 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Biltegi pertsonalizatua - - - - Repository URL - Biltegiaren URLa - - - - Branch - Adarra - - - - CompactView - - - - Icon - Ikonoa - - - - - <b>Package Name</b> - <b>Pakete-izena</b> - - - - - Version - Bertsioa - - - - - Description - Deskribapena - - - - Update Available - Eguneraketa eskuragarri - - - - UpdateAvailable - Eguneratzea eskuragarri - - - - DependencyDialog - - - Dependencies - Mendekotasunak - - - - Dependency type - Mendekotasun mota - - - - Name - Izena - - - - Optional? - Aukerakoa? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Ebatzi mendekotasunak - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Gehigarri honek derrigorrezko eta aukerako hurrengo mendekotasunak ditu. Haiek instalatu behar dira gehigarria erabili ahal izateko. - -Gehigarrien kudeatzaileak automatikoki instalatu ditzan nahi al duzu? Aukeratu "Ez ikusi" gehigarria mendekotasunik gabe instalatzeko. - - - - FreeCAD Addons - FreeCAD gehigarriak - - - - Required Python modules - Beharrezko Python moduluak - - - - Optional Python modules - Aukerako Python moduluak - - - - DeveloperModeDialog - - - Addon Developer Tools - Gehigarrien garatzaile-tresnak - - - - Path to Addon - Gehigarriaren bide-izena - - - - - Browse... - Arakatu... - - - - Metadata - Metadatuak - - - - Primary branch - Adar nagusia - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Gehigarri honek eskaintzen duenaren azalpena. Gehigarrien kudeatzailean erakutsiko da. Honetarako, ez da derrigorrezkoa adieraztea hau FreeCADerako gehigarri bat dela. - - - - Description - Deskribapena - - - - Discussion URL - Eztabaiden URLa - - - - Icon - Ikonoa - - - - Bugtracker URL - Akats-aztarnariaren URLa - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilo semantikoa (1.2.3-beta) edo egutegi-bertsioena (2022.08.30) onartzen da - - - - Set to today (CalVer style) - Ezarri gaurko data (egutegi-bertsioen estiloa) - - - - - - - (Optional) - (Aukerakoa) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Gehigarrien kudeatzaileko gehigarri-zerrendan bistaratutakoa. Ez luke "FreeCAD", hitza eduki beharko eta onartutako sistema eragile guztietan baliozkoa den direktorio-izena izan beharko luke. - - - - README URL - IRAKURRI FITXATEGIAREN URL-A - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - IRADOKIZUNA: Hau FreeCADen bistaratzen da, gehigarrien kudeatzailean, eta beraz, ez da beharrezkoa espazioa alferrik galtzea "Hau FreeCADen gehigarri bat da..." bezalakoak esanda -- zer egiten duen esan, besterik gabe. - - - - Repository URL - Biltegiaren URLa - - - - Website URL - Webgunearen URLa - - - - Documentation URL - Dokumentazioaren URLa - - - - Addon Name - Gehigarriaren izena - - - - Version - Bertsioa - - - - (Recommended) - (Gomendatua) - - - - Minimum Python - Gutxieneko Python bertsioa - - - - (Optional, only 3.x version supported) - (Aukerakoa, 3.x bertsioa soilik onartzen da) - - - - Detect... - Detektatu... - - - - Addon Contents - Gehigarri-edukiak - - - - Dialog - - - Addon Manager - Gehigarrien kudeatzailea - - - - Edit Tags - Editatu etiketak - - - - Comma-separated list of tags describing this item: - Elementu hau deskribatzen duten etiketen zerrenda, komaz banandua: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - IRADOKIZUNA: Etiketa erabilienak "Assembly", "FEM", "Mesh", "NURBS", etab. dira. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Jarraitu - - - - Cancel - Utzi - - - - EditDependencyDialog - - - Edit Dependency - Editatu mendekotasuna - - - - Dependency Type - Mendekotasun mota - - - - Dependency - Mendekotasuna - - - - Package name, if "Other..." - Paketearen izena, "Beste bat..." bada - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - OHARRA: If "Beste bat..." badago hautatuta, paketea ez dago ALLOWED_PYTHON_PACKAGES.txt fitxategian eta gehigarrien kudeatzaileak ez du automatikoki instalatuko. Bidali PR bat <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> helbidera paketea gehitu dadin. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Aukerako mendekotasun bat bada, gehigarrien kudeatzaileak hura instalatzeko aukera eskainiko du (posible bada), baina ez du instalazioa blokeatuko erabiltzaileak paketea ez instalatzea aukeratzen badu edo instalatu ezin badu. - - - - Optional - Aukerakoa - - - - ExpandedView - - - - Icon - Ikonoa - - - - - <h1>Package Name</h1> - <h1>Pakete-izena</h1> - - - - - Version - Bertsioa - - - - - (tags) - (etiketak) - - - - - Description - Deskribapena - - - - - Maintainer - Mantentzailea - - - - Update Available - Eguneraketa eskuragarri - - - - labelSort - labelSort - - - - UpdateAvailable - Eguneratzea eskuragarri - - - - Form - - - Licenses - Lizentziak - - - - License - Lizentzia - - - - License file - Lizentzia-fitxategia - - - - People - Jendea - - - - Kind - Mota - - - - Name - Izena - - - - Email - Posta elektronikoa - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Bertsioen mapatze aurreratua - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - FreeCADen gehigarrien kudeatzailearen etorkizuneko bertsioetan, garatzaileek adar edo etiketa jakin bat ezarri ahal izango dute FreeCADen bertsio jakin bat erabiltzeko (adibidez, gehigarriaren azken bertsioak v0.19 onartzen badu, etiketa zehatz bat ezarri ahal izango da horretarako) - - - - FreeCAD Version - FreeCAD bertsioa - - - - Best-available branch, tag, or commit - Eskuragarri dagoen adar, etiketa edo egikaritze onena - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Onartutako FreeCAD bertsioak - - - - Minimum FreeCAD Version Supported - Onartutako FreeCAD bertsio zaharrena - - - - - Optional - Aukerakoa - - - - Maximum FreeCAD Version Supported - Onartutako FreeCAD bertsio berriena - - - - Advanced version mapping... - Bertsioen mapatze aurreratua... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Gehigarrien kudeatzailearen aukerak - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Deskargatu makroen metadatuak (10MB inguru) - - - - Cache update frequency - Cachearen eguneratze-maiztasuna - - - - Manual (no automatic updates) - Eskuzkoa (eguneratze automatikorik ez) - - - - Daily - Egunero - - - - Weekly - Astero - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Ezkutatu Python 2 bertsiorako soilik diren gehigarriak - - - - Hide Addons marked Obsolete - Ezkutatu zaharkituta dauden gehigarriak - - - - Hide Addons that require a newer version of FreeCAD - Ezkutatu FreeCADen bertsio berriagoa behar duten gehigarriak - - - - Custom repositories - Biltegi pertsonalizatuak - - - - Proxy - Proxya - - - - No proxy - Proxyrik ez - - - - User system proxy - Erabili sistemaren proxya - - - - User-defined proxy: - Erabilitzaileak definitutako proxya: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Aukera aurreratuak - - - - Activate Addon Manager options intended for developers of new Addons. - Aktibatu gehigarri berriak garatzen dituztenentzako gehigarri-kudeatzailearen aukerak. - - - - Addon developer mode - Gehigarrien garatzaileen modua - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Hautatutako makroa edo lan-mahaia desinstalatzen du - - - - Install - Instalatu - - - - Uninstall - Desinstalatu - - - - Update - Eguneratu - - - - Run Macro - Exekutatu makroa - - - - Change branch - Aldatu adarra - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Kudeatu Python mendekotasunak - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Gehigarrien kudeatzaileak honako Python paketeak instalatu ditu gehigarriaren mendekotasunak betetzeko. Instalazioaren kokapena: - - - - Package name - Paketearen izena - - - - Installed version - Instalatutako bertsioa - - - - Available version - Bertsio eskuragarria - - - - Used by - Nork erabilia: - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - "Nork erabilia" zutabeak asteriskoa (*) badu, aukerako mendekotasun bat dagoela esan nahi du. Kontuan izan 'Nork erabilia' aukerak gehigarriaren inportazio zuzenak soilik erregistratzen dituela. Pakete horiek dituzten beste Python mendekotasunak ere instalatuta egon behar dute. - - - - Update all available - Eguneratu erabilgarri dauden guztiak - - - - SelectFromList - - - Dialog - Elkarrizketa-koadroa - - - - TextLabel - Testu-etiketa - - - - UpdateAllDialog - - - Updating Addons - Gehigarriak eguneratzen - - - - Updating out-of-date addons... - Gehigarri zaharkituak eguneratzen... - - - - addContentDialog - - - Content Item - Eduki-elementua - - - - Content type: - Eduki mota: - - - - Macro - Makroa - - - - Preference Pack - Hobespen-paketea - - - - Workbench - Lan-mahaia - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Hau bada gehigarriko gauza bakarra, beste metadatuak goiko mailatik heredatu daitezke eta ez dira zertan hemen zehaztu behar. - - - - This is the only item in the Addon - Hau gehigarriaren elementu bakarra da - - - - Main macro file - Makro-fitxategi nagusia - - - - The file with the macro's metadata in it - Makroaren metadatuak dituen fitxategia - - - - - - Browse... - Arakatu... - - - - Preference Pack Name - Hobespen-paketearen izena - - - - Workbench class name - Lan-mahaiaren klase-izena - - - - Class that defines "Icon" data member - "Ikonoa" datu-kidea definitzen duen klasea - - - - Subdirectory - Azpidirektorioa - - - - Optional, defaults to name of content item - Aukerakoa, balio lehenetsia eduki-elementuaren izena da - - - - Icon - Ikonoa - - - - Optional, defaults to inheriting from top-level Addon - Aukerakoa, balio lehenetsia goi mailako gehigarritik heredatzea da - - - - Tags... - Etiketak... - - - - Dependencies... - Mendekotasunak... - - - - FreeCAD Versions... - FreeCAD bertsioak... - - - - Other Metadata - Beste metadatu batzuk - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Gehigarrien kudeatzailearen zerrendan erakutsia. Ez du "FreeCAD" hitza eduki behar. - - - - Version - Bertsioa - - - - Description - Deskribapena - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilo semantikoa (1.2.3-beta) edo egutegi-bertsioena (2022.08.30) onartzen da - - - - Set to today (CalVer style) - Ezarri gaurko data (egutegi-bertsioen estiloa) - - - - Display Name - Bistaratze-izena - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Hutsik uzten diren eremu guztiak goi mailako gehigarriaren metadatuetatik heredatzen dira. Beraz, teknikoki denak dira aukerakoak. Eduki-elementu anitz dituzten gehigarrien kasuan, elementu bakoitzak bistaratze-izen eta deskribapen esklusiboa eduki behar du. - - - - add_toolbar_button_dialog - - - Add button? - Gehitu botoia? - - - - Add a toolbar button for this macro? - Gehitu tresna-barrako botoi bat makro honi? - - - - Yes - Bai - - - - No - Ez - - - - Never - Inoiz ez - - - - change_branch - - - Change Branch - Aldatu adarra - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Copyright informazioa - - - - Copyright holder: - Copyrightaren jabea: - - - - Copyright year: - Copyrightaren urtea: - - - - personDialog - - - Add Person - Gehitu pertsona - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Mantentzaileak proiektu honetan egikaritzeko sarbidea dutenak dira. Egileak, lana aitortu nahi diozun beste edozein dira. - - - - Name: - Izena: - - - - Email: - Posta elektronikoa: - - - - Email is required for maintainers, and optional for authors. - Mantentzaileek posta elektronikoko helbidea izan behar dute, eta egileek aukerakoa dute. - - - - proxy_authentication - - - Proxy login required - Proxyan saioa hasi behar da - - - - Proxy requires authentication - Proxyak autentifikazioa behar du - - - - Proxy: - Proxya: - - - - Placeholder for proxy address - Proxy-helbiderako leku-marka - - - - Realm: - Domeinua: - - - - Placeholder for proxy realm - Proxy-domeinurako leku-marka - - - - Username - Erabiltzaile-izena - - - - Password - Pasahitza - - - - selectLicenseDialog - - - Select a license - Hautatu lizentzia - - - - About... - Honi buruz... - - - - License name: - Lizentzia-izena: - - - - Path to license file: - Lizentzia-fitxategiaren bide-izena: - - - - (if required by license) - (lizentziak eskatzen badu) - - - - Browse... - Arakatu... - - - - Create... - Sortu... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Hautatu tresna-barra - - - - Select a toolbar to add this macro to: - Hautatu makro hau zein tresna-barrari gehituko zaion: - - - - Ask every time - Galdetu beti - - - - toolbar_button - - - - Add button? - Gehitu botoia? - - - - Add a toolbar button for this macro? - Gehitu tresna-barrako botoi bat makro honi? - - - - Yes - Bai - - - - No - Ez - - - - Never - Inoiz ez - - - - AddonsInstaller - - - Starting up... - Abiarazten... - - - - Worker process {} is taking a long time to stop... - {} langile-prozesuari kostatzen ari zaio gelditzea... - - - - Previous cache process was interrupted, restarting... - - Aurreko cache-prozesua eten egin da, berrabiarazten... - - - - - Custom repo list changed, forcing recache... - - Biltegi-zerrenda pertsonalizatua aldatu da, berriro cachea sortzen... - - - - - Addon manager - Gehigarrien kudeatzailea - - - - You must restart FreeCAD for changes to take effect. - FreeCAD berrabiarazi behar da aldaketak indarrean sartu daitezen. - - - - Restart now - Berrabiarazi orain - - - - Restart later - Berrabiarazi geroago - - - - - Refresh local cache - Freskatu cache lokala - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Cachea eguneratzen... - - - - - Checking for updates... - Eguneraketak bilatzen... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Itxi - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Ezin da instalatzaile berria abiarazi aurrekoa amaitu baino lehen. - - - - - - - Maintainer - Mantentzailea - - - - - - - Author - Egilea - - - - New Python Version Detected - Pythonen bertsio berria detektatu da - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Badirudi lehen aldia dela Python bertsio hau gehigarrien kudeatzailearekin erabiltzen dela. Autoinstalatutako mendekotasun berak instalatu nahi al dituzu harentzat? - - - - Processing, please wait... - Prozesatzen, itxaron... - - - - - Update - Eguneratu - - - - Updating... - Eguneratzen... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Ezin da QtNetwork inportatu -- ez dirudi zure sisteman instalatuta dagoenik. Agian zure hornitzaileak pakete bat dauka mendekotasun horretarako (sarritan "python3-pyside2.qtnetwork" deitzen da) - - - - Failed to convert the specified proxy port '{}' to a port number - Zehaztutako '{}' proxy-ataka ezin izan da ataka-zenbaki bihurtu - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parametro-errorea: elkar ukatzen duten proxy-aukerak ezarri dira. Balio lehenetsiak ezarriko dira. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parametro-errorea: erabiltzaile-proxya adierazi da, baina ez da proxyrik eman. Balio lehenetsiak ezarriko dira. - - - - Addon Manager: Unexpected {} response from server - Gehigarrien kudeatzailea: espero ez zen {} erantzuna zerbitzaritik - - - - Error with encrypted connection - Errorea zifratutako konexioan - - - - - - Confirm remove - Baieztatu kentzea - - - - Are you sure you want to uninstall {}? - Ziur al zaude {} desinstalatu nahi duzula? - - - - - - Removing Addon - Gehigarria kentzen - - - - Removing {} - {} kentzen - - - - - Uninstall complete - Desinstalazioa osatu da - - - - - Uninstall failed - Desinstalazioak huts egin du - - - - Version {version} installed on {date} - {version} bertsioa instalatu da {date} egunean - - - - Version {version} installed - {version} bertsioa instalatu da - - - - Installed on {date} - Instalazio-data: {date} - - - - - - - Installed - Instalatuta - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - '{}' git etiketa egiaztatu da, ezin da eguneratu - - - - Update check in progress - Eguneratzearen egiaztatzea abian - - - - Installation location - Instalazioaren kokapena - - - - Repository URL - Biltegiaren URLa - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Desgaituta - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - ABISUA: Gehigarri hau zaharkituta dago - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ABISUA: Gehigarri hau instalatuta dago, baina desgaituta dago. Erabili 'gaitu' botoia berriro gaitzeko. - - - - This Addon will be enabled next time you restart FreeCAD. - Gehigarri hau FreeCAD berrabiarazten den hurrengoan gaituko da. - - - - This Addon will be disabled next time you restart FreeCAD. - Gehigarri hau FreeCAD berrabiarazten den hurrengoan desgaituko da. - - - - - - Success - Eginda - - - - Install - Instalatu - - - - Uninstall - Desinstalatu - - - - Enable - Gaitu - - - - Disable - Desgaitu - - - - - Check for update - Check for update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - distantzia - - - - Change branch... - Change branch... - - - - Return to package list - Itzuli pakete-zerrendara - - - - Checking connection - Konexioa egiaztatzen - - - - Checking for connection to GitHub... - GitHub-erako konexioa egiaztatzen... - - - - Connection failed - Konexioak huts egin du - - - - Missing dependency - Mendekotasuna falta da - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Ezin izan da QtNetwork inportatu -- ikusi txosten-ikuspegia xehetasunetarako. Gehigarrien kudeatzailea ez dago erabilgarri. - - - - Other... - For providing a license other than one listed - Beste bat... - - - - Select the corresponding license file in your Addon - Hautatu zure gehigarriari dagokion lizentzia-fitxategia - - - - Location for new license file - Lizentzia-fitxategi berriaren kokapena - - - - Received {} response code from server - {} erantzun-kodea jaso da zerbitzaritik - - - - Failed to install macro {} - Ezin izan da {} makroa instalatu - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Eduki mota ezezaguna: '{}' - - - - Unable to locate icon at {} - Ezin da ikonoa hemen aurkitu: {} - - - - Select an icon file for this content item - Hautatu ikono-fitxategi bat eduki-elementu honetarako - - - - - - {} is not a subdirectory of {} - {} ez da {} direktorioaren azpidirektorio bat - - - - Select the subdirectory for this content item - Hautatu eduki-elementu honetarako azpidirektorioa - - - - Automatic - Automatikoa - - - - - Workbench - Lan-mahaia - - - - Addon - Gehigarria - - - - Python - Python - - - - Yes - Bai - - - - Internal Workbench - Barneko lan-mahaia - - - - External Addon - Kanpoko gehigarria - - - - Python Package - Python paketea - - - - - Other... - Beste bat... - - - - Too many to list - Gehiegi zerrendatzeko - - - - - - - - - Missing Requirement - Falta den eskakizuna - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - '{}' gehigarriak '{}' behar du, baina ez dago erabilgarri zure FreeCAD kopian. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - '{}' gehigarriak zure FreeCAD kopian ez dauden honako lan-mahaiak behar ditu: - - - - Press OK to install anyway. - Sakatu 'Ados' instalatzeko. - - - - - Incompatible Python version - Python-en bertsio bateraezina - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - {} gehigarriaren aukerako mendekotasunari ez ikusiarena egin zaio onarpen-zerrendan ez dagoelako - - - - - Installing dependencies - Mendekotasunak instalatzen - - - - - Cannot execute Python - Ezin da Python exekutatu - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Huts egin du Python exekutagarria automatikoki aurkitzeak, edo bide-izena gaizki ezarri da. Begiratu gehigarrien kudeatzailearen hobespenetako ezarpena Python-en bide-izenerako. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Mendekotasunak ezin izan dira instalatu. Jarraitu {} instalatzen? - - - - - Cannot execute pip - Ezin da pip exekutatu - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - {} instalatzen jarraitu nahi duzu? - - - - - Package installation failed - Paketearen instalazioak huts egin du - - - - See Report View for detailed failure log. - Ikusi txostena huts egitearen erregistro xehea kontsultatzeko. - - - - Installing Addon - Gehigarria instalatzen - - - - Installing FreeCAD Addon '{}' - '{}' FreeCAD gehigarria instalatzen - - - - Cancelling - Bertan behera uzten - - - - Cancelling installation of '{}' - '{}' gehigarriaren instalazioa bertan behera uzten - - - - {} was installed successfully - {} ongi instalatu da - - - - - Installation Failed - Instalazioak huts egin du - - - - Failed to install {} - Ezin izan da {} instalatu - - - - - Create new toolbar - Sortu tresna-barra berria - - - - - A macro installed with the FreeCAD Addon Manager - FreeCADen gehigarri-kudeatzailearekin instalatutako makroa - - - - - Run - Indicates a macro that can be 'run' - distantzia - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Ezin dira datuak GitHub-etik irakurri: egiaztatu zure interneteko konexioa eta proxy-ezarpenak eta saiatu berriro. - - - - XML failure while reading metadata from file {} - XML hutsegitea {} fitxategiko metadatuak irakurtzean - - - - Invalid metadata in file {} - Metadatu baliogabeak {} fitxategian - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ABISUA: pacakge.xml metadatuetan zehaztutako bide-izena ez dator bat deskargatutako uneko adarrarekin. - - - - Name - Izena - - - - Class - Klasea - - - - Description - Deskribapena - - - - Subdirectory - Azpidirektorioa - - - - Files - Fitxategiak - - - - Select the folder containing your Addon - Hautatu zure gehigarria duen karpeta - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Ez dago Vermin, eragiketa bertan behera uzten. - - - - Scanning Addon for Python version compatibility - Gehigarria eskaneatzen Python bertsioa bateragarria den jakiteko - - - - Minimum Python Version Detected - Pythonen gutxieneko bertsioa detektatu da - - - - Vermin auto-detected a required version of Python 3.{} - Vermin-ek detektatu du beharrezko Python bertsioa 3.{} dela - - - - Install Vermin? - Vermin instalatu? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Gehigarri honek behar duen Python bertsioa automatikoki detektatzeko, Vermin (https://pypi.org/project/vermin/) instalatu behar da. Instalatu? - - - - Attempting to install Vermin from PyPi - Vermin Pypi bidez instalatzeko saiakera - - - - - Installation failed - Instalazioak huts egin du - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Huts egin du Vermin instalatzeak -- begiratu txosten-bista xehetasun gehiagorako. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Huts egin du vermin inportatzeak hura instalatu ondoren -- ezin da gehigarria eskaneatu. - - - - Select an icon file for this package - Hautatu ikono-fitxategi bat pakete honetarako - - - - Filter is valid - Iragazkia baliozkoa da - - - - Filter regular expression is invalid - Iragazkiaren adierazpen erregularra baliogabea da - - - - Search... - Bilatu... - - - - Click for details about package {} - Egin klik {} paketearen xehetasunak eskuratzeko - - - - Click for details about workbench {} - Egin klik {} lan-mahaiaren xehetasunak eskuratzeko - - - - Click for details about macro {} - Egin klik {} makroaren xehetasunak eskuratzeko - - - - Maintainers: - Mantentzaileak: - - - - Tags - Etiketak - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Noiz sortua: - - - - Updated - Eguneratua: - - - - Score: - Puntuazioa: - - - - - Up-to-date - Eguneratuta - - - - - - - - Update available - Eguneraketa eskuragarri - - - - - Pending restart - Berrabioaren zain - - - - - DISABLED - DESGAITUTA - - - - Installed version - Instalatutako bertsioa - - - - Unknown version - Bertsio ezezaguna - - - - Installed on - Hemen instalatua: - - - - Available version - Bertsio eskuragarria - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Edozein - - - - Macro - Makroa - - - - Preference Pack - Hobespen-paketea - - - - Installation Status - Installation Status - - - - Not installed - Instalatu gabea - - - - Filter - Iragazkia - - - - DANGER: Developer feature - ARRISKUA: Garatzaile-eginbidea - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - ARRISKUA: Adarrez aldatzea garatzaileentzako eta beta bertsioen probatzaileentzako dago pentsatuta. Dokumentu ez bateragarriak, desegonkortasuna, kraskadurak eta unibertsoaren heriotz goiztiarra eragin ditzake. Jarraitu nahi al duzu? - - - - There are local changes - Aldaketa lokalak daude - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - AVBISUA: Biltegi honek egikaritu gabeko aldaketa lokalak ditu. Ziur zaude adarrez aldatu nahi duzula (aldaketak zurekin ekartzeko)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - {} Python paketearen instalazioak huts egin du - - - - Installation of optional package failed - Aukerako paketearen instalazioak huts egin du - - - - Installing required dependency {} - Beharrezkoa den {} mendekotasuna instalatzen - - - - Installation of Addon {} failed - {} gehigarriaren instalazioak huts egin du - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Huts egin du '{}' gehigarrirako {} fitxategia deskodetzeak - - - - Any dependency information in this file will be ignored - Fitxategi honek duen mendekotasun-informazioari ez ikusiarena egingo zaio - - - - Unable to open macro wiki page at {} - Ezin da ireki makroaren {} wiki-orria - - - - Unable to fetch the code of this macro. - Ezin izan da makro honen kodea eskuratu. - - - - Unable to retrieve a description from the wiki for macro {} - Ezin izan da {} makroaren deskribapen bat eskuratu wikitik - - - - Unable to open macro code URL {} - Ezin da ireki makro-kodearen URLa {} - - - - Unable to fetch macro-specified file {} from {} - Ezin da makro bidez zehaztutako {} fitxategia atzitu {} gunetik - - - - Could not locate macro-specified file {} (expected at {}) - Ezin da makroak zehaztutako {} fitxategia aurkitu ({} kokalekuan espero zen) - - - - {}: Unrecognized internal workbench '{}' - {}: Ezagutzen ez den barneko lan-mahaia '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Gehigarrien garatzaileen abisua: {} ({}) gehigarrirako package.xml fitxategian ezarri den biltegi URLa ez dator bat gehigarria atzitu zeneko URLarekin ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Gehigarrien garatzaileen abisua: {} ({}) gehigarrirako package.xml fitxategian ezarri den biltegi-adarra ez dator bat gehigarria atzitu zeneko adarrarekin ({}) - - - - - Got an error when trying to import {} - Errorea gertatu da {} inportatzen saiatzean - - - - An unknown error occurred - Errore ezezaguna gertatu da - - - - Could not find addon {} to remove it. - Ez da aurkitu {} gehigarria hura kendu ahal izateko. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Huts egin du gehigarriaren 'uninstall.py' script-aren exekuzioak. Desinstalatzen jarraitzen... - - - - Removed extra installed file {} - Instalatutako {} fitxategi gehigarria kendu da - - - - Error while trying to remove extra installed file {} - Errorea instalatutako {} fitxategi gehigarria kentzean - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Huts egin du GitHub gunearekin konektatzeak. Egiaztatu konexioa eta proxy-ezarpenak. - - - - WARNING: Duplicate addon {} ignored - ABISUA: Bikoiztutako {} gehigarriari ez ikusiarena egin zaio - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Errorea gertatu da makroak GitHub gunetik eguneratzean, deskarga garbia saiatzen... - - - - Attempting to do a clean checkout... - Deskarga garbia saiatzen... - - - - Clean checkout succeeded - Deskarga garbia ongi gauzatu da - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Huts egin du GitHub guneko makroak egunerateak -- saiatu gehigarrien kudeatzailearen cachea garbitzen. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Errorea wikiarekin konektatzean, FreeCADek ezin du wikiko makro-zerrenda eskuratu momentu honetan - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Huts egin du {name}(e)ko metadatuen irakurketak - - - - Failed to fetch code for macro '{name}' - Huts egin du '{name}' makroaren kodea eskuratzeak - - - - Addon Manager: a worker process failed to complete while fetching {name} - Gehigarrien kudeatzailea: langile-prozesu bat osatzeak huts egin du {name} atzitzean - - - - Out of {num_macros} macros, {num_failed} timed out while processing - {num_macros} makrotatik, {num_failed} denboraz iraungi dira prozesatzean - - - - Addon Manager: a worker process failed to halt ({name}) - Gehigarrien kudeatzailea: langile-prozesu bat gelditzeak huts egin du ({name}) - - - - Timeout while fetching metadata for macro {} - Denbora iraungi da {} makroaren metadatuak atzitzean - - - - Failed to kill process for macro {}! - - Huts egin du {} makroaren prozesua hiltzeak. - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Biltegiaren URLa - - - - Branch name - Preferences header for custom repositories - Adarraren izena - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Jatorrizko direktorioaren babeskopia egiten eta berriro klonatzen - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Instalatzen - - - - Succeeded - Ongi egin da - - - - Failed - Huts egin du - - - - Update was cancelled - Eguneraketa bertan behera geratu da - - - - some addons may have been updated - zenbait gehigarri eguneratu ahal izan dira - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Gehigarrien kudeatzailea - - - - Manage external workbenches, macros, and preference packs - Kudeatu kanpoko lan-mahaiak, makroak eta hobespen-paketeak - - - - AddonInstaller - - - Finished removing {} - {} kentzea amaitu da - - - - Failed to remove some files - Huts egin du zenbait fitxategi kentzeak - - - - Addons installer - - - Finished updating the following addons - Honako gehigarrien eguneraketa amaitu da: - - - - Workbench - - - Auto-Created Macro Toolbar - Makrorako automatikoki sortutako tresna-barra - - - - QObject - - - Addon Manager - Gehigarrien kudeatzailea - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_fi.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_fi.qm deleted file mode 100644 index 7a0cbb71e3..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_fi.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_fi.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_fi.ts deleted file mode 100644 index 26246d13f3..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_fi.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Omavalintainen tietovarasto - - - - Repository URL - Tietovaraston URL-osoite - - - - Branch - Haara - - - - CompactView - - - - Icon - kuvake - - - - - <b>Package Name</b> - <b>Paketin nimi</b> - - - - - Version - Versio - - - - - Description - Kuvaus - - - - Update Available - Päivitys saatavilla - - - - UpdateAvailable - Päivitys saatavilla - - - - DependencyDialog - - - Dependencies - Riippuvuudet - - - - Dependency type - Riippuvuuden tyyppi - - - - Name - Nimi - - - - Optional? - Valinnainen? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Ratkaise riippuvuudet - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Tällä lisäosalla on seuraavat vaaditut ja valinnaiset riippuvuudet. Sinun on asennettava ne ennen kuin tätä lisäosaa voidaan käyttää. - -Haluatko Addon Manager asentaa ne automaattisesti? Valitse "Ohita" asentaaksesi lisäosan ilman riippuvuuksia. - - - - FreeCAD Addons - FreeCAD-lisäosat - - - - Required Python modules - Vaaditut Python-moduulit - - - - Optional Python modules - Valinnaiset Python-moduulit - - - - DeveloperModeDialog - - - Addon Developer Tools - Lisäosien Kehitystyökalut - - - - Path to Addon - Polku lisäosaan - - - - - Browse... - Selaa... - - - - Metadata - Metatiedot - - - - Primary branch - Ensisijainen haara - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Selitys siitä, mitä tämä lisäosa tarjoaa. Näytetään Lisäosien hallinnassa. Ei ole tarpeen todeta, että tämä on FreeCADin lisäosa. - - - - Description - Kuvaus - - - - Discussion URL - Keskustelun URL - - - - Icon - kuvake - - - - Bugtracker URL - Virheiden seurannan URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semanttinen tyyli (1.2.3-beta) ja CalVer-tyyli (2022.08.30) tuettu - - - - Set to today (CalVer style) - Aseta tähän päivään (CalVer-tyyli) - - - - - - - (Optional) - (Valinnainen) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Näytetään Addon Manager's lista Addons. Ei pitäisi sisältää sanaa "FreeCAD", ja täytyy olla kelvollinen hakemiston nimi kaikissa tuetuissa käyttöjärjestelmissä. - - - - README URL - README:n osoite - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - VINKKI: Koska tämä teksti näytetään FreeCADin Lisäosien hallinnassa, ei ole tarpeen käyttää tilaa kertoakseen, että kyseessä on FreeCAD-lisäosa. Sano vain mitä se tekee. - - - - Repository URL - Tietovaraston URL-osoite - - - - Website URL - Sivuston osoite - - - - Documentation URL - Dokumentaation osoite - - - - Addon Name - Lisäosan nimi - - - - Version - Versio - - - - (Recommended) - (Suositeltu) - - - - Minimum Python - Pythonin vähimmäisversio - - - - (Optional, only 3.x version supported) - (Valinnainen, vain versiot 3.x tuettu) - - - - Detect... - Tunnista... - - - - Addon Contents - Lisäosan sisältö - - - - Dialog - - - Addon Manager - Lisäosien hallinta - - - - Edit Tags - Muokkaa tageja - - - - Comma-separated list of tags describing this item: - Pilkulla erotettu luettelo tageista, jotka kuvaavat tätä kohdetta: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - VINKKI: Yleisiä tunnisteita ovat "Assembly", "FEM", "Mesh", "NURBS", jne. - - - - Add-on Manager: Warning! - Lisäosien hallinta: Varoitus! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Add-on Manager tarjoaa pääsyn laajaan kirjastoon hyödyllisiä kolmannen osapuolen FreeCAD -laajennuksia. Turvallisuudesta tai toiminnallisuudesta ei voida antaa takuita. - - - - Continue - Jatka - - - - Cancel - Peruuta - - - - EditDependencyDialog - - - Edit Dependency - Muokkaa riippuvuutta - - - - Dependency Type - Riippuvuuden tyyppi - - - - Dependency - Riippuvuus - - - - Package name, if "Other..." - Paketin nimi, jos "muu..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Valinnainen - - - - ExpandedView - - - - Icon - kuvake - - - - - <h1>Package Name</h1> - <h1>Paketin nimi</h1> - - - - - Version - Versio - - - - - (tags) - (tags) - - - - - Description - Kuvaus - - - - - Maintainer - Ylläpitäjä - - - - Update Available - Päivitys saatavilla - - - - labelSort - labelSort - - - - UpdateAvailable - Päivitys saatavilla - - - - Form - - - Licenses - Lisenssit - - - - License - Lisenssi - - - - License file - Lisenssitiedosto - - - - People - Ihmiset - - - - Kind - Laji - - - - Name - Nimi - - - - Email - Sähköposti - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD:in versio - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Tuetut FreeCAD-versiot - - - - Minimum FreeCAD Version Supported - Pienin tuettu FreeCAD-versio - - - - - Optional - Valinnainen - - - - Maximum FreeCAD Version Supported - Suurin tuettu FreeCAD-versio - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Lisäosien hallinnan asetukset - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Lataa Makrojen metatiedot (noin 10MB) - - - - Cache update frequency - Välimuistin päivitystiheys - - - - Manual (no automatic updates) - Manuaalinen (ei automaattisia päivityksiä) - - - - Daily - Päivittäin - - - - Weekly - Viikottain - - - - Hide Addons without a license - Piilota lisäosat ilman lisenssiä - - - - Hide Addons with non-FSF Free/Libre license - Piilota lisäosat, joilla ei ole FSF Free/Libre -lisenssiä - - - - Hide Addons with non-OSI-approved license - Piilota lisäosat, joiden lisenssi ei ole OSI: n hyväksymä - - - - Hide Addons marked Python 2 Only - Piilota Python 2: lle tarkoitetut lisäosat - - - - Hide Addons marked Obsolete - Piilota lisäosat jotka ovat vanhentuneet - - - - Hide Addons that require a newer version of FreeCAD - Piilota lisäosat, jotka vaativat uudemman version FreeCADista - - - - Custom repositories - Custom repositories - - - - Proxy - Välityspalvelin - - - - No proxy - Ei välityspalvelinta - - - - User system proxy - Käytä järjestelmän välityspalvelinta - - - - User-defined proxy: - Käyttäjän määrittelemä välityspalvelin: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Polku git-suoritustiedostoon (valinnainen): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Lisäasetukset - - - - Activate Addon Manager options intended for developers of new Addons. - Aktivoi Addon Managerin vaihtoehdot, jotka on tarkoitettu uusien lisäosien kehittäjille. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Asenna - - - - Uninstall - Poista asennus - - - - Update - Päivitä - - - - Run Macro - Suorita makro - - - - Change branch - Vaihda haaraa - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Hallitse Python-riippuvuuksia - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Paketin nimi - - - - Installed version - Asennettu versio - - - - Available version - Saatavilla oleva versio - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Päivitä kaikki saatavilla olevat - - - - SelectFromList - - - Dialog - Dialogi - - - - TextLabel - TekstiSelite - - - - UpdateAllDialog - - - Updating Addons - Päivitetään lisäosia - - - - Updating out-of-date addons... - Päivitetään vanhentuneita lisäosia... - - - - addContentDialog - - - Content Item - Sisältökohde - - - - Content type: - Sisältötyyppi: - - - - Macro - Makro - - - - Preference Pack - Preference Pack - - - - Workbench - Työpöytä - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Päämakrotiedosto - - - - The file with the macro's metadata in it - Tiedosto, jossa on makrojen metatiedot - - - - - - Browse... - Selaa... - - - - Preference Pack Name - Asetuspaketin nimi - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - kuvake - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tagit... - - - - Dependencies... - Riippuvuudet... - - - - FreeCAD Versions... - FreeCAD-versiot... - - - - Other Metadata - Muut metatiedot - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versio - - - - Description - Kuvaus - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semanttinen tyyli (1.2.3-beta) ja CalVer-tyyli (2022.08.30) tuettu - - - - Set to today (CalVer style) - Aseta tähän päivään (CalVer-tyyli) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Lisätäänkö painike? - - - - Add a toolbar button for this macro? - Lisää työkalupalkin painike tälle makrolle? - - - - Yes - Kyllä - - - - No - Ei - - - - Never - Ei koskaan - - - - change_branch - - - Change Branch - Vaihda haaraa - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Tekijänoikeustiedot - - - - Copyright holder: - Tekijänoikeuden haltija: - - - - Copyright year: - Tekijänoikeuden vuosi: - - - - personDialog - - - Add Person - Lisää henkilö - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Nimi: - - - - Email: - Sähköposti: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Välityspalvelimen kirjautuminen vaaditaan - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Välityspalvelin: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Käyttäjätunnus - - - - Password - Salasana - - - - selectLicenseDialog - - - Select a license - Valitse lisenssi - - - - About... - Tietoja... - - - - License name: - Lisenssin nimi: - - - - Path to license file: - Polku lisenssitiedostoon: - - - - (if required by license) - (jos lisenssi sitä edellyttää) - - - - Browse... - Selaa... - - - - Create... - Luo... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Valitse työkalupalkki - - - - Select a toolbar to add this macro to: - Valitse työkalurivi, johon tämä makro lisätään: - - - - Ask every time - Kysy joka kerta - - - - toolbar_button - - - - Add button? - Lisätäänkö painike? - - - - Add a toolbar button for this macro? - Lisää työkalupalkin painike tälle makrolle? - - - - Yes - Kyllä - - - - No - Ei - - - - Never - Ei koskaan - - - - AddonsInstaller - - - Starting up... - Käynnistyy... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Lisäosien hallinta - - - - You must restart FreeCAD for changes to take effect. - Käynnistä FreeCAD uudelleen, jotta muutokset tulevat voimaan. - - - - Restart now - Käynnistä uudelleen nyt - - - - Restart later - Käynnistä uudelleen myöhemmin - - - - - Refresh local cache - Päivitä paikallinen välimuisti - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Päivitetään välimuistia... - - - - - Checking for updates... - Tarkistetaan päivityksiä... - - - - Temporary installation of macro failed. - Makron väliaikainen asennus epäonnistui. - - - - - Close - Sulje - - - - Update all addons - Päivitä kaikki lisäosat - - - - Check for updates - Tarkista päivitykset - - - - Python dependencies... - Python-riippuvuudet... - - - - Developer tools... - Kehittäjätyökalut... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - Ei päivityksiä saatavilla - - - - - - Cannot launch a new installer until the previous one has finished. - Uutta asennusta ei voida käynnistää ennen kuin edellinen on valmis. - - - - - - - Maintainer - Ylläpitäjä - - - - - - - Author - Kehittäjä - - - - New Python Version Detected - Uusi Python-versio havaittu - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Käsitellään, odota hetki... - - - - - Update - Päivitä - - - - Updating... - Päivitetään... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Virhe salatussa yhteydessä - - - - - - Confirm remove - Vahvista poisto - - - - Are you sure you want to uninstall {}? - Oletko varma, että haluat poistaa {}? - - - - - - Removing Addon - Poistetaan lisäosa - - - - Removing {} - Poistetaan {} - - - - - Uninstall complete - Asennuksen poisto valmis - - - - - Uninstall failed - Asennuksen poistaminen epäonnistui - - - - Version {version} installed on {date} - Versio {version} asennettu {date} - - - - Version {version} installed - Versio {version} asennettu - - - - Installed on {date} - Asennettu {date} - - - - - - - Installed - Asennettu - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Päivitysten tarkistus käynnissä - - - - Installation location - Asennuksen sijainti - - - - Repository URL - Tietovaraston URL-osoite - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Tämä lisäosa on päivitetty. Käynnistä FreeCAD uudelleen nähdäksesi muutokset. - - - - Disabled - Pois käytöstä - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Päivitys saatavilla versioon {} - - - - This is the latest version available - Tämä on uusin saatavilla oleva versio - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Onnistui - - - - Install - Asenna - - - - Uninstall - Poista asennus - - - - Enable - Käytä - - - - Disable - Ota pois käytöstä - - - - - Check for update - Tarkista päivitykset - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Suorita - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Tarkistetaan yhteyttä - - - - Checking for connection to GitHub... - Tarkistetaan yhteyttä GitHubiin... - - - - Connection failed - Yhteys epäonnistui - - - - Missing dependency - Puuttuva riippuvuus - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automaattinen - - - - - Workbench - Työpöytä - - - - Addon - Lisäosa - - - - Python - Python - - - - Yes - Kyllä - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python-paketti - - - - - Other... - Muu... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Paina OK asentaaksesi joka tapauksessa. - - - - - Incompatible Python version - Yhteensopimaton Python-versio - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Asennetaan riippuvuuksia - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Paketin asennus epäonnistui - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Peruutetaan - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} asennettiin onnistuneesti - - - - - Installation Failed - Asennus epäonnistui - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Luo uusi työkalupalkki - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Suorita - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Nimi - - - - Class - Luokka - - - - Description - Kuvaus - - - - Subdirectory - Subdirectory - - - - Files - Tiedostot - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Asenna Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Asennus epäonnistui - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Suodatin on kelvollinen - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Etsi... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Tags - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Luotu - - - - Updated - Päivitetty - - - - Score: - Score: - - - - - Up-to-date - Ajan tasalla - - - - - - - - Update available - Päivitys saatavilla - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Asennettu versio - - - - Unknown version - Tuntematon versio - - - - Installed on - Asennettu - - - - Available version - Saatavilla oleva versio - - - - Filter by... - Filter by... - - - - Addon Type - Lisäosan tyyppi - - - - - Any - Mikä tahansa - - - - Macro - Makro - - - - Preference Pack - Preference Pack - - - - Installation Status - Asennuksen tila - - - - Not installed - Ei asennettu - - - - Filter - Suodatin - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Paikallinen - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Viimeksi päivitetty - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Tietovaraston URL-osoite - - - - Branch name - Preferences header for custom repositories - Haaran nimi - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Asennetaan - - - - Succeeded - Onnistui - - - - Failed - Epäonnistui - - - - Update was cancelled - Päivitys peruutettiin - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Aakkosjärjestyksessä - - - - Last Updated - Sort order - Viimeksi päivitetty - - - - Date Created - Sort order - Luontipäivä - - - - GitHub Stars - Sort order - GitHub-tähdet - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Lisäosien hallinta - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Seuraavien lisäosien päivittäminen on valmis - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Lisäosien hallinta - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_fil.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_fil.qm deleted file mode 100644 index aaaca96b09..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_fil.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_fil.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_fil.ts deleted file mode 100644 index 84d70b63cb..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_fil.ts +++ /dev/null @@ -1,1168 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Custom repository - - - - Repository URL - Repository URL - - - - Branch - Branch - - - - CompactView - - - Form - Porma - - - - Icon - Imahe - - - - <b>Package Name</b> - <b>Package Name</b> - - - - Version - Bersyon - - - - Description - Paglalarawan - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependencies - - - - Dependency type - Dependency type - - - - Name - Pangalan - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Paglalarawan - - - - Discussion URL - Discussion URL - - - - Icon - Imahe - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Repository URL - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Bersyon - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Addon Manager - - - - Downloading info... - Downloading info... - - - - Pause cache update - Pause cache update - - - - Refresh local cache - Refresh local cache - - - - Download and apply all available updates - Download and apply all available updates - - - - Update all Addons - Update all Addons - - - - Check for updates - Check for updates - - - - View and update Python package dependencies - View and update Python package dependencies - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Close the Addon Manager - Close the Addon Manager - - - - Close - Sarado - - - - Welcome to the Addon Manager - Welcome to the Addon Manager - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Download Settings - Download Settings - - - - Automatically check installed Addons for updates - Automatically check installed Addons for updates - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - No proxy - No proxy - - - - System proxy - System proxy - - - - User-defined proxy: - User-defined proxy: - - - - These and other settings are available in the FreeCAD Preferences window. - These and other settings are available in the FreeCAD Preferences window. - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - Form - Porma - - - - Icon - Imahe - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - Version - Bersyon - - - - (tags) - (tags) - - - - Description - Paglalarawan - - - - Maintainer - Maintainer - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - - Form - Porma - - - - Licenses - Licenses - - - - License - Lisensya - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - Pangalan - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires git) - Automatically check for updates at start (requires git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - - Addons - Addons - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manual (no automatic updates) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Show option to change branches (requires git) - Show option to change branches (requires git) - - - - Disable git (fall back to ZIP downloads only) - Disable git (fall back to ZIP downloads only) - - - - disableGit - disableGit - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - developerMode - developerMode - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Python executable (optional): - Python executable (optional): - - - - The path to the Python executable for package installation with pip. Autodetected if needed and not specified. - The path to the Python executable for package installation with pip. Autodetected if needed and not specified. - - - - git executable (optional): - git executable (optional): - - - - The path to the git executable. Autodetected if needed and not specified. - The path to the git executable. Autodetected if needed and not specified. - - - - Advanced Options - Advanced Options - - - - PackageDetails - - - Form - Porma - - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Install - - - - Uninstall - Uninstall - - - - Update - Update - - - - Run Macro - Run Macro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Diyalogo - - - - TextLabel - TextLabel - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Makro - - - - Preference Pack - Preference Pack - - - - Workbench - Workbench - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Imahe - - - - actualIcon - actualIcon - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Bersyon - - - - Description - Paglalarawan - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch or tag: - Change to branch or tag: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Pangalan: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_fr.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_fr.qm deleted file mode 100644 index 3ee080dc21..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_fr.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_fr.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_fr.ts deleted file mode 100644 index af9baa69b3..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_fr.ts +++ /dev/null @@ -1,2483 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Dépôt personnalisé - - - - Repository URL - URL du dépôt - - - - Branch - Branche - - - - CompactView - - - - Icon - Icône - - - - - <b>Package Name</b> - <b>Nom du paquet</b> - - - - - Version - Version - - - - - Description - Description - - - - Update Available - Mise à jour disponible - - - - UpdateAvailable - Mise à jour disponible - - - - DependencyDialog - - - Dependencies - Dépendances - - - - Dependency type - Type de dépendance - - - - Name - Nom - - - - Optional? - Facultatif ? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Résoudre les dépendances - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Cette extension a les dépendances requises et facultatives suivantes. Vous devez les installer avant que cette extension puisse être utilisée. - -Voulez-vous que le gestionnaire des extensions les installe automatiquement ? Choisissez "Ignorer" pour installer l'extension sans installer les dépendances. - - - - FreeCAD Addons - Extensions de FreeCAD - - - - Required Python modules - Modules nécessaires de Python - - - - Optional Python modules - Modules Python facultatifs - - - - DeveloperModeDialog - - - Addon Developer Tools - Outils pour le développeur d'extensions - - - - Path to Addon - Chemin d'accès vers l'extension - - - - - Browse... - Parcourir... - - - - Metadata - Metadonnés - - - - Primary branch - Branche principale - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explication de ce que cette extension fournit. Affiché dans le gestionnaire des extensions. Il n'est pas nécessaire pour cela d'indiquer qu'il s'agit d'un module FreeCAD. - - - - Description - Description - - - - Discussion URL - URL de discussion - - - - Icon - Icône - - - - Bugtracker URL - URL de suivi des bogues - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Prise en charge des styles Semantic (1.2.3-beta) ou CalVer (2022.08.30) - - - - Set to today (CalVer style) - Régler à aujourd'hui (style CalVer) - - - - - - - (Optional) - (Facultatif) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Affiché dans la liste des extensions du gestionnaire des extensions. Cela ne doit pas inclure le mot "FreeCAD" et doit être un nom de répertoire valide sur tous les systèmes d'exploitation pris en charge. - - - - README URL - URL du README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - ASTUCE : puisque ceci est affiché dans FreeCAD, dans le gestionnaire des extensions, il n'est pas nécessaire de prendre de la place en disant des choses comme "Ceci est une extension de FreeCAD...", dire simplement ce que cela fait. - - - - Repository URL - URL du dépôt - - - - Website URL - URL du site Web - - - - Documentation URL - URL de la documentation - - - - Addon Name - Nom de l’extension - - - - Version - Version - - - - (Recommended) - (Recommandé) - - - - Minimum Python - Version minimum de Python - - - - (Optional, only 3.x version supported) - (Facultatif, seule la version 3.x est prise en charge) - - - - Detect... - Détecter... - - - - Addon Contents - Contenu de l’extension - - - - Dialog - - - Addon Manager - Gestionnaire des extensions - - - - Edit Tags - Modifier les mots-clés - - - - Comma-separated list of tags describing this item: - Liste des mots-clés séparés par des virgules décrivant cet élément : - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - ASTUCE : les mots-clés les plus courants incluent "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Gestionnaire d'extensions : attention ! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Le gestionnaire d'extensions donne accès à une vaste bibliothèque d'extensions tierces de FreeCAD. Aucune garantie ne peut être donnée quant à leur sécurité ou leur fonctionnalité. - - - - Continue - Continuer - - - - Cancel - Annuler - - - - EditDependencyDialog - - - Edit Dependency - Modifier la dépendance - - - - Dependency Type - Type de dépendance - - - - Dependency - Dépendance - - - - Package name, if "Other..." - Nom du paquet, si "Autres..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - REMARQUE : si l'option "Autre..." est sélectionnée, le paquet ne figure pas dans le fichier ALLOWED_PYTHON_PACKAGES.txt et ne sera pas automatiquement installé par le gestionnaire des extensions. Soumettez un PR sur <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> pour demander l'ajout d'un paquet. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - S'il s'agit d'une dépendance facultative, le gestionnaire des extensions proposera de l'installer (quand cela est possible) mais ne bloquera pas l'installation si l'utilisateur choisit de ne pas installer le paquet ou s'il ne peut pas le faire. - - - - Optional - Facultatif - - - - ExpandedView - - - - Icon - Icône - - - - - <h1>Package Name</h1> - <h1>Nom du paquet</h1> - - - - - Version - Version - - - - - (tags) - (mots-clés) - - - - - Description - Description - - - - - Maintainer - Mainteneur - - - - Update Available - Mise à jour disponible - - - - labelSort - Trier par libellés - - - - UpdateAvailable - Mise à jour disponible - - - - Form - - - Licenses - Licences - - - - License - Licence - - - - License file - Fichier de licence - - - - People - Personnes - - - - Kind - Type - - - - Name - Nom - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Correspondance avancée des versions - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Les prochaines versions du gestionnaire des extensions de FreeCAD permettront aux développeurs de définir une branche ou un mot-clé spécifique à utiliser avec une version donnée de FreeCAD (par exemple, définir un mot-clé spécifique comme la dernière version de son extension pour supporter la v0.19, etc.) - - - - FreeCAD Version - Version de FreeCAD - - - - Best-available branch, tag, or commit - La meilleure branche, balise ou commit disponible - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versions de FreeCAD prises en charge - - - - Minimum FreeCAD Version Supported - Version minimale de FreeCAD prise en charge - - - - - Optional - Facultatif - - - - Maximum FreeCAD Version Supported - Version maximale de FreeCAD prise en charge - - - - Advanced version mapping... - Correspondance avancée des versions... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Options du gestionnaire des extensions - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Si cette option est sélectionnée, lors du lancement du gestionnaire des extensions, -les extensions installées seront vérifiées pour les mises à jour disponibles. - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Télécharger les métadonnées des macros (environ 10 Mo) - - - - Cache update frequency - Fréquence de mise à jour du cache - - - - Manual (no automatic updates) - Manuel (pas de mises à jour automatiques) - - - - Daily - Quotidien - - - - Weekly - Hebdomadaire - - - - Hide Addons without a license - Masquer les extensions sans licence - - - - Hide Addons with non-FSF Free/Libre license - Masquer les extensions avec une licence non-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Masquer les extensions avec une licence non approuvée par l'OSI - - - - Hide Addons marked Python 2 Only - Masquer les extensions marquées d'une version Python 2 uniquement - - - - Hide Addons marked Obsolete - Masquer les extensions marquées comme obsolètes - - - - Hide Addons that require a newer version of FreeCAD - Masquer les extensions qui nécessitent une version plus récente de FreeCAD - - - - Custom repositories - Dépôts personnalisés - - - - Proxy - Proxy - - - - No proxy - Pas de proxy - - - - User system proxy - Proxy du système de l'utilisateur - - - - User-defined proxy: - Proxy défini par l'utilisateur : - - - - Score source URL - URL des scores - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - L'URL des données de score de l'extension (voir la page du wiki du gestionnaire des extensions pour les détails de formatage et d'hébergement). - - - - Path to Git executable (optional): - Chemin d'accès vers l'exécutable Git (optionnel) : - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Options avancées - - - - Activate Addon Manager options intended for developers of new Addons. - Activer les options du gestionnaire des extensions destinées aux développeurs des nouvelles extensions. - - - - Addon developer mode - Activer le mode développeur des extensions - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Désinstaller une macro ou un atelier sélectionné - - - - Install - Installer - - - - Uninstall - Désinstaller - - - - Update - Mettre à jour - - - - Run Macro - Lancer la macro - - - - Change branch - Changer de branche - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Gérer les dépendances de Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Les paquets Python suivants ont été installés localement par le gestionnaire des extensions pour satisfaire les dépendances de l'extension. Emplacement de l'installation : - - - - Package name - Nom du paquet - - - - Installed version - Version installée - - - - Available version - Version disponible - - - - Used by - Utilisé par - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Un astérisque (*) dans la colonne "Utilisé par" indique une dépendance facultative. -Remarque : "Utilisé par" n'enregistre que les importations directes dans l'extension. -D'autres paquets Python dont dépendent ces paquets peuvent également avoir été installés. - - - - Update all available - Mettre tout à jour - - - - SelectFromList - - - Dialog - Fenêtre de dialogue - - - - TextLabel - Étiquette de texte - - - - UpdateAllDialog - - - Updating Addons - Mise à jour des extensions - - - - Updating out-of-date addons... - Mise à jour des extensions obsolètes… - - - - addContentDialog - - - Content Item - Élément de contenu - - - - Content type: - Type de contenu : - - - - Macro - Macro - - - - Preference Pack - Kit de préférences - - - - Workbench - Atelier - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Si c'est le seul élément de l'extension, toutes les autres métadonnées peuvent être héritées du niveau supérieur et n'ont pas besoin d'être spécifiées ici. - - - - This is the only item in the Addon - C'est le seul élément de l'extension - - - - Main macro file - Fichier de la macro principale - - - - The file with the macro's metadata in it - Le fichier contenant les métadonnées de la macro - - - - - - Browse... - Parcourir... - - - - Preference Pack Name - Nom du kit de préférences - - - - Workbench class name - Nom de la classe de l'atelier - - - - Class that defines "Icon" data member - Classe qui définit les données membres de "Icône" - - - - Subdirectory - Sous-répertoire - - - - Optional, defaults to name of content item - Optionnel, le nom de l'élément de contenu par défaut - - - - Icon - Icône - - - - Optional, defaults to inheriting from top-level Addon - Optionnel, la valeur par défaut est héritée de l'extension de niveau supérieur - - - - Tags... - Tags... - - - - Dependencies... - Dépendances... - - - - FreeCAD Versions... - Versions de FreeCAD... - - - - Other Metadata - Autres métadonnées - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Affiché dans la liste des extensions du gestionnaire des extensions. Cela ne doit pas inclure le mot "FreeCAD". - - - - Version - Version - - - - Description - Description - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Prise en charge des styles Semantic (1.2.3-beta) ou CalVer (2022.08.30) - - - - Set to today (CalVer style) - Régler à aujourd'hui (style CalVer) - - - - Display Name - Afficher le nom - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Tous les champs laissés vides sont hérités des métadonnées de l'extension de premier niveau, et sont donc techniquement facultatifs. Pour les extensions comportant plusieurs éléments de contenu, chaque élément doit avoir un nom d'affichage et une description uniques. - - - - add_toolbar_button_dialog - - - Add button? - Ajouter un bouton ? - - - - Add a toolbar button for this macro? - Ajouter un bouton de barre d'outils pour cette macro ? - - - - Yes - Oui - - - - No - Non - - - - Never - Jamais - - - - change_branch - - - Change Branch - Changer de branche - - - - Change to branch: - Passer à la branche : - - - - copyrightInformationDialog - - - Copyright Information - Informations sur les droits d'auteur - - - - Copyright holder: - Détenteur des droits d'auteur : - - - - Copyright year: - Année des droits d’auteur : - - - - personDialog - - - Add Person - Ajouter une personne - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Un mainteneur est quelqu'un qui a un accès régulier aux livraisons sur ce projet. Un auteur est tout autre personne à qui vous souhaitez donner du crédit. - - - - Name: - Nom : - - - - Email: - E-mail : - - - - Email is required for maintainers, and optional for authors. - L'e-mail est requis pour les mainteneurs et facultatif pour les auteurs. - - - - proxy_authentication - - - Proxy login required - Une connexion au proxy est requise - - - - Proxy requires authentication - Ce proxy requiert une authentification - - - - Proxy: - Proxy : - - - - Placeholder for proxy address - Emplacement pour l'adresse du proxy - - - - Realm: - Domaine : - - - - Placeholder for proxy realm - Emplacement pour le domaine du proxy - - - - Username - Nom d'utilisateur - - - - Password - Mot de passe  - - - - selectLicenseDialog - - - Select a license - Sélectionner une licence - - - - About... - À propos... - - - - License name: - Nom de la licence : - - - - Path to license file: - Chemin d’accès au fichier de licence : - - - - (if required by license) - (si requis par la licence) - - - - Browse... - Parcourir... - - - - Create... - Créer... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Sélectionner une barre d'outils - - - - Select a toolbar to add this macro to: - Sélectionner une barre d'outils pour y ajouter cette macro : - - - - Ask every time - Toujours demander - - - - toolbar_button - - - - Add button? - Ajouter un bouton ? - - - - Add a toolbar button for this macro? - Ajouter un bouton de barre d'outils pour cette macro ? - - - - Yes - Oui - - - - No - Non - - - - Never - Jamais - - - - AddonsInstaller - - - Starting up... - Démarrage en cours... - - - - Worker process {} is taking a long time to stop... - Le processus de traitement {} prend beaucoup de temps pour s’arrêter... - - - - Previous cache process was interrupted, restarting... - - Le processus du précédent cache a été interrompu, redémarrage... - - - - Custom repo list changed, forcing recache... - - La liste des dépôts personnalisés a changé, ce qui force à relancer le cache... - - - - Addon manager - Gestionnaire des extensions - - - - You must restart FreeCAD for changes to take effect. - Vous devez redémarrer FreeCAD pour que les modifications soient prises en compte. - - - - Restart now - Redémarrer maintenant - - - - Restart later - Redémarrer plus tard - - - - - Refresh local cache - Rafraîchir le cache local - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Mise à jour du cache... - - - - - Checking for updates... - Recherche de mises à jour... - - - - Temporary installation of macro failed. - L'installation temporaire de la macro a échoué. - - - - - Close - Fermer - - - - Update all addons - Mettre à jour toutes les extensions - - - - Check for updates - Vérifier les mises à jour - - - - Python dependencies... - Dépendances de Python... - - - - Developer tools... - Outils pour les développeurs… - - - - Apply %n available update(s) - Appliquer %n mise(s) à jour disponible(s) - - - - No updates available - Aucune mise à jour disponible - - - - - - Cannot launch a new installer until the previous one has finished. - Impossible de lancer un nouveau programme d'installation tant que le précédent n'est pas terminé. - - - - - - - Maintainer - Mainteneur - - - - - - - Author - Auteur - - - - New Python Version Detected - Une nouvelle version de Python a été trouvée - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Cela semble être la première fois que cette version de Python est utilisée avec le gestionnaire des extensions. Voulez-vous installer les mêmes dépendances auto-installées pour cela ? - - - - Processing, please wait... - En cours de traitement, veuillez patienter... - - - - - Update - Mettre à jour - - - - Updating... - Mise à jour en cours... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Impossible d'importer QtNetwork : il ne semble pas être installé sur votre système. Votre fournisseur peut avoir un paquet pour cette dépendance (souvent appelé par exemple "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Impossible de convertir le port du proxy "{}" spécifié en un numéro de port - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Erreur de paramètre : des options de proxy mutuellement exclusives ont été définies. Réinitialisation à la valeur par défaut. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Erreur de paramètre : le proxy de l'utilisateur est indiqué, mais aucun proxy n'est fourni. Réinitialisation à la valeur par défaut. - - - - Addon Manager: Unexpected {} response from server - Gestionnaire des extensions : réponse inattendue {} du serveur - - - - Error with encrypted connection - Erreur avec la connexion chiffrée - - - - - - Confirm remove - Confirmer la suppression - - - - Are you sure you want to uninstall {}? - Êtes-vous sûr de vouloir désinstaller {} ? - - - - - - Removing Addon - Suppression de l'extension - - - - Removing {} - Suppression de {} - - - - - Uninstall complete - Désinstallation terminée - - - - - Uninstall failed - Échec de la désinstallation - - - - Version {version} installed on {date} - Version {version} installée le {date} - - - - Version {version} installed - Version {version} installée - - - - Installed on {date} - Installé le {date} - - - - - - - Installed - Installé - - - - Currently on branch {}, name changed to {} - Pour le moment sur la branche {}, le nom a été changé en {} - - - - Git tag '{}' checked out, no updates possible - La balise de git "{}" a été retirée, aucune mise à jour possible. - - - - Update check in progress - Recherche de mise à jour en cours - - - - Installation location - Emplacement de l’installation - - - - Repository URL - URL du dépôt - - - - Changed to branch '{}' -- please restart to use Addon. - A changé pour la branche "{}". Redémarrer pour utiliser l'extension. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Cette extension a été mise à jour. Redémarrer FreeCAD pour voir les changements. - - - - Disabled - Désactivé - - - - Currently on branch {}, update available to version {} - Actuellement sur la branche {}, une mise à jour est disponible vers la version {}. - - - - Update available to version {} - Mise à jour disponible vers la version {} - - - - This is the latest version available - Ceci est la dernière version disponible. - - - - WARNING: This addon is obsolete - ATTENTION : cette extension est obsolète. - - - - WARNING: This addon is Python 2 only - ATTENTION : cette extension est seulement en Python 2. - - - - WARNING: This addon requires FreeCAD {} - ATTENTION : cette extension nécessite FreeCAD {}. - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ATTENTION : cette extension est actuellement installée mais désactivée. Utilisez le bouton "Activer" pour la réactiver. - - - - This Addon will be enabled next time you restart FreeCAD. - Cette extension sera activée la prochaine fois que vous redémarrerez FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Cette extension sera désactivée la prochaine fois que vous redémarrerez FreeCAD. - - - - - - Success - Opération réussie - - - - Install - Installer - - - - Uninstall - Désinstaller - - - - Enable - Activer - - - - Disable - Désactiver - - - - - Check for update - Vérifier les mises à jour - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Lancer - - - - Change branch... - Changer de branche... - - - - Return to package list - Retourner à la liste des paquets - - - - Checking connection - Vérification de la connexion - - - - Checking for connection to GitHub... - Vérification de la connexion à GitHub... - - - - Connection failed - La connexion a échoué - - - - Missing dependency - Dépendances manquantes - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Impossible d'importer QtNetwork -- voir la Vue rapport pour plus de détails. Le gestionnaire des extensions n'est pas disponible. - - - - Other... - For providing a license other than one listed - Autre... - - - - Select the corresponding license file in your Addon - Sélectionner le fichier de licence correspondant à votre extension - - - - Location for new license file - Emplacement du nouveau fichier de licence - - - - Received {} response code from server - Réception de {} code de réponse du serveur - - - - Failed to install macro {} - Impossible d'installer la macro {} - - - - Failed to create installation manifest file: - - Impossible de créer le fichier d'information sur l'installation : - - - - Unrecognized content kind '{}' - Type de contenu non reconnu "{}" - - - - Unable to locate icon at {} - Impossible de localiser l'icône à {} - - - - Select an icon file for this content item - Sélectionner un fichier d'icône pour cet élément de contenu. - - - - - - {} is not a subdirectory of {} - {} n'est pas un sous-répertoire de {} - - - - Select the subdirectory for this content item - Sélectionner le sous-répertoire pour cet élément de contenu. - - - - Automatic - Automatique - - - - - Workbench - Atelier - - - - Addon - Extension - - - - Python - Python - - - - Yes - Oui - - - - Internal Workbench - Atelier interne - - - - External Addon - Extension externe - - - - Python Package - Paquet Python - - - - - Other... - Autre... - - - - Too many to list - Trop de valeurs à afficher - - - - - - - - - Missing Requirement - Condition manquante - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - L'extension "{}" nécessite "{}" qui n'est pas disponible dans votre version de FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - L'extension "{}" nécessite les ateliers suivants, qui ne sont pas présents dans votre version de FreeCAD : - - - - Press OK to install anyway. - Appuyez sur OK pour installer quand même. - - - - - Incompatible Python version - Version de Python incompatible - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Cette extension nécessite des paquets Python qui ne sont pas installés et qui ne peuvent pas l'être automatiquement. Pour utiliser cette extension, vous devez installer manuellement les paquets Python suivants : - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Cette extension (ou l'une de ses dépendances) nécessite Python {}.{}, et votre système fonctionne sous {}.{}. L'installation a été annulée. - - - - Optional dependency on {} ignored because it is not in the allow-list - Dépendance facultative sur {} ignorée parce qu’elle n'est pas dans la liste autorisée - - - - - Installing dependencies - Installation des dépendances - - - - - Cannot execute Python - Impossible de lancer Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Impossible de localiser automatiquement votre exécutable en Python ou bien, le chemin d'accès est incorrect. Vérifier le chemin d'accès à Python dans les préférences du gestionnaire des extensions. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Les dépendances n'ont pas pu être installées. Continuer quand même l'installation de {} ? - - - - - Cannot execute pip - Impossible d'exécuter la commande pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Impossible d'exécuter le pip. Il peut être absent de votre installation Python. Assurez-vous que pip est installé sur votre système et réessayez. La commande qui a échoué était : - - - - - Continue with installation of {} anyway? - Continuer l'installation de {} quand même ? - - - - - Package installation failed - L'installation du paquet a échoué - - - - See Report View for detailed failure log. - Voir la Vue rapport pour pour les logs détaillés des défaillances. - - - - Installing Addon - Installer l'extension - - - - Installing FreeCAD Addon '{}' - Installation de l'extension "{}" - - - - Cancelling - Annulation en cours - - - - Cancelling installation of '{}' - Annulation de l'installation de "{}" - - - - {} was installed successfully - {} a été installé avec succès - - - - - Installation Failed - L'installation a échoué - - - - Failed to install {} - Impossible d'installer {} - - - - - Create new toolbar - Créer une nouvelle barre d'outils - - - - - A macro installed with the FreeCAD Addon Manager - Une macro installée avec le gestionnaire des extensions de FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Exécuter - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Impossible de lire les données depuis GitHub : vérifiez votre connexion internet et vos paramètres de proxy et réessayez. - - - - XML failure while reading metadata from file {} - Erreur XML lors de la lecture des métadonnées depuis le fichier {} - - - - Invalid metadata in file {} - Métadonnées non valides dans le fichier {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ATTENTION : le chemin d'accès spécifié dans les métadonnées du package.xml ne correspond pas à la branche actuellement extraite. - - - - Name - Nom - - - - Class - Classe - - - - Description - Description - - - - Subdirectory - Sous-répertoire - - - - Files - Fichiers - - - - Select the folder containing your Addon - Sélectionner le dossier contenant votre extension - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Absence du logiciel Vermin, annulation de l’opération. - - - - Scanning Addon for Python version compatibility - Vérification de la compatibilité de l'extension avec la version de Python - - - - Minimum Python Version Detected - Version minimale de Python détectée - - - - Vermin auto-detected a required version of Python 3.{} - Vermin a détecté le besoin d'une version Python 3.{} - - - - Install Vermin? - Installer Vermin ? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - La détection automatique de la version requise de Python pour cette extension nécessite Vermin (https://pypi.org/project/vermin/). D'accord pour l'installer ? - - - - Attempting to install Vermin from PyPi - Tentative d'installation de Vermin à partir de PyPi - - - - - Installation failed - L'installation a échoué - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Impossible d'installer Vermin. Voir la vue rapport pour plus de détails. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Impossible d'importer Vermin après l'installation. Il n'est pas possible de faire une analyse l'extension. - - - - Select an icon file for this package - Sélectionner un fichier d'icône pour ce paquet - - - - Filter is valid - Le filtre est valide - - - - Filter regular expression is invalid - L'expression régulière du filtre n'est pas valide - - - - Search... - Rechercher... - - - - Click for details about package {} - Cliquer pour plus de détails sur le paquet {} - - - - Click for details about workbench {} - Cliquer pour plus de détails sur l'atelier {} - - - - Click for details about macro {} - Cliquer pour plus de détails sur la macro {} - - - - Maintainers: - Mainteneurs : - - - - Tags - Mots-clés - - - - {} ★ on GitHub - {} ★ sur GitHub - - - - No ★, or not on GitHub - Pas d'★ ou pas sur GitHub - - - - Created - Créé - - - - Updated - Mis à jour - - - - Score: - Score : - - - - - Up-to-date - À jour - - - - - - - - Update available - Mise à jour disponible - - - - - Pending restart - En attente de redémarrage - - - - - DISABLED - DÉSACTIVÉ - - - - Installed version - Version installée - - - - Unknown version - Version inconnue - - - - Installed on - Installé le - - - - Available version - Version disponible - - - - Filter by... - Filtrer par... - - - - Addon Type - Type d'extension - - - - - Any - Tous - - - - Macro - Macro - - - - Preference Pack - Kit de préférences - - - - Installation Status - Statut des installations - - - - Not installed - Non installé - - - - Filter - Filtre - - - - DANGER: Developer feature - DANGER : fonction de développeur - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER : Le passage d'une branche à l'autre est destiné aux développeurs et aux bêta-testeurs, et peut entraîner des documents endommagés et non rétrocompatibles, de l'instabilité, des pannes et/ou la mort prématurée de l'univers... Êtes-vous sûr de vouloir continuer ? - - - - There are local changes - Il y a des changements locaux - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ATTENTION : ce répertoire contient des modifications locales non validées. Êtes-vous sûr de vouloir changer de branche (en apportant les modifications avec vous) ? - - - - Local - Table header for local git ref name - Locale - - - - Remote tracking - Table header for git remote tracking branch name - Suivi à distance - - - - Last Updated - Table header for git update date - Dernière mise à jour - - - - Installation of Python package {} failed - L'installation du paquet Python {} a échoué - - - - Installation of optional package failed - L'installation du paquet facultatif a échoué - - - - Installing required dependency {} - Installation de la dépendance requise {} - - - - Installation of Addon {} failed - L'installation de l'extension {} a échoué. - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Impossible de décoder le fichier {} pour l'extension "{}" - - - - Any dependency information in this file will be ignored - Toutes les informations de dépendance dans ce fichier seront ignorées - - - - Unable to open macro wiki page at {} - Impossible d'ouvrir la page wiki de la macro {} - - - - Unable to fetch the code of this macro. - Impossible de récupérer le code de cette macro. - - - - Unable to retrieve a description from the wiki for macro {} - Impossible de récupérer une description du wiki pour la macro {} - - - - Unable to open macro code URL {} - Impossible d'ouvrir l'URL du code de la macro {} - - - - Unable to fetch macro-specified file {} from {} - Impossible de récupérer le fichier {} spécifié par la macro à partir de {} - - - - Could not locate macro-specified file {} (expected at {}) - Impossible de localiser le fichier {} spécifié par la macro (attendu à {}) - - - - {}: Unrecognized internal workbench '{}' - {} : atelier interne non reconnu "{}" - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Avertissement du développeur de l'extension : l'URL du répertoire défini dans le fichier package.xml pour l'extension {} ({}) ne correspond pas à l'URL depuis laquelle il a été récupéré ({}). - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Avertissement du développeur de l'extension : la branche du répertoire définie dans le fichier package.xml pour l'extension {} ({}) ne correspond pas à la branche depuis laquelle il a été récupéré ({}). - - - - - Got an error when trying to import {} - Une erreur s'est produite lors de l'importation de {} - - - - An unknown error occurred - Une erreur inconnue est survenue - - - - Could not find addon {} to remove it. - Impossible de trouver l'extension {} pour la supprimer. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - L'exécution du script uninstall.py de l'extension a échoué. Poursuite de la désinstallation... - - - - Removed extra installed file {} - Suppression du fichier {} installé en plus - - - - Error while trying to remove extra installed file {} - Erreur lors de la suppression du fichier {} installé en plus - - - - Error while trying to remove macro file {}: - Erreur lors de la suppression du fichier de la macro {} : - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Impossible de connecter à GitHub. Vérifiez vos paramètres de connexion et de proxy. - - - - WARNING: Duplicate addon {} ignored - ATTENTION : l'extension dupliquée {} est ignorée. - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Une erreur est survenue lors de la mise à jour des macros depuis GitHub, en tentant un checkout propre... - - - - Attempting to do a clean checkout... - Tentative de faire un checkout propre... - - - - Clean checkout succeeded - Checkout propre réussi - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Impossible de mettre à jour des macros depuis GitHub. Essayez de vider le cache du gestionnaire des extensions. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Erreur de connexion au wiki : FreeCAD ne peut pas récupérer la liste des macros du wiki pour le moment - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Impossible de lire les métadonnées de {name} - - - - Failed to fetch code for macro '{name}' - Impossible de récupérer le code de la macro "{name}" - - - - Addon Manager: a worker process failed to complete while fetching {name} - Gestionnaire des extensions : un processus n'a pas abouti lors de la récupération de {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Sur {num_macros} macros, {num_failed} sont tombées en panne pendant le traitement - - - - Addon Manager: a worker process failed to halt ({name}) - Gestionnaire des extensions : un processus n'a pas pu arrêter ({name}) - - - - Timeout while fetching metadata for macro {} - Délai de récupération des métadonnées de la macro {} - - - - Failed to kill process for macro {}! - - Impossible d'arrêter la macro {} ! - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Impossible de récupérer les statistiques de l'extension {}, seul le tri par ordre alphabétique sera correct. - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Impossible de récupérer le score de l'extension de "{}". Le tri par score échouera. - - - - Repository URL - Preferences header for custom repositories - URL du dépôt - - - - Branch name - Preferences header for custom repositories - Nom de la branche - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Sauvegarde du répertoire original et re-clonage - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Le renommage de la branche git a échoué avec le message suivant : - - - - Installing - Installation en cours - - - - Succeeded - Opération réussie - - - - Failed - Échec - - - - Update was cancelled - Mise à jour annulée - - - - some addons may have been updated - certaines extensions ont peut-être été mises à jour - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Chargement des informations pour {} à partir de la page du wiki "Liste des macros de FreeCAD..." - - - - Loading page for {} from {}... - Chargement de la page pour {} depuis {}... - - - - Failed to download data from {} -- received response code {}. - Impossible de télécharger les données de {}. Le code de réponse reçu est {}. - - - - Composite view - Vue composite - - - - Expanded view - Vue étendue - - - - Compact view - Vue compacte - - - - Alphabetical - Sort order - Alphabétique - - - - Last Updated - Sort order - Dernière mise à jour - - - - Date Created - Sort order - Date de création - - - - GitHub Stars - Sort order - Étoiles sous GitHub - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Gestionnaire des extensions - - - - Manage external workbenches, macros, and preference packs - Gérer les ateliers externes, les macros et les kits de préférences - - - - AddonInstaller - - - Finished removing {} - Suppression terminée {} - - - - Failed to remove some files - Impossible de supprimer certains fichiers - - - - Addons installer - - - Finished updating the following addons - Mise à jour terminée des extensions suivantes - - - - Workbench - - - Auto-Created Macro Toolbar - Barre d'outils de macro créée automatiquement - - - - QObject - - - Addon Manager - Gestionnaire des extensions - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_gl.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_gl.qm deleted file mode 100644 index 0e55c17f87..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_gl.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_gl.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_gl.ts deleted file mode 100644 index 5f34b2808c..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_gl.ts +++ /dev/null @@ -1,2516 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Custom repository - - - - Repository URL - Repository URL - - - - Branch - Branch - - - - CompactView - - - - Icon - Icona - - - - - <b>Package Name</b> - <b>Package Name</b> - - - - - Version - Versión - - - - - Description - Descrición - - - - Update Available - Update Available - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependencies - - - - Dependency type - Dependency type - - - - Name - Nome - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Descrición - - - - Discussion URL - Discussion URL - - - - Icon - Icona - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Repository URL - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Versión - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Xestor de complementos - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Welcome to the Addon Manager - Welcome to the Addon Manager - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Download Settings - Download Settings - - - - Automatically check installed Addons for updates - Automatically check installed Addons for updates - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - No proxy - Sen proxy - - - - System proxy - System proxy - - - - User-defined proxy: - User-defined proxy: - - - - These and other settings are available in the FreeCAD Preferences window. - These and other settings are available in the FreeCAD Preferences window. - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - - Icon - Icona - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - Versión - - - - - (tags) - (tags) - - - - - Description - Descrición - - - - - Maintainer - Mantedor - - - - Update Available - Update Available - - - - labelSort - labelSort - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - Licenses - Licenses - - - - License - Licenza - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - Nome - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires git) - Automatically check for updates at start (requires git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manual (no automatic updates) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Proxy - Proxy - - - - No proxy - Sen proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to git executable (optional): - Path to git executable (optional): - - - - The path to the git executable. Autodetected if needed and not specified. - The path to the git executable. Autodetected if needed and not specified. - - - - Advanced Options - Advanced Options - - - - Show option to change branches (requires git) - Show option to change branches (requires git) - - - - Disable git (fall back to ZIP downloads only) - Disable git (fall back to ZIP downloads only) - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Instalado - - - - Uninstall - Desinstalar - - - - Update - Actualizar - - - - Run Macro - Executar macro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Xanela de diálogo - - - - TextLabel - TextLabel - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Macro - - - - Preference Pack - Preference Pack - - - - Workbench - Banco de traballo - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Icona - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versión - - - - Description - Descrición - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Cambiar Rama - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Nome: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - AddonsInstaller - - - Starting up... - Starting up... - - - - Loading addon information - Loading addon information - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - Actualiza a caché local - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - Checking for updates... - - - - - Close - Pechar - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - Execution of macro failed. See console for failure details. - Execution of macro failed. See console for failure details. - - - - - - - Maintainer - Mantedor - - - - - - - Author - Autor - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Actualizar - - - - Updating... - Updating... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installation location - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Disabled - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Branch change succeeded, please restart to use the new version. - Branch change succeeded, please restart to use the new version. - - - - Install - Instalado - - - - Uninstall - Desinstalar - - - - Enable - Habilitar - - - - Disable - Inhabilitar - - - - - Check for update - Check for update - - - - Run - Executar - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automática - - - - - Workbench - Banco de traballo - - - - Addon - Complementos - - - - Python - Python - - - - Yes - Yes - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Other... - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually: - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This Addon (or one if its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one if its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Executar - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Nome - - - - Class - Clase - - - - Description - Descrición - - - - Subdirectory - Subdirectory - - - - Files - Ficheiros - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Atopar... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Etiquetas - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Installed version - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Available version - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Calquera - - - - Macro - Macro - - - - Preference Pack - Preference Pack - - - - Installation Status - Installation Status - - - - Not installed - Not installed - - - - Filter - Filtro - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded package.xml for {} - Downloaded package.xml for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Downloaded metadata.txt for {} - Downloaded metadata.txt for {} - - - - Downloaded requirements.txt for {} - Downloaded requirements.txt for {} - - - - Downloaded icon for {} - Downloaded icon for {} - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Git is disabled, skipping git macros - Git is disabled, skipping git macros - - - - Attempting to change non-git Macro setup to use git - - Attempting to change non-git Macro setup to use git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Unable to fetch git updates for workbench {} - Unable to fetch git updates for workbench {} - - - - git status failed for {} - git status failed for {} - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Caching macro code... - Caching macro code... - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Getting metadata from macro {} - Getting metadata from macro {} - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Retrieving macro description... - Retrieving macro description... - - - - Retrieving info from git - Retrieving info from git - - - - Retrieving info from wiki - Retrieving info from wiki - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Repository URL - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic git update failed with the following message: - Basic git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using git - Failed to clone {} into {} using git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Xestor de complementos - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_hr.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_hr.qm deleted file mode 100644 index e709f1e330..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_hr.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_hr.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_hr.ts deleted file mode 100644 index 1d8f9af8d9..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_hr.ts +++ /dev/null @@ -1,2486 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Prilagođeno spremište - - - - Repository URL - URL repozitorija - - - - Branch - Grana - - - - CompactView - - - - Icon - Ikona - - - - - <b>Package Name</b> - <b>Naziv paketa</b> - - - - - Version - Verzija - - - - - Description - Opis - - - - Update Available - Dostupno je ažuriranje - - - - UpdateAvailable - Dostupno ažuriranje - - - - DependencyDialog - - - Dependencies - Ovisnosti - - - - Dependency type - Vrsta ovisnosti - - - - Name - Ime - - - - Optional? - Opcije? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Razriješi zavisnosti - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Ovaj dodatak zahtjeva slijedeće obavezne i neobavezne ovisnosti. Morate instalirati ovisnosti prije nego što ovaj dodatak može biti pokrenut. - -Da li želite da Upravitelj dodacima ih instalira automatski? Odaberi "Ignore" kako bi instalirali dodatak bez da intalirate ovisnosti. - - - - FreeCAD Addons - FreeCAD Dodatci - - - - Required Python modules - Potrebni Python moduli - - - - Optional Python modules - Opcionalni Python moduli - - - - DeveloperModeDialog - - - Addon Developer Tools - Alati dodataka za razvojne programere - - - - Path to Addon - Put do Dodatka - - - - - Browse... - Pretraživati... - - - - Metadata - Metapodaci - - - - Primary branch - Glavna grana - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Objašnjenje onoga što ovaj dodatak pruža. Prikazuje se u Upravitelju dodataka. Nije potrebno navesti da je to dodatak FreeCAD-a. - - - - Description - Opis - - - - Discussion URL - URL adresa diskusije - - - - Icon - Ikona - - - - Bugtracker URL - URL adresa sustava za praćenje pogrešaka - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Podržani su stilovi Semantic (1.2.3-beta) ili CalVer (2022.08.30) - - - - Set to today (CalVer style) - Podesi na danas (CalVer stil) - - - - - - - (Optional) - (Opcionalno) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Prikazuje se u popisu dodataka upravitelja dodataka. Ne smije sadržavati riječ "FreeCAD" i mora biti valjano ime direktorija na svim podržanim operativnim sustavima. - - - - README URL - URL README (pročitaj) - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - Savjet: Budući da se ovo prikazuje u FreeCAD-u, u upravitelju dodataka, nije potrebno gubiti prostor govoreći stvari poput "Ovo je dodatak FreeCAD-a..." -- samo recite što ono radi. - - - - Repository URL - URL repozitorija - - - - Website URL - URL adresa web stranice - - - - Documentation URL - URL adresa dokumentacije - - - - Addon Name - Ime Dodatka - - - - Version - Verzija - - - - (Recommended) - (Preporučeno) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Opcionalno, podržana je samo verzija 3.x) - - - - Detect... - Otkri... - - - - Addon Contents - Sadržaj dodatka - - - - Dialog - - - Addon Manager - Upravitelj dodataka - - - - Edit Tags - Uredi Oznake - - - - Comma-separated list of tags describing this item: - Lista tagova odvojenih zarezom opisuje ovu stavku: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - Napomena: Uobičajeni tagovi uključuju "Assembly", "FEM", "Mesh", "NURBS" itd. - - - - Add-on Manager: Warning! - Upravitelj Dodataka: Upozorenje! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Add-on Manager omogućuje pristup opsežnoj biblioteci korisnih FreeCAD proširenja trećih strana. Ne mogu se dati nikakva jamstva u pogledu njihove sigurnosti ili funkcionalnosti. - - - - Continue - Nastavi - - - - Cancel - Otkazati - - - - EditDependencyDialog - - - Edit Dependency - Uredi ovisnost - - - - - - Dependency Type - Vrsta ovisnosti - - - - Dependency - Ovisnost - - - - Package name, if "Other..." - Ime paketa, ako je "Ostalo..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NAPOMENA: Ako je "Ostalo..." izabran, paket se ne nalazi u datoteci ALLOVED_PYTHON_PACKAGES.txt i upravitelj dodataka ga neće automatski instalirati. Pošalji PR na <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> za zahtjev dodavanja paketa. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Ako je ovisnost opcionalna, Upravitelj dodataka će ponuditi da je instalira (kad god je to moguće), ali neće blokirati instalaciju ako korisnik ne želi ili ne može instalirati paket. - - - - Optional - Opcionalno - - - - ExpandedView - - - - Icon - Ikona - - - - - <h1>Package Name</h1> - <h1>Naziv paketa</h1> - - - - - Version - Verzija - - - - - (tags) - (oznake) - - - - - Description - Opis - - - - - Maintainer - Održavatelj - - - - Update Available - Dostupno je ažuriranje - - - - labelSort - labelSort - - - - UpdateAvailable - Dostupno ažuriranje - - - - Form - - - Licenses - Licence - - - - License - Licenca - - - - License file - Datoteka licence - - - - People - Osobe - - - - Kind - Vrsta - - - - Name - Ime - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Napredno mapiranje verzija - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Buduće verzije Upravitelja dodataka FreeCAD-a podržat će postavljanje određene grane ili oznake za korištenje s određenom verzijom FreeCAD-a (npr. postavljanje određene oznake kao posljednje verzije vašeg dodatka za podršku v0.19 itd.) - - - - FreeCAD Version - Verzija FreeCAD-a - - - - Best-available branch, tag, or commit - Najbolja dostupna grana, oznaka ili objava - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Podržane FreeCAD inačice - - - - Minimum FreeCAD Version Supported - Minimalna FreeCAD verzija koja je podržana - - - - - Optional - Opcionalno - - - - Maximum FreeCAD Version Supported - Maksimalna FreeCAD verzija koja je podržana - - - - Advanced version mapping... - Napredno mapiranje verzija... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opcije uređivača dodataka - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Aako je ova opcija odabrana, kada pokrenete Upravitelj dodataka instalirani dodatci će biti na provjeri za nova ažuriranja. - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Preuzmi meta podatke makro naredbe (otprilike 10MB) - - - - Cache update frequency - Učestalost ažuriranja predmemorije - - - - Manual (no automatic updates) - Ručno (nema automatskih ažuriranja) - - - - Daily - Dnevno - - - - Weekly - Tjedno - - - - Hide Addons without a license - Skriva dodatke bez licence - - - - Hide Addons with non-FSF Free/Libre license - Skriva dodatke sa non-FSF Free/Libre licencom - - - - Hide Addons with non-OSI-approved license - Skriva dodatke sa non-OSI-approved licencom - - - - Hide Addons marked Python 2 Only - Skriva dodatak označen samo za Python 2 - - - - Hide Addons marked Obsolete - Skriva dodatake označene zastarjelim - - - - Hide Addons that require a newer version of FreeCAD - Sakrij dodatke koji zahtjevaju noviju verziju FreeCAD-a - - - - Custom repositories - Prilagođena spremišta - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - Korisnički definiran proxy: - - - - Score source URL - Bodovi izvornog URL-a - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - URL za podatke o ocjeni dodataka (vidi wiki stranicu Addon Managera za formatiranje i detalje o hostingu). - - - - Path to Git executable (optional): - Putanja ka izvršnoj git datoteci (neobavezno): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Napredne opcije - - - - Activate Addon Manager options intended for developers of new Addons. - Aktivirajte Upravitelj dodataka opcije namijenjene programerima novih Dodataka. - - - - Addon developer mode - Dodatak Developer mod - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Deinstaliraj označenu makronaredbu ili radni stol - - - - Install - Instaliraj - - - - Uninstall - Deinstaliraj - - - - Update - Ažuriraj - - - - Run Macro - Izvedi makronaredbu - - - - Change branch - Promijeni granu - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Upravljanje sa Python zavisnostima - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Sljedeće Python pakete je lokalno instalirao Upravitelj dodataka da bi zadovoljio zavisnosti dodataka. Lokacija instalacije: - - - - Package name - Naziv paketa - - - - Installed version - Instalirana verzija - - - - Available version - Dostupna verzija - - - - Used by - Korišten od - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Zvjezdica t.j. asteriks (*) u polju "Korišteno od" stupca označava neobaveznu zavisnost. Imaj na umu da 'Korišteno od' samo snima direktne uvoze u Dodatak. Možda su instalirani i drugi Python paketi od kojih ti paketi zavise. - - - - Update all available - Ažurirajte sve dostupno - - - - SelectFromList - - - Dialog - Dijalog - - - - TextLabel - Tekst oznaka - - - - UpdateAllDialog - - - Updating Addons - Ažuriraj Dodatke - - - - Updating out-of-date addons... - Ažuriranje zastarjelih dodataka... - - - - addContentDialog - - - Content Item - Sastavni dio - - - - Content type: - Vrsta sadržaja: - - - - Macro - Makro naredbe - - - - Preference Pack - Paket postavki - - - - Workbench - Radni prostor - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Ako je ovo jedina stvar u Dodatku, svi ostali metapodaci mogu biti nasljeđeni sa najviše razine i ne moraju se ovdje navoditi. - - - - This is the only item in the Addon - Ovo je jedina stavka u Dodatku - - - - Main macro file - Glavna datoteka makro naredbe - - - - The file with the macro's metadata in it - Datoteka sa metapodacima makro naredbe u njoj - - - - - - Browse... - Pretraživati... - - - - Preference Pack Name - Ime paketa postavki - - - - Workbench class name - Naziv klase Radnog stola - - - - Class that defines "Icon" data member - Klasa koja određuje podatak člana "Icon" - - - - Subdirectory - Poddirektorij - - - - Optional, defaults to name of content item - Izborno, zadano je ime stavke sadržaja - - - - Icon - Ikona - - - - Optional, defaults to inheriting from top-level Addon - Opciono, podrazumjevano nasljeđivanje od Dodatka najviše razine - - - - Tags... - Oznake... - - - - Dependencies... - Ovisnosti... - - - - FreeCAD Versions... - Verzija FreeCAD-a... - - - - Other Metadata - Ostali Metapodaci - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Prikazuje se na listi Upravitelja dodataka. Ne bi trebalo da sadrži riječ "FreeCAD". - - - - Version - Verzija - - - - Description - Opis - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Podržani su stilovi Semantic (1.2.3-beta) ili CalVer (2022.08.30) - - - - Set to today (CalVer style) - Podesi na danas (CalVer stil) - - - - Display Name - Ime za prikaz - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Sva polja ostavljena prazna su naslijeđena od meta podataka dodatka najviše razine, tako da tehnički, sva su neobavezna. Za dodatke sa više stavki sa sadržajem, svaka stavka treba da omogući jedinstveno ime i opis. - - - - add_toolbar_button_dialog - - - Add button? - Dodaj tipku? - - - - Add a toolbar button for this macro? - Dodaj tipku alatne trake za ovu makro naredbu - - - - Yes - Da - - - - No - Ne - - - - Never - Nikada - - - - change_branch - - - Change Branch - Promijeni granu - - - - Change to branch: - Promijeni na Git_granu: - - - - copyrightInformationDialog - - - Copyright Information - Copyright informacija - - - - Copyright holder: - Nositelj autorskih prava: - - - - Copyright year: - Godina autorskog prava: - - - - personDialog - - - Add Person - Dodaj osobu - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Održavatelj zadužen za održavanje je neko sa trenutnim pristupom ovom projektu. Autor je neko, kome možeš da odaš priznanje. - - - - Name: - Naziv: - - - - Email: - E-mail: - - - - Email is required for maintainers, and optional for authors. - E-pošta je neophodna za osobu odgovornu za održavanje, a neobavezna za autore. - - - - proxy_authentication - - - Proxy login required - Potrebni Proxy login podaci - - - - Proxy requires authentication - Proksi zahtjeva autentifikaciju - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Rezervirano mjesto za proksi adresu - - - - Realm: - Oblast: - - - - Placeholder for proxy realm - Rezervirano mjesto za proxy oblast - - - - Username - Korisničko ime - - - - Password - Zaporka - - - - selectLicenseDialog - - - Select a license - Odaberite licence - - - - About... - O... - - - - License name: - Naziv licence: - - - - Path to license file: - Putanja do datoteke licence: - - - - (if required by license) - (ako to zahtijeva licenca) - - - - Browse... - Pretraživati... - - - - Create... - Stvori... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Odaberi Alatnu traku - - - - Select a toolbar to add this macro to: - Odaberi Alatnu traku za dodavanje ove makro naredbe u: - - - - Ask every time - Pitaj svaki put - - - - toolbar_button - - - - Add button? - Dodaj tipku? - - - - Add a toolbar button for this macro? - Dodaj tipku alatne trake za ovu makro naredbu - - - - Yes - Da - - - - No - Ne - - - - Never - Nikada - - - - AddonsInstaller - - - Starting up... - Pokreče se... - - - - Worker process {} is taking a long time to stop... - Radni proces {} se dugo zaustavlja... - - - - Previous cache process was interrupted, restarting... - - Prethodni proces međuspremanja je prekinut, ponovo se pokreće... - - - - - Custom repo list changed, forcing recache... - - Korisnička lista spremišta je promjenjena, prisilno ponovno međuspremanje... - - - - - Addon manager - Upravitelj dodataka - - - - You must restart FreeCAD for changes to take effect. - Za primjenu promjene, ponovo pokreni FreeCAD. - - - - Restart now - Ponovno pokreni sada - - - - Restart later - Ponovno pokreni kasnije - - - - - Refresh local cache - Osvježite lokalnu predmemoriju - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Ažuriram međuspremnik… - - - - - Checking for updates... - Provjeri ima li ažuriranja... - - - - Temporary installation of macro failed. - Instalacija makro naredbe privremeno nije uspjela. - - - - - Close - Zatvori - - - - Update all addons - Ažuriraj sve dodatke - - - - Check for updates - Provjeri ažuriranja - - - - Python dependencies... - Pythonove ovisnosti ... - - - - Developer tools... - Razvojni alati... - - - - Apply %n available update(s) - Primjeni %n dostupno(a) ažuriranja - - - - No updates available - Nema dostupnih ažuriranja - - - - - - Cannot launch a new installer until the previous one has finished. - Ne može se pokrenuti novi program za instaliranje dok se prethodni ne završi. - - - - - - - Maintainer - Održavatelj - - - - - - - Author - Autor - - - - New Python Version Detected - Otkrivena nova verzija Pythona - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Čini se da je ovo prvi put da je ova verzija Python-a korištena sa Upraviteljem dodataka. Da li želiš da za njega instaliraš iste automatski instalirane zavisnosti? - - - - Processing, please wait... - U obradi, sačekaj... - - - - - Update - Ažuriraj - - - - Updating... - Ažuriranje... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Nije moguće uvesti QtNetwork -- izgleda da nije instaliran na tvom operativnom sustavu. Tvoj davatelj usluga možda ima paket za ovu zavisnost (često se na primjer naziva, "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Konvertiranje navedenog proksi porta '{}' nije uspjelo - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Greška u parametru: postavljene su međusobno isključive proksi opcije. Vraćanje na zadane vrijednosti. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Greška u parametru: korisnički proksi je označen, ali nije moguće. Vraćanje na zadane vrijednosti. - - - - Addon Manager: Unexpected {} response from server - Upravitelj dodataka: Neočekivani {} odgovor s poslužitelja - - - - Error with encrypted connection - Pogreška s šifriranom vezom - - - - - - Confirm remove - Potvrdi uklanjanje - - - - Are you sure you want to uninstall {}? - Da li ste sigurni da želite deinstalirati {}? - - - - - - Removing Addon - Uklanjanje dodatka - - - - Removing {} - Uklanjanje {} - - - - - Uninstall complete - Deinstaliranje završeno - - - - - Uninstall failed - Deinstaliranje nije uspjelo - - - - Version {version} installed on {date} - Dana {date} instalirana je verzija {version} - - - - Version {version} installed - Instalirana {version} verzija - - - - Installed on {date} - Instalirano {date} - - - - - - - Installed - Instalirano - - - - Currently on branch {}, name changed to {} - Trenutno na grani {}, naziv promijenjen u {} - - - - Git tag '{}' checked out, no updates possible - Oznaka Git-a '{}' provjerena, ažuriranja nisu moguća - - - - Update check in progress - Provjera ažuriranja u tijeku - - - - Installation location - Mjesto instaliranja - - - - Repository URL - URL repozitorija - - - - Changed to branch '{}' -- please restart to use Addon. - Promjena u git_grani '{}' -- ponovo pokreni da bi koristio Dodatak. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Ovaj Dodatak je ažuriran. Trebate napraviti ponovno pokretanje FreeCAD-a za promjene. - - - - Disabled - Onemogućeno - - - - Currently on branch {}, update available to version {} - Trenutno na grani {}, dostupno ažuriranje na verziju {} - - - - Update available to version {} - Dostupno ažuriranje za verziju {} - - - - This is the latest version available - Ovo je najnovija dostupna verzija - - - - WARNING: This addon is obsolete - UPOZORENJE: Ovaj dodatak je zastario - - - - WARNING: This addon is Python 2 only - UPOZORENJE: Ovaj dodatak je samo za Python 2 - - - - WARNING: This addon requires FreeCAD {} - UPOZORENJE: Ovaj dodatak treba FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - UPOZORENJE: Ovaj dodatak je trenutno instaliran, ali je onemogućen. Koristi 'omogući' gumb da bi ponovo omogućio. - - - - This Addon will be enabled next time you restart FreeCAD. - Ovaj Dodatak će biti omogućen sljedeći put kada ponovo pokreneš FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Ovaj Dodatak će biti onemogućen sljedeći put kada ponovo pokreneš FreeCAD. - - - - - - Success - Uspješno obavljeno - - - - Install - Instaliraj - - - - Uninstall - Deinstaliraj - - - - Enable - Omogući - - - - Disable - Onemogući - - - - - Check for update - Potraži ažuriranja - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - pokreni - - - - Change branch... - Promijeni Git_granu... - - - - Return to package list - Povratak na popis paketa - - - - Checking connection - Provjeravam vezu - - - - Checking for connection to GitHub... - Provjera veze s GitHubom... - - - - Connection failed - Povezivanje nije uspjelo - - - - Missing dependency - Nedostaje zavisnost - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Nije moguće uvesti QtNetwork – pogledaj pregled izvješća za detalje. Upravitelj dodataka nije dostupan. - - - - Other... - For providing a license other than one listed - Drugo... - - - - Select the corresponding license file in your Addon - Izaberi odgovarajuću datoteku licence u svom Dodatku - - - - Location for new license file - Lokacija za novu licencnu datoteku - - - - Received {} response code from server - Primljen {} kod odgovora sa servera - - - - Failed to install macro {} - Nije moguće instalirati makro naredbu {} - - - - Failed to create installation manifest file: - - Greška prilikom stvaranja datoteke manifesta instalacije - - - - Unrecognized content kind '{}' - Nepoznata vrsta sadržaja '{}' - - - - Unable to locate icon at {} - Nije moguće pronaći ikonu u {} - - - - Select an icon file for this content item - Izaberi datoteku ikone za ovu stavku sadržaja - - - - - - {} is not a subdirectory of {} - {} nije poddirektorij {} - - - - Select the subdirectory for this content item - Izaberi pod direktorij za ovu stavku sadržaja - - - - Automatic - Automatsko - - - - - Workbench - Radni prostor - - - - Addon - Dodatak - - - - Python - Python - - - - Yes - Da - - - - Internal Workbench - Unutarnji Radni stol - - - - External Addon - Vanjski dodatak - - - - Python Package - Python paket - - - - - Other... - Drugo... - - - - Too many to list - Previše ih je da bi se izlistali - - - - - - - - - Missing Requirement - Nedostaje uvjet - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Dodatak '{}' zahtijeva '{}&apos, koji nisu dostupni u vašoj kopiji FreeCAD-a. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Dodatak '{}' zahtijeva sljedeće radne stolove, koji nisu dostupni u vašoj kopiji FreeCAD-a: - - - - Press OK to install anyway. - Pritisni OK da bi ipak instaliralo. - - - - - Incompatible Python version - Nekompatibilna Python verzija - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Ovaj dodatak zahtijeva Python pakete koji nisu instalirani i ne mogu se automatski instalirati. Za korištenje ovog dodatka morate ručno instalirati sljedeće Python pakete: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Ovaj Dodatak (ili jedna od njegovih zavisnosti) zahtjeva Pithon {}.{}, a tvoj operativni sustav radi na {}.{}. Instalacija je prekinuta. - - - - Optional dependency on {} ignored because it is not in the allow-list - Neobavezna zavisnost od {} se zanemaruje jer se ne nalazi na listi dozvoljenih - - - - - Installing dependencies - Instalacija ovisnosti - - - - - Cannot execute Python - Nije moguće pokrenuti Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Automatsko pronalaženje izvršne datoteke Python-a nije uspjelo, ili je putanja pogrešno zadana. Provjeri ispravnost ove putanje u podešavanjima za Upravitelj dodataka. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Zavisnosti se ne mogu instalirati. Želiš li ipak nastaviti sa instalacijom {}? - - - - - Cannot execute pip - Nije moguće pokrenuti pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Izvršavanje pip-a nije uspjelo, izgleda da on nedostaje u tvojoj Python instalaciji. Uvjeri se da tvoj operativni sustav ima instaliran pip i pokušaj ponovo. Neuspjela naredba je bila: - - - - - Continue with installation of {} anyway? - Želiš li ipak nastaviti sa instalacijom {}? - - - - - Package installation failed - Instalacija paketa nije uspjela - - - - See Report View for detailed failure log. - Pogledaj Pregled izvješća za detaljan zapisnik grešaka. - - - - Installing Addon - Instaliranje Dodatka - - - - Installing FreeCAD Addon '{}' - Instalacija FreeCAD Dodatka '{}' - - - - Cancelling - Otkazivanje - - - - Cancelling installation of '{}' - Prekid instalacije '{}' - - - - {} was installed successfully - {} je uspješno instalirano. - - - - - Installation Failed - Instalacija nije uspjela - - - - Failed to install {} - Nije moguće instaliratii {} - - - - - Create new toolbar - Napravi novu Alatnu traku - - - - - A macro installed with the FreeCAD Addon Manager - Makro naredba instalirana sa FreeCAD Upraviteljem dodataka - - - - - Run - Indicates a macro that can be 'run' - pokreni - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Nije moguće pročitati podatke sa GitHub-a: provjeri internet vezu i podešavanja proksija i pokušaj ponovo. - - - - XML failure while reading metadata from file {} - XML greška pri čitanju metapodataka iz datoteke {} - - - - Invalid metadata in file {} - Nevažeća stavka metapodataka u datoteci {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - UPOZORENJE: Putanja navedena u metapodacima package.xml ne odgovara trenutnoј checked-out grani. - - - - Name - Ime - - - - Class - Klasa - - - - Description - Opis - - - - Subdirectory - Poddirektorij - - - - Files - Datoteke - - - - Select the folder containing your Addon - Izaberi mapu u kojoj se nalazi tvoj Dodatak - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Nema Vermin-a, operacija se otkazuje. - - - - Scanning Addon for Python version compatibility - Skeniranje Dodatka za Python radi utvrđivanja kompatibilnosti - - - - Minimum Python Version Detected - Otkrivena je minimalna verzija Python-a - - - - Vermin auto-detected a required version of Python 3.{} - Vermin je automatski otkrio potrebnu verziju Python-a 3.{} - - - - Install Vermin? - Instaliraj Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Za automatsko otkrivanje potrebne verzije Python-a za ovaj dodatak potreban je Vermin (https://pipi.org/project/vermin/). Pritisnite OK ako želite instalirati? - - - - Attempting to install Vermin from PyPi - Pokušaj instaliranja Vermin-a sa PyPi - - - - - Installation failed - Instalacija neuspješna - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Instalacija Vermin-a nije uspjela – provjeri pregled izvješća za detalje. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Uvoz Vermin-a nakon instalacije nije uspio - ne može da se skenira Dodatak. - - - - Select an icon file for this package - Izaberi datoteku ikone za ovaj paket - - - - Filter is valid - Filter je valjan - - - - Filter regular expression is invalid - Regularni izraz filtra nije važeći - - - - Search... - Pretraživanje... - - - - Click for details about package {} - Kliknite za detalje o paketu {} - - - - Click for details about workbench {} - Kliknite za detalje o Radnom stolu {} - - - - - - Click for details about macro {} - Kliknite za detalje o makro naredbama {} - - - - Maintainers: - Održavatelji: - - - - Tags - Oznake - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Stvoreno - - - - Updated - Ažurirano - - - - Score: - Bodovi: - - - - - Up-to-date - Aktualno - - - - - - - - Update available - Dostupno ažuriranje - - - - - Pending restart - Na čekanju ponovnog pokretanja - - - - - DISABLED - ONEMOGUĆENO - - - - Installed version - Instalirana verzija - - - - Unknown version - Nepoznata verzija - - - - Installed on - Instalirano na - - - - Available version - Dostupna verzija - - - - Filter by... - Filtriraj prema... - - - - Addon Type - Vrsta Dodatka - - - - - Any - Bilo koji - - - - Macro - Makro naredbe - - - - Preference Pack - Paket postavki - - - - Installation Status - Status instalacije - - - - Not installed - Nije instalirano - - - - Filter - Filter - - - - DANGER: Developer feature - OPASNOST: Funkcija za programere - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - OPASNOST: Prebacivanje grana je namjenjeno programerima i beta testerima i može da dovede do oštećenih dokumenata koji nisu kompatibilni unazad, nestabilnosti, kvarova i/ili preranog toplotnog kolapsa univerzuma. Da li si siguran da želiš da nastaviš? - - - - There are local changes - Postoje lokalne promjene - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - UPOZORENjE: Ovo spremište ima nepovezane lokalne promjene. Da li si siguran da želiš da promjeniš grane (donoseći promjene sa sobom)? - - - - Local - Table header for local git ref name - Lokalno - - - - Remote tracking - Table header for git remote tracking branch name - Daljinsko praćenje - - - - Last Updated - Table header for git update date - Posljednje ažurirano - - - - Installation of Python package {} failed - Instalacija Python paketa {} nije uspjelo - - - - Installation of optional package failed - Instalacija opcionalnih paketa {} nije uspjelo - - - - Installing required dependency {} - Instaliranje potrebne zavisnosti {} - - - - Installation of Addon {} failed - Instalacija Dodatka {} nije uspjela. - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Dekodiranje {} datoteke za Dodatak '{}' nije uspjelo - - - - Any dependency information in this file will be ignored - Sve informacije o zavisnosti u ovoj datoteci će biti ignorirane - - - - Unable to open macro wiki page at {} - Nije moguće otvoriti makro wiki stranicu na {} - - - - Unable to fetch the code of this macro. - Nije moguće preuzeti kod ove makro naredbe. - - - - Unable to retrieve a description from the wiki for macro {} - Nije moguće preuzeti opis sa wiki-ja za makro naredbu {} - - - - Unable to open macro code URL {} - Nije moguće otvoriti makro kod URL {} - - - - Unable to fetch macro-specified file {} from {} - Nije moguće preuzeti datoteku {} navedene makro naredbe iz {} - - - - Could not locate macro-specified file {} (expected at {}) - Nije moguće locirati datoteku navedenu u makro naredbi {} (trebala je biti u {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Neprepoznati interni Radni stol '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Upozorenje za programere Dodatka: URL adresa spremišta zadana u package.xml datoteci za dodatak {} ({}) ne odgovara URL adresi sa koje je preuzet ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Upozorenje za programere Dodatka: Grana-adresa spremišta zadana u package.xml datoteci za dodatak {} ({}) ne odgovara Grana-adresi sa koje je preuzet ({}) - - - - - Got an error when trying to import {} - Greška pri pokušaju uvoza {} - - - - An unknown error occurred - Dogodila se nepoznata greška - - - - Could not find addon {} to remove it. - Nije moguće pronaći Dodatak {} da se ukloni. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Izvršavanje uninstall.py skripte Dodatka nije usjpelo. Nastavlja se sa deinstaliranjem... - - - - Removed extra installed file {} - Uklonjena je dodatno instalirana datoteka {} - - - - Error while trying to remove extra installed file {} - Greška pri pokušaju uklanjanja dodatno instalirane datoteke {} - - - - Error while trying to remove macro file {}: - Greška pri pokušaju uklanjanja datoteke makro naredbe {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Povezivanje sa GitHub-om nije uspjelo. Provjeri podešavanja veze i proksija. - - - - WARNING: Duplicate addon {} ignored - UPOZORENJE: Duplikat dodatka {} je ignoriran - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Došlo je do greške pri ažuriranju makro naredbi a sa GitHub-a, pokušavam čistu provjeru... - - - - Attempting to do a clean checkout... - Pokušavam napraviti čistu provjeru... - - - - Clean checkout succeeded - Čista provjera je uspjela - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Nije uspjelo ažurirati makro naredbe s GitHuba. Pokušajte izbrisati predmemoriju Upravitelja dodataka. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Čini se da je problem povezivanje s Wiki-em, FreeCAD trenutačno ne može dohvatiti popis makronaredbi Wiki-a - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Nije uspjelo čitanje metapodataka iz {name} - - - - Failed to fetch code for macro '{name}' - Nije uspjelo preuzimanje koda za makro naredbu '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Upravitelj dodataka: radni proces nije uspio da se završi prilikom preuzimanja {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Za {num_macros} makro naredbu je prekoračen je vremenski limit, {num_failed} tokom obrade - - - - Addon Manager: a worker process failed to halt ({name}) - Upravitelj dodataka: radni proces nije uspio da se zaustavi {name}) - - - - Timeout while fetching metadata for macro {} - Isteklo je vrijeme za preuzimanje metapodataka za makro naredbu {} - - - - Failed to kill process for macro {}! - - Zaustavljanje procesa za makro naredbu {} nije uspjelo - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Nije uspjelo dohvatiti statistike dodataka iz {} -- samo će abecedno sortiranje biti točno - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Nije uspjelo dohvatiti bodove dodataka iz '{}' -- sortiranje po bodovima neće biti uspješno. - - - - Repository URL - Preferences header for custom repositories - URL repozitorija - - - - Branch name - Preferences header for custom repositories - Naziv grane - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Pravljenje rezervne kopije originalnog direktorija i ponovno kloniranje - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Osnovno ažuriranje Git_grane nije uspjelo sa sljedećom porukom: - - - - Installing - Instalacija - - - - Succeeded - Uspijelo je - - - - Failed - Neuspješno - - - - Update was cancelled - Ažuriranje je obustavljeno - - - - some addons may have been updated - neki dodaci su možda ažurirani - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Učitavanje informacija za {} FreeCAD Macro Recipes wiki stranice... - - - - Loading page for {} from {}... - Učitavanje stranice za {} iz {}... - - - - Failed to download data from {} -- received response code {}. - Nije uspjelo preuzeti podatke iz {} -- primljen je povratni kod {}. - - - - Composite view - Sastavljeni prikaz - - - - Expanded view - Prošireni prikaz - - - - Compact view - Kompaktni prikaz - - - - Alphabetical - Sort order - Abecednim redom - - - - Last Updated - Sort order - Posljednje ažurirano - - - - Date Created - Sort order - Datum stvaranja - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Bodovi - - - - Std_AddonMgr - - - &Addon manager - Upr&avitelj dodataka - - - - Manage external workbenches, macros, and preference packs - Upravljajte vanjskim radnim stolovima, makronaredbama i paketima postavki - - - - AddonInstaller - - - Finished removing {} - Završeno premještanje {} - - - - Failed to remove some files - Nije uspjelo uklanjanje nekih datoteka - - - - Addons installer - - - Finished updating the following addons - Završeno je ažuriranje sljedećih dodataka - - - - Workbench - - - Auto-Created Macro Toolbar - Automatski napravljena Makro alatna traka - - - - QObject - - - Addon Manager - Upravitelj dodataka - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_hu.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_hu.qm deleted file mode 100644 index 44a38a5477..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_hu.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_hu.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_hu.ts deleted file mode 100644 index 828c946622..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_hu.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Egyéni adattár - - - - Repository URL - Adattároló URL - - - - Branch - Változat - - - - CompactView - - - - Icon - Ikon - - - - - <b>Package Name</b> - <b>Csomag neve</b> - - - - - Version - Verzió - - - - - Description - Leírás - - - - Update Available - Frissítés elérhető - - - - UpdateAvailable - Frissítés elérhető - - - - DependencyDialog - - - Dependencies - Függőségek - - - - Dependency type - Függőség tpus - - - - Name - Név - - - - Optional? - Választható? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Függőségek feloldása - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Ez a bővítmény a következő szükséges vagy opcionális függőségekkel rendelkezik. Ezeket telepíteni kell a bővítmény használata előtt. - -A bővítmény kezelő automatikusan telepítse őket? Válassza a "Elvet" lehetőséget a bővítmény telepítéséhez a függőségek telepítése nélkül. - - - - FreeCAD Addons - FreeCAD kiegészítők - - - - Required Python modules - Szükséges Python modulok - - - - Optional Python modules - Választható Python modulok - - - - DeveloperModeDialog - - - Addon Developer Tools - Kiterjesztés fejlesztői eszközök - - - - Path to Addon - Útvonal a kiterjesztéshez - - - - - Browse... - Tallózás... - - - - Metadata - Metaadatok - - - - Primary branch - Elsődleges változat - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Annak magyarázata, hogy mit nyújt ez a kiterjesztés. Megjelenik a kiterjesztés kezelőben. Ehhez nem szükséges kijelenteni, hogy ez egy FreeCAD kiterjesztés. - - - - Description - Leírás - - - - Discussion URL - Beszélgetés URL - - - - Icon - Ikon - - - - Bugtracker URL - Hibakövető URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) vagy CalVer (2022.08.30) stílusok támogatottak - - - - Set to today (CalVer style) - Mai napra beállítva (CalVer stílusban) - - - - - - - (Optional) - (Választható) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Megjelenik a bővítmények listájában a bővítménykezelőben. Nem tartalmazhatja a "FreeCAD"szót, és minden támogatott operációs rendszeren érvényes könyvtárnévnek kell lennie. - - - - README URL - OLVASS EL URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - Tipp: mivel ez a FreeCAD-ben, a Bővítmény Kezelőben jelenik meg, nem szükséges olyan információkkal foglalni a helyet, mint például "Ez egy FreeCAD kiegészítő..." -- csak mondja meg, hogy mit csinál. - - - - Repository URL - Adattároló URL - - - - Website URL - Webhely URL - - - - Documentation URL - Dokumentáció URL - - - - Addon Name - Bővítmény neve - - - - Version - Verzió - - - - (Recommended) - (Javasolt) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Választható, csak a 3.x verzió támogatott) - - - - Detect... - Észlelés... - - - - Addon Contents - Bővítmény tartalma - - - - Dialog - - - Addon Manager - Bővítmény kezelő - - - - Edit Tags - Címkék szerkesztése - - - - Comma-separated list of tags describing this item: - Az elemet leíró címkék vesszővel elválasztott listája: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - MEGJEGYZÉS: A szokásos címkék közé tartoznak a "Összeállítás", "VEM", "Rács", "NURBS" stb. - - - - Add-on Manager: Warning! - Bővítménykezelő: Figyelmeztetés! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - A bővítménykezelő hozzáférést biztosít a FreeCAD hasznos, harmadik féltől származó FreeCAD-bővítmények széleskörű könyvtárához. Ezek biztonságosságára vagy működőképességére vonatkozóan nem vállalható garancia. - - - - Continue - Tovább - - - - Cancel - Mégse - - - - EditDependencyDialog - - - Edit Dependency - Függőségek szerkesztése - - - - Dependency Type - Függőség típus - - - - Dependency - Függőség - - - - Package name, if "Other..." - A csomag neve, ha "Egyéb..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - MEGJEGYZÉS: Ha a "Egyéb..." van kiválasztva, a csomag nem szerepel az ALLOWED_PYTHON_PACKAGES.txt fájlban, és a Bővítmény kezelő nem fogja automatikusan telepíteni. Küldjön PR-t a <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-Addons</a> címre, hogy kérjen egy csomag hozzáadást. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Ha ez egy választható függőség, a bővítménykezelő felajánlja a telepítését (ha lehetséges), de nem blokkolja a telepítést, ha a felhasználó nem akarja vagy nem tudja telepíteni a csomagot. - - - - Optional - Választható - - - - ExpandedView - - - - Icon - Ikon - - - - - <h1>Package Name</h1> - <h1>Csomag neve</h1> - - - - - Version - Verzió - - - - - (tags) - (címkék) - - - - - Description - Leírás - - - - - Maintainer - Közreműködő - - - - Update Available - Frissítés elérhető - - - - labelSort - címke rendezés - - - - UpdateAvailable - Frissítés elérhető - - - - Form - - - Licenses - Engedélyek - - - - License - Licenc - - - - License file - Engedély fájl - - - - People - Személyek - - - - Kind - Típus - - - - Name - Név - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Haladó verzió leképezés - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - A FreeCAD Bővítmény kezelő következő verziói segíteni fogják a fejlesztői beállításokat' abban, hogy egy adott változatot vagy mezőt a FreeCAD egy adott verziójával való használatra adjanak meg (pl. egy adott mező beállításával a bővítmény legújabb verziójához, amely még támogatja a v0.19-et, stb.) - - - - FreeCAD Version - FreeCAD verzió - - - - Best-available branch, tag, or commit - Legjobb elérhető változat, mező vagy commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Támogatott FreeCAD verziók - - - - Minimum FreeCAD Version Supported - FreeCAD támogatott minimális verziója - - - - - Optional - Választható - - - - Maximum FreeCAD Version Supported - FreeCAD támogatott legutolsó verziója - - - - Advanced version mapping... - Haladó verzió leképezés... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Bővítmény kezelő lehetőségei - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Ha ez a beállítás be van jelölve, az Bővítmény kezelője indításakor, -a telepített bővítményeket a rendszer ellenőrzi az elérhető frissítésekre vonatkozóan - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Makró metaadatok letöltése (kb. 10 MB) - - - - Cache update frequency - Gyorsítótár frissítési gyakoriság - - - - Manual (no automatic updates) - Manuális (nincs automatikus frissítés) - - - - Daily - Napi - - - - Weekly - Heti - - - - Hide Addons without a license - Licenc nélküli bővítmények elrejtése - - - - Hide Addons with non-FSF Free/Libre license - Nem FSF Free/Libre licenccel rendelkező bővítmények elrejtése - - - - Hide Addons with non-OSI-approved license - Nem OSI által jóváhagyott licenccel rendelkező bővítmény elrejtése - - - - Hide Addons marked Python 2 Only - Csak Python v. 2 bővítmények elrejtése - - - - Hide Addons marked Obsolete - Az elavultként megjelölt bővítmények elrejtése - - - - Hide Addons that require a newer version of FreeCAD - A FreeCAD újabb verzióját igénylő bővítmények elrejtése - - - - Custom repositories - Egyéni adattárak - - - - Proxy - Proxy - - - - No proxy - Nincs proxy - - - - User system proxy - Felhasználói rendszer proxy - - - - User-defined proxy: - Felhasználó által meghatározott proxy: - - - - Score source URL - Forrás pontszám URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Az Bővítmény pontozási adatok URL címe (lásd az Bővítmény kezelője wiki oldalát a formázás és a tárhely részleteiért). - - - - Path to Git executable (optional): - Git futtatható fájl elérési útja (opcionális): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Haladó beállítások - - - - Activate Addon Manager options intended for developers of new Addons. - Aktiválja az új Bővítmény kezelőkhöz a fejlesztőknek szánt Bítmény kezelő lehetőségeket. - - - - Addon developer mode - Bővítmény fejlesztői mód - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Kijelölt makró vagy munkafelület eltávolítása - - - - Install - Teleptés - - - - Uninstall - Eltávolítás - - - - Update - Frissítés - - - - Run Macro - Makró futtatás - - - - Change branch - Változat módosítása - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Python-függőségek kezelése - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - A következő Python-csomagokat helyileg telepítette a Bővítmény kezelőjével a Bővítmény függőségek kielégítése érdekében. Telepítési hely: - - - - Package name - Csomag neve - - - - Installed version - Telepített verzió - - - - Available version - Elérhető verzió - - - - Used by - Használja - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - A csillag (*) a "Használja" oszlopban választható függőséget jelez. Vegye figyelembe, hogy a Használja csak a Bővítmény közvetlen importjait rögzíti. Más Python csomagok is települhettek, amelyektől ezek a csomagok függnek. - - - - Update all available - Összes elérhető frissítése - - - - SelectFromList - - - Dialog - Párbeszédablak - - - - TextLabel - Szövegfelirat - - - - UpdateAllDialog - - - Updating Addons - Kiegészítők frissítése - - - - Updating out-of-date addons... - Az elavult kiegészítők frissítése... - - - - addContentDialog - - - Content Item - Tartalom elem - - - - Content type: - Elem típus: - - - - Macro - Makró - - - - Preference Pack - Előnyben részesített csomag - - - - Workbench - Munkafelület - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Ha ez az egyetlen dolog a Bővítményben, akkor minden más metaadat a legfelső szintről örökölhető, és nem kell itt megadni. - - - - This is the only item in the Addon - Ez az egyetlen elem az bővítményben - - - - Main macro file - Fő makró fájl - - - - The file with the macro's metadata in it - A makró'metaadatokat tartalmazó fájl - - - - - - Browse... - Tallózás... - - - - Preference Pack Name - Preferencia csomag név - - - - Workbench class name - Munkafelület osztály neve - - - - Class that defines "Icon" data member - Az "Ikon" adattagot meghatározó osztály - - - - Subdirectory - Alkönyvtár - - - - Optional, defaults to name of content item - Választható, alapértelmezés szerint a tartalomelem neve - - - - Icon - Ikon - - - - Optional, defaults to inheriting from top-level Addon - Választható, alapértelmezés szerint a legfelső szintű bővítményből öröklődik - - - - Tags... - Címkék... - - - - Dependencies... - Függőségek... - - - - FreeCAD Versions... - FreeCAD verziók... - - - - Other Metadata - Egyéb metaadat - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Megjelenik a Bővítmény kezelők' Bővítmény listájában. Nem tartalmazhatja a "FreeCAD" szót. - - - - Version - Verzió - - - - Description - Leírás - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) vagy CalVer (2022.08.30) stílusok támogatottak - - - - Set to today (CalVer style) - Mai napra beállítva (CalVer stílusban) - - - - Display Name - Név megjelenítése - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Az üresen hagyott mezők a legfelső szintű bővítmény metaadatokból öröklődnek, így technikailag mindegyik választható. A több tartalmi elemet tartalmazó bővítmény esetében minden egyes elemnek egyedi megjelenítési nevet és leírást kell megadnia. - - - - add_toolbar_button_dialog - - - Add button? - Gomb hozzáadása? - - - - Add a toolbar button for this macro? - Eszköztárgomb hozzáadása ehhez a makróhoz? - - - - Yes - Igen - - - - No - Nem - - - - Never - Soha - - - - change_branch - - - Change Branch - Változat módosítása - - - - Change to branch: - Váltson a változatra: - - - - copyrightInformationDialog - - - Copyright Information - Szerzői jogi információk - - - - Copyright holder: - Szerzői jogtulajdonos: - - - - Copyright year: - Szerzői jog éve: - - - - personDialog - - - Add Person - Személy hozzáadása - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A karbantartó az a személy, aki hozzáféréssel rendelkezik a projektben lévő commitokhoz. A szerző bárki más, akit te' szeretnél bevonni. - - - - Name: - Név: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Az e-mail cím megadása a felügyelők számára kötelező, a szerzők számára nem kötelező. - - - - proxy_authentication - - - Proxy login required - Proxy belépés szükséges - - - - Proxy requires authentication - Proxy azonosítás szükséges - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - A proxy cím helyőrzője - - - - Realm: - Terület: - - - - Placeholder for proxy realm - A proxy cím tartomány helyőrzője - - - - Username - Felhasználónév - - - - Password - Jelszó - - - - selectLicenseDialog - - - Select a license - Licencfájl kiválasztása - - - - About... - Névjegy... - - - - License name: - Engedély neve: - - - - Path to license file: - Engedély fájl útvonala: - - - - (if required by license) - (ha az engedély előírja) - - - - Browse... - Tallózás... - - - - Create... - Létrehoz... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Eszköztár kiválasztása - - - - Select a toolbar to add this macro to: - Válasszon ki egy eszköztárat a makró hozzáadásához: - - - - Ask every time - Mindig kérdezzen rá - - - - toolbar_button - - - - Add button? - Gomb hozzáadása? - - - - Add a toolbar button for this macro? - Eszköztárgomb hozzáadása ehhez a makróhoz? - - - - Yes - Igen - - - - No - Nem - - - - Never - Soha - - - - AddonsInstaller - - - Starting up... - Elkezd... - - - - Worker process {} is taking a long time to stop... - Hosszú időbe telik egy futó {} folyamat leállítása... - - - - Previous cache process was interrupted, restarting... - - Az előző gyorsítótár-folyamat megszakadt, újraindul... - - - - - Custom repo list changed, forcing recache... - - Megváltoztatta a felhasználói tárolók listáját, kényszerítve az újbóli gyorsítótárazást... - - - - - Addon manager - Bővítmény kezelő - - - - You must restart FreeCAD for changes to take effect. - A módosítások érvénybe léptetéséhez újra kell indítania a FreeCAD-et. - - - - Restart now - Újraindítás most - - - - Restart later - Újraindítás később - - - - - Refresh local cache - Gyorsítótár frissítése - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Gyorsítótár frissítése... - - - - - Checking for updates... - Frissítés keresése... - - - - Temporary installation of macro failed. - A makró ideiglenes telepítése sikertelen. - - - - - Close - Bezárás - - - - Update all addons - Összes bővítmény frissítése - - - - Check for updates - Frissítések keresése - - - - Python dependencies... - Python függőségek... - - - - Developer tools... - Fejlesztői eszközök... - - - - Apply %n available update(s) - %n elérhető frissítés(ek) alkalmazása - - - - No updates available - Nincs elérhető frissítés - - - - - - Cannot launch a new installer until the previous one has finished. - Az új telepítő csak az előző telepítő befejezése után indítható el. - - - - - - - Maintainer - Közreműködő - - - - - - - Author - Létrehozó - - - - New Python Version Detected - Új Python verziót érzékelt - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Úgy tűnik, hogy ez az első alkalom, hogy a Python ezen verzióját a Bővítmény kezelővel együtt használják. Szeretné telepíteni ugyanazokat az automatikusan telepített függőségeket hozzá? - - - - Processing, please wait... - Feldolgozás folyamatban, kérjük várjon... - - - - - Update - Frissítés - - - - Updating... - Frissítés... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Nem lehet importálni a QtNetwork-et - nincs telepítve a rendszerre. Előfordulhat, hogy a szolgáltatónak van egy csomagja ehhez a függőséghez (gyakran így nevezik "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Nem sikerült a megadott '{}' proxy portot a port számra átalakítani - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Paraméter hiba: kölcsönösen kizáró proxy beállítások. Alapértelmezettre visszaállítás. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Paraméterhiba: felhasználói proxy van megadva, de nincs megadva proxy. Alapértelmezettre visszaállítás. - - - - Addon Manager: Unexpected {} response from server - Bővítmény kezelő: Váratlan {} válasz a szervertől - - - - Error with encrypted connection - Hiba a titkosított kapcsolat során - - - - - - Confirm remove - Eltávolítás megerősítése - - - - Are you sure you want to uninstall {}? - Biztosan szeretné a(z) {} eltávolítani? - - - - - - Removing Addon - Bővítmény eltávolítás - - - - Removing {} - Eltávolítás {} - - - - - Uninstall complete - Eltávolítás befejeződött - - - - - Uninstall failed - Sikertelen eltávolítás - - - - Version {version} installed on {date} - {version} telepítve ekkor {date} - - - - Version {version} installed - {version} verzió telepítve - - - - Installed on {date} - Telepítés ideje {date} - - - - - - - Installed - Telepítve - - - - Currently on branch {}, name changed to {} - Jelenleg a {} változat van, neve {}-ra változott - - - - Git tag '{}' checked out, no updates possible - Git mező '{}' ellenőrizve, frissítés nem lehetséges - - - - Update check in progress - Frissítések ellenőrzése folyamatban - - - - Installation location - Telepítés helye - - - - Repository URL - Adattároló URL - - - - Changed to branch '{}' -- please restart to use Addon. - Változatre módosította '{}' -- indítsa újra a bővítmény használatához. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Ezt a bővítményt frissítettük. A változások megtekintéséhez indítsa újra a FreeCAD-et. - - - - Disabled - Kikapcsolva - - - - Currently on branch {}, update available to version {} - Jelenleg a {} változaton van, frissítés elérhető a {} verzióra - - - - Update available to version {} - Rendelkezésre áll frissítés a {} verzióra - - - - This is the latest version available - Ez a legfrissebb elérhető verzió - - - - WARNING: This addon is obsolete - FIGYELMEZTETÉS: Ez a bővítmény elavult - - - - WARNING: This addon is Python 2 only - FIGYELMEZTETÉS: Ez a bővítmény csak Python 2 - - - - WARNING: This addon requires FreeCAD {} - FIGYELEM: Ehhez a bővítményhez FreeCAD {} szükséges - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - FIGYELMEZTETÉS: Ez a bővítmény jelenleg telepített, de le van tiltva. Használja az 'engedélyezés' gombot a visszakapcsolásához. - - - - This Addon will be enabled next time you restart FreeCAD. - Ez a bővítmény a FreeCAD következő újraindításakor lesz engedélyezve. - - - - This Addon will be disabled next time you restart FreeCAD. - Ez a bővítmény a FreeCAD következő újraindításakor lesz kiiktatva. - - - - - - Success - Sikerült - - - - Install - Teleptés - - - - Uninstall - Eltávolítás - - - - Enable - Bekapcsolás - - - - Disable - Letilt - - - - - Check for update - Frissítés keresése - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Futtat - - - - Change branch... - Változat módosítása... - - - - Return to package list - Vissza a csomag listához - - - - Checking connection - Kapcsolat tesztelése - - - - Checking for connection to GitHub... - A GitHubhoz való kapcsolat ellenőrzése... - - - - Connection failed - Csatlakozás sikertelen - - - - Missing dependency - Hiányzó függőség - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - QtNetwork importálhatatlan - lásd a Jelentésnézetet a részletekért. A bővítmény kezelő nem érhető el. - - - - Other... - For providing a license other than one listed - Egyéb... - - - - Select the corresponding license file in your Addon - Válassza ki a megfelelő licencfájlt a bővítményben - - - - Location for new license file - Új licencfájl helye - - - - Received {} response code from server - {} válaszkód érkezett a szervertől - - - - Failed to install macro {} - {} makró telepítése sikertelen - - - - Failed to create installation manifest file: - - Nem sikerült létrehozni a telepítési manifeszt fájlt: - - - - - Unrecognized content kind '{}' - Nem ismert tartalomfajta '{}' - - - - Unable to locate icon at {} - Nem sikerült megtalálni az ikont a {} - - - - Select an icon file for this content item - Válasszon ki egy ikonfájlt ehhez a tartalmi elemhez - - - - - - {} is not a subdirectory of {} - {} nem alkönyvtára ennek: {} - - - - Select the subdirectory for this content item - Válassza ki a tartalmi elem alkönyvtárát - - - - Automatic - Automatikus - - - - - Workbench - Munkafelület - - - - Addon - Bővítmény - - - - Python - Python - - - - Yes - Igen - - - - Internal Workbench - Belső munkafelület - - - - External Addon - Külső bővítmény - - - - Python Package - Python csomag - - - - - Other... - Egyéb... - - - - Too many to list - Túl sok a listázáshoz - - - - - - - - - Missing Requirement - Hiányzó követelmény - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - A '{}' bővítményhez a '{}', csomagra van szükség, amely nem érhető el a FreeCAD-ben. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - A '{}' bővítmény olyan munkafelületeket igényel, amelyek nem állnak rendelkezésre a FreeCAD példányában: - - - - Press OK to install anyway. - Nyomja meg az OK gombot a telepítés kényszerítéséhez. - - - - - Incompatible Python version - Nem kompatibilis Python verzió - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Ez a bővítmény olyan Python-csomagokat igényel, amelyek nincsenek telepítve, és nem is telepíthetők automatikusan. A bővítmény használatához a következő Python csomagokat magának kell telepítenie: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Ez a bővítmény (vagy valamelyik függősége) Python {}.{}-t igényel, és az Ön rendszerén {}.{} fut. A telepítés törlődött. - - - - Optional dependency on {} ignored because it is not in the allow-list - A rendszer figyelmen kívül hagyja a választható függőséget a(z) {} sablontól, mert nem szerepel az engedélyezett listán - - - - - Installing dependencies - Függőségek telepítése - - - - - Cannot execute Python - Python nem hajtható végre - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Nem sikerült automatikusan megtalálni a Python futtatható fájlt, vagy az elérési út rosszul van megadva. Ellenőrizze a bővítmény kezelő beállításban a Python környezet elérési útvonalát. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - A függőségeket nem sikerült telepíteni. Folytassa a {} telepítését? - - - - - Cannot execute pip - Pip nem hajtható végre - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Nem sikerült a pip futtatása, ami lehet, hogy hiányzik a Python telepítéséből. Kérjük, győződjön meg róla, hogy a rendszerén telepítve van a pip, és próbálja meg újra. A sikertelen parancs a következő volt: - - - - - Continue with installation of {} anyway? - Folytassa a {} telepítését? - - - - - Package installation failed - Oldal telepítése sikertelen - - - - See Report View for detailed failure log. - A részletes hibanaplót a Jelentésnézet című témakörben tekintheti meg. - - - - Installing Addon - Bővítmény telepítése - - - - Installing FreeCAD Addon '{}' - A FreeCAD '{}' bővítmény telepítése - - - - Cancelling - Megszakít - - - - Cancelling installation of '{}' - A '{}' telepítésének megszakítása - - - - {} was installed successfully - {} sikeresen telepítve - - - - - Installation Failed - Telepítés sikertelen - - - - Failed to install {} - A {} nem sikerült telepíteni - - - - - Create new toolbar - Új eszköztár létrehozása - - - - - A macro installed with the FreeCAD Addon Manager - A FreeCAD bővítmény kezelővel telepített makró - - - - - Run - Indicates a macro that can be 'run' - Futtat - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Nem sikerült adatokat olvasni a GitHubról: ellenőrizze az internetkapcsolat és a proxy beállításait, és próbálja meg újra. - - - - XML failure while reading metadata from file {} - XML hiba a metaadatok olvasása közben a {} fájlból - - - - Invalid metadata in file {} - Érvénytelen metaadat a {} fájlban - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - FIGYELMEZTETÉS: A package.xml metaadatokban megadott elérési út nem egyezik a jelenleg ellenőrzött változattal. - - - - Name - Név - - - - Class - Tűrési osztály - - - - Description - Leírás - - - - Subdirectory - Alkönyvtár - - - - Files - Fájlok - - - - Select the folder containing your Addon - Válassza ki a bővítményt tartalmazó mappát - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Nincs Vermin, megszakítva a műveletet. - - - - Scanning Addon for Python version compatibility - A bővítmény Python-környezet verzió kompatibilitásának vizsgálata - - - - Minimum Python Version Detected - Minimális Python verziót érzékelt - - - - Vermin auto-detected a required version of Python 3.{} - A Vermin automatikusan észlelte a Python 3.{} szükséges verzióját - - - - Install Vermin? - Telepítse a Vermint? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - A Python-környezet szükséges verziójának automatikus felismeréséhez a Vermin kiegészítőre van szükség (https://pypi.org/project/vermin/). "OK" a telepítéshez? - - - - Attempting to install Vermin from PyPi - A Vermin telepítésének kísérlete a PyPi-ból - - - - - Installation failed - Sikertelen telepítés - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - A Vermin telepítése sikertelen -- a részletekért nézze meg a Jelentés nézetet. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - A telepítés után nem sikerült importálni a Vermint -- nem tudja ellenőrizni a bővítményt. - - - - Select an icon file for this package - Válasszon ki egy ikonfájlt ehhez a csomaghoz - - - - Filter is valid - A szűrő érvényes - - - - Filter regular expression is invalid - A szűrő alapértelmezett kifejezése érvénytelen - - - - Search... - Keres... - - - - Click for details about package {} - Kattintson a csomag részleteiért {} - - - - Click for details about workbench {} - Kattintson a munkafelület részleteiért {} - - - - Click for details about macro {} - Kattintson a makró részleteiért {} - - - - Maintainers: - Közreműködők: - - - - Tags - Címkék - - - - {} ★ on GitHub - {} ★ GitHub-on - - - - No ★, or not on GitHub - ★ sz., vagy nincs a GitHub-on - - - - Created - Létrehozott - - - - Updated - Frissített - - - - Score: - Pontszám: - - - - - Up-to-date - Naprakész - - - - - - - - Update available - Frissítés elérhető - - - - - Pending restart - Újraindításra vár - - - - - DISABLED - LETILTVA - - - - Installed version - Telepített verzió - - - - Unknown version - Ismeretlen verzió - - - - Installed on - Telepítve ekkor - - - - Available version - Elérhető verzió - - - - Filter by... - Szűrés ezzel... - - - - Addon Type - Bővítmény típus - - - - - Any - Bármelyik - - - - Macro - Makró - - - - Preference Pack - Előnyben részesített csomag - - - - Installation Status - Telepítés állapota - - - - Not installed - Nincs telepítve - - - - Filter - Szűrő - - - - DANGER: Developer feature - VESZÉLY: Fejlesztői funkció - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - VESZÉLY: A változatok váltása fejlesztőknek és béta tesztelőknek szól, és törött, nem visszafelé kompatibilis dokumentumokat, instabilitást, összeomlást és/vagy az univerzum idő előtti hőhalálát eredményezheti. Biztos vagy benne, hogy folytatni akarod? - - - - There are local changes - Helyi módosítások vannak - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - FIGYELMEZTETÉS: Ez a repo nem commitolt helyi változásokat tartalmaz. Biztos vagy benne, hogy változatot akarsz váltani (magaddal hozva a változásokat)? - - - - Local - Table header for local git ref name - Helyi - - - - Remote tracking - Table header for git remote tracking branch name - Távoli követés - - - - Last Updated - Table header for git update date - Legutóbb frissítve - - - - Installation of Python package {} failed - A {} Python csomag telepítése sikertelen - - - - Installation of optional package failed - A {} választható csomag telepítése sikertelen - - - - Installing required dependency {} - {} szükséges függőség telepítése - - - - Installation of Addon {} failed - A {} bővítmény telepítése sikertelen - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Nem sikerült dekódolni a {} fájlt a '{}' hozzáadásához - - - - Any dependency information in this file will be ignored - Az ebben a fájlban lévő függőségi információkat figyelmen kívül hagyjuk - - - - Unable to open macro wiki page at {} - A {} makro wiki oldalt nem lehet megnyitni - - - - Unable to fetch the code of this macro. - Nem sikerült beolvasni a makró kódját. - - - - Unable to retrieve a description from the wiki for macro {} - Nem olvasható be a {} makró wiki leírása - - - - Unable to open macro code URL {} - A {} makrókód URL nem nyitható meg - - - - Unable to fetch macro-specified file {} from {} - Nem sikerült lekérni a makró által megadott {} fájlt innen: {} - - - - Could not locate macro-specified file {} (expected at {}) - Nem találta a makró által megadott {} fájlt (a {}-nál kellett volna lennie) - - - - {}: Unrecognized internal workbench '{}' - {}: Nem ismert belső munkafelület '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Bővítmény fejlesztői figyelmeztetés: A bővítmény {} ({}) package.xml fájlban megadott tároló URL címe nem egyezik az URL-címmel, ahonnan lehívásra került ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Bővítmény fejlesztői figyelmeztetés: A package.xml fájlban a {} ({}) bővítmény tárolt változata nem egyezik azzal a változattal, ahonnan lekérdezték ({}) - - - - - Got an error when trying to import {} - Hibát kapott, amikor megpróbálta importálni a {} - - - - An unknown error occurred - Ismeretlen hiba történt - - - - Could not find addon {} to remove it. - Nem találta az eltávolítandó {} bővítményt. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Bővítmény' uninstall.py forgatókönyvének végrehajtása sikertelen volt. Folytatja az eltávolítást... - - - - Removed extra installed file {} - {} extra telepített fájl eltávolítása - - - - Error while trying to remove extra installed file {} - Hiba a(z) {} extra telepített fájl eltávolítása közben - - - - Error while trying to remove macro file {}: - Hiba a {} makrófájl eltávolítása közben: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Nem sikerült csatlakozni a GitHubhoz. Ellenőrizze a kapcsolat és a proxy beállításait. - - - - WARNING: Duplicate addon {} ignored - FIGYELMEZTETÉS: A {} bővítmény duplikátuma elhagyva - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Hiba történt a makrók frissítésében a GitHubról, próbálom tisztán ellenőrizni a... - - - - Attempting to do a clean checkout... - Megpróbálok egy tiszta kijelentkezést végezni... - - - - Clean checkout succeeded - A tiszta kilépés sikerült - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Nem sikerült frissíteni a makrókat a GitHubról -- próbálja meg törölni a bővítmény kezelő's cache-t. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Hiba a Wikihez csatlakozásban, a FreeCAD jelenleg nem tudja lekérdezni a Wiki makrólistáját - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Nem sikerült beolvasni a metaadatokat innen {name} - - - - Failed to fetch code for macro '{name}' - Nem sikerült kódot lekérni a '{name}' makróhoz - - - - Addon Manager: a worker process failed to complete while fetching {name} - Bővítmény kezelő: a {name} letöltése során nem sikerült befejezni a feldolgozást - - - - Out of {num_macros} macros, {num_failed} timed out while processing - A {num_macros} makrók közül {num_failed} a feldolgozás során letelt az idő - - - - Addon Manager: a worker process failed to halt ({name}) - Bővítmény kezelő: egy munkafolyamat nem állt le ({name}) - - - - Timeout while fetching metadata for macro {} - Időkiesés a makró metaadatainak lekérése közben innen: {} - - - - Failed to kill process for macro {}! - - Nem sikerült leállítani a {} makró folyamatát! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Sikertelenül kapta meg a Bővítmény statisztikákat innen {} - csak az ábécé szerinti rendezés lesz pontos - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Sikertelenül kapta meg a Bővítmény pontszámot a '{}' - a pontszám szerinti rendezés sikertelen lesz - - - - - Repository URL - Preferences header for custom repositories - Adattároló URL - - - - Branch name - Preferences header for custom repositories - Változat neve - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Az eredeti könyvtár biztonsági mentése és újraklónozása - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git változat átnevezés a következő üzenettel sikertelen volt: - - - - Installing - Telepítés - - - - Succeeded - Sikerült - - - - Failed - Sikertelen - - - - Update was cancelled - Frissítés megszakításra került - - - - some addons may have been updated - egyes bővítmények frissülhettek - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - A {} információ betöltése a FreeCAD Mkro Receptek wikiből... - - - - Loading page for {} from {}... - Oldal betöltés ehhez {} ebből {}... - - - - Failed to download data from {} -- received response code {}. - Nem sikerült letölteni az adatokat innen {} - a válaszkód {}. - - - - Composite view - Összetett nézet - - - - Expanded view - Bővített nézet - - - - Compact view - Kompakt nézet - - - - Alphabetical - Sort order - Betűrendes - - - - Last Updated - Sort order - Legutóbb frissítve - - - - Date Created - Sort order - Létehozás dátuma - - - - GitHub Stars - Sort order - GitHub csillagok - - - - Score - Sort order - Pontszám - - - - Std_AddonMgr - - - &Addon manager - &Bővítmény kezelő - - - - Manage external workbenches, macros, and preference packs - Külső munkafelületek, makrók és beállításcsomagok kezelése - - - - AddonInstaller - - - Finished removing {} - {} fájl eltávolítása befejeződött - - - - Failed to remove some files - Néhány fájl eltávolítása sikertelen - - - - Addons installer - - - Finished updating the following addons - A következő bővítmények frissítése befejeződött - - - - Workbench - - - Auto-Created Macro Toolbar - Automatikusan létrehozott makró eszköztár - - - - QObject - - - Addon Manager - Bővítmény kezelő - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_id.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_id.qm deleted file mode 100644 index 6b47a58f3d..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_id.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_id.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_id.ts deleted file mode 100644 index b4d5bd5275..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_id.ts +++ /dev/null @@ -1,2514 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repositori khusus - - - - Repository URL - URL repositori - - - - Branch - Cabang - - - - CompactView - - - - Icon - Ikon - - - - - <b>Package Name</b> - <b>Nama Paket</b> - - - - - Version - Versi - - - - - Description - Description - - - - Update Available - Pembaruan Tersedia - - - - UpdateAvailable - PembaruanTersedia - - - - DependencyDialog - - - Dependencies - Dependensi - - - - Dependency type - Tipe dependensi - - - - Name - Nama - - - - Optional? - Opsional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Selesaikan Ketergantungan - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Addon ini memiliki dependensi wajib dan opsional. Anda harus menginstalnya sebelum Addon ini dapat digunakan. - -Apakah Anda ingin Pengelola Addon menginstalnya secara otomatis? Pilih "Abaikan" untuk menginstal Addon tanpa menginstal dependensi. - - - - FreeCAD Addons - Addon FreeCAD - - - - Required Python modules - Modul Python yang diperlukan - - - - Optional Python modules - Modul Python opsional - - - - DeveloperModeDialog - - - Addon Developer Tools - Alat Pengembang Addon - - - - Path to Addon - Lokasi ke Addon - - - - - Browse... - Telusuri... - - - - Metadata - Metadata - - - - Primary branch - Cabang utama - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Description - - - - Discussion URL - URL diskusi - - - - Icon - Ikon - - - - Bugtracker URL - URL pelacak bug - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Opsional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - URL README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - URL repositori - - - - Website URL - URL situs web - - - - Documentation URL - URL dokumentasi - - - - Addon Name - Nama Addon - - - - Version - Versi - - - - (Recommended) - (Direkomendasikan) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Deteksi... - - - - Addon Contents - Konten Addon - - - - Dialog - - - Addon Manager - Pengelola Addon - - - - Edit Tags - Ubah Tanda - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Welcome to the Addon Manager - Selamat datang di Pengelola Addon - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Download Settings - Pengaturan Unduhan - - - - Automatically check installed Addons for updates - Automatically check installed Addons for updates - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - No proxy - Tanpa proxy - - - - System proxy - System proxy - - - - User-defined proxy: - User-defined proxy: - - - - These and other settings are available in the FreeCAD Preferences window. - These and other settings are available in the FreeCAD Preferences window. - - - - EditDependencyDialog - - - Edit Dependency - Sunting Dependensi - - - - Dependency Type - Dependency Type - - - - Dependency - Dependensi - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Opsional - - - - ExpandedView - - - - Icon - Ikon - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - Versi - - - - - (tags) - (tanda) - - - - - Description - Description - - - - - Maintainer - Pemelihara - - - - Update Available - Pembaruan Tersedia - - - - labelSort - labelSort - - - - UpdateAvailable - PembaruanTersedia - - - - Form - - - Licenses - Lisensi - - - - License - Lisensi - - - - License file - Berkas lisensi - - - - People - Orang - - - - Kind - Jenis - - - - Name - Nama - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Versi Pengelola Addon FreeCAD yang akan datang akan mendukung pengembangan pengembang mengatur cabang atau tanda tertentu untuk digunakan dengan versi FreeCAD tertentu (misalnya, mengatur tanda tertentu sebagai versi terakhir Addon Anda untuk mendukung v0.19, dll.) - - - - FreeCAD Version - Versi FreeCAD - - - - Best-available branch, tag, or commit - Cabang, tag, atau penerapan terbaik yang tersedia - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versi FreeCAD yang Didukung - - - - Minimum FreeCAD Version Supported - Versi FreeCAD Minimum yang Didukung - - - - - Optional - Opsional - - - - Maximum FreeCAD Version Supported - Versi FreeCAD Maksimum yang Didukung - - - - Advanced version mapping... - Pemetaan versi lanjutan... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opsi pengelola Addon - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires git) - Secara otomatis memeriksa pembaruan di awal (memerlukan git) - - - - Download Macro metadata (approximately 10MB) - Unduh metadata Makro (sekitar 10MB) - - - - Cache update frequency - Frekuensi pembaruan cache - - - - Manual (no automatic updates) - Manual (tidak ada pembaruan otomatis) - - - - Daily - Harian - - - - Weekly - Mingguan - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Repositori khusus - - - - Proxy - Proxy - - - - No proxy - Tanpa proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to git executable (optional): - Path to git executable (optional): - - - - The path to the git executable. Autodetected if needed and not specified. - The path to the git executable. Autodetected if needed and not specified. - - - - Advanced Options - Pilihan Lanjutan - - - - Show option to change branches (requires git) - Show option to change branches (requires git) - - - - Disable git (fall back to ZIP downloads only) - Disable git (fall back to ZIP downloads only) - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Pasang - - - - Uninstall - Copot pemasangan - - - - Update - Memperbarui - - - - Run Macro - Jalankan Makro - - - - Change branch - Ubah cabang - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Nama paket - - - - Installed version - Versi terpasang - - - - Available version - Versi tersedia - - - - Used by - Digunakan oleh - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Perbarui semua yang tersedia - - - - SelectFromList - - - Dialog - Dialog - - - - TextLabel - TextLabel - - - - UpdateAllDialog - - - Updating Addons - Memperbarui Addon - - - - Updating out-of-date addons... - Memperbarui Addon yang kedaluwarsa... - - - - addContentDialog - - - Content Item - Isi item - - - - Content type: - Jenis konten: - - - - Macro - Makro - - - - Preference Pack - Paket Preferensi - - - - Workbench - Meja kerja - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Telusuri... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Ikon - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tanda... - - - - Dependencies... - Dependensi... - - - - FreeCAD Versions... - Versi FreeCAD... - - - - Other Metadata - Metadata Lainnya - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versi - - - - Description - Description - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Setel ke hari ini (gaya CalVer) - - - - Display Name - Nama Tampilan - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Tambah tombol? - - - - Add a toolbar button for this macro? - Tambahkan tombol toolbar untuk makro ini? - - - - Yes - Ya - - - - No - Tidak - - - - Never - Tidak pernah - - - - change_branch - - - Change Branch - Ubah cabang - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Informasi Hak Cipta - - - - Copyright holder: - Pemegang Hak Cipta: - - - - Copyright year: - Tahun Hak Cipta: - - - - personDialog - - - Add Person - Tambah Orang - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Nama: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Nama pengguna - - - - Password - Kata sandi - - - - selectLicenseDialog - - - Select a license - Pilih Lisensi - - - - About... - Tentang... - - - - License name: - Nama lisensi: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Telusuri... - - - - Create... - Buat... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Pilih Toolbar - - - - Select a toolbar to add this macro to: - Pilih toolbar untuk menambahkan makro ini ke: - - - - Ask every time - Tanyakan setiap saat - - - - toolbar_button - - - - Add button? - Tambah tombol? - - - - Add a toolbar button for this macro? - Tambahkan tombol toolbar untuk makro ini? - - - - Yes - Ya - - - - No - Tidak - - - - Never - Tidak pernah - - - - AddonsInstaller - - - Starting up... - Memulai... - - - - Loading addon information - Memuat informasi addon - - - - Worker process {} is taking a long time to stop... - Proses bekerja {} membutuhkan waktu lama untuk berhenti... - - - - Previous cache process was interrupted, restarting... - - Proses cache sebelumnya terhenti, dimulai ulang... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - Segarkan cache lokal - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - Checking for updates... - - - - - Close - Dekat - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - Execution of macro failed. See console for failure details. - Execution of macro failed. See console for failure details. - - - - - - - Maintainer - Pemelihara - - - - - - - Author - Penulis - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Memperbarui - - - - Updating... - Updating... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Pemeriksaan pembaruan sedang berlangsung - - - - Installation location - Lokasi pemasangan - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Disabled - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - PERINGATAN: Addon ini sudah usang - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - PERINGATAN: Addon ini sedang dipasang, namun dinonaktifkan. Gunakan tombol 'aktifkan' untuk mengaktifkan kembali. - - - - This Addon will be enabled next time you restart FreeCAD. - Addon ini akan diaktifkan saat Anda memulai ulang FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Addon ini akan dinonaktifkan saat Anda memulai ulang FreeCAD. - - - - - - Success - Berhasil - - - - Branch change succeeded, please restart to use the new version. - Perubahan cabang berhasil, silakan mulai ulang untuk menggunakan versi baru. - - - - Install - Pasang - - - - Uninstall - Copot pemasangan - - - - Enable - Memungkinkan - - - - Disable - Nonaktifkan - - - - - Check for update - Check for update - - - - Run - menjalankan - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Memeriksa sambungan - - - - Checking for connection to GitHub... - Memeriksa sambungan ke GitHub... - - - - Connection failed - Sambungan gagal - - - - Missing dependency - Dependensi Hilang - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Lainnya... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Otomatis - - - - - Workbench - Meja kerja - - - - Addon - Tambahan - - - - Python - Python - - - - Yes - Ya - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Paket Python - - - - - Other... - Lainnya... - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually: - - - - Too many to list - Terlalu banyak untuk dicantumkan - - - - - - - - - Missing Requirement - Persyaratan Kurang - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Tekan OK untuk tetap memasang. - - - - - Incompatible Python version - Versi Python tidak kompatibel - - - - This Addon (or one if its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one if its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - menjalankan - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Nama - - - - Class - Kelas - - - - Description - Description - - - - Subdirectory - Subdirectory - - - - Files - Berkas - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Versi Python Minimum Terdeteksi - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Pasang Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Pemasangan gagal - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Pilih file ikon untuk paket ini - - - - Filter is valid - Filternya valid - - - - Filter regular expression is invalid - Filter ekspresi reguler tidak valid - - - - Search... - Search... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Pemelihara: - - - - Tags - Tanda - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Mutakhir - - - - - - - - Update available - Pembaruan tersedia - - - - - Pending restart - Menunggu dimulai ulang - - - - - DISABLED - DINONAKTIFKAN - - - - Installed version - Versi terpasang - - - - Unknown version - Versi tidak diketahui - - - - Installed on - Installed on - - - - Available version - Versi tersedia - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Apa saja - - - - Macro - Makro - - - - Preference Pack - Paket Preferensi - - - - Installation Status - Installation Status - - - - Not installed - Tidak terpasang - - - - Filter - Menyaring - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded package.xml for {} - Downloaded package.xml for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Downloaded metadata.txt for {} - Downloaded metadata.txt for {} - - - - Downloaded requirements.txt for {} - Downloaded requirements.txt for {} - - - - Downloaded icon for {} - Downloaded icon for {} - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Git is disabled, skipping git macros - Git is disabled, skipping git macros - - - - Attempting to change non-git Macro setup to use git - - Attempting to change non-git Macro setup to use git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Unable to fetch git updates for workbench {} - Unable to fetch git updates for workbench {} - - - - git status failed for {} - git status failed for {} - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Caching macro code... - Caching macro code... - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Getting metadata from macro {} - Getting metadata from macro {} - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Retrieving macro description... - Mengambil deskripsi makro... - - - - Retrieving info from git - Mengambil info dari git - - - - Retrieving info from wiki - Mengambil info dari wiki - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - URL repositori - - - - Branch name - Preferences header for custom repositories - Nama cabang - - - - Basic git update failed with the following message: - Basic git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using git - Failed to clone {} into {} using git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Memasang - - - - Succeeded - Berhasil - - - - Failed - Gagal - - - - Update was cancelled - Pembaruan dibatalkan - - - - some addons may have been updated - beberapa addon mungkin telah diperbarui - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Pengelola Addon - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Gagal menghapus beberapa file - - - - Addons installer - - - Finished updating the following addons - Selesai memperbarui addon berikut - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Pengelola Addon - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_it.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_it.qm deleted file mode 100644 index 272fba5101..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_it.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_it.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_it.ts deleted file mode 100644 index 913a99a083..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_it.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repository personalizzato - - - - Repository URL - URL del repository - - - - Branch - Ramo - - - - CompactView - - - - Icon - Icona - - - - - <b>Package Name</b> - <b>Nome pacchetto</b> - - - - - Version - Versione - - - - - Description - Descrizione - - - - Update Available - Aggiornamento Disponibile - - - - UpdateAvailable - AggiornamentoDisponibile - - - - DependencyDialog - - - Dependencies - Dipendenze - - - - Dependency type - Tipo di dipendenza - - - - Name - Nome - - - - Optional? - Facoltativo? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Risolvi Dipendenze - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Questo Addon ha le seguenti dipendenze richieste e opzionali. Devi installarle prima che questo Addon possa essere usato. - -Vuoi che Addon Manager le installi automaticamente? Scegli "Ignora" per installare Addon senza installare le dipendenze. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Moduli Python richiesti - - - - Optional Python modules - Moduli Python opzionali - - - - DeveloperModeDialog - - - Addon Developer Tools - Estensione strumenti per sviluppatori - - - - Path to Addon - Percorso per l'estensione - - - - - Browse... - Sfoglia... - - - - Metadata - Metadati - - - - Primary branch - Ramo primario - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Spiegazione di ciò che questo componente aggiuntivo fornisce. Visualizzato in Addon Manager. Non è necessario per questo dichiarare che questo è un FreeCAD Addon. - - - - Description - Descrizione - - - - Discussion URL - Url della discussione - - - - Icon - Icona - - - - Bugtracker URL - URL del Bugtracker - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Stili semantici (1.2.3-beta) o calVer (2022.08.30) supportati - - - - Set to today (CalVer style) - Impostato a oggi (Stile CalVer) - - - - - - - (Optional) - (opzionale) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Visualizzati nella lista di estensioni dell'Addon Manager. Non deve contenere la parola "FreeCAD" e deve essere un nome di cartella valido su tutti i sistemi operativi supportati. - - - - README URL - URL del README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - SUGGERIMENTO: Dal momento che questo è visualizzato all'interno di FreeCAD, nel gestore di Addon, non è necessario usare spazio per dire cose come "Questo è un FreeCAD Addon.." -- basta dire quello che fa. - - - - Repository URL - URL del repository - - - - Website URL - URL del sito - - - - Documentation URL - URL documentazione - - - - Addon Name - Nome dell'estensione - - - - Version - Versione - - - - (Recommended) - (consigliato) - - - - Minimum Python - Python minimo - - - - (Optional, only 3.x version supported) - (Opzionale, solo versione 3.x supportata) - - - - Detect... - Rileva... - - - - Addon Contents - Contenuti dell'estensione - - - - Dialog - - - Addon Manager - Addon manager - - - - Edit Tags - Modifica etichette - - - - Comma-separated list of tags describing this item: - Elenco di tag separato da virgole descrivono questo elemento: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: I tag comuni includono "Assembly", "FEM", "Mesh", "NURBS", ecc. - - - - Add-on Manager: Warning! - Add-on Manager: avvertimento! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Il gestore Add-on fornisce l'accesso a un'ampia libreria di utili estensioni FreeCAD di terze parti. Non è possibile dare alcuna garanzia riguardo la loro sicurezza o funzionalità. - - - - Continue - Continua - - - - Cancel - Annulla - - - - EditDependencyDialog - - - Edit Dependency - Modifica Dipendenza - - - - Dependency Type - Tipo Dipendenza - - - - Dependency - Dipendenza - - - - Package name, if "Other..." - Nome del pacchetto, se "Altro..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTA: Se "Altro..." è selezionato, il pacchetto non è in ALLOWED_PYTHON_PACKAGES.txt file, e non sarà installato automaticamente da Addon Manager. Invia un PR a <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> per richiedere l'aggiunta di un pacchetto. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Se questa è una dipendenza opzionale, Addon Manager offrirà d'installarla (quando possibile), ma non bloccherà l'installazione se l'utente sceglie di non installare, o non poter installare il pacchetto. - - - - Optional - Opzionale - - - - ExpandedView - - - - Icon - Icona - - - - - <h1>Package Name</h1> - <h1>Nome pacchetto</h1> - - - - - Version - Versione - - - - - (tags) - (etichette) - - - - - Description - Descrizione - - - - - Maintainer - Manutentore - - - - Update Available - Aggiornamento Disponibile - - - - labelSort - Ordinamento etichette - - - - UpdateAvailable - AggiornamentoDisponibile - - - - Form - - - Licenses - Licenze - - - - License - Licenza - - - - License file - File di Licenza - - - - People - Persone - - - - Kind - Tipo - - - - Name - Nome - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Mappatura Versione Avanzata - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Le prossime versioni dell'Addon Manager consentiranno agli sviluppatori di impostare un ramo o un tag specifico da usare con una versione specifica di FreeCAD (per esempio: impostare un tag specifico come l'ultima versione della tua estensione che supporta v0.19, ecc.) - - - - FreeCAD Version - Versione FreeCAD - - - - Best-available branch, tag, or commit - Ramo migliore disponibile, tag o commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versioni FreeCAD Supportate - - - - Minimum FreeCAD Version Supported - Versione Minima FreeCAD Supportata - - - - - Optional - Opzionale - - - - Maximum FreeCAD Version Supported - Massima Versione FreeCAD Supportata - - - - Advanced version mapping... - Mappatura versione avanzata... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opzioni di Addon manager - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Se questa opzione è selezionata, quando si avvia Addon Manager, gli addons installati -saranno controllati per gli aggiornamenti disponibili - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Scarica Macro metadati (circa 10MB) - - - - Cache update frequency - Frequenza aggiornamento cache - - - - Manual (no automatic updates) - Manuale (nessun aggiornamento automatico) - - - - Daily - Giornaliero - - - - Weekly - Settimanale - - - - Hide Addons without a license - Nascondi Addons senza licenza - - - - Hide Addons with non-FSF Free/Libre license - Nascondi Addons con licenza non-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Nascondi Addons con licenza non-OSI-approved - - - - Hide Addons marked Python 2 Only - Nascondi Addons contrassegnati con Solo Python 2 - - - - Hide Addons marked Obsolete - Nascondi gli Addons contrassegnati obsoleti - - - - Hide Addons that require a newer version of FreeCAD - Nascondi Addons che richiedono una nuova versione di FreeCAD - - - - Custom repositories - Repository personalizzati - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - Proxy di sistema utente - - - - User-defined proxy: - Proxy definito dall'utente: - - - - Score source URL - Punteggio sorgente URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - L'URL per i dati di Addon Score (vedi la pagina wiki di Addon Manager per la formattazione e i dettagli di hosting). - - - - Path to Git executable (optional): - Percorso dell'eseguibile Git (opzionale): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opzioni Avanzate - - - - Activate Addon Manager options intended for developers of new Addons. - Attiva le opzioni Addon Manager destinate agli sviluppatori di nuovi Addons. - - - - Addon developer mode - Modalità sviluppatore Addon - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Disinstalla una macro o un ambiente di lavoro selezionato - - - - Install - Installa - - - - Uninstall - Disinstalla - - - - Update - Aggiorna - - - - Run Macro - Esegui macro - - - - Change branch - Cambia ramo - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Gestisci Dipendenze Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - I seguenti pacchetti Python sono stati installati localmente da Addon Manager per soddisfare le dipendenze di Addon. Posizione di installazione: - - - - Package name - Nome pacchetto - - - - Installed version - Versione installata - - - - Available version - Versione disponibile - - - - Used by - Usato da - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Un asterisco (*) nella colonna "Usato da" indica una dipendenza facoltativa. Si noti che "Usato da" registra solo le importazioni dirette in Addon. Altri pacchetti Python su cui questi pacchetti dipendono potrebbero essere stati installati. - - - - Update all available - Aggiorna tutto disponibile - - - - SelectFromList - - - Dialog - Finestra di dialogo - - - - TextLabel - Etichetta Testo - - - - UpdateAllDialog - - - Updating Addons - Aggiornamento Addons - - - - Updating out-of-date addons... - Aggiornamento addon obsoleti... - - - - addContentDialog - - - Content Item - Elemento di contenuto - - - - Content type: - Tipo di contenuto: - - - - Macro - Macro - - - - Preference Pack - Pacchetto Preferenze - - - - Workbench - Ambiente - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Se questa è l'unica cosa nell'Estensione, tutti gli altri metadati possono essere ereditati dal livello superiore, e non hanno bisogno di essere specificati qui. - - - - This is the only item in the Addon - Questo è l'unico elemento nel componente aggiuntivo - - - - Main macro file - File macro principale - - - - The file with the macro's metadata in it - Il file con i metadati macro's in esso - - - - - - Browse... - Sfoglia... - - - - Preference Pack Name - Nome Pacchetto Preferenze - - - - Workbench class name - Nome classe Ambiente di lavoro - - - - Class that defines "Icon" data member - Classe che definisce "Icona" membro dei dati - - - - Subdirectory - Sottocartella - - - - Optional, defaults to name of content item - Opzionale, predefinito per il nome dell'elemento di contenuto - - - - Icon - Icona - - - - Optional, defaults to inheriting from top-level Addon - Opzionale, predefinito per ereditare da Addon di alto livello - - - - Tags... - Etichette... - - - - Dependencies... - Dipendenze... - - - - FreeCAD Versions... - Versioni FreeCAD... - - - - Other Metadata - Altri metadati - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Visualizzati nella lista Addon Manager' di Addons. Non dovrebbe includere la parola "FreeCAD". - - - - Version - Versione - - - - Description - Descrizione - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Stili semantici (1.2.3-beta) o calVer (2022.08.30) supportati - - - - Set to today (CalVer style) - Impostato a oggi (Stile CalVer) - - - - Display Name - Nome Visualizzato - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Tutti i campi lasciati in bianco sono ereditati dai metadati di Addon di alto livello, quindi tecnicamente sono tutti facoltativi. Per Addons con contenuti multipli, ogni elemento dovrebbe fornire un nome di visualizzazione e una descrizione unica. - - - - add_toolbar_button_dialog - - - Add button? - Aggiungere pulsante? - - - - Add a toolbar button for this macro? - Aggiungere un pulsante della barra degli strumenti per questa macro? - - - - Yes - - - - - No - No - - - - Never - Mai - - - - change_branch - - - Change Branch - Cambia Ramo - - - - Change to branch: - Cambia ramo: - - - - copyrightInformationDialog - - - Copyright Information - Informazioni sul copyright - - - - Copyright holder: - Titolare del copyright: - - - - Copyright year: - Anno del copyright: - - - - personDialog - - - Add Person - Aggiungi persona - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Un responsabile è qualcuno con accesso al commit corrente su questo progetto. Un autore è chiunque altro a cui tu'vorresti dare credito. - - - - Name: - Nome: - - - - Email: - Posta elettronica: - - - - Email is required for maintainers, and optional for authors. - L'email è richiesta per i manutentori e facoltativa per gli autori. - - - - proxy_authentication - - - Proxy login required - Accesso Proxy richiesto - - - - Proxy requires authentication - Il Proxy richiede l'autenticazione - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Segnaposto per l'indirizzo proxy - - - - Realm: - Dominio: - - - - Placeholder for proxy realm - Segnaposto per il proxy realm - - - - Username - Nome Utente - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Seleziona una licenza - - - - About... - Informazioni... - - - - License name: - Nome licenza: - - - - Path to license file: - Percorso del file di licenza: - - - - (if required by license) - (se richiesto dalla licenza) - - - - Browse... - Sfoglia... - - - - Create... - Crea... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Seleziona Barra Strumenti - - - - Select a toolbar to add this macro to: - Selezionare una barra degli strumenti per aggiungere questa macro a: - - - - Ask every time - Chiedi ogni volta - - - - toolbar_button - - - - Add button? - Aggiungere pulsante? - - - - Add a toolbar button for this macro? - Aggiungere un pulsante della barra degli strumenti per questa macro? - - - - Yes - - - - - No - No - - - - Never - Mai - - - - AddonsInstaller - - - Starting up... - Avvio in corso... - - - - Worker process {} is taking a long time to stop... - Il processo in corso {} sta impiegando molto tempo per fermarsi... - - - - Previous cache process was interrupted, restarting... - - Il processo di cache precedente è stato interrotto, riavvio... - - - - - Custom repo list changed, forcing recache... - - L'elenco dei repository personalizzati è stato modificato, si forza la recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - È necessario riavviare FreeCAD perché le modifiche abbiano effetto. - - - - Restart now - Riavvia ora - - - - Restart later - Riavvia dopo - - - - - Refresh local cache - Aggiorna cache locale - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Aggiornamento cache... - - - - - Checking for updates... - Controllo aggiornamenti... - - - - Temporary installation of macro failed. - Installazione temporanea della macro non riuscita. - - - - - Close - Chiudi - - - - Update all addons - Aggiorna tutti gli addons - - - - Check for updates - Controlla aggiornamenti - - - - Python dependencies... - Dipendenze Python... - - - - Developer tools... - Strumenti per sviluppatori... - - - - Apply %n available update(s) - Applica %n aggiornamenti disponibili - - - - No updates available - Nessun aggiornamento disponibile - - - - - - Cannot launch a new installer until the previous one has finished. - Impossibile avviare una nuova installazione fino al termine della precedente. - - - - - - - Maintainer - Manutentore - - - - - - - Author - Autore - - - - New Python Version Detected - Rilevata Nuova Versione Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Sembra che sia la prima volta che questa versione di Python è stata usata con Addon Manager. Vuoi installare le dipendenze che erano state installate automaticamente? - - - - Processing, please wait... - Elaborazione in corso, attendere prego... - - - - - Update - Aggiorna - - - - Updating... - In aggiornamento... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Impossibile importare QtNetwork -- non sembra essere installato sul sistema. Il tuo provider può avere un pacchetto per questa dipendenza (spesso chiamata "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Impossibile convertire la porta proxy specificata '{}' in un numero di porta - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Errore nel parametro: le opzioni proxy impostate sono reciprocamente esclusive. Ripristinato valore predefinito. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Errore di parametro: proxy utente indicato, ma nessun proxy fornito. Ripristino a default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Risposta {} inattesa dal server - - - - Error with encrypted connection - Errore con connessione cifrata - - - - - - Confirm remove - Conferma rimozione - - - - Are you sure you want to uninstall {}? - Sei sicuro di voler disinstallare {}? - - - - - - Removing Addon - Rimozione Addon - - - - Removing {} - Rimozione {} - - - - - Uninstall complete - Disinstallazione completata - - - - - Uninstall failed - Disinstallazione fallita - - - - Version {version} installed on {date} - Versione {version} installata in {date} - - - - Version {version} installed - Versione {version} installata - - - - Installed on {date} - Installato il {date} - - - - - - - Installed - Installato - - - - Currently on branch {}, name changed to {} - Attualmente sul ramo {}, nome cambiato in {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' check out, nessun aggiornamento possibile - - - - Update check in progress - Controllo aggiornamento in corso - - - - Installation location - Percorso di installazione - - - - Repository URL - URL del repository - - - - Changed to branch '{}' -- please restart to use Addon. - Cambiato in ramo '{}' -- si prega di riavviare per utilizzare Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Questo Addon è stato aggiornato. Riavviare FreeCAD per vedere le modifiche. - - - - Disabled - Disabilitato - - - - Currently on branch {}, update available to version {} - Attualmente sul ramo {}, aggiornamento disponibile alla versione {} - - - - Update available to version {} - Aggiornamento disponibile alla versione {} - - - - This is the latest version available - Questa è l'ultima versione disponibile - - - - WARNING: This addon is obsolete - ATTENZIONE: Questo addon è obsoleto - - - - WARNING: This addon is Python 2 only - ATTENZIONE: Questo addon è solo Python 2 - - - - WARNING: This addon requires FreeCAD {} - ATTENZIONE: Questo addon richiede FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ATTENZIONE: Questo addon è attualmente installato, ma disabilitato. Usa il pulsante 'abilita' per riabilitare. - - - - This Addon will be enabled next time you restart FreeCAD. - Questa estensione sarà abilitata al prossimo riavvio di FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Questa estensione sarà disabilitata al prossimo riavvio di FreeCAD. - - - - - - Success - Operazione riuscita - - - - Install - Installa - - - - Uninstall - Disinstalla - - - - Enable - Abilita - - - - Disable - Disabilita - - - - - Check for update - Verifica aggiornamenti - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Esegui - - - - Change branch... - Cambia ramo... - - - - Return to package list - Ritorna alla lista dei pacchetti - - - - Checking connection - Controllo connessione - - - - Checking for connection to GitHub... - Controllo della connessione a GitHub... - - - - Connection failed - Connessione fallita - - - - Missing dependency - Dipendenza mancante - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Impossibile importare QtNetwork -- vedere Report View per i dettagli. Addon Manager non disponibile. - - - - Other... - For providing a license other than one listed - Altro... - - - - Select the corresponding license file in your Addon - Seleziona il file di licenza corrispondente nel tuo Addon - - - - Location for new license file - Posizione per il nuovo file di licenza - - - - Received {} response code from server - Ricevuto {} codice di risposta dal server - - - - Failed to install macro {} - Impossibile installare la macro {} - - - - Failed to create installation manifest file: - - Creazione del file manifest di installazione non riuscita: - - - - - Unrecognized content kind '{}' - Tipo di contenuto non riconosciuto '{}' - - - - Unable to locate icon at {} - Impossibile individuare l'icona a {} - - - - Select an icon file for this content item - Seleziona un file icona per questo elemento di contenuto - - - - - - {} is not a subdirectory of {} - {} non è una sottodirectory di {} - - - - Select the subdirectory for this content item - Seleziona la sottocartella per questo elemento di contenuto - - - - Automatic - Automatica - - - - - Workbench - Ambiente - - - - Addon - Componente aggiuntivo - - - - Python - Python - - - - Yes - - - - - Internal Workbench - Ambiente Interno - - - - External Addon - Addon Esterno - - - - Python Package - Python Package - - - - - Other... - Altro... - - - - Too many to list - Troppi da elencare - - - - - - - - - Missing Requirement - Requisito Mancante - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' richiede '{}', che non è disponibile nella tua copia di FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' richiede i seguenti ambienti di lavoro, che non sono disponibili nella tua copia di FreeCAD: - - - - Press OK to install anyway. - Premere OK per installare comunque. - - - - - Incompatible Python version - Versione Python incompatibile - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Questo addon richiede pacchetti Python che non sono installati e non possono essere installati automaticamente. Per utilizzare questo addon è necessario installare manualmente i seguenti pacchetti Python: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Questo Addon (o una delle sue dipendenze) richiede Python {}.{}, e sul tuo sistema è in esecuzione {}.{}. Installazione annullata. - - - - Optional dependency on {} ignored because it is not in the allow-list - Dipendenza opzionale da {} ignorata perché non è nella lista permessi - - - - - Installing dependencies - Installazione delle dipendenze - - - - - Cannot execute Python - Impossibile eseguire Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Impossibile localizzare automaticamente l'eseguibile Python, o il percorso è impostato in modo errato. Controlla l'impostazione delle preferenze di Addon Manager per il percorso di Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Le dipendenze non possono essere installate. Continuare con l'installazione di {} comunque? - - - - - Cannot execute pip - Impossibile eseguire pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Esecuzione di pip non riuscita, che potrebbe mancare dall'installazione di Python. Assicurarsi che il sistema abbia pip installato e riprovare. Il comando fallito era: - - - - - Continue with installation of {} anyway? - Continuare con l'installazione di {} comunque? - - - - - Package installation failed - Installazione del pacchetto fallita - - - - See Report View for detailed failure log. - Vedere Report View per il registro di errore dettagliato. - - - - Installing Addon - Installazione Addon - - - - Installing FreeCAD Addon '{}' - Installazione Addon di FreeCAD '{}' - - - - Cancelling - Annullamento - - - - Cancelling installation of '{}' - Annullamento dell’installazione di '{}' - - - - {} was installed successfully - {} installato con successo - - - - - Installation Failed - Installazione Fallita - - - - Failed to install {} - Impossibile installare {} - - - - - Create new toolbar - Crea nuova barra degli strumenti - - - - - A macro installed with the FreeCAD Addon Manager - Una macro installata con FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Esegui - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Impossibile leggere i dati da GitHub: controllare la connessione internet e le impostazioni proxy e riprovare. - - - - XML failure while reading metadata from file {} - Errore XML durante la lettura dei metadati dal file {} - - - - Invalid metadata in file {} - Metadati non validi nel file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ATTENZIONE: il percorso specificato nei metadati package.xml non corrisponde al ramo attualmente selezionato. - - - - Name - Nome - - - - Class - Classe - - - - Description - Descrizione - - - - Subdirectory - Sottocartella - - - - Files - File - - - - Select the folder containing your Addon - Seleziona la cartella contenente il tuo Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Vermin assente, annullamento operazione. - - - - Scanning Addon for Python version compatibility - Scansione di Addon per la compatibilità della versione Python - - - - Minimum Python Version Detected - Rilevata Versione Minima Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin ha auto-rilevato una versione necessaria di Python 3.{} - - - - Install Vermin? - Installare Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Il rilevamento automatico della versione richiesta di Python per questo Addon richiede Vermin (https://pypi.org/project/vermin/). OK per installare? - - - - Attempting to install Vermin from PyPi - Tentativo di installare Vermin da PyPi - - - - - Installation failed - Installazione non riuscita - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Impossibile installare Vermin -- controlla Report View per i dettagli. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Impossibile importare Vermin dopo l'installazione -- impossibile scansionare Addon. - - - - Select an icon file for this package - Seleziona un file icona per questo pacchetto - - - - Filter is valid - Filtro valido - - - - Filter regular expression is invalid - L'espressione regolare del filtro non è valida - - - - Search... - Cerca... - - - - Click for details about package {} - Clicca per i dettagli sul pacchetto {} - - - - Click for details about workbench {} - Clicca per i dettagli sull'ambiente di lavoro {} - - - - Click for details about macro {} - Clicca per i dettagli sulla macro {} - - - - Maintainers: - Manutentori: - - - - Tags - Etichette - - - - {} ★ on GitHub - {} ★ su GitHub - - - - No ★, or not on GitHub - Nessuna ★, o non presente in GitHub - - - - Created - Creato - - - - Updated - Aggiornato - - - - Score: - Punteggio: - - - - - Up-to-date - Aggiornato - - - - - - - - Update available - Aggiornamento disponibile - - - - - Pending restart - Riavvio in sospeso - - - - - DISABLED - DISABILITATO - - - - Installed version - Versione installata - - - - Unknown version - Versione sconosciuta - - - - Installed on - Installato il - - - - Available version - Versione disponibile - - - - Filter by... - Filtra per... - - - - Addon Type - Tipo di Addon - - - - - Any - Qualsiasi - - - - Macro - Macro - - - - Preference Pack - Pacchetto Preferenze - - - - Installation Status - Stato Dell'Installazione - - - - Not installed - Non installato - - - - Filter - Filtro - - - - DANGER: Developer feature - PERICOLO: Funzione sviluppatore - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - PERICOLO: La commutazione dei rami è destinata a sviluppatori e beta tester, e può causare documenti corrotti, non compatibili all'indietro, instabilità, crash e/o morte termica prematura dell'universo. Sei sicuro di voler continuare? - - - - There are local changes - Ci sono cambiamenti locali - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ATTENZIONE: Questo repository ha modifiche locali non effettuate. Sei sicuro di voler cambiare i rami (apportando le modifiche con te)? - - - - Local - Table header for local git ref name - Locale - - - - Remote tracking - Table header for git remote tracking branch name - Monitoraggio remoto - - - - Last Updated - Table header for git update date - Ultimo aggiornamento - - - - Installation of Python package {} failed - Installazione del pacchetto Python {} fallita - - - - Installation of optional package failed - Installazione del pacchetto opzionale fallita - - - - Installing required dependency {} - Installazione della dipendenza richiesta {} - - - - Installation of Addon {} failed - Installazione dell'Addon {} fallita - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Impossibile decodificare il file {} per Addon '{}' - - - - Any dependency information in this file will be ignored - Qualsiasi informazione sulla dipendenza in questo file verrà ignorata - - - - Unable to open macro wiki page at {} - Impossibile aprire la pagina wiki della macro su {} - - - - Unable to fetch the code of this macro. - Impossibile recuperare il codice di questa macro. - - - - Unable to retrieve a description from the wiki for macro {} - Impossibile recuperare una descrizione dalla wiki per macro {} - - - - Unable to open macro code URL {} - Impossibile aprire l'URL del codice macro {} - - - - Unable to fetch macro-specified file {} from {} - Impossibile recuperare il file macro specificato {} da {} - - - - Could not locate macro-specified file {} (expected at {}) - Impossibile individuare il file specificato dalla macro {} (dovrebbe trovarsi a {}) - - - - {}: Unrecognized internal workbench '{}' - {}: ambiente di lavoro interno non riconosciuto '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Avviso Sviluppatore Addon: l'URL del repository impostato nel file package.xml per il componente aggiuntivo {} ({}) non corrisponde all'URL da cui è stato recuperato ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Avviso Sviluppatore Addon: il ramo del Repository impostato nel file pacchetto.xml per il componente aggiuntivo {} ({}) non corrisponde al ramo da cui è stato recuperato ({}) - - - - - Got an error when trying to import {} - Errore durante l'importazione di {} - - - - An unknown error occurred - Si è verificato un errore sconosciuto - - - - Could not find addon {} to remove it. - Impossibile trovare l'addon {} per rimuoverlo. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Esecuzione dello script di Addon's uninstall.py non riuscita. Si proseguire con la disinstallazione... - - - - Removed extra installed file {} - File extra installato rimosso {} - - - - Error while trying to remove extra installed file {} - Errore durante il tentativo di rimuovere il file extra installato {} - - - - Error while trying to remove macro file {}: - Errore durante il tentativo di rimuovere il file macro {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Impossibile connettersi a GitHub. Controlla le impostazioni di connessione e proxy. - - - - WARNING: Duplicate addon {} ignored - ATTENZIONE: Addon duplicato {} ignorato - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Si è verificato un errore durante l'aggiornamento delle macro da GitHub, ritentando il check out... - - - - Attempting to do a clean checkout... - Tentativo di fare un check out pulito... - - - - Clean checkout succeeded - Checkout pulito riuscito - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Impossibile aggiornare le macro da GitHub -- prova a cancellare la cache di Addon Manager. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Errore nel connettersi al Wiki, FreeCAD non può recuperare l'elenco macro Wiki in questo momento - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Lettura dei metadati da {name} non riuscita - - - - Failed to fetch code for macro '{name}' - Recupero del codice per macro '{name}' non riuscito - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: un processo in corso non è riuscito a completarsi durante il recupero di {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Su {num_macros} macro, {num_failed} si sono bloccate durante l'elaborazione - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: un processo in corso impedisce di arrestare ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout durante il recupero dei metadati per la macro {} - - - - Failed to kill process for macro {}! - - Impossibile terminare il processo per la macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Impossibile ottenere le statistiche di Addon da {} -- solo l'ordinamento alfabetico sarà accurato - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Impossibile ottenere il punteggio Addon da '{}' -- l'ordinamento per punteggio fallirà - - - - - Repository URL - Preferences header for custom repositories - URL del repository - - - - Branch name - Preferences header for custom repositories - Nome branch - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backup della directory originale e ri-clonazione - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Impossibile rinominare il ramo Git con il seguente messaggio: - - - - Installing - Installazione - - - - Succeeded - Riuscito - - - - Failed - Fallito - - - - Update was cancelled - Aggiornamento annullato - - - - some addons may have been updated - alcuni addons potrebbero essere stati aggiornati - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Caricamento informazioni per {} dal wiki Racolta Macro FreeCAD... - - - - Loading page for {} from {}... - Caricamento pagina per {} da {}... - - - - Failed to download data from {} -- received response code {}. - Impossibile scaricare i dati da {} -- ricevuto il codice di risposta {}. - - - - Composite view - Vista composita - - - - Expanded view - Vista espansa - - - - Compact view - Vista compatta - - - - Alphabetical - Sort order - Alfabetico - - - - Last Updated - Sort order - Ultimo aggiornamento - - - - Date Created - Sort order - Data creazione - - - - GitHub Stars - Sort order - Stelline su GitHub - - - - Score - Sort order - Punteggio - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Gestisci ambienti di lavoro, macro e pacchetti di preferenze esterni - - - - AddonInstaller - - - Finished removing {} - Terminata la rimozione {} - - - - Failed to remove some files - Rimozione di alcuni file non riuscita - - - - Addons installer - - - Finished updating the following addons - Terminato l'aggiornamento dei seguenti addons - - - - Workbench - - - Auto-Created Macro Toolbar - Barra Macro Auto-Creata - - - - QObject - - - Addon Manager - Addon manager - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ja.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ja.qm deleted file mode 100644 index 79cbf17d28..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ja.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ja.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ja.ts deleted file mode 100644 index fe18fe9ca7..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ja.ts +++ /dev/null @@ -1,2483 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - カスタムリポジトリ - - - - Repository URL - リポジトリのURL - - - - Branch - ブランチ - - - - CompactView - - - - Icon - アイコン - - - - - <b>Package Name</b> - <b>パッケージ名</b> - - - - - Version - バージョン - - - - - Description - 説明 - - - - Update Available - 更新があります - - - - UpdateAvailable - 更新が利用可能 - - - - DependencyDialog - - - Dependencies - 依存関係 - - - - Dependency type - 依存関係の種類 - - - - Name - 名前 - - - - Optional? - オプション? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - 依存関係を解決 - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - このアドオンには以下の必須依存関係、オプション依存関係があります。このアドオンを使用できるようにするにはこれらをインストールする必要があります。 - -アドオン・マネージャーに自動的にインストールしますか? 依存関係をインストールせずにアドオンをインストールするには"無視" を選択してください。 - - - - FreeCAD Addons - FreeCADアドオン - - - - Required Python modules - 必須のPythonモジュール - - - - Optional Python modules - オプションのPythonモジュール - - - - DeveloperModeDialog - - - Addon Developer Tools - 拡張機能の開発者ツール - - - - Path to Addon - 拡張機能のパス - - - - - Browse... - 参照... - - - - Metadata - メタデータ - - - - Primary branch - プライマリブランチ - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - このアドオンが提供するものの説明です。アドオンマネージャーに表示されます。FreeCADアドオン であることを示す必要ありません。 - - - - Description - 説明 - - - - Discussion URL - 議論用のURL - - - - Icon - アイコン - - - - Bugtracker URL - バグ管理システムのURL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - セマンティック(1.2.3-beta)かカレンダー(2022.08.30)バージョニングで入力 - - - - Set to today (CalVer style) - 今日の日付を挿入 - - - - - - - (Optional) - (オプション) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - アドオン・マネージャーのアドオンリストに表示されます。「FreeCAD」という単語を含まない、サポートされているすべてのオペレーティングシステムで利用可能なディレクトリ名でなければなりません。 - - - - README URL - READMEのURL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: これはFreeCAD内のアドオン・マネージャーに表示されるので、"これはFreeCADのアドオンです..." といったことを説明する必要はありません。単にこれが何かを説明してください。 - - - - Repository URL - リポジトリのURL - - - - Website URL - WebサイトのURL - - - - Documentation URL - ドキュメントのURL - - - - Addon Name - 拡張機能の名前 - - - - Version - バージョン - - - - (Recommended) - (入力を推奨) - - - - Minimum Python - Pythonの最低要件 - - - - (Optional, only 3.x version supported) - (オプション。3.x バージョンのみサポート) - - - - Detect... - 検出... - - - - Addon Contents - 拡張機能の内容 - - - - Dialog - - - Addon Manager - アドオン・マネージャー - - - - Edit Tags - タグを編集 - - - - Comma-separated list of tags describing this item: - カンマで区切られた、この項目を説明するタグのリスト: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - ヒント:一般的なタグには "Assembly"、"FEM"、"Mesh"、"NURBS"等があります。 - - - - Add-on Manager: Warning! - アドオンマネージャー: 警告! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - アドオンマネージャーは、便利なサードパーティー製 FreeCAD 拡張機能の豊富なライブラリーへのアクセスを提供します。これらの機能の安全性、機能性に関しては何ら保証しません。 - - - - Continue - 続行 - - - - Cancel - キャンセル - - - - EditDependencyDialog - - - Edit Dependency - 依存関係を編集 - - - - Dependency Type - 依存関係の種類 - - - - Dependency - 依存関係 - - - - Package name, if "Other..." - パッケージ名が「その他...」の場合 - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - 注意: 「その他...」を選択すると、パッケージは ALLOWED_PYTHON_PACKAGES.txt ファイルに記載されず、アドオン・マネージャーは自動インストールを行ないません。パッケージを追加したい場合は <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> へ PR を投稿してください。 - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - これがオプションの依存関係である場合、アドオン・マネージャーは (可能であれば) そのインストールを提供しますが、ユーザーがパッケージをインストールしない、またはできない場合でも、インストールをブロックはしません。 - - - - Optional - オプション - - - - ExpandedView - - - - Icon - アイコン - - - - - <h1>Package Name</h1> - <h1>パッケージ名</h1> - - - - - Version - バージョン - - - - - (tags) - (タグ) - - - - - Description - 説明 - - - - - Maintainer - 保守担当者 - - - - Update Available - 更新があります - - - - labelSort - ラベルソート - - - - UpdateAvailable - 更新が利用可能 - - - - Form - - - Licenses - ライセンス - - - - License - ライセンス - - - - License file - ライセンスファイル - - - - People - 貢献者 - - - - Kind - 役割 - - - - Name - 名前 - - - - Email - Eメール - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - 高度なバージョンのマッピング - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - FreeCADアドオン・マネージャーの今後のバージョンでは、特定のバージョンのFreeCADで使用するための特定のブランチやタグを開発者が設定する機能がサポートされます (例えば v0.19 をサポートする自作アドオンの最新バージョンとして特定のタグを設定するなど) - - - - FreeCAD Version - FreeCADのバージョン - - - - Best-available branch, tag, or commit - 最良のブランチ、タグ、またはコミット - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - サポートされているFreeCADのバージョン - - - - Minimum FreeCAD Version Supported - サポートされているFreeCADの最小バージョン - - - - - Optional - オプション - - - - Maximum FreeCAD Version Supported - サポートされているFreeCADの最大バージョン - - - - Advanced version mapping... - 高度なバージョンのマッピング... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - アドオン・マネージャーのオプション - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - このオプションが選択されている場合、アドオン・マネージャーの起動時にインストール済みアドオンの利用可能な更新をチェックします。 - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - マクロのメタデータ(約10MB)をダウンロード - - - - Cache update frequency - キャッシュの更新頻度 - - - - Manual (no automatic updates) - 手動(自動で更新しません) - - - - Daily - 毎日 - - - - Weekly - 毎週 - - - - Hide Addons without a license - ライセンスの無い拡張機能を非表示 - - - - Hide Addons with non-FSF Free/Libre license - 非FSF Free/Libre ライセンスの拡張機能を非表示 - - - - Hide Addons with non-OSI-approved license - OSI非承認ライセンスの拡張機能を非表示 - - - - Hide Addons marked Python 2 Only - Python 2専用の拡張機能を非表示 - - - - Hide Addons marked Obsolete - 廃止された拡張機能を非表示 - - - - Hide Addons that require a newer version of FreeCAD - 新しいバージョンのFreeCADが必要な拡張機能を非表示 - - - - Custom repositories - カスタムリポジトリ - - - - Proxy - プロキシ - - - - No proxy - プロキシを使用しない - - - - User system proxy - ユーザーシステムプロキシ - - - - User-defined proxy: - 手動でプロキシを設定する - - - - Score source URL - スコア元のURL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - アドオンスコアデータの URL (フォーマットとホスティングの詳細についてはアドオン・マネージャーのWikiページを参照) - - - - Path to Git executable (optional): - Gitの実行ファイルのパス(オプション) - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - 詳細設定 - - - - Activate Addon Manager options intended for developers of new Addons. - 新しいアドオン開発者向けのアドオン・マネージャー・オプションを有効にします。 - - - - Addon developer mode - 拡張機能開発者モード - - - - PackageDetails - - - Uninstalls a selected macro or workbench - 選択したマクロ、ワークベンチをアンインストール - - - - Install - インストール - - - - Uninstall - アンインストール - - - - Update - 更新 - - - - Run Macro - マクロを実行 - - - - Change branch - ブランチの変更 - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Pythonの依存関係の管理 - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - 以下の Python パッケージはアドオンの依存関係を満たすようにアドオン・マネージャーによってローカルにインストールされています。インストール場所: - - - - Package name - パッケージ名 - - - - Installed version - インストール済みのバージョン - - - - Available version - 利用可能なバージョン - - - - Used by - 使用先 - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - 「使用先」のアスタリスク(*)はオプションの依存関係を示します。「使用先」には拡張機能で直接インポートされたもののみ記録されることに注意してください。依存している他のPythonパッケージもインストールされている可能性があります。 - - - - Update all available - 全てを更新 - - - - SelectFromList - - - Dialog - ダイアログ - - - - TextLabel - テキストラベル - - - - UpdateAllDialog - - - Updating Addons - 拡張機能を更新 - - - - Updating out-of-date addons... - 廃止された拡張機能を更新... - - - - addContentDialog - - - Content Item - コンテンツアイテム - - - - Content type: - コンテンツの種類 - - - - Macro - マクロ - - - - Preference Pack - 環境設定パック - - - - Workbench - ワークベンチ - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - これが拡張機能内で唯一のものである場合、他のすべてのメタデータはトップレベルから継承でき、ここで指定する必要はありません。 - - - - This is the only item in the Addon - これは拡張機能の中の唯一のアイテムです - - - - Main macro file - メインのマクロファイル - - - - The file with the macro's metadata in it - マクロのメタデータを含むファイル - - - - - - Browse... - 参照... - - - - Preference Pack Name - 環境設定パック名 - - - - Workbench class name - ワークベンチのクラス名 - - - - Class that defines "Icon" data member - "Icon" データメンバを定義するクラス - - - - Subdirectory - サブディレクトリ - - - - Optional, defaults to name of content item - 省略可能、既定ではコンテンツアイテムの名前 - - - - Icon - アイコン - - - - Optional, defaults to inheriting from top-level Addon - 省略可能、デフォルトでは最上位の拡張機能から継承 - - - - Tags... - タグ... - - - - Dependencies... - 依存関係... - - - - FreeCAD Versions... - FreeCADのバージョン... - - - - Other Metadata - その他のメタデータ - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - アドオン・マネージャーのアドオン一覧に表示されます。"FreeCAD" という単語が含まれないようにしてください。 - - - - Version - バージョン - - - - Description - 説明 - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - セマンティック(1.2.3-beta)かカレンダー(2022.08.30)バージョニングで入力 - - - - Set to today (CalVer style) - 今日の日付を挿入 - - - - Display Name - 表示名 - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - 空白のフィールドは、トップレベルの拡張機能メタデータから継承されるため、実質的にはすべてオプションです。 複数のコンテンツアイテムを持つ拡張機能では、各アイテムには一意な表示名と説明を指定する必要があります。 - - - - add_toolbar_button_dialog - - - Add button? - ボタンを追加しますか? - - - - Add a toolbar button for this macro? - ツールバーにこのマクロを追加しますか? - - - - Yes - はい - - - - No - いいえ - - - - Never - 常にしない - - - - change_branch - - - Change Branch - ブランチの変更 - - - - Change to branch: - ブランチの変更 - - - - copyrightInformationDialog - - - Copyright Information - 著作権情報 - - - - Copyright holder: - 著作権者 - - - - Copyright year: - 著作権年 - - - - personDialog - - - Add Person - 人物を追加 - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - 保守担当者はこのプロジェクトで現在コミットアクセス権を持っている人です。作成者はあなたがクレジット表記したいと思う任意の人です。 - - - - Name: - 名前 - - - - Email: - Eメール - - - - Email is required for maintainers, and optional for authors. - 保守担当者はEメールアドレスが必要です。 - - - - proxy_authentication - - - Proxy login required - プロキシにログインしてください - - - - Proxy requires authentication - プロキシに認証が必要です - - - - Proxy: - プロキシ - - - - Placeholder for proxy address - プロキシアドレスのプレースホルダー - - - - Realm: - レルム - - - - Placeholder for proxy realm - プロキシのレルムのプレースホルダー - - - - Username - ユーザー名 - - - - Password - パスワード - - - - selectLicenseDialog - - - Select a license - ライセンスの選択 - - - - About... - このプログラムについて... - - - - License name: - ライセンス名 - - - - Path to license file: - ライセンスファイルのパス - - - - (if required by license) - (必要なライセンスの場合) - - - - Browse... - 参照... - - - - Create... - 作成... - - - - select_toolbar_dialog - - - - - - Select Toolbar - ツールバーを選択 - - - - Select a toolbar to add this macro to: - このマクロを追加するツールバーを選択 - - - - Ask every time - 毎回確認する - - - - toolbar_button - - - - Add button? - ボタンを追加しますか? - - - - Add a toolbar button for this macro? - ツールバーにこのマクロを追加しますか? - - - - Yes - はい - - - - No - いいえ - - - - Never - 常にしない - - - - AddonsInstaller - - - Starting up... - 起動しています… - - - - Worker process {} is taking a long time to stop... - ワーカープロセス {} の停止に時間がかかっています… - - - - Previous cache process was interrupted, restarting... - - キャッシュプロセスが中断されました。再起動しています… - - - - - Custom repo list changed, forcing recache... - - カスタムリポジトリの一覧が変更されました。強制的に再キャッシュをしています… - - - - Addon manager - アドオン・マネージャー - - - - You must restart FreeCAD for changes to take effect. - 変更を有効にするにはFreeCADを再起動してください。 - - - - Restart now - 今すぐ再起動 - - - - Restart later - 後で再起動 - - - - - Refresh local cache - ローカルキャッシュを更新 - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - キャッシュを更新しています… - - - - - Checking for updates... - 更新を確認しています… - - - - Temporary installation of macro failed. - マクロを一時インストールできませんでした。 - - - - - Close - 閉じる - - - - Update all addons - 全ての拡張機能を更新 - - - - Check for updates - 更新を確認 - - - - Python dependencies... - Pythonの依存関係... - - - - Developer tools... - 開発者ツール... - - - - Apply %n available update(s) - %n を更新 - - - - No updates available - 更新はありません - - - - - - Cannot launch a new installer until the previous one has finished. - 前のものが終了するまで、新しいインストーラーは起動できません。 - - - - - - - Maintainer - 保守担当者 - - - - - - - Author - 作成者 - - - - New Python Version Detected - 新しいバージョンのPythonが検出されました。 - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - このバージョンの Python がアドオンマネージャーで使用されたのは初めてのようです。 同じ自動インストール依存関係をインストールしますか? - - - - Processing, please wait... - 処理しています。しばらくお待ちください… - - - - - Update - 更新 - - - - Updating... - 更新しています… - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - QtNetwork をインポートできませんでした。依存関係のパッケージ("python3-pyside2.qtnetwork")をインストールしてください。 - - - - Failed to convert the specified proxy port '{}' to a port number - 指定されたプロキシポート '{}' をポート番号に変換できませんでした - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - パラメーターエラー:相互排他的なプロキシオプションが設定されています。既定のプロキシに再設定します。 - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - パラメーターエラー:「手動でプロキシを設定する」が選択されましたが、プロキシが提供されていません。既定のプロキシに再設定します。 - - - - Addon Manager: Unexpected {} response from server - アドオン・マネージャー: サーバーからの予期しない {} レスポンス - - - - Error with encrypted connection - 暗号化された接続でエラー - - - - - - Confirm remove - 削除を確認 - - - - Are you sure you want to uninstall {}? - {} をアンインストールしますか? - - - - - - Removing Addon - 拡張機能を削除しています - - - - Removing {} - {}を削除しています - - - - - Uninstall complete - アンインストールしました - - - - - Uninstall failed - アンインストールできませんでした - - - - Version {version} installed on {date} - {date} にバージョン {version} がインストールされました - - - - Version {version} installed - バージョン {version} がインストールされました - - - - Installed on {date} - {date} にインストールされました - - - - - - - Installed - インストール済み - - - - Currently on branch {}, name changed to {} - 現在のブランチ {} の名前が {} に変更されました - - - - Git tag '{}' checked out, no updates possible - Gitタグ '{}' がチェックアウトされました。更新はありません。 - - - - Update check in progress - 更新を確認しています - - - - Installation location - インストール先 - - - - Repository URL - リポジトリのURL - - - - Changed to branch '{}' -- please restart to use Addon. - ブランチ '{}' に変更されました。拡張機能を使用するには再起動してください。 - - - - This Addon has been updated. Restart FreeCAD to see changes. - この拡張機能を更新しました。FreeCADを再起動して変更を確認してください。 - - - - Disabled - 無効 - - - - Currently on branch {}, update available to version {} - 現在のブランチ {} で 、バージョン {} に更新できます - - - - Update available to version {} - バージョン {} に更新できます - - - - This is the latest version available - お使いのバージョンは最新です - - - - WARNING: This addon is obsolete - 警告:この拡張機能は廃止されました - - - - WARNING: This addon is Python 2 only - 警告:この拡張機能は Python 2専用です - - - - WARNING: This addon requires FreeCAD {} - 警告:この拡張機能は FreeCAD {} が必要です - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - 警告:この拡張機能は現在インストールされていますが無効になっています。再度有効にするには「有効」ボタンを押してください。 - - - - This Addon will be enabled next time you restart FreeCAD. - この拡張機能は次にFreeCADを再起動したときに有効になります。 - - - - This Addon will be disabled next time you restart FreeCAD. - この拡張機能は次にFreeCADを再起動したときに無効になります。 - - - - - - Success - インストールしました - - - - Install - インストール - - - - Uninstall - アンインストール - - - - Enable - 有効 - - - - Disable - 無効化 - - - - - Check for update - 更新を確認 - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - 実行 - - - - Change branch... - ブランチを変更... - - - - Return to package list - パッケージの一覧に戻る - - - - Checking connection - 接続を確認しています - - - - Checking for connection to GitHub... - GitHubへの接続を確認しています… - - - - Connection failed - 接続できませんでした - - - - Missing dependency - 依存関係が失われています - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - QtNetworkをインポートできませんでした。詳細についてはレポートビューを参照してください。アドオン・マネージャーは利用できません。 - - - - Other... - For providing a license other than one listed - その他のライセンス... - - - - Select the corresponding license file in your Addon - 拡張機能で対応するライセンスファイルを選択してください - - - - Location for new license file - 新規のライセンスファイルの保存先 - - - - Received {} response code from server - サーバーから {} レスポンスがありました - - - - Failed to install macro {} - マクロ {} をインストールできませんでした - - - - Failed to create installation manifest file: - - インストールマニフェストファイルを作成できませんでした。 - - - - Unrecognized content kind '{}' - 認識できないコンテンツ '{}' です - - - - Unable to locate icon at {} - {} でアイコンが見つかりませんでした - - - - Select an icon file for this content item - このアイテム用のアイコンファイルを選択してください - - - - - - {} is not a subdirectory of {} - {} は {} のサブディレクトリではありません - - - - Select the subdirectory for this content item - このコンテンツアイテムのサブディレクトリを選択してください - - - - Automatic - 自動 - - - - - Workbench - ワークベンチ - - - - Addon - アドオン - - - - Python - Python - - - - Yes - はい - - - - Internal Workbench - 内部ワークベンチ - - - - External Addon - 外部の拡張機能 - - - - Python Package - Pythonのパッケージ - - - - - Other... - その他... - - - - Too many to list - 項目が多いため全てを一覧にできません - - - - - - - - - Missing Requirement - 不足している要件 - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - 拡張機能 '{}' には '{}' をインストールしてください。 - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - 拡張機能 '{}' には以下のワークベンチをインストールしてください。 - - - - Press OK to install anyway. - インストールするにはOKをクリックしてください。 - - - - - Incompatible Python version - Pythonのバージョンに互換性がありません - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - この拡張機能は必要なPythonパッケージがインストールされていないため、自動でインストールできません。 この拡張機能を使用するには、以下のPythonパッケージを手動でインストールしてください。 - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - この拡張機能(あるいは依存関係がある場合はその1つ)では Python {}.{} が必要ですが、システムが {}.{} で実行されているためインストールは中止されました。 - - - - Optional dependency on {} ignored because it is not in the allow-list - 許可リストにないため、{} のオプションの依存関係は無視されます。 - - - - - Installing dependencies - 依存関係をインストールしています - - - - - Cannot execute Python - Pythonを実行できませんでした - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Pythonの実行ファイルの自動検索に失敗したか、あるいはパスが正しく設定されていません。アドオンマネージャーのユーザー設定でPythonのパスを確認してください。 - - - - Dependencies could not be installed. Continue with installation of {} anyway? - 依存関係をインストールできませんでした。{} のインストールを続行しますか? - - - - - Cannot execute pip - pipを実行できません - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - pipを実行できませんでした。システムにpipがインストールされていることを確認してください。失敗したコマンドは次の通りです。 - - - - - Continue with installation of {} anyway? - {} のインストールを続行しますか? - - - - - Package installation failed - パッケージをインストールできませんでした - - - - See Report View for detailed failure log. - 詳細な失敗ログについては、レポートビューを参照してください。 - - - - Installing Addon - 拡張機能をインストールしています - - - - Installing FreeCAD Addon '{}' - 拡張機能 '{}' をインストールしています - - - - Cancelling - 中止しています - - - - Cancelling installation of '{}' - '{}' のインストールを中止しています - - - - {} was installed successfully - {} をインストールしました - - - - - Installation Failed - インストールできませんでした - - - - Failed to install {} - {} をインストールできませんでした - - - - - Create new toolbar - ツールバーを新規作成 - - - - - A macro installed with the FreeCAD Addon Manager - FreeCAD アドオンマネージャーでインストールされたマクロ - - - - - Run - Indicates a macro that can be 'run' - 実行 - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - GitHubからデータを読み込めませんでした。インターネット接続とプロキシ設定を確認してください。 - - - - XML failure while reading metadata from file {} - ファイル {} のメタデータを読み込み中にXMLエラーが発生しました - - - - Invalid metadata in file {} - ファイル {} のメタデータが無効です - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - 警告:package.xmlメタデータで指定されたパスが現在チェックアウトされているブランチと一致しませんでした。 - - - - Name - 名前 - - - - Class - クラス - - - - Description - 説明 - - - - Subdirectory - サブディレクトリ - - - - Files - ファイル - - - - Select the folder containing your Addon - 拡張機能を保存したフォルダを選択してください - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Verminがありません。操作を中止します。 - - - - Scanning Addon for Python version compatibility - Pythonのバージョン互換性を確認するため、拡張機能をスキャンしています - - - - Minimum Python Version Detected - 最小バージョンのPythonが検出されました - - - - Vermin auto-detected a required version of Python 3.{} - VerminはPython 3.{} を必要なバージョンとして検出しました - - - - Install Vermin? - Verminをインストールしますか? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - この拡張機能に必要なPythonのバージョンを自動的に検出するには、Vermin(https://pypi.org/project/vermin/)が必要です。Verminをインストールしますか? - - - - Attempting to install Vermin from PyPi - PyPiからVerminをインストールしています - - - - - Installation failed - インストールできませんでした - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Verminをインストールできませんでした。詳細についてはレポートビューを確認してください。 - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - インストールしたVerminをインポートできませんでした。拡張機能をスキャンできません。 - - - - Select an icon file for this package - このパッケージ用のアイコンファイルを選択してください - - - - Filter is valid - フィルターは有効です - - - - Filter regular expression is invalid - フィルターの正規表現が正しくありません - - - - Search... - 検索... - - - - Click for details about package {} - パッケージ {} の詳細についてはクリックしてください - - - - Click for details about workbench {} - ワークベンチ {} の詳細についてはクリックしてください - - - - Click for details about macro {} - マクロ {} の詳細についてはクリックしてください - - - - Maintainers: - 保守担当者 - - - - Tags - タグ - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - ★がありません。またはGitHubにありません - - - - Created - 作成 - - - - Updated - 更新 - - - - Score: - スコア - - - - - Up-to-date - 最新版 - - - - - - - - Update available - 更新があります - - - - - Pending restart - 再起動を保留しています - - - - - DISABLED - 無効 - - - - Installed version - インストール済みのバージョン - - - - Unknown version - 不明なバージョン - - - - Installed on - インストール済み - - - - Available version - 利用可能なバージョン - - - - Filter by... - フィルター... - - - - Addon Type - 拡張機能の種類 - - - - - Any - 任意 - - - - Macro - マクロ - - - - Preference Pack - 環境設定パック - - - - Installation Status - インストールの状態 - - - - Not installed - 未インストール - - - - Filter - フィルター - - - - DANGER: Developer feature - 危険:開発者機能 - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - 危険:ブランチの切り替えは開発者とベータテスターを対象としており、壊れた後方互換性のないドキュメントファイル、不安定な挙動、クラッシュを引き起こす可能性があります。 実行しますか? - - - - There are local changes - ローカルの変更があります - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - 警告:このリポジトリにはコミットされていないローカルな変更があります。(変更を保持したまま)ブランチを変更しますか? - - - - Local - Table header for local git ref name - ローカル - - - - Remote tracking - Table header for git remote tracking branch name - リモートトラッキング - - - - Last Updated - Table header for git update date - 最終更新 - - - - Installation of Python package {} failed - Pythonのパッケージ {} をインストールできませんでした - - - - Installation of optional package failed - オプションのパッケージをインストールできませんでした - - - - Installing required dependency {} - 必要な依存関係 {} をインストールしています - - - - Installation of Addon {} failed - 拡張機能 {} をインストールできませんでした - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - {} ファイルを拡張機能 '{}' 用にデコードできませんでした - - - - Any dependency information in this file will be ignored - このファイル内の依存関係の情報は無視されます - - - - Unable to open macro wiki page at {} - {} のマクロのWikiを開けませんでした - - - - Unable to fetch the code of this macro. - このマクロのコードを取得できませんでした - - - - Unable to retrieve a description from the wiki for macro {} - マクロ {} の説明をWikiから取得できませんでした - - - - Unable to open macro code URL {} - マクロのコードの URL {} を開けませんでした - - - - Unable to fetch macro-specified file {} from {} - マクロ指定ファイル {} を {} から取得できませんでした - - - - Could not locate macro-specified file {} (expected at {}) - マクロ指定ファイル {} が見つかりませんでした ({}) - - - - {}: Unrecognized internal workbench '{}' - {}:認識できない内部ワークベンチ '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - 拡張機能開発者警告: 拡張機能 {} ({}) のpackage.xmlファイルに設定されているリポジトリURLが ({}) から取得したURLと一致しませんでした - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - 拡張機能開発者警告: 拡張機能 {} ({}) のpackage.xmlファイルに設定されているリポジトリのブランチが ({}) から取得したブランチと一致しませんでした - - - - - Got an error when trying to import {} - {} のインポートでエラーが発生しました。 - - - - An unknown error occurred - 不明なエラーが発生しました。 - - - - Could not find addon {} to remove it. - 削除する拡張機能 {} が見つかりませんでした。 - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - 拡張機能のuninstall.pyスクリプトを実行できませんでした。アンインストールしています… - - - - Removed extra installed file {} - 追加でインストールされたファイル {} を削除しました - - - - Error while trying to remove extra installed file {} - 追加でインストールされたファイル {} の削除中にエラーが発生しました - - - - Error while trying to remove macro file {}: - マクロファイル {} の削除中にエラーが発生しました - - - - Failed to connect to GitHub. Check your connection and proxy settings. - GitHubに接続できませんでした。インターネット接続とプロキシ設定を確認してください。 - - - - WARNING: Duplicate addon {} ignored - 警告:重複する拡張機能 {} は無視されました - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - GitHubのマクロを更新中にエラーが発生しました。チェックアウトを削除しています… - - - - Attempting to do a clean checkout... - チェックアウトを削除しています… - - - - Clean checkout succeeded - チェックアウトを削除しました - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - GitHub からマクロを更新できませんでした -- アドオン・マネージャーのキャッシュをクリアしてみてください。 - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Wikiへの接続中にエラーが発生しました。現在、FreeCADはWikiのマクロ一覧を取得できません。 - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - {name} からメタデータを読み込めませんでした - - - - Failed to fetch code for macro '{name}' - マクロ '{name}' のコードが取得できませんでした - - - - Addon Manager: a worker process failed to complete while fetching {name} - アドオン・マネージャー: {name} の取得中にワーカープロセスが処理を完了できませんでした - - - - Out of {num_macros} macros, {num_failed} timed out while processing - {num_macros}個のマクロのうち、{num_failed}個が処理中にタイムアウトしました - - - - Addon Manager: a worker process failed to halt ({name}) - アドオン・マネージャー: ワーカープロセスの停止に失敗しました ({name}) - - - - Timeout while fetching metadata for macro {} - マクロ {} のメタデータを取得中にタイムアウトしました - - - - Failed to kill process for macro {}! - - マクロ {} のプロセスを強制終了できませんでした。 - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - {} から拡張機能の統計データを取得できませんでした。アルファベット順での並べ替えのみ正しいものになります - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - '{}' から拡張機能のスコアを取得できませんでした。スコア順での並べ替えはできません - - - - - Repository URL - Preferences header for custom repositories - リポジトリのURL - - - - Branch name - Preferences header for custom repositories - ブランチ名 - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - 元のディレクトリをバックアップして再クローンします - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Giのブランチ名を変更できませんでした。 - - - - Installing - インストールしています - - - - Succeeded - 成功 - - - - Failed - 失敗 - - - - Update was cancelled - 更新を中止しました - - - - some addons may have been updated - 一部の拡張機能が更新されます - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - マクロのWikiから {} の情報を読み込んでいます… - - - - Loading page for {} from {}... - {} のページを {} から読み込んでいます… - - - - Failed to download data from {} -- received response code {}. - {} からデータをダウンロードできませんでした -- レスポンスコード {} を受信しました。 - - - - Composite view - 複合表示 - - - - Expanded view - 展開表示 - - - - Compact view - コンパクト表示 - - - - Alphabetical - Sort order - アルファベット順 - - - - Last Updated - Sort order - 最終更新 - - - - Date Created - Sort order - 作成日時 - - - - GitHub Stars - Sort order - GitHubのスター数 - - - - Score - Sort order - スコア - - - - Std_AddonMgr - - - &Addon manager - アドオンマネージャー(&A) - - - - Manage external workbenches, macros, and preference packs - 外部のワークベンチ、マクロ、環境設定パックを管理 - - - - AddonInstaller - - - Finished removing {} - {}を削除しました - - - - Failed to remove some files - 一部のファイルを削除できませんでした - - - - Addons installer - - - Finished updating the following addons - 以下の拡張機能を更新しました - - - - Workbench - - - Auto-Created Macro Toolbar - 自動で作成されたマクロのツールバー - - - - QObject - - - Addon Manager - アドオン・マネージャー - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ka.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ka.qm deleted file mode 100644 index 70fd85b4ae..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ka.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ka.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ka.ts deleted file mode 100644 index 5aa6669d9d..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ka.ts +++ /dev/null @@ -1,2486 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - ხელით მითითებული რეპოზიტორია - - - - Repository URL - რეპოზიტორიის URL - - - - Branch - ბრენჩი - - - - CompactView - - - - Icon - ხატულა - - - - - <b>Package Name</b> - <b>პაკეტის სახელი</b> - - - - - Version - ვერსია - - - - - Description - აღწერა - - - - Update Available - ხელმისაწვდომია განახლება - - - - UpdateAvailable - განახლება ხელმისაწვდომია - - - - DependencyDialog - - - Dependencies - დამოკიდებულებები - - - - Dependency type - დამოკიდებულების ტიპი - - - - Name - სახელი - - - - Optional? - არასავალდებულო? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - დამოკიდებულებების ამოხსნა - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - ამ დამატებას გააჩნია შემდეგი საჭირო და არასავალდებულო დამოკიდებულებები. დააყენეთ ისინი ამ დამატების სრული ფუნქციონალის მისაღებად. - -იქნებ გნებავთ, რომ ეს დამოკიდებულებები დამატებების მმართველმა ავტომატურად დააყენოს? დამატების დამოკიდებულებების გარეშე დასაყენებლად აირჩიეთ "იგნორი". - - - - FreeCAD Addons - FreeCAD-ის დამატებები - - - - Required Python modules - Python-ის საჭირო მოდულები - - - - Optional Python modules - Python-ის არასავალდებულო მოდულები - - - - DeveloperModeDialog - - - Addon Developer Tools - დამატების პროგრამისტის ხელსაწყოები - - - - Path to Addon - ბილიკი დამატებამდე - - - - - Browse... - მოძებნა... - - - - Metadata - მეტამონაცემები - - - - Primary branch - ძირითადი ბრენჩი - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - აღწერა, რას აკეთებს ეს დამატება. გამოჩნდება დამატებების მმართველში. ეს საკმარისი არაა, რომ ის FreeCAD-ის დამატება აღმოჩნდეს. - - - - Description - აღწერა - - - - Discussion URL - განხილვის URL - - - - Icon - ხატულა - - - - Bugtracker URL - შეცდომების სიის URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - მხარდაჭერილია Semantic (1.2.3-beta) და CalVer (2022.08.30) სტილები - - - - Set to today (CalVer style) - დღევანდელ დღეზე დაყენება (CalVer-ის სტილი) - - - - - - - (Optional) - (არასავალდებულო) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - ნაჩვენებია დამატებების სიაში. არ უნდა შეიცავდეს სიტყვას "FreeCAD" და ყველა მხარდაჭერილი ოპერაციული სისტემებისთვის სწორ საქაღალდის სახელს უნდა წარმოადგენდეს. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - მინიშნება: იმის გამო, რომ ეს FreeCAD-ის შიგნით, დამატებების მმართველში გამოჩნდება, ნუ დახარჯავთ ადგილს, რომ მიაწეროთ "ეს FreeCAD-ის დამატებაა" -- უბრალოდ დააწერეთ, რას აკეთებს. - - - - Repository URL - რეპოზიტორიის URL - - - - Website URL - ვებსაიტის URL - - - - Documentation URL - დოკუმენტაციის URL - - - - Addon Name - დამატების სახელი - - - - Version - ვერსია - - - - (Recommended) - (რეკომენდებული) - - - - Minimum Python - მინიმალური Python - - - - (Optional, only 3.x version supported) - (არასავალდებულო. მხარდაჭერილია მხოლოდ ვერსია 3.x) - - - - Detect... - აღმოჩენა... - - - - Addon Contents - დამატების საკონტაქტო ინფორმაცია - - - - Dialog - - - Addon Manager - დამატებების მმართველი - - - - Edit Tags - ჭდეების ჩასწორება - - - - Comma-separated list of tags describing this item: - ამ ელემენტის აღმწერი მძიმეებით-გამოყოფილი ჭდეების სია: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - მინიშნება: გავრცელებული ჭდეები შეიცავენ "ანაწყობს","სემ","ბადე","NURBS" და ა.შ. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - გაგრძელება - - - - Cancel - გაუქმება - - - - EditDependencyDialog - - - Edit Dependency - დამოკიდებულების ჩასწორება - - - - Dependency Type - დამოკიდებულების ტიპი - - - - Dependency - დამოკიდებულება - - - - Package name, if "Other..." - პაკეტის სახელი, თუ "სხვა..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - შენიშვნა: თუ არჩეულია "სხვა" პაკეტი, რომელიც ALLOWED_PYTHON_PACKAGES.txt ფაილში მოყვანლი არაა, ავტომატურად არ იქნება დაყენებული დამატებების მმართველის მიერ. პაკეტის დასამატებლად გახსენით PR მისამართზე <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a>. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - თუ ეს არასავალდებულო დემოკიდებულებაა, დამატებების მმართველი შემოგთავაზებთ, დააყენოთ ის (თუ ეს შესაძლებელია), მაგრამ არ დაბლოკავს დაყენებას, თუ უარს განაცხადებთ, პაკეტი დააყენოთ. - - - - Optional - არასავალდებულო - - - - ExpandedView - - - - Icon - ხატულა - - - - - <h1>Package Name</h1> - <h1>პაკეტის სახელი</h1> - - - - - Version - ვერსია - - - - - (tags) - (ჭდეები) - - - - - Description - აღწერა - - - - - Maintainer - პროექტის ლიდერი - - - - Update Available - განახლება ხელმისაწვდომია - - - - labelSort - ჭდეების დალაგება - - - - UpdateAvailable - ხელმისაწვდომიაგანახლება - - - - Form - - - Licenses - ლიცენზიები - - - - License - ლიცენზია - - - - License file - ლიცენზიის ფაილი - - - - People - ხალხი - - - - Kind - ტიპი - - - - Name - სახელი - - - - Email - ელფოსტა - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - ვერსიების დამატებითი ბმა - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - FreeCAD-ის დამატებების მმართველის მომავალ ვერსიებს დამატებების ბრენჩის ან ჭდის მითითების საშუალება ექნება, რათა საშუალება მოგცეთ, ის FreeCAD-ის მითითებულ ვერსიაში გამოიყენოთ (მაგალითდ, გამოიყენეთ ჭდეები, რომ აირჩიოთ დამატება, რომელსაც 0.19-ის მხარდაჭერა გააჩნია და ა.შ.) - - - - FreeCAD Version - FreeCAD-ის ვერსია - - - - Best-available branch, tag, or commit - საუკეთესო ხელმისაწვდომი ბრენჩი, ჭდე ან კომიტი - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - FreeCAD-ის მხარდაჭერილი ვერსიები - - - - Minimum FreeCAD Version Supported - FreeCAD-ის მინიმალური მხარდაჭერილი ვერსია - - - - - Optional - არასავალდებულო - - - - Maximum FreeCAD Version Supported - FreeCAD-ის მაქსიმალური მხარდაჭერილი ვერსია - - - - Advanced version mapping... - ვერსიების დამატებითი ბმა... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - დამატებების მმართველის გამართვა - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - თუ ეს პარამეტრი არჩეულია, დამატებების მმართველის გაშვებისას -დაყენებული დამატებების განახლებებიც შემოწმდება - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - მაკროს მეტამონაცემების გადმოწერა (დაახლ. 10მბ) - - - - Cache update frequency - ქეშის განახლების სიხშირე - - - - Manual (no automatic updates) - ხელით (ავტომატური განახლებების გამორთვა) - - - - Daily - ყოველდღიური - - - - Weekly - ყოველკვირეული - - - - Hide Addons without a license - ლიცენზიის არმქონე დამატებების დამალვა - - - - Hide Addons with non-FSF Free/Libre license - არა-FSF/Libre ლიცენზიის მქონე დამატებების დამალვა - - - - Hide Addons with non-OSI-approved license - არა-OSI-ის მიერ მოწონებული ლიცენზიის მქონე გაფართოებების დამალვა - - - - Hide Addons marked Python 2 Only - მხოლოდ Python v2-თან თავსებადი დამატებების დამალვა - - - - Hide Addons marked Obsolete - მოძველებულად მონიშნული დამატებების დამალვა - - - - Hide Addons that require a newer version of FreeCAD - იმ დამატებების დამალვა, რომელსაც FreeCAD-ის უფრო ახალი ვერსია სჭირდებათ - - - - Custom repositories - ხელით მითითებული რეპოზიტორიები - - - - Proxy - პროქსი - - - - No proxy - პროქსის გარეშე - - - - User system proxy - მომხმარებლის სისტემური პროქსი - - - - User-defined proxy: - მომხმარებლის პროქსი: - - - - Score source URL - წყაროს ბმულის შეფასება - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - ბმული დამატების ქულების მონაცემისთვის (იხილეთ დამატებების მმართველის ვიკის გვერდი დაფორმატებისა და ჰოსტინგის დეტალებისთვის). - - - - Path to Git executable (optional): - 'git'-ის გამშვები ფაილის ბილიკი (არასავალდებულოა): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - დამატებითი პარამეტრები - - - - Activate Addon Manager options intended for developers of new Addons. - დამატებების მმართველში ახალი დამატებების პროგრამისტებისათვის განკუთვნილი პარამეტრების აქტივაცია. - - - - Addon developer mode - დამატების პროგრამისტის რეჟიმი - - - - PackageDetails - - - Uninstalls a selected macro or workbench - მონიშნული მაკროს ან სამუშაო მაგიდის წაშლა - - - - Install - დაყენება - - - - Uninstall - წაშლა - - - - Update - განახლება - - - - Run Macro - მაკროს გაშვება - - - - Change branch - ბრენჩის შეცვლა - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Python-ის დამოკიდებულებების მართვა - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - დამატებების მმართველის მიერ დამატების მოთხოვნების დასაკმაყოფილებლად Python-ის პაკეტები იქნა დაყენებული. -დაყენების მდებარეობა: - - - - Package name - პაკეტის სახელი - - - - Installed version - დაყენებული ვერსია - - - - Available version - ხელმისაწვდომი ვერსია - - - - Used by - გამოიყენება - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - ვარსკვლავი (*), "გამოყენებული" სვეტის მიერ, დამატებითი დამოკიდებულებების არსებობას აღნიშნავს. გაითვალისწინეთ, რომ ის გამოიყენება მხოლოდ ჩანაწერების მიერ, რომლებიც დამატებაში პირდაპირაა შემოტანილი. Python-ის სხვა პაკეტები, რომლებზეც ისინი არიან დამოკიდებულები, ასევე დადგება. - - - - Update all available - ყველა ხელმისაწვდომის განახლება - - - - SelectFromList - - - Dialog - ფანჯარა - - - - TextLabel - ტექსტური ჭდე - - - - UpdateAllDialog - - - Updating Addons - დამატებების განახლება - - - - Updating out-of-date addons... - მოძველებული დამატებების განახლება... - - - - addContentDialog - - - Content Item - შემცველობის ელემენტი - - - - Content type: - შემცველობის ტიპი: - - - - Macro - მაკრო - - - - Preference Pack - პარამეტრების პაკეტი - - - - Workbench - სამუშაო მაგიდა - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - თუ ეს ამ დამატების ერთად-ერთი რამაა, სხვა მეტამონაცემების მიღება მემკვიდრეობით შეგიძლიათ, უმაღლესი დონიდან და არ სჭირდება, აქაც იყოს მითითებული. - - - - This is the only item in the Addon - ეს ამ დამატების ერთად ერთი ელემენტია - - - - Main macro file - მაკროს მთავარი ფაილი - - - - The file with the macro's metadata in it - მაკროს მეტამონაცემების შემცველი ფაილი - - - - - - Browse... - მოძებნა... - - - - Preference Pack Name - პარამეტრების პაკეტის სახელი - - - - Workbench class name - სამუშაო დაფის კლასის სახელი - - - - Class that defines "Icon" data member - კლასი, რომელიც "ხატულის" მონაცემების წევრს აღწერს - - - - Subdirectory - ქვესაქაღალდე - - - - Optional, defaults to name of content item - არასავალდებულო, ნაგულისხმევად შემცველობის ელემენტის სახელს შეიცავს - - - - Icon - ხატულა - - - - Optional, defaults to inheriting from top-level Addon - არასავალდებულო. ნაგულისხმევია ყველაზე ზედა დამატებიდან, მემკვიდრეობით - - - - Tags... - ჭდეები... - - - - Dependencies... - დამოკიდებულებები... - - - - FreeCAD Versions... - FreeCAD-ის ვერსიები... - - - - Other Metadata - სხვა მეტაინფორმაცია - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - ნაჩვენებია დამატებების მმართველის სიაში. არ უნდა შეიცავდეს სიტყვას "FreeCAD". - - - - Version - ვერსია - - - - Description - აღწერა - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - მხარდაჭერილია Semantic (1.2.3-beta) ან CalVer (2022.08.30) სტილები - - - - Set to today (CalVer style) - დღევანდელზე დაყენება (CalVer-ის სტილი) - - - - Display Name - საჩვენებელი სახელი - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - ნებისმიერი ცარიელად დატოვებული ველი მემკვირდრეობით იქნება აღებული ზედა-დონის დამატების მეტამონაცემებიდან, ასე რომ, ტექნიკურად, ისინი სავალდებული არაა. დამატებებისთვის, რომლებსაც შემცველობის მრავალი ელემენტი გააჩნიათ, თითოეულ მათგანს თავისი, უნიკალური სახელი და აღწერა უნდა გააჩნდეს. - - - - add_toolbar_button_dialog - - - Add button? - დავამატო ღილაკი? - - - - Add a toolbar button for this macro? - დავამატო ამ ღილაკი ამ მაკროსთვის? - - - - Yes - დიახ - - - - No - არა - - - - Never - არასდროს - - - - change_branch - - - Change Branch - ბრენჩის შეცვლა - - - - Change to branch: - შეცვლა ბრენჩზე: - - - - copyrightInformationDialog - - - Copyright Information - საავტორო უფლებები - - - - Copyright holder: - საავტორო უფლების მფლობელი: - - - - Copyright year: - საავტორო უფლებების წელი: - - - - personDialog - - - Add Person - პიროვნების დამატება - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - პროექტის წამყვანი წარმაოდგენს პიროვნებას, რომელსაც ამ პროექტში ცვლილებების შეტანა შეუძლია. ავტორი წარმოადგენს ნებისმიერს, ვისაც გნებავთ, პატივი მიაგოთ. - - - - Name: - სახელი: - - - - Email: - ელფოსტა: - - - - Email is required for maintainers, and optional for authors. - ელფოსტა აუცლებელია პროექტის ხელმძღვანელებისათვის და არასავალდებულოა ავტორებისთვის. - - - - proxy_authentication - - - Proxy login required - საჭიროა პროქსიზე შესვლა - - - - Proxy requires authentication - პროქსი მოითხოვს ავტენთიფიკაციას - - - - Proxy: - პროქსი: - - - - Placeholder for proxy address - პროქსი რეალმის ადგილის დამკავებელი - - - - Realm: - რეალმი: - - - - Placeholder for proxy realm - პროქსი რეალმის ადგილი - - - - Username - მომხმარებლის სახელი - - - - Password - პაროლი - - - - selectLicenseDialog - - - Select a license - აირჩიეთ ლიცენზია - - - - About... - შესახებ... - - - - License name: - ლიცენზიის სახელი: - - - - Path to license file: - ბილიკი ლიცენზიის ფაილამდე: - - - - (if required by license) - (თუ მთხოვნილია ლიცენზიის მიერ) - - - - Browse... - მოძებნა... - - - - Create... - შექმნა... - - - - select_toolbar_dialog - - - - - - Select Toolbar - აირჩიეთ ხელსაწყოთა ზოლი - - - - Select a toolbar to add this macro to: - აირჩიეთ ხელსაწყოების ზოლი, რომელსაც ეს მაკრო დაემატება: - - - - Ask every time - შეკითხვა ყოველთვის - - - - toolbar_button - - - - Add button? - დავამატო ღილაკი? - - - - Add a toolbar button for this macro? - დავამატო ხელსაწყოების პანელის ღილაკი ამ მაკროსთვის? - - - - Yes - დიახ - - - - No - არა - - - - Never - არასდროს - - - - AddonsInstaller - - - Starting up... - გაშვება... - - - - Worker process {} is taking a long time to stop... - დამხმარე პროცესი {} გაჩერებას მეტისმეტად დიდხანს უნდება... - - - - Previous cache process was interrupted, restarting... - - ქეშის წინა პროცესი გაწყდა. თავიდან დაწყება... - - - - - Custom repo list changed, forcing recache... - - ხელით მითითებული რეპოების სია შეიცვალა. მიმდინარეობს ლოკალური ქეშის თავიდან აგება... - - - - - Addon manager - დამატებების მმართველი - - - - You must restart FreeCAD for changes to take effect. - ცვლილებების ძალაში შესასვლელად საჭიროა FreeCAD-ის გადატვირთვა. - - - - Restart now - ახლავე გადატვირთვა - - - - Restart later - მოგვიანებით გადატვირთვა - - - - - Refresh local cache - ლოკალური კეშის განახლება - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - კეშის განახლება... - - - - - Checking for updates... - განახლების შემოწმება... - - - - Temporary installation of macro failed. - მაკროს დროებით დაყენების ჩავარდა. - - - - - Close - დახურვა - - - - Update all addons - ყველა დამატების განახლება - - - - Check for updates - განახლებების შემოწმება - - - - Python dependencies... - Python-ის დამოკიდებულებები... - - - - Developer tools... - პროგრამისტის ხელსაწყოები... - - - - Apply %n available update(s) - %n ხელმისაწვდომი განახლების გადატარება - - - - No updates available - განახლებები ხელმისაწვდომი არაა - - - - - - Cannot launch a new installer until the previous one has finished. - ახალი დამყენებლის გაშვება მაშინ, როცა წინა ჯერ არ დასრულებულა, შეუძლებელია. - - - - - - - Maintainer - წამყვანი პროგრამისტი - - - - - - - Author - ავტორი - - - - New Python Version Detected - აღმოჩენილია Python-ის ახალი ვერსია - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - როგორც ჩანს, Python-ის ეს ვერსია დამატებების მმართველში პირველად გამოიყენება. გნებავთ იგივე ავტომატურად-დაყენებული დამოკიდებულებების დაყენება? - - - - Processing, please wait... - მიმდინარეობს დამუშავება. გთხოვთ, მოიცადეთ... - - - - - Update - განახლება - - - - Updating... - მიმდინარეობს განახლება... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - QtNetwork-ის შემოტანის შეცდომა. როგორც ჩანს, ის თქვენს სისტემაზე დაყენებული არაა. თქვენს მომწოდებელს შეიძლება მისთვის ცალკე პაკეტი ჰქონდეს (ხშირად ჰქვია "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - მითითებული პოროქსის პორტის '{}' პორტის ნომრად გარდაქმნის შეცდომა - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - პარამეტრის შეცდომა: პროქსის ურთიერთგამომრიცხავი პარამეტრები. დაბრუნებული იქნება ნაგულისხმევი მნიშვნელობები. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - პარამეტრის შეცდომა: მომხმარებლის პროქსი ჩართულია, მაგრამ მითითებული არაა. გამოყენებული იქნება ნაგულისხმევი მნიშვნელობები. - - - - Addon Manager: Unexpected {} response from server - დამატებების მმართველი: სერვერის მოულოდნელი პასუხი: {} - - - - Error with encrypted connection - დაშიფრული კავშირის შეცდომა - - - - - - Confirm remove - წაშლის დადასტურება - - - - Are you sure you want to uninstall {}? - დარწმუნებული ბრძანდებით, რომ გნებავთ, წაშალოთ {}? - - - - - - Removing Addon - დამატების წაშლა - - - - Removing {} - {}-ის წაშლა - - - - - Uninstall complete - წაშლა დასრულდა - - - - - Uninstall failed - წაშლის შეცდომა - - - - Version {version} installed on {date} - დაყენებული ვერსია {version}. თარიღი {date} - - - - Version {version} installed - დაყენებული ვერსია {version} - - - - Installed on {date} - ინსტალაციის თარიღი {date} - - - - - - - Installed - დაყენებულია - - - - Currently on branch {}, name changed to {} - ამჟამად ვარ ბრენჩზე {}. სახელი შეიცვალა მნიშვნელობაზე {} - - - - Git tag '{}' checked out, no updates possible - Git ჭდით '{}' შემოწმდა. განახლებები ხელმიუწვდომელია - - - - Update check in progress - მიმდინარეობს განახლებების შემოწმება - - - - Installation location - დაყენების ადგილი - - - - Repository URL - რეპოზიტორიის URL - - - - Changed to branch '{}' -- please restart to use Addon. - ბრენჩი შეიცვალა '{}' - დამატების გამოსაყენებლად გადატვირთეთ. - - - - This Addon has been updated. Restart FreeCAD to see changes. - დამატება განახლდა. ცვლილებების სანახავად გადატვირთეთ FreeCAD. - - - - Disabled - გათიშული - - - - Currently on branch {}, update available to version {} - ამჟამად ბრენჩია {}. ხელმისაწვდომია განახლება ვერსიამდე {} - - - - Update available to version {} - ხელმისაწვდომია განახლება ვერსიამდე {} - - - - This is the latest version available - ეს არის უახლესი ვერსია - - - - WARNING: This addon is obsolete - გაფრთხილება: ეს დამატება მოძველებულია - - - - WARNING: This addon is Python 2 only - გაფრთხილება: ეს დამატება მუშაობს, მხოლოდ, Python v2-ზე - - - - WARNING: This addon requires FreeCAD {} - გაფრთხილება: ამ დამატებას სჭირდება FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - გაფრთხილება: ეს დამატება ამჟამად დაყენებულია, მაგრამ გამორთული. ჩასართავად გამოიყენეთ 'ჩართვის' ღილაკი. - - - - This Addon will be enabled next time you restart FreeCAD. - ეს დამატება მხოლოდ FreeCAD-ის მორიგი რესტარტის შემდეგ ჩაირთვება. - - - - This Addon will be disabled next time you restart FreeCAD. - ეს დამატება მხოლოდ FreeCAD-ის მორიგი რესტარტის შემდეგ გაითიშება. - - - - - - Success - წარმატება - - - - Install - დაყენება - - - - Uninstall - წაშლა - - - - Enable - ჩართვა - - - - Disable - გამორთვა - - - - - Check for update - განახლების შემოწმება - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - გაშვება - - - - Change branch... - ბრენჩის შეცვლა... - - - - Return to package list - პაკეტების სიასთან დაბრუნება - - - - Checking connection - შეერთების შემოწმება - - - - Checking for connection to GitHub... - GitHub-მდე კავშირის შემოწმება... - - - - Connection failed - დაკავშირება ვერ მოხერხდა - - - - Missing dependency - აკლია დამოკიდებულება - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - QtNetwork-ის შემოტანის შეცდომა -- დეტალებისთვის იხილეთ ანგარიში. დამატებების მმართველი ხელმიუწვდომელია. - - - - Other... - For providing a license other than one listed - სხვა... - - - - Select the corresponding license file in your Addon - აირჩიეთ შესაბამისი ლიცენზიის ფაილი თქვენი დამატებისთვის - - - - Location for new license file - ახალი ლიცენზიის ფაილის მდებარეობა - - - - Received {} response code from server - სერვერიდან მიღებულია პასუხის კოდი {} - - - - Failed to install macro {} - მაკრო {} დაყენების შეცდომა - - - - Failed to create installation manifest file: - - დაყენების მანიფესტის ფაილის შექმნა ჩავარდა: - - - - - Unrecognized content kind '{}' - შემცველობის უცნობი ტიპი '{}' - - - - Unable to locate icon at {} - {}-ზე ხატულის პოვნის შეცდომა - - - - Select an icon file for this content item - აირჩიეთ ხატულას ფაილი ამ შემცველობის ელემენტისთვის - - - - - - {} is not a subdirectory of {} - {} -ი {}-ის ქვესაქაღალდეს არ წარმოადგენს - - - - Select the subdirectory for this content item - აირჩიეთ ამ შემცველობის ელემენტის ქვესაქაღალდე - - - - Automatic - ავტომატური - - - - - Workbench - სამუშაო მაგიდა - - - - Addon - დამატება - - - - Python - Python - - - - Yes - დიახ - - - - Internal Workbench - შიდა სამუშაო მაგიდა - - - - External Addon - გარე დამატება - - - - Python Package - Python-ის პაკეტი - - - - - Other... - სხვა... - - - - Too many to list - მეტისმეტად ბევრ ელემენტს ამატებთ სიაში - - - - - - - - - Missing Requirement - არასაკმარისი პირობები - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - დამატება '{}'-ს ესაჭიროება '{}', რომელიც FreeCAD-ის თქვენს ვერსიაში ხელმიუწვდომელია. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - დამატება '{}'-ს ესაჭიროება შემდეგი სამუშაო მაგიდები, რომელიც FreeCAD-ის თქვენს ვერსიაში ხელმიუწვდომელია: - - - - Press OK to install anyway. - დააწექით "დიახ"-ს ნებისმიერ შემთხვევაში დასაყენებლად. - - - - - Incompatible Python version - Python-ის შეუთავსებელი ვერსია - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - ამ დამატებას სჭირდება Python-ის პაკეტები, რომლებიც დაყენებული არაა და მათი დაყენება ავტომატურადაც შეუძლებელია. ამ დამატების გამოსაყენებლად საჭიროა ხელით დააყენოთ Python-ის შემდეგი პაკეტები: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - ეს დამატება (ან მისი რომელიმე დამოკიდებულება) Python {}.{}-ს მოითხოვს. თქვენ კი {}.{} გაქვთ. დაყენება გაუქმდა. - - - - Optional dependency on {} ignored because it is not in the allow-list - არასავალდებულო დამოკიდებულება {} იგნორირებულია. ის დაშვებულ სიაში არაა - - - - - Installing dependencies - დამოკიდებულებების დაყენება - - - - - Cannot execute Python - Python-ის გაშვების შეცდომა - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Python-ის გამშვები ფაილის პოვნა შეუძლებელია. დარწმუნდით, რომ დამატებების მმართველის პარამეტრებში ბილიკი Python-ის გამშვებ ფაილებამდე სწორადაა დაყენებული. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - დამოკიდებულებების დაყენების შეცდომა. მაინც დავაყენო {}? - - - - - Cannot execute pip - Pip-ის გაშვების შეცდომა - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Pip-ის გაშვების შეცდომა. შეიძლება ის Python-ის თქვენს დისტრიბუტივს უბრალოდ აკლია. დარწმუნდით, რომ pip-ი აყენია და თავიდან სცადეთ. ბრძანება, რომელმაც შეცდომა დააბრუნა: - - - - - Continue with installation of {} anyway? - გნებავთ, მაინც გააგრძელოთ {}-ის დაყენება? - - - - - Package installation failed - პაკეტის დაყენების შეცდომა - - - - See Report View for detailed failure log. - შეცდომის შესახებ დეტალური ინფორმაციისთვის იხილეთ ანგარიშის ხედი. - - - - Installing Addon - დამატების დაყენება - - - - Installing FreeCAD Addon '{}' - მიმდინარეობს FreeCAD-ის დამატების დაყენება: '{}' - - - - Cancelling - გაუქმება - - - - Cancelling installation of '{}' - '{}'-ის დაყენების შეწყვეტა; - - - - {} was installed successfully - {} -ის დაყენება წარმატებულია - - - - - Installation Failed - დაყენების შეცდომა - - - - Failed to install {} - {}-ის დაყენების შეცდომა - - - - - Create new toolbar - ხელსაწყოების ახალი ზოლის შექმნა - - - - - A macro installed with the FreeCAD Addon Manager - FreeCAD-ის დამატებების მმართველით დაყენებული მაკრო - - - - - Run - Indicates a macro that can be 'run' - გაშვება - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - GitHub-დან მონაცემების წაკითხვა შეუძლებელია. შეამოწმეთ ინტერნეტთან შეერთებისა და პროქსის პარამეტრებ და თავიდან სცადეთ. - - - - XML failure while reading metadata from file {} - XML-ის შეცდომა მეტამონაცემების კითხვისას ფაილიდან {} - - - - Invalid metadata in file {} - არასწორი მეტამონაცემები ფაილში {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - გაფრთხილება: package.xml-ის მეტამონაცემებში მითითებული ვილიკი ამჟამად გამოთხოვილი ბრენჩის ბილიკს არ ემთხვევა. - - - - Name - სახელი - - - - Class - კლასი - - - - Description - აღწერა - - - - Subdirectory - ქვესაქაღალდე - - - - Files - ფაილები - - - - Select the folder containing your Addon - აირჩიეთ თქვენი დამატების შემცველი საქაღალდე - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Vermin აღმოჩენილი არაა. ოპერაცია გაუქმდება. - - - - Scanning Addon for Python version compatibility - დამატების სკანირება Python-ის ვერსიის თავსებადობაზე - - - - Minimum Python Version Detected - აღმოჩენილია Python-ის მინიმალური ვერსია - - - - Vermin auto-detected a required version of Python 3.{} - Vermin-მა ავტომატურად იპოვა საჭირო ვერსია Python 3.{} - - - - Install Vermin? - დავაყენო Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Python-ის ვერსიის ამ დამატებისთვის ავტომატური ამოცნობა Vermin-ს (https://pypi.org/project/vermin/) მოითხოვს. დავაყენო? - - - - Attempting to install Vermin from PyPi - Vermin-ის PyPi-დან დაყენების მცდელობა - - - - - Installation failed - დაყენების შეცდომა - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Vermn-ის დაყენების შეცდომა - მეტი დეტალებისთვის იხილეთ ანგარიშის ხედი. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - დაყენების შემდეგ Vermin-ის შემოტანის შეცდომა - დამატების სკანირება შეუძლებელია. - - - - Select an icon file for this package - აირჩიეთ ამ პაკეტის ხატულა - - - - Filter is valid - ფილტრი სწორია - - - - Filter regular expression is invalid - ფილტრის რეგულარული გამოსახულება არასწორია - - - - Search... - ძებნა... - - - - Click for details about package {} - პაკეტის დეტალების გასაგებად დააწკაპუნეთ {} - - - - Click for details about workbench {} - სამუშაო მაგიდის დეტალების გასაგებად დააწკაპუნეთ {} - - - - Click for details about macro {} - მაკროს დეტალების სანახავად დააწკაპუნეთ {} - - - - Maintainers: - პროექტის ლიდერები: - - - - Tags - ჭდეები - - - - {} ★ on GitHub - {} ★ GitHub-ზე - - - - No ★, or not on GitHub - ★-ის გარეშე, ან GitHub-ზე არაა - - - - Created - შექმნლია - - - - Updated - განახლებულია - - - - Score: - ქულა: - - - - - Up-to-date - განახლებულია - - - - - - - - Update available - განახლება ხელმისაწვდომია - - - - - Pending restart - რესტარტის მოლოდინი - - - - - DISABLED - გათიშულია - - - - Installed version - დაყენებული ვერსია - - - - Unknown version - უცნობი ვერსია - - - - Installed on - დაყენების დრო - - - - Available version - ხელმისაწვდომი ვერსია - - - - Filter by... - ფილტრის პირობა... - - - - Addon Type - დამატების ტიპი - - - - - Any - ნებისმიერი - - - - Macro - მაკრო - - - - Preference Pack - პარამეტრების პაკეტი - - - - Installation Status - დაყენების სტატუსი - - - - Not installed - არ არის დაყენებული - - - - Filter - ფილტრი - - - - DANGER: Developer feature - საშიშროება: პროგრამისტისთვის საჭირო თვისება - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - საშიშროება: ბრენჩებს შორის გადართვა განკუთვნილია პროგრამისტებისა და ბეტა ტესტერებისთვის და შეიძლება ყველაფერი გაფუჭებული, არათავსებადი დოკუმენტებით და არასტაბილურობით ან/და სამყაროს გადაცხელებით. დარწმუნებული ბრძანდებით, რომ გაგრძელება გნებავთ? - - - - There are local changes - გაქვთ ადგილობრივი ცვლილებები - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - გაფრთხილება: ამ რეპოს დაუკომიტებელი ლოკალური ცვლილებები გააჩნია. დარწმუნებული ბრძანდებით, რომ გნებავთ შეცვალოთ ბრენჩი (და თან წაიყოლოთ თქვენი ცვლილებები)? - - - - Local - Table header for local git ref name - ლოკალური - - - - Remote tracking - Table header for git remote tracking branch name - დაშორებული ტრეკინგი - - - - Last Updated - Table header for git update date - ბოლოს განახლებული - - - - Installation of Python package {} failed - Python-ის პაკეტის {} დაყენება შეუძლებელია - - - - Installation of optional package failed - არასავალდებულო პაკეტის დაყენების შეცდომა - - - - Installing required dependency {} - აუცილებელი დამოკიდებულების დაყენება: {} - - - - Installation of Addon {} failed - დამატების "{}" დაყენების შეცდომა - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - {} ფაილის გაშიფვრის შეცდომა დამატებისთვის '{}' - - - - Any dependency information in this file will be ignored - ამ ფაილში არსებული ნებისმიერი დამოკიდებულება იგნორირებული იქნება - - - - Unable to open macro wiki page at {} - მაკროების ვიკის გვერდის {} გახსნის შეცდომა - - - - Unable to fetch the code of this macro. - მაკროს კოდის მოპოვება შეუძლებელია. - - - - Unable to retrieve a description from the wiki for macro {} - ვიკიდან მაკროს {} აღწერის მიღება შეუძლებელია - - - - Unable to open macro code URL {} - მაკროს კოდის URL-ის ({}) გახსნა შეუძლებელია - - - - Unable to fetch macro-specified file {} from {} - შეცდომა მაკროსთვის-მითითებული ფაილის {} {}-დან გამოთხოვისას - - - - Could not locate macro-specified file {} (expected at {}) - მაკროს მიერ მითითებული ფაილის {} პოვნა შეუძლებელია (ველოდი მისამართზე {}) - - - - {}: Unrecognized internal workbench '{}' - {}: უცნობი შიდა სამუშაო დაფა '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - დამატების პროგრამისტის გაფრთხილება: რეპოს URL, რომელიც დაყენებულია დამატების {} ({}) package.xml ფაილში, არ ემთხვევა URL-ს, საიდანაც ის გადმოვწერეთ ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - დამატების პროგრამისტის გაფრთხილება: რეპოს ბრენჩი, რომელიც დაყენებულია დამატების {} ({}) package.xml ფაილში, არ ემთხვევა ბრენჩს, საიდანაც ის გადმოვწერეთ ({}) - - - - - Got an error when trying to import {} - შეცდომა {}-ის შემოტანის მცდელობისას - - - - An unknown error occurred - უცნობი შეცდომა - - - - Could not find addon {} to remove it. - წასაშლელად დამატება {} ვერ ვიპოვე. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - დამატების uninstall.py სკრიპტის შესრულება ვერ მოხერხდა. ვუშვებ წაშლის პროცესს... - - - - Removed extra installed file {} - დამატებითი დაყენებული ფაილი {} წაიშალა - - - - Error while trying to remove extra installed file {} - შეცდომა დამატებითი დაყენებული ფაილის {} წაშლის მცდელობისას - - - - Error while trying to remove macro file {}: - შეცდომა მაკროს ფაილის {} წაშლისას: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - GitHub-თან მიერთების შეცდომა. შეამოწმეთ შეერთებისა და პროქსის პარამეტრები. - - - - WARNING: Duplicate addon {} ignored - გაფრთხილება: დუბლიკატი გაფართოება {} გამოტოვებულია - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - შეცდომა მაკროების GitHub-დან განახლებისას. ვცდი სუფთად გამოვითხოვო... - - - - Attempting to do a clean checkout... - სუფთა გამოთხოვის მცდელობა... - - - - Clean checkout succeeded - სუფთა გამოთხოვა წარმატებულია - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - GitHub-დან მაკროს განახლების შეცდომა -- სცადეთ დამატებების მმართველის ქეში გაწმინდოთ. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - ვიკისთან დაკავშირების შეცდომა. FreeCAD-ს ამჟამად ვკიდან მაკროების სიის მიღება არ შეუძლია - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - მეტამონაცემების {name}-დან კითხვის შეცდომა - - - - Failed to fetch code for macro '{name}' - მაკროს '{name}' კოდის გამოთხოვის შეცდომა; - - - - Addon Manager: a worker process failed to complete while fetching {name} - დამატებების მმართველი: დამხმარე პროცესის შეცდომა {name}-ის გადმოწერისას - - - - Out of {num_macros} macros, {num_failed} timed out while processing - {num_macros} მაკროდან {num_failed}-ის დამუშავების ვადა გავიდა - - - - Addon Manager: a worker process failed to halt ({name}) - დამატებების მმართველი: დამხმარე პროცესის შეჩერების შეცდომა ({name}) - - - - Timeout while fetching metadata for macro {} - მაკროს {} მეტამონაცემების გამოთხოვნის ვადა გავიდა - - - - Failed to kill process for macro {}! - - მაკროს {} პროცესის მოკვლა შეუძლებელია! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - {}-დან დამატების სტატისტიკის მიღება ჩავარდა -- სწორი, მხოლოდ, ანბანით დალაგება იქნება - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - '{}'-დან დამატების ქულების გამოთხოვნა ჩავარდა -- ქულებით დალაგება ჩავარდება - - - - Repository URL - Preferences header for custom repositories - რეპოზიტორიის URL - - - - Branch name - Preferences header for custom repositories - ბრენჩის სახელი - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - საწყისი საქაღალდის მარქაფი და თავიდან კლონირება - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git-ის ბრენჩის სახელის გადარქმევა ჩავარდა შემდეგი შეტყობინებით: - - - - Installing - დაყენება - - - - Succeeded - წარმატებულია - - - - Failed - შეცდომა - - - - Update was cancelled - განახლება გაუქმდა - - - - some addons may have been updated - ზოგიერთი განახლებ შეიძლება განახლდა - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - იტვირთება ინფორმაცია {}-სთვის FreeCAD-ის მაკროს რეცეპტების ვიკიდან... - - - - Loading page for {} from {}... - იტვირთება გვერდი {} {}-დან... - - - - Failed to download data from {} -- received response code {}. - {}-დან მონაცემების გადმოწერა ჩავარდა - მივიღე პასუხის კოდი {}. - - - - Composite view - კომპოზიტური ხედი - - - - Expanded view - გაფართოებული ხედი - - - - Compact view - კომპაქტური ხედი - - - - Alphabetical - Sort order - ანბანის მიხედვით - - - - Last Updated - Sort order - ბოლოს განახლებული - - - - Date Created - Sort order - შექმნის თარიღი - - - - GitHub Stars - Sort order - GitHub-ის ვარსკვლავები - - - - Score - Sort order - ქულა - - - - Std_AddonMgr - - - &Addon manager - &დამატებების მმართველი - - - - Manage external workbenches, macros, and preference packs - მართეთ გარე სამუშაო მაგიდები, მაკროები და პარამეტრების ნაკრებები - - - - AddonInstaller - - - Finished removing {} - {}-ის წაშლა დასრულდა - - - - Failed to remove some files - ზოგიერთი ფაილის წაშლა შეუძლებელია - - - - Addons installer - - - Finished updating the following addons - დასრულდა შემდეგი დამატებების განახლება - - - - Workbench - - - Auto-Created Macro Toolbar - ავტომატურად შექმნილი მაკროების პანელი - - - - QObject - - - Addon Manager - დამატებების მმართველი - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_kab.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_kab.qm deleted file mode 100644 index df0fe19f9e..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_kab.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_kab.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_kab.ts deleted file mode 100644 index 89072874b5..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_kab.ts +++ /dev/null @@ -1,427 +0,0 @@ - - - - - AddonInstaller - - - Installed location - Installed location - - - - AddonsInstaller - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description for this macro. - Unable to retrieve a description for this macro. - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - - - - Checking for updates... - Checking for updates... - - - - Apply - Apply - - - - update(s) - update(s) - - - - No update available - No update available - - - - Macro successfully installed. The macro is now available from the Macros dialog. - Macro successfully installed. The macro is now available from the Macros dialog. - - - - Unable to install - Unable to install - - - - Addon successfully removed. Please restart FreeCAD - Addon successfully removed. Please restart FreeCAD - - - - Unable to remove this addon - Unable to remove this addon - - - - Macro successfully removed. - Macro successfully removed. - - - - Macro could not be removed. - Macro could not be removed. - - - - Unable to download addon list. - Unable to download addon list. - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Outdated GitPython detected, consider upgrading with pip. - Outdated GitPython detected, consider upgrading with pip. - - - - List of macros successfully retrieved. - List of macros successfully retrieved. - - - - Retrieving description... - Retrieving description... - - - - Retrieving info from - Retrieving info from - - - - An update is available for this addon. - An update is available for this addon. - - - - This addon is already installed. - This addon is already installed. - - - - Retrieving info from git - Retrieving info from git - - - - Retrieving info from wiki - Retrieving info from wiki - - - - GitPython not found. Using standard download instead. - GitPython not found. Using standard download instead. - - - - Your version of python doesn't appear to support ZIP files. Unable to proceed. - Your version of python doesn't appear to support ZIP files. Unable to proceed. - - - - Workbench successfully installed. Please restart FreeCAD to apply the changes. - Workbench successfully installed. Please restart FreeCAD to apply the changes. - - - - Missing workbench - Missing workbench - - - - Missing python module - Missing python module - - - - Missing optional python module (doesn't prevent installing) - Missing optional python module (doesn't prevent installing) - - - - Some errors were found that prevent to install this workbench - Some errors were found that prevent to install this workbench - - - - Please install the missing components first. - Please install the missing components first. - - - - Error: Unable to download - Error: Unable to download - - - - Successfully installed - Successfully installed - - - - GitPython not installed! Cannot retrieve macros from git - GitPython not installed! Cannot retrieve macros from git - - - - Installed - Installed - - - - Update available - Update available - - - - Restart required - Restart required - - - - This macro is already installed. - This macro is already installed. - - - - A macro has been installed and is available under Macro -> Macros menu - A macro has been installed and is available under Macro -> Macros menu - - - - This addon is marked as obsolete - This addon is marked as obsolete - - - - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - - - - Error: Unable to locate zip from - Error: Unable to locate zip from - - - - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - - - - This addon is marked as Python 2 Only - This addon is marked as Python 2 Only - - - - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - - - - User requested updating a Python 2 workbench on a system running Python 3 - - User requested updating a Python 2 workbench on a system running Python 3 - - - - - Workbench successfully updated. Please restart FreeCAD to apply the changes. - Workbench successfully updated. Please restart FreeCAD to apply the changes. - - - - User requested installing a Python 2 workbench on a system running Python 3 - - User requested installing a Python 2 workbench on a system running Python 3 - - - - - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - - - - Raw markdown displayed - Raw markdown displayed - - - - Python Markdown library is missing. - Python Markdown library is missing. - - - - Dialog - - - Workbenches - Ateliers - - - - Macros - Macros - - - - Execute - Lancer - - - - Downloading info... - Downloading info... - - - - Update all - Update all - - - - Executes the selected macro, if installed - Executes the selected macro, if installed - - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Installs or updates the selected macro or workbench - Installs or updates the selected macro or workbench - - - - Download and apply all available updates - Download and apply all available updates - - - - Custom repositories (one per line): - Custom repositories (one per line): - - - - Sets configuration options for the Addon Manager - Sets configuration options for the Addon Manager - - - - Configure... - Configure... - - - - Addon manager options - Addon manager options - - - - Uninstall selected - Uninstall selected - - - - Install/update selected - Install/update selected - - - - Close - Fermer - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires GitPython) - Automatically check for updates at start (requires GitPython) - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User defined proxy : - User defined proxy : - - - - Addon Manager - Addon Manager - - - - Close the Addon Manager - Close the Addon Manager - - - - You can use this window to specify additional addon repositories -to be scanned for available addons - You can use this window to specify additional addon repositories -to be scanned for available addons - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches and macros - Manage external workbenches and macros - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ko.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ko.qm deleted file mode 100644 index 34c24f6ed9..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ko.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ko.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ko.ts deleted file mode 100644 index 56a91417f4..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ko.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - 개인 저장소 - - - - Repository URL - 저장소 URL - - - - Branch - 분기 - - - - CompactView - - - - Icon - 아이콘 - - - - - <b>Package Name</b> - <b>패키지 이름</b> - - - - - Version - 버전 - - - - - Description - 설명 - - - - Update Available - 업데이트 사용 가능 - - - - UpdateAvailable - 업데이트 가능 - - - - DependencyDialog - - - Dependencies - 의존성 - - - - Dependency type - 의존성 유형 - - - - Name - 이름 - - - - Optional? - 선택사항? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - 의존성 해결 - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - 이 애드온에는 다음의 필수적 및 선택적 종속성이 있습니다. 이 애드온을 사용하기 전에 이들을 설치해야 합니다. - -애드온 관리자가 이들을 자동으로 설치하도록 하시겠습니까? 종속성을 설치하지 않고 애드온을 설치하려면 '무시'를 선택하세요. - - - - FreeCAD Addons - FreeCAD 애드온 - - - - Required Python modules - 필수 파이썬 모듈 - - - - Optional Python modules - 추가 파이썬 모듈 - - - - DeveloperModeDialog - - - Addon Developer Tools - 애드온 개발자 도구 - - - - Path to Addon - 애드온 경로 - - - - - Browse... - 탐색... - - - - Metadata - 메타데이터 - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - 설명 - - - - Discussion URL - Discussion URL - - - - Icon - 아이콘 - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (선택사항) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - 저장소 URL - - - - Website URL - 웹사이트 URL - - - - Documentation URL - 문서 URL - - - - Addon Name - 애드온 이름 - - - - Version - 버전 - - - - (Recommended) - (권장) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (선택, 3.x 버전만 지원) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - 애드온 매니저 - - - - Edit Tags - 태그 편집 - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - 애드온 매니저는 유용한 서드 파티 FreeCAD 확장 기능을 폭넓게 제공합니다. 애드온의 안전 또는 기능에 대해서는 보장할 수 없습니다. - - - - Continue - 계속 - - - - Cancel - 취소하기 - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - - Icon - 아이콘 - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - 버전 - - - - - (tags) - (tags) - - - - - Description - 설명 - - - - - Maintainer - Maintainer - - - - Update Available - Update Available - - - - labelSort - labelSort - - - - UpdateAvailable - 업데이트 가능 - - - - Form - - - Licenses - Licenses - - - - License - 라이선스 - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - 이름 - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD 버전 - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - 애드온 관리자 옵션 - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - 매크로 메타데이터 다운로드 (약 10MB) - - - - Cache update frequency - 캐시 업데이트 빈도 - - - - Manual (no automatic updates) - 수동 (자동 업데이트 없음) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - 파이썬 2 전용으로 표시된 애드온 숨기기 - - - - Hide Addons marked Obsolete - 사용되지 않음으로 표시된 애드온 숨기기 - - - - Hide Addons that require a newer version of FreeCAD - 최신 버전의 FreeCAD가 필요한 애드온 숨기기 - - - - Custom repositories - Custom repositories - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Advanced Options - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - 선택한 매크로 또는 작업대 설치제거 - - - - Install - Install - - - - Uninstall - Uninstall - - - - Update - 업데이트 - - - - Run Macro - 매크로 실행 - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - 다이얼로그 - - - - TextLabel - 텍스트 라벨 - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - 매크로 - - - - Preference Pack - Preference Pack - - - - Workbench - 작업대 - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - 탐색... - - - - Preference Pack Name - 환경설정 팩 이름 - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - 아이콘 - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - 버전 - - - - Description - 설명 - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - 이 매크로의 도구모음 버튼을 추가할까요? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - 이름: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - 탐색... - - - - Create... - Create... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - 이 매크로를 추가할 도구모음을 선택하세요: - - - - Ask every time - Ask every time - - - - toolbar_button - - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - 이 매크로의 도구모음 버튼을 추가할까요? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - AddonsInstaller - - - Starting up... - Starting up... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - 로컬 캐시 비우기 - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - Checking for updates... - - - - Temporary installation of macro failed. - 매크로의 임시 설치에 실패했습니다. - - - - - Close - 닫기 - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - - - - Maintainer - Maintainer - - - - - - - Author - 작성자: - - - - New Python Version Detected - 새로운 파이썬 버전이 감지되었습니다 - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - 처리 중입니다. 기다려주세요... - - - - - Update - 업데이트 - - - - Updating... - 업데이트 중... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installation location - - - - Repository URL - 저장소 URL - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Disabled - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Install - Install - - - - Uninstall - Uninstall - - - - Enable - 활성화 - - - - Disable - 비활성화 - - - - - Check for update - Check for update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - 실행 - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - 매크로 {} 설치에 실패했습니다 - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - 자동 - - - - - Workbench - 작업대 - - - - Addon - Addon - - - - Python - 파이썬 - - - - Yes - Yes - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Other... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - 파이썬을 실행할 수 없습니다 - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - 프리캐드의 애드온 관리자로 설치된 매크로 - - - - - Run - Indicates a macro that can be 'run' - 실행 - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - 이름 - - - - Class - 클래스 - - - - Description - 설명 - - - - Subdirectory - Subdirectory - - - - Files - Files - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - 검색하기... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - 작업대에 관한 세부정보를 위해 클릭 - - - - Click for details about macro {} - 매크로 {} 에 대한 자세한 내용을 보려면 클릭하세요 - - - - Maintainers: - Maintainers: - - - - Tags - 태그 - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Installed version - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Available version - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Any - - - - Macro - 매크로 - - - - Preference Pack - Preference Pack - - - - Installation Status - Installation Status - - - - Not installed - Not installed - - - - Filter - 필터 - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - 저장소 URL - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - 자동 생성된 매크로 도구모음 - - - - QObject - - - Addon Manager - 애드온 매니저 - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_lt.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_lt.qm deleted file mode 100644 index a564526eef..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_lt.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_lt.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_lt.ts deleted file mode 100644 index 329f6a0a7a..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_lt.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Custom repository - - - - Repository URL - Repository URL - - - - Branch - Branch - - - - CompactView - - - - Icon - Piktograma - - - - - <b>Package Name</b> - <b>Package Name</b> - - - - - Version - Laida - - - - - Description - Aprašymas - - - - Update Available - Update Available - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependencies - - - - Dependency type - Dependency type - - - - Name - Pavadinimas - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - FreeCAD Addons - „FreeCad“ papildiniai - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Aprašymas - - - - Discussion URL - Discussion URL - - - - Icon - Piktograma - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Repository URL - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Laida - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Papildinių tvarkyklė - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Tęsti - - - - Cancel - Atšaukti - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - - Icon - Piktograma - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - Laida - - - - - (tags) - (tags) - - - - - Description - Aprašymas - - - - - Maintainer - Prižiūrėtojas - - - - Update Available - Update Available - - - - labelSort - labelSort - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - Licenses - Licenses - - - - License - Licencija - - - - License file - License file - - - - People - People - - - - Kind - Rūšis - - - - Name - Pavadinimas - - - - Email - El. paštas - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - Cache update frequency - Podėlio atnaujinimo dažnis - - - - Manual (no automatic updates) - Rankinis (savaiminis atnaujinimas išjungtas) - - - - Daily - Kasdien - - - - Weekly - Kas savaitę - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Proxy - Tarpinis serveris - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Advanced Options - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Įdiegti - - - - Uninstall - Išdiegti - - - - Update - Atnaujinti - - - - Run Macro - Vykdyti makrokomandą - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Dialogas - - - - TextLabel - Žymė - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Makrokomandos - - - - Preference Pack - Preference Pack - - - - Workbench - Darbastalis - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Nuostatų rinkinio pavadinimas - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Klasė, apibrėžianti "Piktogramos" nario duomenis - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Piktograma - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Laida - - - - Description - Aprašymas - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Rodomasis pavadinimas - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Taip - - - - No - Ne - - - - Never - Niekada - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Pavadinimas: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Taip - - - - No - Ne - - - - Never - Niekada - - - - AddonsInstaller - - - Starting up... - Starting up... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - Atnaujinti vietinį podėlį - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - Checking for updates... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Užverti - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - - - - Maintainer - Prižiūrėtojas - - - - - - - Author - Autorius - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Atnaujinti - - - - Updating... - Updating... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installation location - - - - Repository URL - Repository URL - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Disabled - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Install - Įdiegti - - - - Uninstall - Išdiegti - - - - Enable - Įgalinti - - - - Disable - Išjungti - - - - - Check for update - Check for update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Paleisti - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Neįmanoma rasti piktogramos {} - - - - Select an icon file for this content item - Pasirinkite piktogramos failą turinio nariui - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automatinis - - - - - Workbench - Darbastalis - - - - Addon - Papildinys - - - - Python - Python - - - - Yes - Taip - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Other... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Paleisti - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Pavadinimas - - - - Class - Klasė - - - - Description - Aprašymas - - - - Subdirectory - Subdirectory - - - - Files - Rinkmenos - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Pasirinkite piktogramos failą šiam paketui - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Paieška... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Žymės - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Installed version - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Available version - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Bet koks - - - - Macro - Makrokomandos - - - - Preference Pack - Preference Pack - - - - Installation Status - Installation Status - - - - Not installed - Not installed - - - - Filter - Filtras - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Vietinis - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Repository URL - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Įvertinimas - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Papildinių tvarkyklė - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_nl.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_nl.qm deleted file mode 100644 index e7291f186a..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_nl.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_nl.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_nl.ts deleted file mode 100644 index 711affe423..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_nl.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Aangepaste repository - - - - Repository URL - URL van de repository - - - - Branch - Aftakking - - - - CompactView - - - - Icon - Pictogram - - - - - <b>Package Name</b> - <b>Pakket Naam</b> - - - - - Version - Versie - - - - - Description - Omschrijving - - - - Update Available - Update beschikbaar - - - - UpdateAvailable - UpdateBeschikbaar - - - - DependencyDialog - - - Dependencies - Afhankelijkheden - - - - Dependency type - Afhankelijkheidstype - - - - Name - Naam - - - - Optional? - Optioneel? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Afhankelijkheden oplossen - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Deze uitbreiding heeft de volgende vereiste en optionele afhankelijkheden. Je moet ze installeren voordat deze uitbreiding kan worden gebruikt. - -Wilt u dat de Uitbreidingsmanager deze automatisch installeert? Kies "Negeren" om de uitbreiding te installeren zonder de afhankelijkheden te installeren. - - - - FreeCAD Addons - FreeCAD Uitbreidingen - - - - Required Python modules - Vereiste Python modules - - - - Optional Python modules - Optionele Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Uitbreiding ontwikkelaar gereedschappen - - - - Path to Addon - Pad naar de uitbreiding - - - - - Browse... - Bladeren... - - - - Metadata - Metagegevens - - - - Primary branch - Primaire branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Uitleg waar deze uitbreiding over gaat. Wordt weergegeven in de Uitbreidingsmanager. Het is niet nodig om te vermelden dat dit een FreeCAD Uitbreiding is. - - - - Description - Omschrijving - - - - Discussion URL - Discussie URL - - - - Icon - Pictogram - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) of CalVer (2022.08.30) stijlen worden ondersteund - - - - Set to today (CalVer style) - Op vandaag instellen (CalVer stijl) - - - - - - - (Optional) - (Optioneel) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Wordt weergegeven in de Uitbreidingsmanager's lijst met Uitbreidingen. Zou het woord "FreeCAD" niet moeten bevatten, en moet een geldige mapnaam zijn op alle ondersteunende besturingssystemen. - - - - README URL - LEESME URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Omdat dit wordt weergegeven in het programma FreeCAD, in de Uitbreidingsmanager, is het niet nodig om ruimte te gebruiken om dingen te zeggen zoals "dit is een FreeCAD Uitbreiding..." -- zeg gewoon wat het doet. - - - - Repository URL - URL van de repository - - - - Website URL - Website-URL - - - - Documentation URL - URL documentatie - - - - Addon Name - Naam van de uitbreiding - - - - Version - Versie - - - - (Recommended) - (Aanbevolen) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optioneel, slechts 3.x versie ondersteund) - - - - Detect... - Detecteer... - - - - Addon Contents - Inhoud van de uitbreiding - - - - Dialog - - - Addon Manager - Uitbreidingsmanager - - - - Edit Tags - Labels bewerken - - - - Comma-separated list of tags describing this item: - Komma-gescheiden lijst van tags die dit item beschrijven: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Veelvoorkomende tags zijn "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Doorgaan - - - - Cancel - Annuleren - - - - EditDependencyDialog - - - Edit Dependency - Bewerk afhankelijkheid - - - - Dependency Type - Afhankelijkheid Type - - - - Dependency - Afhankelijkheid - - - - Package name, if "Other..." - Pakket naam, indien "Anders..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - LET OP: Als "Anders..." is geselecteerd, is het pakket niet onderdeel van het ALLOWED_PYTHON_PACKAGES.txt bestand, en zal niet automatisch worden geïnstalleerd door de Uitbreidingsmanager. Stuur een PR naar <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> om toevoegen van een pakket aan te vragen. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Als dit een optionele afhankelijkheid is, biedt de Uitbreidingsmanager aan om deze te installeren (indien mogelijk), maar zal de installatie niet blokkeren als de gebruiker besluit het pakket niet te installeren, of niet kan installeren. - - - - Optional - Optioneel - - - - ExpandedView - - - - Icon - Pictogram - - - - - <h1>Package Name</h1> - <h1>Pakket Naam</h1> - - - - - Version - Versie - - - - - (tags) - (labels) - - - - - Description - Omschrijving - - - - - Maintainer - Beheerder - - - - Update Available - Update beschikbaar - - - - labelSort - labelSort - - - - UpdateAvailable - UpdateBeschikbaar - - - - Form - - - Licenses - Licenties - - - - License - Licentie - - - - License file - Licentiebestand - - - - People - Personen - - - - Kind - Soort - - - - Name - Naam - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Geavanceerd Versie Overzicht - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - In volgende versies van FreeCAD Uitbreidingsmanager zal de ontwikkelaars instelling van een specifieke branch of tag voor gebruik met een specifieke versie van FreeCAD, worden ondersteund (b.v. het instellen van een specifiek label dat de laatste versie van uw uitbreiding v0.19 ondersteund, enz.) - - - - FreeCAD Version - FreeCAD versie - - - - Best-available branch, tag, or commit - Meest beschikbare branche, tag of commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Ondersteunde FreeCAD versies - - - - Minimum FreeCAD Version Supported - Minimale FreeCAD versie ondersteund - - - - - Optional - Optioneel - - - - Maximum FreeCAD Version Supported - Maximale FreeCAD versie ondersteund - - - - Advanced version mapping... - Geavanceerd versie overzicht... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Uitbreidingsmanager voorkeuren - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Download Macro-metadata (ongeveer 10MB) - - - - Cache update frequency - Cache update frequentie - - - - Manual (no automatic updates) - Handmatig (geen automatische updates) - - - - Daily - Dagelijks - - - - Weekly - Wekelijks - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Verberg uitbreidingen die gemarkeerd zijn als -Alleen voor Python 2- - - - - Hide Addons marked Obsolete - Verberg uitbreidingen die gemarkeerd zijn als -Obsolete- - - - - Hide Addons that require a newer version of FreeCAD - Verberg uitbreidingen die een nieuwere versie van FreeCAD vereisen - - - - Custom repositories - Aangepaste repositories - - - - Proxy - Proxy - - - - No proxy - Geen proxy - - - - User system proxy - Proxy van het systeem van de gebruiker - - - - User-defined proxy: - Proxy gedefinieerd door gebruiker: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Geavanceerde Opties - - - - Activate Addon Manager options intended for developers of new Addons. - Activeer de voorkeuren voor Uitbreidingsmanager voor ontwikkelaars van nieuwe uitbreidingen. - - - - Addon developer mode - Uitbreiding ontwikkelaar gereedschappen - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Verwijder een geselecteerde macro of werkbank - - - - Install - Installeren - - - - Uninstall - De-installeren - - - - Update - Update - - - - Run Macro - Macro uitvoeren - - - - Change branch - Wijzig branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Beheer Python afhankelijkheden - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - De volgende Python pakketten zijn lokaal door de Uitbreidingsmanager geïnstalleerd om te voldoen aan de uitbreidingsafhankelijkheden. Installatie locatie: - - - - Package name - Pakketnaam - - - - Installed version - Geïnstalleerde versie - - - - Available version - Beschikbare versie - - - - Used by - Gebruikt door - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Een asterisk (*) in de "Gebruikt door" kolom geeft een optionele afhankelijkheid aan. Merk op dat Gebruikt door alleen directe imports in de uitbreiding aangeeft. Andere Python pakketten waarvan die pakketten afhankelijk zijn kunnen ook geïnstalleerd zijn. - - - - Update all available - Update alle beschikbare - - - - SelectFromList - - - Dialog - Dialoog - - - - TextLabel - Tekstbenaming - - - - UpdateAllDialog - - - Updating Addons - Uitbreidingen aan het bijwerken - - - - Updating out-of-date addons... - Verouderde uitbreidingen aan het bijwerken... - - - - addContentDialog - - - Content Item - Inhoud Item - - - - Content type: - Soort: - - - - Macro - Macro - - - - Preference Pack - Voorkeurspakket - - - - Workbench - Werkbank - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Als dit het enige is in de uitbreiding, kunnen alle andere metadata worden overgenomen van het bovenste niveau, en hoeft hier niet nader te worden gespecificeerd. - - - - This is the only item in the Addon - Dit is het enige onderwerp in de uitbreiding - - - - Main macro file - Hoofd macrobestand - - - - The file with the macro's metadata in it - Het bestand met de metadata van de macro er in - - - - - - Browse... - Bladeren... - - - - Preference Pack Name - Naam van het voorkeuren pakket - - - - Workbench class name - Werkbank class naam - - - - Class that defines "Icon" data member - Class die het "Icoon" gegevens onderdeel definieert - - - - Subdirectory - Submap - - - - Optional, defaults to name of content item - Optioneel, staat standaard op de naam van het onderwerp van de inhoud - - - - Icon - Pictogram - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Labels... - - - - Dependencies... - Afhankelijkheden... - - - - FreeCAD Versions... - FreeCAD versie... - - - - Other Metadata - Andere metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versie - - - - Description - Omschrijving - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) of CalVer (2022.08.30) stijlen worden ondersteund - - - - Set to today (CalVer style) - Op vandaag instellen (CalVer stijl) - - - - Display Name - Weergavenaam - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Knop toevoegen? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Ja - - - - No - Nee - - - - Never - Nooit - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Auteursrechtinformatie - - - - Copyright holder: - Auteursrechthouder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Persoon toevoegen - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Naam: - - - - Email: - E-mail: - - - - Email is required for maintainers, and optional for authors. - E-mail is vereist voor beheerders en optioneel voor auteurs. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Gebruikersnaam - - - - Password - Wachtwoord - - - - selectLicenseDialog - - - Select a license - Selecteer een licentie - - - - About... - Over... - - - - License name: - Naam van de licentie: - - - - Path to license file: - Pad naar licentiebestand: - - - - (if required by license) - (indien vereist door de licentie) - - - - Browse... - Bladeren... - - - - Create... - Aanmaken... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Werkbalk selecteren - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Elke keer vragen - - - - toolbar_button - - - - Add button? - Knop toevoegen? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Ja - - - - No - Nee - - - - Never - Nooit - - - - AddonsInstaller - - - Starting up... - Opstarten... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Aangepaste repo lijst veranderd, geheugen-update forceren... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - U moet FreeCAD herstarten om de wijzigingen toe te passen. - - - - Restart now - Nu opnieuw opstarten - - - - Restart later - Later opnieuw opstarten - - - - - Refresh local cache - Lokale cache vernieuwen - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Bezig met updaten van cache... - - - - - Checking for updates... - Zoeken naar updates... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Sluiten - - - - Update all addons - Update all addons - - - - Check for updates - Op updates controleren - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - Geen updates beschikbaar - - - - - - Cannot launch a new installer until the previous one has finished. - Kan geen nieuw installatieprogramma starten totdat de vorige klaar is. - - - - - - - Maintainer - Beheerder - - - - - - - Author - Auteur - - - - New Python Version Detected - Nieuwe Python versie gedetecteerd - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Bezig, even geduld... - - - - - Update - Update - - - - Updating... - Updaten... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Bevestig verwijdering - - - - Are you sure you want to uninstall {}? - Weet u zeker dat u {} wilt de-installeren? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - {} wordt verwijderd - - - - - Uninstall complete - De-installatie voltooid - - - - - Uninstall failed - Verwijderen mislukt - - - - Version {version} installed on {date} - Versie {version} geïnstalleerd op {date} - - - - Version {version} installed - Versie {version} geïnstalleerd - - - - Installed on {date} - Geïnstalleerd op {date} - - - - - - - Installed - Geïnstalleerd - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Controle van updates bezig - - - - Installation location - Locatie van de installatie - - - - Repository URL - URL van de repository - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Uitgeschakeld - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update beschikbaar voor versie {} - - - - This is the latest version available - Dit is de nieuwste versie die beschikbaar is - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Geslaagd - - - - Install - Installeren - - - - Uninstall - De-installeren - - - - Enable - Schakel in - - - - Disable - Uitschakelen - - - - - Check for update - Controleer op update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Uitvoeren - - - - Change branch... - Change branch... - - - - Return to package list - Terug naar de lijst met pakketten - - - - Checking connection - Verbinding controleren - - - - Checking for connection to GitHub... - Controleren op verbinding met GitHub... - - - - Connection failed - Verbinden mislukt - - - - Missing dependency - Ontbrekende afhankelijkheid - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Andere... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Locatie van nieuwe licentiebestand - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Kan pictogram niet vinden op {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is geen submap van {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automatisch - - - - - Workbench - Werkbank - - - - Addon - Uitbreiding - - - - Python - Python - - - - Yes - Ja - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Andere... - - - - Too many to list - Te veel om weer te geven - - - - - - - - - Missing Requirement - Ontbrekende Vereiste - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Druk op OK om toch te installeren. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Afhankelijkheden installeren - - - - - Cannot execute Python - Kan Python niet uitvoeren - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Afhankelijkheden konden niet worden geïnstalleerd. Toch doorgaan met de installatie van {}? - - - - - Cannot execute pip - Kan -pip- niet uitvoeren - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Installatie pakket mislukt - - - - See Report View for detailed failure log. - Zie rapportweergave voor gedetailleerde foutenlog. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Annuleren - - - - Cancelling installation of '{}' - Installatie van '{}' annuleren - - - - {} was installed successfully - {} is succesvol geïnstalleerd - - - - - Installation Failed - Installatie mislukt - - - - Failed to install {} - Installatie van {} is mislukt - - - - - Create new toolbar - Nieuwe werkbalk maken - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Uitvoeren - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Ongeldige metadata in het bestand {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Naam - - - - Class - Klasse - - - - Description - Omschrijving - - - - Subdirectory - Submap - - - - Files - Bestanden - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installatie mislukt - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is geldig - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Zoeken... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Beheerders: - - - - Tags - Labels - - - - {} ★ on GitHub - {} ★ op GitHub - - - - No ★, or not on GitHub - Geen ★, of niet op GitHub - - - - Created - Aangemaakt - - - - Updated - Bijgewerkt - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update beschikbaar - - - - - Pending restart - Wachten op herstarten - - - - - DISABLED - UITGESCHAKELD - - - - Installed version - Geïnstalleerde versie - - - - Unknown version - Onbekende versie - - - - Installed on - Geïnstalleerd op - - - - Available version - Beschikbare versie - - - - Filter by... - Filteren op... - - - - Addon Type - Addon Type - - - - - Any - Elke - - - - Macro - Macro - - - - Preference Pack - Voorkeurspakket - - - - Installation Status - Installatiestatus - - - - Not installed - Niet geïnstalleerd - - - - Filter - Filter - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - Er zijn lokale wijzigingen - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Lokaal - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Laatst bijgewerkt - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Er is een fout opgetreden bij het importeren van {} - - - - An unknown error occurred - Er is een onbekende fout opgetreden - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Extra geïnstalleerd bestand {} verwijderd - - - - Error while trying to remove extra installed file {} - Fout bij het verwijderen van extra geïnstalleerd bestand {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Kan geen verbinding maken met GitHub. Controleer je verbinding en proxy-instellingen. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - URL van de repository - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Aan het installeren - - - - Succeeded - Geslaagd - - - - Failed - Mislukt - - - - Update was cancelled - Update werd geannuleerd - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Uitgebreide weergave - - - - Compact view - Compacte weergave - - - - Alphabetical - Sort order - Alfabetisch - - - - Last Updated - Sort order - Laatst bijgewerkt - - - - Date Created - Sort order - Datum aangemaakt - - - - GitHub Stars - Sort order - GitHub Sterren - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Uitbreidingsmanager - - - - Manage external workbenches, macros, and preference packs - Beheer externe werkbanken, macro's en voorkeurspakketten - - - - AddonInstaller - - - Finished removing {} - Verwijderen van {} voltooid - - - - Failed to remove some files - Kan sommige bestanden niet verwijderen - - - - Addons installer - - - Finished updating the following addons - Bijwerken van de volgende uitbreidingen is voltooid - - - - Workbench - - - Auto-Created Macro Toolbar - Automatisch aangemaakte Macro werkbalk - - - - QObject - - - Addon Manager - Uitbreidingsmanager - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_no.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_no.qm deleted file mode 100644 index 7015e809a3..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_no.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_no.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_no.ts deleted file mode 100644 index c4958b17db..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_no.ts +++ /dev/null @@ -1,424 +0,0 @@ - - - - - AddonInstaller - - - Installed location - Installasjonssted - - - - AddonsInstaller - - - Unable to fetch the code of this macro. - Kan ikke hente koden for denne makroen. - - - - Unable to retrieve a description for this macro. - Kan ikke hente en beskrivelse for denne makroen. - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - Programtilleggene som kan installeres her, er ikke offisielt en del av FreeCAD, og er ikke vurdert av FreeCAD-teamet. Vær sikker på at du vet hva du installerer! - - - - Addon manager - Håndterer for tilleggsmoduler - - - - You must restart FreeCAD for changes to take effect. Press Ok to restart FreeCAD now, or Cancel to restart later. - Du må starte FreeCAD på nytt for at endringene skal tre i kraft. Trykk OK for å starte FreeCAD på nytt, eller Avbryt å starte på nytt senere. - - - - Checking for updates... - Ser etter oppdateringer... - - - - Apply - Bruk - - - - update(s) - oppdatering(er) - - - - No update available - Ingen oppdatering tilgjengelig - - - - Macro successfully installed. The macro is now available from the Macros dialog. - Makro installert. Makroen er nå tilgjengelig i Makrodialogen. - - - - Unable to install - Kunne ikke installere - - - - Addon successfully removed. Please restart FreeCAD - Tillegg fjernet. Start FreeCAD på nytt - - - - Unable to remove this addon - Kan ikke fjerne dette tillegget - - - - Macro successfully removed. - Makroen er fjernet. - - - - Macro could not be removed. - Makroen kunne ikke fjernes. - - - - Unable to download addon list. - Kunne ikke laste ned liste over tilleggsmoduler. - - - - Workbenches list was updated. - Liste over arbeidsbenker ble oppdatert. - - - - Outdated GitPython detected, consider upgrading with pip. - Utdatert GitPython oppdaget, vurder oppgradering med pip. - - - - List of macros successfully retrieved. - Makroliste hentet. - - - - Retrieving description... - Henter beskrivelse... - - - - Retrieving info from - Henter informasjon fra - - - - An update is available for this addon. - En oppdatering er tilgjengelig for denne tilleggsmodulen. - - - - This addon is already installed. - Denne tilleggsmoduler er allerede installert. - - - - Retrieving info from git - Henter informasjon fra git - - - - Retrieving info from wiki - Henter informasjon fra wiki - - - - GitPython not found. Using standard download instead. - GitPython ble ikke funnet. Bruker standard nedlasting. - - - - Your version of python doesn't appear to support ZIP files. Unable to proceed. - Den installerte versjonen av Python støtter ikke ZIP-filer. Kan ikke fortsette. - - - - Workbench successfully installed. Please restart FreeCAD to apply the changes. - Arbeidsbenken er installert. Start FreeCAD på nytt for at den skal bli tilgjengelig. - - - - Missing workbench - Arbeidsbenken mangler - - - - Missing python module - Python-modul mangler - - - - Missing optional python module (doesn't prevent installing) - Python-modul mangler (hindrer ikke installering) - - - - Some errors were found that prevent to install this workbench - Noen feil ble funnet som hindrer installering av denne arbeidsbenken - - - - Please install the missing components first. - Vennligst installer manglende komponenter først. - - - - Error: Unable to download - Feil: Kan ikke lastes ned - - - - Successfully installed - Installert - - - - GitPython not installed! Cannot retrieve macros from git - GitPython er ikke installert! Kan ikke hente makroer fra git - - - - Installed - Installert - - - - Update available - Oppdatering tilgjengelig - - - - Restart required - Omstart nødvendig - - - - This macro is already installed. - Denne makroen er allerede installert. - - - - A macro has been installed and is available under Macro -> Macros menu - En makro er installert og er tilgjengelig under Makro -> Makroer menyen - - - - This addon is marked as obsolete - Denne tilleggsmodulen er merket utdatert - - - - This usually means it is no longer maintained, and some more advanced addon in this list provides the same functionality. - Dette betyr vanligvis at den ikke lenger vedlikeholdes og at andre mer avanserte tilleggsmoduler i denne listen gir samme funksjonalitet. - - - - Error: Unable to locate zip from - Feil: Finner ikke zip-filen fra - - - - Something went wrong with the Git Macro Retrieval, possibly the Git executable is not in the path - Noe gikk galt med Git Macro-nedlastingen, muligens er ikke Git lagt til søkestien - - - - This addon is marked as Python 2 Only - Denne tilleggsmodulen er markert som kun for Python 2 - - - - This workbench may no longer be maintained and installing it on a Python 3 system will more than likely result in errors at startup or while in use. - Denne arbeidsbenken vedlikeholdes ikke lenger og vil sannsynligvis gi problemer om den installeres på et system med Python 3. - - - - User requested updating a Python 2 workbench on a system running Python 3 - - Brukeren forsøkte å oppdatere en arbeidsbenk for Python 2 på et system med Python 3 - - - - - Workbench successfully updated. Please restart FreeCAD to apply the changes. - Arbeidsbenken er oppdatert. Start FreeCAD på nytt for å se endringene. - - - - User requested installing a Python 2 workbench on a system running Python 3 - - Brukeren forsøkte å installer en arbeidsbenk for Python 2 på et system med Python 3 - - - - - Appears to be an issue connecting to the Wiki, therefore cannot retrieve Wiki macro list at this time - Makrolisten fra Wiki kan ikke hentes, sannsynligvis på grunn av et tilkoblingsproblem - - - - Raw markdown displayed - Raw markdown displayed - - - - Python Markdown library is missing. - Python Markdown library is missing. - - - - Dialog - - - Workbenches - Workbenches - - - - Macros - Makroer - - - - Execute - Kjør - - - - Downloading info... - Laster ned informasjon... - - - - Update all - Oppdater alt - - - - Executes the selected macro, if installed - Den valgte makroen kjøres hvis den er installert - - - - Uninstalls a selected macro or workbench - Den valgte makroen eller arbeidsbenken fjernes fra fra systemet - - - - Installs or updates the selected macro or workbench - Den valgte makroen eller arbeidsbenken installeres eller oppdateres - - - - Download and apply all available updates - Last ned og legg till alle tilgjengelige oppdateringer - - - - Custom repositories (one per line): - Egendefinerte repositorier (ett per linje): - - - - Sets configuration options for the Addon Manager - Viser konfigurasjonsvalg for håndtereren av tilleggsmoduler - - - - Configure... - Konfigurer... - - - - Addon manager options - Valg for håndterer av tilleggsmoduler - - - - Uninstall selected - Avinstaller valgte - - - - Install/update selected - Installer/oppdater valgte - - - - Close - Lukk - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - Håndtereren for tilleggsmoduler ser etter tilgjengelige oppdateringer når den starter hvis dette alternativet er valgt (krever at pakken GitPython er installert på systemet) - - - - Automatically check for updates at start (requires GitPython) - Se etter oppdateringer ved oppstart (krever GitPython) - - - - Proxy - Mellomtjener - - - - No proxy - Ikke bruk mellomtjener - - - - User system proxy - Mellomtjener for brukersystem - - - - User defined proxy : - Brukerdefinert mellomtjener: - - - - Addon Manager - Håndterer for tilleggsmoduler - - - - Close the Addon Manager - Lukk håndtereren for tilleggsmoduler - - - - You can use this window to specify additional addon repositories -to be scanned for available addons - Du kan spesifisere flere repositorier som skal søkes for tilleggsmoduler i dette vinduet - - - - Std_AddonMgr - - - &Addon manager - &Håndterer for tilleggsmoduler - - - - Manage external workbenches and macros - Håndter eksterne arbeidsbenker og makroer - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_pl.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_pl.qm deleted file mode 100644 index e7f9459578..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_pl.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_pl.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_pl.ts deleted file mode 100644 index 547660f106..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_pl.ts +++ /dev/null @@ -1,2492 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repozytoria użytkownika - - - - Repository URL - Adres URL repozytorium - - - - Branch - Gałąź - - - - CompactView - - - - Icon - Ikonka - - - - - <b>Package Name</b> - <b>Nazwa pakietu</b> - - - - - Version - Wersja - - - - - Description - Opis - - - - Update Available - Aktualizacja jest dostępna - - - - UpdateAvailable - Dostępna aktualizacja - - - - DependencyDialog - - - Dependencies - Zależności - - - - Dependency type - Typ zależności - - - - Name - Nazwa - - - - Optional? - Opcjonalne? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Rozwiąż zależności - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Ten dodatek ma następujące wymagane i opcjonalne zależności. Musisz je zainstalować, zanim ten dodatek będzie mógł być używany. - -Czy chcesz, aby Menadżer dodatków zainstalował je automatycznie? Wybierz "Zignoruj" aby zainstalować dodatek bez instalowania zależności. - - - - FreeCAD Addons - Dodatki dla FreeCAD - - - - Required Python modules - Wymagane moduły Python - - - - Optional Python modules - Opcjonalne moduły Python - - - - DeveloperModeDialog - - - Addon Developer Tools - Narzędzia dla twórców dodatków - - - - Path to Addon - Ścieżka do dodatku - - - - - Browse... - Przeglądaj... - - - - Metadata - Metadane - - - - Primary branch - Gałąź główna - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Wyjaśnienie tego, co zawiera ten dodatek. Wyświetlane w Menedżerze Dodatków. Nie jest to konieczne, aby stwierdzić, że jest to dodatek dla programu FreeCAD. - - - - Description - Opis - - - - Discussion URL - Adres URL dyskusji - - - - Icon - Ikonka - - - - Bugtracker URL - Adres URL systemu rejestracji błędów - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Obsługiwane style semantyczne (1.2.3-beta) lub CalVer (2022.08.30) - - - - Set to today (CalVer style) - Ustaw na dzisiaj (styl CalVer) - - - - - - - (Optional) - (Opcjonalne) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Wyświetlany na liście dodatków Menedżera dodatków. Nie powinien zawierać słowa "FreeCAD". i musi być prawidłową nazwą katalogu we wszystkich obsługiwanych systemach operacyjnych. - - - - README URL - Adres URL pliku readme - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - Wskazówka: ponieważ jest to wyświetlane w programie FreeCAD, w Menedżerze Dodatków, nie jest konieczne zajmowanie miejsca informacjami takimi jak "To jest dodatek do programu FreeCAD..." -- po prostu powiedz, co on robi. - - - - Repository URL - Adres URL repozytorium - - - - Website URL - Adres URL strony - - - - Documentation URL - Adres URL dokumentacji - - - - Addon Name - Nazwa dodatku - - - - Version - Wersja - - - - (Recommended) - (zalecane) - - - - Minimum Python - Minimalna wersja Pythona - - - - (Optional, only 3.x version supported) - (Opcjonalne, obsługiwana jest tylko wersja 3.x) - - - - Detect... - Wykryj ... - - - - Addon Contents - Zawartość dodatku - - - - Dialog - - - Addon Manager - Menedżer dodatków - - - - Edit Tags - Edytuj tagi - - - - Comma-separated list of tags describing this item: - Lista tagów oddzielonych przecinkami, opisujących element: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - UWAGA: Zwykłe tagi obejmują obiekty "Złożenie", "MES", "Siatka", "NURBS" itd. - - - - Add-on Manager: Warning! - Menedżer dodatków: Ostrzeżenie! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Menedżer dodatków zapewnia dostęp do obszernej biblioteki przydatnych rozszerzeń dla FreeCAD, od osób trzecich. -Nie można zagwarantować ich bezpieczeństwa ani funkcjonalności. - - - - Continue - Kontynuuj - - - - Cancel - Anuluj - - - - EditDependencyDialog - - - Edit Dependency - Edytuj zależność - - - - Dependency Type - Typ zależności - - - - Dependency - Zależność - - - - Package name, if "Other..." - Nazwa pakietu, jeśli "Inne ..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - UWAGA: Jeśli wybrano "Inne ...", pakiet nie jest w pliku ALLOWED_PYTHON_PACKAGES.txt i nie zostanie automatycznie zainstalowany przez Menedżera Dodatków. Prześlij PR na <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a>, aby poprosić o dodanie pakietu. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Jeśli jest to opcjonalna zależność, Menedżer dodatków zaoferuje zainstalowanie tej zależności (jeśli to możliwe), ale nie zablokuje instalacji, jeśli użytkownik nie zdecyduje się na zainstalowanie pakietu lub nie może go zainstalować. - - - - Optional - Opcjonalne - - - - ExpandedView - - - - Icon - Ikonka - - - - - <h1>Package Name</h1> - <h1>Nazwa pakietu</h1> - - - - - Version - Wersja - - - - - (tags) - (znaczniki) - - - - - Description - Opis - - - - - Maintainer - Opiekun - - - - Update Available - Aktualizacja jest dostępna - - - - labelSort - sortowanie etykiet - - - - UpdateAvailable - Dostępna aktualizacja - - - - Form - - - Licenses - Licencje - - - - License - Licencja - - - - License file - Plik licencji - - - - People - Twórcy - - - - Kind - Rodzaj - - - - Name - Nazwa - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Zaawansowane mapowanie wersji - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Przyszłe wersje Menadżera dodatków FreeCAD będą wspierać deweloperów, ustawiając konkretną gałąź lub tag do użytku z konkretną wersją FreeCAD (np. ustawiając konkretny tag jako ostatnią wersję twojego dodatku, aby obsługiwał v0.19, itp.) - - - - FreeCAD Version - Wersja FreeCAD - - - - Best-available branch, tag, or commit - Najlepsza dostępna gałąź, tag lub commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Wspierane wersje FreeCAD - - - - Minimum FreeCAD Version Supported - Minimalna wersja FreeCAD, która jest obsługiwana - - - - - Optional - Opcjonalne - - - - Maximum FreeCAD Version Supported - Maksymalna wersja FreeCAD, która jest obsługiwana - - - - Advanced version mapping... - Zaawansowane mapowanie wersji ... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opcje Menedżera dodatków - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Jeśli ta opcja jest zaznaczona, podczas uruchamiania Menedżera dodatków, -zainstalowane dodatki będą sprawdzane pod kątem dostępnych aktualizacji - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Pobierz metadane makrodefinicji (około 10 MB) - - - - Cache update frequency - Częstotliwość aktualizacji pamięci podręcznej - - - - Manual (no automatic updates) - Ręcznie (bez aktualizacji automatycznych) - - - - Daily - Codziennie - - - - Weekly - Tygodniowo - - - - Hide Addons without a license - Ukryj dodatki bez zdefiniowanej licencji - - - - Hide Addons with non-FSF Free/Libre license - Ukryj dodatki bez licencji FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Ukryj dodatki z licencją niezatwierdzoną przez OSI - - - - Hide Addons marked Python 2 Only - Ukryj dodatki wymagające środowiska Python 2 - - - - Hide Addons marked Obsolete - Ukryj dodatki oznaczone jako przestarzałe - - - - Hide Addons that require a newer version of FreeCAD - Ukryj dodatki, które wymagają nowszej wersji programu FreeCAD - - - - Custom repositories - Repozytoria użytkownika - - - - Proxy - Serwer pośredniczący - - - - No proxy - Bez serwera pośredniczącego - - - - User system proxy - Użyj ustawień serwera pośredniczącego z systemu - - - - User-defined proxy: - Serwer pośredniczący użytkownika: - - - - Score source URL - Adres URL źródła wyniku - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Adres URL dla danych o punktacji dodatków (Szczegóły dotyczące formatowania i hostingu można znaleźć na stronie wiki Menedżera dodatków). - - - - Path to Git executable (optional): - Ścieżka do pliku wykonywalnego Git (opcjonalnie): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opcje zaawansowane - - - - Activate Addon Manager options intended for developers of new Addons. - Aktywuj opcje Menedżera dodatków przeznaczone dla twórców nowych dodatków. - - - - Addon developer mode - Tryb dewelopera dodatków - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Odinstalowuje wybrane makrodefinicje lub środowiska pracy - - - - Install - Zainstaluj - - - - Uninstall - Odinstaluj - - - - Update - Zaktualizuj - - - - Run Macro - Uruchom makrodefinicję - - - - Change branch - Zmień gałąź - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Zarządzaj zależnościami środowiska Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Następujące pakiety środowiska Python zostały zainstalowane lokalnie przez menedżera dodatków w celu spełnienia zależności dodatków. Lokalizacja plików instalacji: - - - - Package name - Nazwa pakietu - - - - Installed version - Wersja zainstalowana - - - - Available version - Wersja dostępna - - - - Used by - Używany przez - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Gwiazdka (*) w kolumnie "Używany przez" wskazuje zależność opcjonalną. Zauważ, że kolumna "Używany przez" zapisuje tylko bezpośredni import w dodatku. Inne pakiety środowiska Python, od których te pakiety zależą, mogły również zostać zainstalowane. - - - - Update all available - Aktualizuj wszystkie dostępne - - - - SelectFromList - - - Dialog - Okno dialogowe - - - - TextLabel - Etykieta tekstu - - - - UpdateAllDialog - - - Updating Addons - Aktualizacja dodatków - - - - Updating out-of-date addons... - Aktualizacja nieaktualnych dodatków ... - - - - addContentDialog - - - Content Item - Element zawartości - - - - Content type: - Typ zawartości: - - - - Macro - Makrodefinicja - - - - Preference Pack - Pakiet preferencji - - - - Workbench - Środowisko pracy - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Jeśli jest to jedyna rzecz w dodatku, wszystkie inne metadane mogą być odziedziczone z najwyższego poziomu i nie muszą być w tym miejscu określone. - - - - This is the only item in the Addon - To jest jedyny element w dodatku - - - - Main macro file - Plik główny makrodefinicji - - - - The file with the macro's metadata in it - Plik z metadanymi makrodefinicji - - - - - - Browse... - Przeglądaj ... - - - - Preference Pack Name - Nazwa Pakietu preferencji - - - - Workbench class name - Nazwa klasy środowiska pracy - - - - Class that defines "Icon" data member - Klasa, która definiuje element danych "Ikona" - - - - Subdirectory - Katalog podrzędny - - - - Optional, defaults to name of content item - Opcjonalne, domyślnie nazwa elementu zawartości - - - - Icon - Ikonka - - - - Optional, defaults to inheriting from top-level Addon - Opcjonalne, domyślnie odziedziczone z dodatku najwyższego poziomu - - - - Tags... - Tagi... - - - - Dependencies... - Zależności... - - - - FreeCAD Versions... - Wersje FreeCAD... - - - - Other Metadata - Inne metadane - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Wyświetlany na liście dodatków Menedżera dodatków. Nie powinien zawierać słowa "FreeCAD". - - - - Version - Wersja - - - - Description - Opis - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Obsługiwane style semantyczne (1.2.3-beta) lub CalVer (2022.08.30) - - - - Set to today (CalVer style) - Ustaw na dzisiaj (styl CalVer) - - - - Display Name - Nazwa wyświetlana - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Wszelkie pola pozostawione puste są dziedziczone z metadanych dodatku najwyższego poziomu, więc technicznie wszystkie są opcjonalne. W przypadku dodatków z wieloma elementami zawartości każdy element powinien mieć unikalną nazwę wyświetlaną i opis. - - - - add_toolbar_button_dialog - - - Add button? - Dodać przycisk? - - - - Add a toolbar button for this macro? - Dodać przycisk paska narzędzi dla tej makrodefinicji? - - - - Yes - Tak - - - - No - Nie - - - - Never - Nigdy - - - - change_branch - - - Change Branch - Zmień gałąź - - - - Change to branch: - Zmień na gałąź: - - - - copyrightInformationDialog - - - Copyright Information - Informacje o prawach autorskich - - - - Copyright holder: - Właściciel praw autorskich: - - - - Copyright year: - Rok praw autorskich: - - - - personDialog - - - Add Person - Dodaj osobę - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Opiekun to ktoś, kto ma dostęp do commitów w tym projekcie. Autorem jest każdy, kogo jeszcze chciałbyś uwzględnić. - - - - Name: - Nazwa: - - - - Email: - Adres e-mail: - - - - Email is required for maintainers, and optional for authors. - Adres e-mail jest wymagany dla opiekunów i opcjonalny dla autorów. - - - - proxy_authentication - - - Proxy login required - Wymagane logowanie do serwera proxy - - - - Proxy requires authentication - Serwer proxy wymaga uwierzytelnienia - - - - Proxy: - Serwer proxy: - - - - Placeholder for proxy address - Miejsce dla adresu serwera pośredniczącego - - - - Realm: - Domena: - - - - Placeholder for proxy realm - Miejsce dla domeny serwera pośredniczącego - - - - Username - Nazwa użytkownika - - - - Password - Hasło - - - - selectLicenseDialog - - - Select a license - Wybierz licencję - - - - About... - O licencji ... - - - - License name: - Nazwa licencji: - - - - Path to license file: - Ścieżka do pliku licencji: - - - - (if required by license) - (jeśli wymaga tego licencja) - - - - Browse... - Przeglądaj ... - - - - Create... - Utwórz ... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Wybierz pasek narzędzi - - - - Select a toolbar to add this macro to: - Wybierz pasek narzędzi, do którego chcesz dodać tę makrodefinicję: - - - - Ask every time - Pytaj za każdym razem - - - - toolbar_button - - - - Add button? - Dodać przycisk? - - - - Add a toolbar button for this macro? - Dodać przycisk paska narzędzi dla tej makrodefinicji? - - - - Yes - Tak - - - - No - Nie - - - - Never - Nigdy - - - - AddonsInstaller - - - Starting up... - Uruchamianie ... - - - - Worker process {} is taking a long time to stop... - Zatrzymanie działającego procesu {} zajmuje dużo czasu ... - - - - Previous cache process was interrupted, restarting... - - Poprzedni proces pamięci podręcznej został przerwany, ponowne uruchamianie... - - - - - Custom repo list changed, forcing recache... - - Zmieniono listę repozytoriów użytkownika, wymuszając ponowne buforowanie ... - - - - Addon manager - Menadżera dodatków - - - - You must restart FreeCAD for changes to take effect. - Musisz zrestartować FreeCAD, aby zmiany zaczęły obowiązywać. - - - - Restart now - Uruchom ponownie teraz - - - - Restart later - Uruchom ponownie później - - - - - Refresh local cache - Odśwież pamięć podręczną - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Aktualizowanie pamięci podręcznej ... - - - - - Checking for updates... - Sprawdzam dostępność aktualizacji ... - - - - Temporary installation of macro failed. - Tymczasowa instalacja makrodefinicji nie powiodła się. - - - - - Close - Zamknij - - - - Update all addons - Aktualizuj wszystkie dodatki - - - - Check for updates - Sprawdź dostępność aktualizacji - - - - Python dependencies... - Zależności środowiska Python ... - - - - Developer tools... - Narzędzia programisty ... - - - - Apply %n available update(s) - Zastosuj %n dostępne aktualizacje - - - - No updates available - Brak dostępnych aktualizacji - - - - - - Cannot launch a new installer until the previous one has finished. - Nie można uruchomić nowej instalacji, dopóki poprzednia nie zostanie zakończona. - - - - - - - Maintainer - Opiekun - - - - - - - Author - Autor - - - - New Python Version Detected - Wykryto nową wersję środowiska Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Wygląda na to, że po raz pierwszy ta wersja Python została użyta z Menedżerem dodatków. Czy chciałbyś zainstalować dla niego te same automatycznie instalowane zależności? - - - - Processing, please wait... - Przetwarzanie, proszę czekać ... - - - - - Update - Aktualizuj - - - - Updating... - Aktualizuję ... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Nie można zaimportować QtNetwork -- wygląda na to, że nie jest zainstalowany w Twoim systemie. Twój dostawca może mieć pakiet dla tej zależności (często nazywany np. "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Nie udało się przekonwertować określonego portu serwera pośredniczącego "{}"; na numer portu - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Błąd parametru: ustawiono wzajemnie wykluczające się opcje serwera pośredniczącego. Resetowanie do wartości domyślnych. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Błąd parametru: wskazano serwer pośredniczący użytkownika, ale nie podano serwera pośredniczącego. Przywrócenie ustawień domyślnych. - - - - Addon Manager: Unexpected {} response from server - Menedżer dodatków: Nieoczekiwana odpowiedź {} z serwera - - - - Error with encrypted connection - Błąd z połączeniem szyfrowanym - - - - - - Confirm remove - Potwierdź usunięcie - - - - Are you sure you want to uninstall {}? - Czy na pewno odinstalować {}? - - - - - - Removing Addon - Usuwanie dodatku - - - - Removing {} - Usuwanie {} - - - - - Uninstall complete - Odinstalowanie zakończone - - - - - Uninstall failed - Odinstalowanie nie powiodło się - - - - Version {version} installed on {date} - Wersja {version} została zainstalowana: {date} - - - - Version {version} installed - Wersja {version} zainstalowana - - - - Installed on {date} - Data instalacji {date} - - - - - - - Installed - Zainstalowano - - - - Currently on branch {}, name changed to {} - Obecnie w gałęzi {}, nazwa została zmieniona na {} - - - - Git tag '{}' checked out, no updates possible - Identyfikator Git '{}' sprawdzony, brak możliwości aktualizacji - - - - Update check in progress - Sprawdzanie aktualizacji w toku - - - - Installation location - Miejsce instalacji - - - - Repository URL - Adres URL repozytorium - - - - Changed to branch '{}' -- please restart to use Addon. - Zmieniono na gałąź "{}" -- uruchom ponownie, aby korzystać z dodatku. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Ten dodatek został zaktualizowany. Uruchom ponownie FreeCAD, aby zobaczyć zmiany. - - - - Disabled - Wyłączone - - - - Currently on branch {}, update available to version {} - W gałęzi {} aktualizacja dostępna do wersji {} - - - - Update available to version {} - Aktualizacja dostępna do wersji {} - - - - This is the latest version available - To jest najnowsza dostępna wersja - - - - WARNING: This addon is obsolete - UWAGA: Ten dodatek jest przestarzały - - - - WARNING: This addon is Python 2 only - UWAGA: Ten dodatek jest przeznaczony tylko dla środowiska Python 2 - - - - WARNING: This addon requires FreeCAD {} - OSTRZEŻENIE: Ten dodatek wymaga programu FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - OSTRZEŻENIE: Ten dodatek jest obecnie zainstalowany, ale wyłączony. Użyj przycisku 'włącz', aby go ponownie włączyć. - - - - This Addon will be enabled next time you restart FreeCAD. - Ten dodatek zostanie włączony przy następnym ponownym uruchomieniu programu FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Ten dodatek zostanie wyłączony przy ponownym uruchomieniu programu FreeCAD. - - - - - - Success - Zakończono pomyślnie - - - - Install - Zainstaluj - - - - Uninstall - Odinstaluj - - - - Enable - Włącz - - - - Disable - Wyłącz - - - - - Check for update - Sprawdź dostępność aktualizacji - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - uruchom - - - - Change branch... - Zmień gałąź ... - - - - Return to package list - Wróć do listy pakietów - - - - Checking connection - Sprawdzanie połączenia - - - - Checking for connection to GitHub... - Sprawdzanie połączenia z GitHub ... - - - - Connection failed - Nawiązanie połączenia nie powiodło się - - - - Missing dependency - Brakująca zależność - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Nie można zaimportować QtNetwork — szczegóły możesz zobaczyć w Widoku raportu. Menedżer dodatków jest niedostępny. - - - - Other... - For providing a license other than one listed - Inne ... - - - - Select the corresponding license file in your Addon - Wybierz odpowiedni plik licencyjny w swoim dodatku - - - - Location for new license file - Lokalizacja nowego pliku licencji - - - - Received {} response code from server - Otrzymano {} kod odpowiedzi z serwera - - - - Failed to install macro {} - Nie udało się zainstalować makrodefinicji {} - - - - Failed to create installation manifest file: - - Nie udało się utworzyć pliku informacji o instalacji: - - - - - Unrecognized content kind '{}' - Nierozpoznany rodzaj treści "{}" - - - - Unable to locate icon at {} - Nie można zlokalizować ikony {} - - - - Select an icon file for this content item - Wybierz plik ikon dla tego elementu - - - - - - {} is not a subdirectory of {} - {} nie jest podkatalogiem {} - - - - Select the subdirectory for this content item - Wybierz podkatalog dla tego elementu - - - - Automatic - Automatycznie - - - - - Workbench - Środowiska pracy - - - - Addon - Dodatek - - - - Python - Python - - - - Yes - Tak - - - - Internal Workbench - Wbudowane środowisko pracy - - - - External Addon - Dodatek zewnętrzny - - - - Python Package - Pakiet Python - - - - - Other... - Inne ... - - - - Too many to list - Lista jest zbyt długa do wyświetlenia - - - - - - - - - Missing Requirement - Niespełnione wymagania - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Dodatek "{}" wymaga pakietu "{}", który nie jest dostępny w twojej kopii FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Dodatek '{}' wymaga danych środowisk pracy, które nie są dostępne w twojej kopii programu FreeCAD: - - - - Press OK to install anyway. - Naciśnij przycisk OK, aby pomimo to zainstalować. - - - - - Incompatible Python version - Niekompatybilna wersja środowiska Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Ten dodatek wymaga pakietów Python, które nie są zainstalowane i nie mogą być zainstalowane automatycznie. Aby użyć tego dodatku, musisz zainstalować samodzielnie następujące pakiety środowiska Python: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Ten dodatek (lub jedna jego zależność) wymaga Pythona {}.{}, a Twój system jest uruchomiony z {}.{}. Instalacja anulowana. - - - - Optional dependency on {} ignored because it is not in the allow-list - Opcjonalna zależność od {} jest ignorowana, ponieważ nie znajduje się na liście dopuszczonych - - - - - Installing dependencies - Instalowanie zależności - - - - - Cannot execute Python - Nie można wykonać skryptu Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Nie udało się automatycznie zlokalizować pliku wykonywalnego Python, lub ścieżka jest ustawiona nieprawidłowo. Sprawdź ustawienie preferencji Menedżera dodatków dotyczące ścieżki do środowiska Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Nie można było zainstalować zależności. Czy mimo to kontynuować instalację {}? - - - - - Cannot execute pip - Nie można uruchomić programu - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Niepowodzenie nie udało się uruchomić polecenia, którego może brakować -w Twojej instalacji środowiska Python. -Upewnij się, że w systemie jest zainstalowane to polecenie -i spróbuj ponownie. Polecenie, którego wykonanie się nie powiodło, to: - - - - - Continue with installation of {} anyway? - Czy mimo to kontynuować instalację {}? - - - - - Package installation failed - Instalacja pakietu nie powiodła się - - - - See Report View for detailed failure log. - Szczegóły zapisu awarii znajdują się w widoku raportu. - - - - Installing Addon - Instalacja dodatku - - - - Installing FreeCAD Addon '{}' - Instalowanie dodatku FreeCAD "{}" - - - - Cancelling - Anulowanie - - - - Cancelling installation of '{}' - Anulowanie instalacji "{}" - - - - {} was installed successfully - {} został poprawnie zainstalowany - - - - - Installation Failed - Instalacja nie powiodła się - - - - Failed to install {} - Nie udało się zainstalować {} - - - - - Create new toolbar - Utwórz nowy pasek narzędzi - - - - - A macro installed with the FreeCAD Addon Manager - Makro zainstalowane przy pomocy Menedżera dodatków FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Uruchom - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Nie można odczytać danych z GitHub: sprawdź swoje połączenie internetowe i ustawienia serwera pośredniczącego i spróbuj ponownie. - - - - XML failure while reading metadata from file {} - Błąd XML podczas odczytywania metadanych z pliku {} - - - - Invalid metadata in file {} - Nieprawidłowe metadane w pliku {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - OSTRZEŻENIE: Ścieżka określona w metadanych package.xml nie pasuje do aktualnie sprawdzanej gałęzi. - - - - Name - Nazwa - - - - Class - Klasa - - - - Description - Opis - - - - Subdirectory - Katalog podrzędny - - - - Files - Pliki - - - - Select the folder containing your Addon - Wybierz folder zawierający dodatek - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Brak Vermin, operacja zostaje anulowania. - - - - Scanning Addon for Python version compatibility - Skanowanie dodatku w celu kompatybilności wersji środowiska Python - - - - Minimum Python Version Detected - Wykryto minimalną wymaganą wersję Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin automatycznie wykrył wymaganą wersję środowiska Python 3.{} - - - - Install Vermin? - Zainstalować Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Automatyczne wykrywanie wymaganej wersji środowiska Python dla tego dodatku wymaga dodatku Vermin (https://pypi.org/project/vermin/). "OK" aby zainstalować? - - - - Attempting to install Vermin from PyPi - Próba zainstalowania Vermin z PyPi - - - - - Installation failed - Instalacja nie powiodła się - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Nie udało się zainstalować Vermin -- sprawdź widok raportu, aby uzyskać szczegóły. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Nie udało się zaimportować vermin po instalacji -- nie można sprawdzić dodatku. - - - - Select an icon file for this package - Wybierz plik ikon dla tego pakietu - - - - Filter is valid - Filtr jest prawidłowy - - - - Filter regular expression is invalid - Wyrażenie regularne filtra jest nieprawidłowe - - - - Search... - Szukaj ... - - - - Click for details about package {} - Kliknij, aby uzyskać informacje o pakiecie {} - - - - Click for details about workbench {} - Kliknij, aby uzyskać informacje o środowisku pracy {} - - - - Click for details about macro {} - Kliknij, aby uzyskać informacje o makrodefinicji {} - - - - Maintainers: - Opiekunowie: - - - - Tags - Znaczniki - - - - {} ★ on GitHub - {} ★ na GitHub - - - - No ★, or not on GitHub - Bez ★, lub nie na GitHub - - - - Created - Utworzono - - - - Updated - Zaktualizowano - - - - Score: - Wynik: - - - - - Up-to-date - Aktualny - - - - - - - - Update available - Dostępna aktualizacja - - - - - Pending restart - Oczekuje na ponowne uruchomienie - - - - - DISABLED - WYŁĄCZONY - - - - Installed version - Wersja zainstalowana - - - - Unknown version - Nieznana wersja - - - - Installed on - Data instalacji - - - - Available version - Wersja dostępna - - - - Filter by... - Filtruj według ... - - - - Addon Type - Typ dodatku - - - - - Any - Dowolny - - - - Macro - Makrodefinicje - - - - Preference Pack - Pakiet preferencji - - - - Installation Status - Stan instalacji - - - - Not installed - Nie zainstalowano - - - - Filter - Filtr - - - - DANGER: Developer feature - OSTRZEŻENIE: Funkcja dewelopera - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Przełączanie gałęzi jest przeznaczone dla deweloperów i beta testerów i może skutkować uszkodzeniem, nieskutecznie kompatybilnymi dokumentami, niestabilność, awarie lub przedwczesna śmierć wszechświata. Czy na pewno chcesz kontynuować? - - - - There are local changes - Występują zmiany lokalne - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - OSTRZEŻENIE: To repozytorium ma niezatwierdzone lokalne zmiany. Czy na pewno chcesz zmienić gałęzie (wprowadzając zmiany w życie)? - - - - Local - Table header for local git ref name - Lokalnie - - - - Remote tracking - Table header for git remote tracking branch name - Śledzenie zdalne - - - - Last Updated - Table header for git update date - Ostatnia aktualizacja - - - - Installation of Python package {} failed - Instalacja pakietu Python {} nie powiodła się - - - - Installation of optional package failed - Instalacja pakietu opcjonalnego nie powiodła się. - - - - Installing required dependency {} - Instalowanie wymaganej zależności {} - - - - Installation of Addon {} failed - Instalacja dodatku {} nie powiodła się - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Nie udało się dekodować pliku {} dla dodatku "{}" - - - - Any dependency information in this file will be ignored - Wszelkie informacje o zależności w tym pliku zostaną zignorowane - - - - Unable to open macro wiki page at {} - Nie można otworzyć strony Wiki makrodefinicji w {} - - - - Unable to fetch the code of this macro. - Nie można pobrać kodu makrodefinicji. - - - - Unable to retrieve a description from the wiki for macro {} - Nie można pobrać opisu z Wiki dla makrodefinicji {} - - - - Unable to open macro code URL {} - Nie można otworzyć adresu URL kodu makrodefinicji {} - - - - Unable to fetch macro-specified file {} from {} - Nie można pobrać pliku określonego przez makrodefinicję {} z {} - - - - Could not locate macro-specified file {} (expected at {}) - Nie można zlokalizować określonego przez makrodefinicję pliku {} (oczekiwany w {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Nierozpoznane wewnętrzne środowisko pracy "{}" - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Ostrzeżenie dla twórców dodatku: Adres URL repozytorium ustawiony w pliku package.xml dla dodatku {} ({}) nie pasuje do adresu URL pobranego z ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Ostrzeżenie dla twórców dodatku: Gałąź repozytorium ustawiona w pliku package.xml dla dodatku {} ({}) nie pasuje do gałęzi, z której został on pobrany ({}) - - - - - Got an error when trying to import {} - Wystąpił błąd podczas próby zaimportowania {} - - - - An unknown error occurred - Wystąpił nieznany błąd - - - - Could not find addon {} to remove it. - Nie można znaleźć dodatku {} do usunięcia. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Wykonanie skryptu dodatku uninstall.py nie powiodło się. Kontynuuję odinstalowywanie ... - - - - Removed extra installed file {} - Usunięto dodatkowy zainstalowany plik {} - - - - Error while trying to remove extra installed file {} - Błąd podczas próby usunięcia dodatkowego zainstalowanego pliku {} - - - - Error while trying to remove macro file {}: - Błąd podczas próby usunięcia pliku makrodefinicji {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Niepowodzenie nie udało się połączyć z GitHub. Sprawdź swoje połączenie i ustawienia serwera pośredniczącego. - - - - WARNING: Duplicate addon {} ignored - OSTRZEŻENIE: Duplikat dodatku {} pominięto - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Wystąpił błąd podczas aktualizacji makrodefinicji z GitHub, próba czyszczenia ... - - - - Attempting to do a clean checkout... - Próbuje wykonać czyszczenie ... - - - - Clean checkout succeeded - Czyszczenie zakończone pomyślnie - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Nie udało się zaktualizować makrodefinicji z repozytorium GitHub — próba oczyszczenia pamięci podręcznej Menedżera dodatków. - - - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Błąd połączenia z Wiki, FreeCAD nie może w tej chwili pobrać listy makrodefinicji Wiki - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Niepowodzenie nie udało się odczytać metadanych z {name} - - - - Failed to fetch code for macro '{name}' - Niepowodzenie nie udało się pobrać kodu dla makrodefinicji "{name}" - - - - Addon Manager: a worker process failed to complete while fetching {name} - Menedżer dodatków: nie udało się ukończyć procesu przetwarzania podczas pobierania {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Dla {num_macros} makrodefinicji przekroczono limit czasu {num_failed} podczas przetwarzania - - - - Addon Manager: a worker process failed to halt ({name}) - Menadżer dodatków: nie udało się zatrzymać uruchomionego procesu ({name}) - - - - Timeout while fetching metadata for macro {} - Upłynął limit czasu pobierania metadanych dla makrodefinicji {} - - - - Failed to kill process for macro {}! - - Nie udało się przerwać procesu makrodefinicji {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Nie udało się pobrać statystyk dodatku z {} - tylko sortowanie alfabetyczne będzie dokładne. - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Nie udało się pobrać wyniku dodatku z "{}" -- sortowanie według wyniku nie powiedzie się. - - - - - Repository URL - Preferences header for custom repositories - Adres URL repozytorium - - - - Branch name - Preferences header for custom repositories - Nazwa gałęzi - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Tworzenie kopii zapasowej oryginalnego katalogu i ponowne klonowanie - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Zmiana nazwy gałęzi Git nie powiodła się, z następującym komunikatem: - - - - Installing - Instalowanie - - - - Succeeded - Zakończono z powodzeniem - - - - Failed - Niepowodzenie - - - - Update was cancelled - Aktualizacja została przerwana - - - - some addons may have been updated - niektóre dodatki mogły zostać zaktualizowane - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Wczytywanie informacji dla {} z wiki systemu makro FreeCAD... - - - - Loading page for {} from {}... - Wczytywanie strony {} z {}... - - - - Failed to download data from {} -- received response code {}. - Nie udało się pobrać danych z {} -- otrzymano kod odpowiedzi {}. - - - - Composite view - Widok złożony - - - - Expanded view - Widok rozszerzony - - - - Compact view - Widok skrócony - - - - Alphabetical - Sort order - Alfabetycznie - - - - Last Updated - Sort order - Ostatnia aktualizacja - - - - Date Created - Sort order - Data utworzenia - - - - GitHub Stars - Sort order - Odznaki GitHub - - - - Score - Sort order - Wynik - - - - Std_AddonMgr - - - &Addon manager - &Menadżer dodatków - - - - Manage external workbenches, macros, and preference packs - Zarządzanie zewnętrznymi środowiskami pracy, makroinstrukcjami i pakietami preferencji - - - - AddonInstaller - - - Finished removing {} - Zakończono usuwanie {} - - - - Failed to remove some files - Nie udało się usunąć niektórych plików - - - - Addons installer - - - Finished updating the following addons - Zakończono aktualizację następujących dodatków - - - - Workbench - - - Auto-Created Macro Toolbar - Pasek narzędzi makr tworzonych automatycznie - - - - QObject - - - Addon Manager - Menedżer dodatków - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-BR.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_pt-BR.qm deleted file mode 100644 index d090c1b1a4..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-BR.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-BR.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_pt-BR.ts deleted file mode 100644 index 436542a0c7..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-BR.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repositório personalizado - - - - Repository URL - URL do repositório - - - - Branch - Ramo - - - - CompactView - - - - Icon - Ícone - - - - - <b>Package Name</b> - <b>Nome do pacote</b> - - - - - Version - Versão - - - - - Description - Descrição - - - - Update Available - Atualização disponível - - - - UpdateAvailable - Atualização Disponível - - - - DependencyDialog - - - Dependencies - Dependências - - - - Dependency type - Tipo de dependência - - - - Name - Nome - - - - Optional? - Opcional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolver Dependências - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Este complemento tem as seguintes dependências obrigatórias e opcionais. Você deve instalá-las antes que este complemento possa ser usado. - -Você quer que o Gerenciador de Complementos os instale automaticamente? Escolha "Ignorar" para instalar o Complemento sem instalar as dependências. - - - - FreeCAD Addons - Extensões FreeCAD - - - - Required Python modules - Módulos Python necessários - - - - Optional Python modules - Módulos opcionais do Python - - - - DeveloperModeDialog - - - Addon Developer Tools - Ferramentas do Desenvolvedor de Complementos (Addon) - - - - Path to Addon - Caminho para o Complemento (addon) - - - - - Browse... - Procurar... - - - - Metadata - Metadados - - - - Primary branch - Ramificação primária - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explicação do que este Complemento fornece. Exibido no Gerenciador de Complementos. Não é necessário que isso declare que este é um Complemento do FreeCAD. - - - - Description - Descrição - - - - Discussion URL - URL de Discussão - - - - Icon - Ícone - - - - Bugtracker URL - URL do rastreador de bugs - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilos semânticos (1.2.3-beta) ou calendário (2022.08.30) suportados - - - - Set to today (CalVer style) - Definir para hoje (Estilo CalVer) - - - - - - - (Optional) - (Opcional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Exibido na lista de Complementos 's de Complementos. Não deve incluir a palavra "FreeCAD", e deve ser um nome de diretório válido em todos os sistemas operacionais de suporte. - - - - README URL - LEIA-ME URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - DICA: Como isso é exibido no FreeCAD, no Gerenciador de Complementos, não é necessário ocupar espaço dizendo coisas como "Este é um Complemento do FreeCAD. ." -- apenas diga o que faz. - - - - Repository URL - URL do repositório - - - - Website URL - URL do site - - - - Documentation URL - URL da Documentação - - - - Addon Name - Nome Complemento - - - - Version - Versão - - - - (Recommended) - (Recomendado) - - - - Minimum Python - Versão mínima Python - - - - (Optional, only 3.x version supported) - (Opcional, apenas versão 3.x suportada) - - - - Detect... - Detectar... - - - - Addon Contents - Comentários do complemento - - - - Dialog - - - Addon Manager - Gerenciador de Extensões - - - - Edit Tags - Editar marcações - - - - Comma-separated list of tags describing this item: - Lista de tags separadas por vírgulas descrevendo este item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - DICA: Tags comuns incluem "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Gerenciador de Extensões: Aviso! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - O Gerenciador de Extensões fornece acesso a uma vasta biblioteca de extensões FreeCAD úteis e de terceiros. Nenhuma garantia pode ser feita acerca da segurança ou funcionalidade delas. - - - - Continue - Continuar - - - - Cancel - Cancelar - - - - EditDependencyDialog - - - Edit Dependency - Editar Dependência - - - - Dependency Type - Tipo de dependência - - - - Dependency - Dependência - - - - Package name, if "Other..." - Nome do pacote, se for "Outro..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTA: Se "Outro..." for selecionado, o pacote não está no arquivo ALLOWED_PYTHON_PACKAGES.txt, e não será instalado automaticamente pelo gerenciador de extensões. Crie um PR em <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> para pedir a inclusão de um novo pacote. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Se esta for uma dependência opcional, o gerenciador de extensões oferecerá para instalá-la (se for possível), mas não irá bloquear a instalação se o usuário escolher não instalar o pacote. - - - - Optional - Opcional - - - - ExpandedView - - - - Icon - Ícone - - - - - <h1>Package Name</h1> - <h1>Nome do pacote</h1> - - - - - Version - Versão - - - - - (tags) - (etiquetas) - - - - - Description - Descrição - - - - - Maintainer - Mantenedor - - - - Update Available - Atualização disponível - - - - labelSort - labelSort - - - - UpdateAvailable - Atualização Disponível - - - - Form - - - Licenses - Licenças - - - - License - Licença - - - - License file - Arquivo de licença - - - - People - Pessoas - - - - Kind - Tipo - - - - Name - Nome - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Mapeamento Avançado de Versão - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Versões futuras do gerenciador de extensões permitirão que desenvolvedores definam um branch ou tag específico para uso com uma versão específica do FreeCAD (ex. definindo uma tag específica como a última versão da sua extensão que suporte o FreeCAD v0.19, etc.) - - - - FreeCAD Version - Versão do FreeCAD - - - - Best-available branch, tag, or commit - Branch, tag ou commit mais apropriado - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versões do FreeCAD suportadas - - - - Minimum FreeCAD Version Supported - Versão mínima do FreeCAD suportada - - - - - Optional - Opcional - - - - Maximum FreeCAD Version Supported - Máximo de versão do FreeCAD suportada - - - - Advanced version mapping... - Mapeamento avançado da versão... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opções de gerenciamento de extensões - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Se esta opção for selecionada, ao iniciar o Addon Manager, -será verificado se há atualizações disponíveis - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Baixar metadados de macro (aproximadamente 10MB) - - - - Cache update frequency - Frequência de atualização do cache - - - - Manual (no automatic updates) - Manual (sem atualizações automáticas) - - - - Daily - Diariamente - - - - Weekly - Semanalmente - - - - Hide Addons without a license - Ocultar Complementos sem licença - - - - Hide Addons with non-FSF Free/Libre license - Ocultar complementos com licença não-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Ocultar complementos com licença não-aprovada - - - - Hide Addons marked Python 2 Only - Ocultar Complementos marcados apenas para Python 2 - - - - Hide Addons marked Obsolete - Ocultar Complementos marcados como obsoletos - - - - Hide Addons that require a newer version of FreeCAD - Ocultar Complementos que requerem uma versão mais recente do FreeCAD - - - - Custom repositories - Repositórios personalizados - - - - Proxy - Proxy - - - - No proxy - Sem proxy - - - - User system proxy - Proxy do sistema do usuário - - - - User-defined proxy: - Proxy definido pelo usuário: - - - - Score source URL - URL da fonte da pontuação - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - A URL para os dados de pontuação das extensões (veja a página wiki do gerenciador de extensões para formatação e detalhes de hospedagem). - - - - Path to Git executable (optional): - Executável Git (opcional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opções Avançadas - - - - Activate Addon Manager options intended for developers of new Addons. - Ativar opções de gerenciador de extensões destinadas aos desenvolvedores. - - - - Addon developer mode - Modo de desenvolvedor - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Desinstala uma macro ou bancada de trabalho selecionada - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Update - Atualizar - - - - Run Macro - Executar macro - - - - Change branch - Alterar branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Gerenciar Dependências do Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Os seguintes pacotes do Python foram instalados localmente pelo Addon Manager para satisfazer as dependências do Addon. Localização da instalação: - - - - Package name - Nome do pacote - - - - Installed version - Versão instalada - - - - Available version - Versão disponível - - - - Used by - Utilizado por - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Um asterisco (*) no "usado por" coluna indica uma dependência opcional. Note que usado apenas registra importações diretas no Addon. Outros pacotes Python dos quais esses pacotes dependem também podem ter sido instalados. - - - - Update all available - Atualizar tudo que estiver disponível - - - - SelectFromList - - - Dialog - Diálogo - - - - TextLabel - Rótulo de texto - - - - UpdateAllDialog - - - Updating Addons - Atualizando Complementos - - - - Updating out-of-date addons... - Atualizando addons desatualizados... - - - - addContentDialog - - - Content Item - Item de Conteúdo - - - - Content type: - Tipo de conteúdo: - - - - Macro - Macro - - - - Preference Pack - Pacote de preferência - - - - Workbench - Bancada - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Se esta é a única coisa no Addon, todos os outros metadados podem ser herdados do nível superior, e não precisa ser especificado aqui. - - - - This is the only item in the Addon - Este é o único item do Addon - - - - Main macro file - Arquivo de macro principal - - - - The file with the macro's metadata in it - O arquivo com os metadados da macro's nele - - - - - - Browse... - Procurar... - - - - Preference Pack Name - Nome do pacote de preferências - - - - Workbench class name - Nome da classe da Bancada de Trabalho - - - - Class that defines "Icon" data member - Classe que define o dado "Ícone" - - - - Subdirectory - Subdiretório - - - - Optional, defaults to name of content item - Opcional, o padrão é o nome do item de conteúdo - - - - Icon - Ícone - - - - Optional, defaults to inheriting from top-level Addon - Opcional, padrão para herdar de Addon de nível superior - - - - Tags... - Etiquetas... - - - - Dependencies... - Dependências... - - - - FreeCAD Versions... - Versões do FreeCAD... - - - - Other Metadata - Outros metadados - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Exibido na lista de extensões do gerenciador. Não deve incluir a palavra "FreeCAD". - - - - Version - Versão - - - - Description - Descrição - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Estilos semânticos (1.2.3-beta) ou calendário (2022.08.30) suportados - - - - Set to today (CalVer style) - Definir para hoje (Estilo CalVer) - - - - Display Name - Nome de exibição - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Qualquer campo deixado em branco herdará os metadados da extensão acima, por tanto tecnicamente todos são opcionais. Para extensões com vários itens de conteúdo, cada item deve fornecer um único nome e descrição. - - - - add_toolbar_button_dialog - - - Add button? - Adicionar botão? - - - - Add a toolbar button for this macro? - Adicionar um botão na barra de ferramentas desta macro? - - - - Yes - Sim - - - - No - Não - - - - Never - Nunca - - - - change_branch - - - Change Branch - Alterar Ramo - - - - Change to branch: - Alterar branch: - - - - copyrightInformationDialog - - - Copyright Information - Informações sobre Direitos Autorais - - - - Copyright holder: - Titular dos direitos autorais: - - - - Copyright year: - Ano do direito autoral: - - - - personDialog - - - Add Person - Adicionar perfil - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Um mantenedor é alguém com acesso de commit atual neste projeto. Um autor é qualquer pessoa para quem você deseja dar créditos. - - - - Name: - Nome: - - - - Email: - E-mail: - - - - Email is required for maintainers, and optional for authors. - E-mail é obrigatório para os mantenedores, e opcional para os autores. - - - - proxy_authentication - - - Proxy login required - Requer configuração de proxy - - - - Proxy requires authentication - Proxy requer autenticação - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Espaço reservado para o endereço de proxy - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Espaço reservado para o realm de proxy - - - - Username - Nome de usuário - - - - Password - Senha - - - - selectLicenseDialog - - - Select a license - Selecionar licença - - - - About... - Sobre... - - - - License name: - Nome da licença: - - - - Path to license file: - Local do arquivo de licença: - - - - (if required by license) - (se exigido pela licença) - - - - Browse... - Procurar... - - - - Create... - Criar... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Selecionar Barra de Ferramentas - - - - Select a toolbar to add this macro to: - Selecionar uma barra de ferramentas para adicionar a esse macro: - - - - Ask every time - Sempre perguntar - - - - toolbar_button - - - - Add button? - Adicionar botão? - - - - Add a toolbar button for this macro? - Adicionar um botão na barra de ferramentas para esta macro? - - - - Yes - Sim - - - - No - Não - - - - Never - Nunca - - - - AddonsInstaller - - - Starting up... - Iniciando... - - - - Worker process {} is taking a long time to stop... - Processo de trabalhador {} está demorando muito para parar... - - - - Previous cache process was interrupted, restarting... - - Processamento do cache anterior foi interrompido, reiniciando... - - - - - Custom repo list changed, forcing recache... - - Lista personalizada de repositórios alterada, forçando recache... - - - - - Addon manager - Gerenciador de complementos - - - - You must restart FreeCAD for changes to take effect. - Você deve reiniciar o FreeCAD para que as alterações tenham efeito. - - - - Restart now - Reiniciar agora - - - - Restart later - Reiniciar depois - - - - - Refresh local cache - Atualizar o cache local - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Atualizando cache... - - - - - Checking for updates... - Verificando por atualizações... - - - - Temporary installation of macro failed. - Falha na instalação temporária do macro. - - - - - Close - Fechar - - - - Update all addons - Atualizar todos os addons - - - - Check for updates - Verificar atualizações - - - - Python dependencies... - Dependências do Python... - - - - Developer tools... - Ferramentas do desenvolvedor... - - - - Apply %n available update(s) - Aplicar %n atualizações disponíveis - - - - No updates available - Não há atualizações disponíveis - - - - - - Cannot launch a new installer until the previous one has finished. - Não é possível iniciar um novo instalador até que o anterior tenha terminado. - - - - - - - Maintainer - Mantenedor - - - - - - - Author - Autor - - - - New Python Version Detected - Nova versão do Python detectada - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Parece ser a primeira vez que esta versão do Python é usada no Addon Manager. Você gostaria de instalar as mesmas dependências instaladas automaticamente para ele? - - - - Processing, please wait... - Processando, aguarde... - - - - - Update - Atualizar - - - - Updating... - Atualizando... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Não foi possível importar QtNetwork -- aparentemente não está instalada em seu sistema. Seu provedor pode ter um pacote para esta dependência (frequentemente chamado "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Falha ao converter a porta especificada '{}' do proxy para um número de porta - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Erro de parâmetro: opções de proxy mutualmente exclusivas definidas. Redefinindo ao padrão. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Erro de parâmetro: proxy de usuário indicado, mas nenhum proxy foi fornecido. Redefinindo para o padrão. - - - - Addon Manager: Unexpected {} response from server - Gerente de Addons: Resposta inesperada {} do servidor - - - - Error with encrypted connection - Erro na conexão criptografada - - - - - - Confirm remove - Confirme a remoção - - - - Are you sure you want to uninstall {}? - Tem certeza que deseja desinstalar {}? - - - - - - Removing Addon - Removendo complemento - - - - Removing {} - Removendo {} - - - - - Uninstall complete - Desinstalação concluída - - - - - Uninstall failed - Falha ao desinstalar - - - - Version {version} installed on {date} - Versão {version} instalada no dia {date} - - - - Version {version} installed - Versão {version} instalada - - - - Installed on {date} - Instalado no dia {date} - - - - - - - Installed - Instalado - - - - Currently on branch {}, name changed to {} - Atualmente na branch {}, nome alterado para {} - - - - Git tag '{}' checked out, no updates possible - Tag do Git '{}' verificada, nenhuma atualização possivel - - - - Update check in progress - Verificação de atualização em andamento - - - - Installation location - Local da instalação - - - - Repository URL - URL do repositório - - - - Changed to branch '{}' -- please restart to use Addon. - Alterado para a ramificação '{}' - por favor reinicie para usar o Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Este complemento foi atualizado. Reinicie o FreeCAD para ver as alterações. - - - - Disabled - Desabilitado - - - - Currently on branch {}, update available to version {} - Atualmente na ramificação {}, atualização disponível para a versão {} - - - - Update available to version {} - Atualização disponível para versão {} - - - - This is the latest version available - Esta é a versão mais recente disponível - - - - WARNING: This addon is obsolete - AVISO: Este complemento é obsoleto - - - - WARNING: This addon is Python 2 only - AVISO: Esta extensão é apenas Python 2 - - - - WARNING: This addon requires FreeCAD {} - AVISO: Esta extensão requer o FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - AVISO: Este addon está instalado, mas desabilitado. Use o botão 'ativar' para reativá-lo. - - - - This Addon will be enabled next time you restart FreeCAD. - Este complemento será ativado na próxima vez que você reiniciar o FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Este addon vai ser desabilitado na próxima vez que você reiniciar o FreeCad. - - - - - - Success - Sucesso - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Enable - Ativar - - - - Disable - Desativar - - - - - Check for update - Verificar atualizações - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - executar - - - - Change branch... - Mudar ramificação... - - - - Return to package list - Retornar à lista de pacotes - - - - Checking connection - Verificando conexão - - - - Checking for connection to GitHub... - Verificando a conexão com o GitHub... - - - - Connection failed - Conexão falhou - - - - Missing dependency - Dependência ausente - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Não foi possível importar QtNetwork -- consulte Ver relatórios para detalhes. Gerenciador de Addons indisponível. - - - - Other... - For providing a license other than one listed - Outro... - - - - Select the corresponding license file in your Addon - Selecione o arquivo de licença correspondente no seu Addon - - - - Location for new license file - Local para o novo arquivo de licença - - - - Received {} response code from server - Código de resposta {} recebido do servidor - - - - Failed to install macro {} - Falha ao instalar macro {} - - - - Failed to create installation manifest file: - - Falha ao criar arquivo de manifesto de instalação: - - - - - Unrecognized content kind '{}' - Tipo de conteúdo desconhecido '{}' - - - - Unable to locate icon at {} - Não foi possível localizar o ícone em {} - - - - Select an icon file for this content item - Selecione um arquivo de ícone para este pacote - - - - - - {} is not a subdirectory of {} - {} não é um subdiretório de {} - - - - Select the subdirectory for this content item - Selecione o subdiretório para este item de conteúdo - - - - Automatic - Automática - - - - - Workbench - Bancada - - - - Addon - Complemento - - - - Python - Python - - - - Yes - Sim - - - - Internal Workbench - Bancada Interna - - - - External Addon - Editor externo - - - - Python Package - Pacote Python - - - - - Other... - Outro... - - - - Too many to list - Muitos para listar - - - - - - - - - Missing Requirement - Requisito ausente - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Complemento '{}' requer '{}', que não está disponível na sua cópia do FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Complemento '{}' requer as seguintes bancadas de trabalho, que não estão disponíveis na sua cópia do FreeCAD: - - - - Press OK to install anyway. - Pressione OK para instalar mesmo assim. - - - - - Incompatible Python version - Versão incompatível do Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Esta extensão requer pacotes do Python que não estão instalados e não podem ser instalados automaticamente. Para usar esta bancada de trabalho, você deve instalar os seguintes pacotes do Python manualmente: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Esta extensão (ou uma das suas dependências) necessita o Python {}.{}, porém seu sistema está rodando a {}.{}. A instalação foi cancelada. - - - - Optional dependency on {} ignored because it is not in the allow-list - Dependência opcional de {} ignorada porque não está na lista de permissão - - - - - Installing dependencies - Instalando dependências - - - - - Cannot execute Python - Não é possível executar Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Falha ao localizar automaticamente o executável do Python, ou o caminho está definido incorretamente. Por favor, verifique a configuração das preferências do Gerenciador de complementos para o caminho do Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependências não puderam ser instaladas. Continuar com a instalação de {} mesmo assim? - - - - - Cannot execute pip - Não é possível executar pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Falha ao executar pip, que pode estar faltando na instalação do Python. Por favor, certifique-se de que seu sistema tem o pip instalado e tente novamente. O comando que falhou foi: - - - - - Continue with installation of {} anyway? - Continuar com a instalação de {} mesmo assim? - - - - - Package installation failed - Instalação do pacote falhou - - - - See Report View for detailed failure log. - Consulte Ver Relatório um registro de falhas detalhado. - - - - Installing Addon - Instalando complemento - - - - Installing FreeCAD Addon '{}' - Instalando complemento '{}' - - - - Cancelling - Cancelando - - - - Cancelling installation of '{}' - Cancelando a instalação de '{}' - - - - {} was installed successfully - {} foi instalado com sucesso - - - - - Installation Failed - Falha na instalação - - - - Failed to install {} - Falha ao instalar {} - - - - - Create new toolbar - Criar nova barra de ferramentas - - - - - A macro installed with the FreeCAD Addon Manager - Uma macro instalada com o Gerenciador de complementos do FreeCAD - - - - - Run - Indicates a macro that can be 'run' - executar - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Não foi possível ler os dados do GitHub: verifique sua conexão de internet e configurações de proxy e tente novamente. - - - - XML failure while reading metadata from file {} - Falha XML ao ler metadados do arquivo {} - - - - Invalid metadata in file {} - Metadados inválidos no arquivo {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - AVISO: caminho especificado nos metadados package.xml não corresponde à ramificação atualmente marcada como check-out. - - - - Name - Nome - - - - Class - Classe - - - - Description - Descrição - - - - Subdirectory - Subdiretório - - - - Files - Arquivos - - - - Select the folder containing your Addon - Selecione a pasta que contém seu complemento - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Nenhum Vermin, cancelando a operação. - - - - Scanning Addon for Python version compatibility - Escaneando compatibilidade com versões de extensão Python - - - - Minimum Python Version Detected - Nova versão do Python detectada - - - - Vermin auto-detected a required version of Python 3.{} - Vermin detectou automaticamente uma versão do Python 3.{} - - - - Install Vermin? - Instalar Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - A Detecção automática da versão do Python para este complemento requer o Vermin (https://pypi.org/project/vermin/). OK para instalar? - - - - Attempting to install Vermin from PyPi - Tentando instalar o Vermin pelo PyPi - - - - - Installation failed - Falha na instalação - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Falha ao instalar Vermin -- verifique Ver Relatório para mais detalhes. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Falha ao importar vermin após a instalação -- não é possível verificar o complemento. - - - - Select an icon file for this package - Selecione um arquivo de ícone para este pacote - - - - Filter is valid - O filtro é válido - - - - Filter regular expression is invalid - Uma expressão regular de filtro é inválida - - - - Search... - Procurar... - - - - Click for details about package {} - Clique para detalhes sobre o pacote {} - - - - Click for details about workbench {} - Clique para detalhes sobre a bancada de trabalho {} - - - - Click for details about macro {} - Clique para detalhes sobre a macro {} - - - - Maintainers: - Mantenedores: - - - - Tags - Etiquetas - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - Sem ★ ou não no GitHub - - - - Created - Criado - - - - Updated - Atualizado - - - - Score: - Pontuação: - - - - - Up-to-date - Atualizado - - - - - - - - Update available - Atualização Disponível - - - - - Pending restart - Reinício pendente - - - - - DISABLED - DESATIVADO - - - - Installed version - Versão instalada - - - - Unknown version - Versão desconhecida - - - - Installed on - Instalado em - - - - Available version - Versão disponível - - - - Filter by... - Filtrar por... - - - - Addon Type - Tipo de Complemento - - - - - Any - Qualquer um - - - - Macro - Macro - - - - Preference Pack - Pacote de preferência - - - - Installation Status - Status da instalação - - - - Not installed - Não instalado - - - - Filter - Filtro - - - - DANGER: Developer feature - PERIGO: Recurso de desenvolvedor - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - PERIGO: A troca de branch é destinada aos desenvolvedores e testadores beta, e pode resultar em quebras, documentos não compatíveis com a retrocompatibilidade, instabilidade e travamentos. Tem certeza que deseja continuar? - - - - There are local changes - Existem alterações locais - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - AVISO: Este repositório tem mudanças locais não confirmadas. Tem certeza de que deseja alterar ramificações (trazendo as alterações com você)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Rastreamento remoto - - - - Last Updated - Table header for git update date - Atualizado pela última vez - - - - Installation of Python package {} failed - Falha na instalação do pacote Python {} - - - - Installation of optional package failed - Falha na instalação do pacote opcional - - - - Installing required dependency {} - Instalando dependência requerida {} - - - - Installation of Addon {} failed - Falha na instalação do complemento {} - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Falha ao decodificar o arquivo {} do complemento '{}' - - - - Any dependency information in this file will be ignored - Qualquer informação sobre dependências neste arquivo será ignorada - - - - Unable to open macro wiki page at {} - Não é possível abrir a página da wiki da macro em {} - - - - Unable to fetch the code of this macro. - Incapaz de buscar o código desta macro. - - - - Unable to retrieve a description from the wiki for macro {} - Não é possível exibir uma descrição deste macro {} - - - - Unable to open macro code URL {} - Não foi possível abrir o URL do código da macro {} - - - - Unable to fetch macro-specified file {} from {} - Não foi possível buscar o arquivo {} especificado de {} - - - - Could not locate macro-specified file {} (expected at {}) - Não foi possível localizar o arquivo {} macro-especificada (esperado em {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Bancada interna desconhecida '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - AVISO DO DESENVOLVEDOR DE EXTENSÕES: URL do repositório definido no arquivo package.xml para extensão {} ({}) não corresponde ao URL do qual foi buscado ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - AVISO DO DESENVOLVEDOR DE EXTENSÕES: A ramificação do repositório definida no arquivo package.xml para extensão {} ({}) não corresponde à ramificação da qual foi buscado ({}) - - - - - Got an error when trying to import {} - Ocorreu um erro ao tentar importar {} - - - - An unknown error occurred - Ocorreu um erro desconhecido - - - - Could not find addon {} to remove it. - Não foi possível encontrar a extensão {} para removê-la. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execução do complemento's uninstall.py falhou. Prosseguindo com a desistalação... - - - - Removed extra installed file {} - Arquivo extra instalado removido {} - - - - Error while trying to remove extra installed file {} - Erro ao tentar remover o arquivo extra instalado {} - - - - Error while trying to remove macro file {}: - Erro enquanto tentava remover o arquivo da macro {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Falha ao se conectar ao GitHub. Verifique sua conexão e configurações de proxy. - - - - WARNING: Duplicate addon {} ignored - AVISO: Extensão {} duplicada ignorada - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Ocorreu um erro ao atualizar macros do GitHub, tentando check-out limpo... - - - - Attempting to do a clean checkout... - Tentando fazer um checkout... - - - - Clean checkout succeeded - Check-out limpo bem-sucedido - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Falha ao atualizar macros do GitHub -- tente limpar o cache do Gerenciador de extensões's. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Erro ao conectar ao Wiki, o FreeCAD não pode recuperar a lista de macros Wiki neste momento - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Falha ao ler metadados de {name} - - - - Failed to fetch code for macro '{name}' - Falha ao obter código para macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Gerenciador de extensões: um processo de trabalho falhou em completar ao obter {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Sem {num_macros} macros, {num_failed} expiraram durante o processamento - - - - Addon Manager: a worker process failed to halt ({name}) - Gerenciador de extensões: um processo de trabalho falhou ao parar ({name}) - - - - Timeout while fetching metadata for macro {} - Tempo limite para buscar metadados para macro {} - - - - Failed to kill process for macro {}! - - Falha ao matar o processo para macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Falha ao obter as estatísticas da extensão de {} -- somente ordenar o valor alfabético será preciso - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Falha ao obter pontuação da extensão de '{}' -- classificar por pontuação falhará - - - - - Repository URL - Preferences header for custom repositories - URL do repositório - - - - Branch name - Preferences header for custom repositories - Nome da ramificação - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Fazendo cópia de segurança do diretório original e re-clonando - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Renomeação de branch do Git falhou com a seguinte mensagem: - - - - Installing - Instalando - - - - Succeeded - Concluído - - - - Failed - Falhou - - - - Update was cancelled - A atualização foi cancelada - - - - some addons may have been updated - alguns complementos podem ter sido atualizados - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Carregando informações para {} da wiki de receitas de Macro do FreeCAD... - - - - Loading page for {} from {}... - Carregando página para {} de {}... - - - - Failed to download data from {} -- received response code {}. - Falha ao baixar dados de {} -- código de resposta recebido {}. - - - - Composite view - Vista composta - - - - Expanded view - Expandir visão - - - - Compact view - Visualização compacta - - - - Alphabetical - Sort order - Alfabético - - - - Last Updated - Sort order - Atualizado pela última vez - - - - Date Created - Sort order - Data de criação - - - - GitHub Stars - Sort order - Estrelas no GitHub - - - - Score - Sort order - Pontuação - - - - Std_AddonMgr - - - &Addon manager - Gerenciador de Extensões - - - - Manage external workbenches, macros, and preference packs - Gerenciar bancadas, macros e pacotes de preferência externos - - - - AddonInstaller - - - Finished removing {} - Finalizando e removendo {} - - - - Failed to remove some files - Falha ao remover alguns arquivos - - - - Addons installer - - - Finished updating the following addons - Terminou de atualizar as seguintes extensões - - - - Workbench - - - Auto-Created Macro Toolbar - Barra de Macro Criada Automaticamente - - - - QObject - - - Addon Manager - Gerenciador de Extensões - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-PT.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_pt-PT.qm deleted file mode 100644 index 63d2c0a245..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-PT.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-PT.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_pt-PT.ts deleted file mode 100644 index 0c2d172b0c..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_pt-PT.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Repositório personalizado - - - - Repository URL - URL do Repositório - - - - Branch - Ramo - - - - CompactView - - - - Icon - Ícone - - - - - <b>Package Name</b> - <b>Nome do Pacote</b> - - - - - Version - Versão - - - - - Description - Descrição - - - - Update Available - Atualização Disponível - - - - UpdateAvailable - AtualizacaoDisponivel - - - - DependencyDialog - - - Dependencies - Dependências - - - - Dependency type - Tipo de Dependência - - - - Name - Nome - - - - Optional? - Opcional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolver Dependências - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Este Suplemento tem as seguintes dependências obrigatórias e opcionais. Tem de instalá-las para ser possível utilizar este Suplemento. - -Pretende que o Gestor de Suplementos as instale automaticamente? Escolha "Ignorar" para instalar o Suplemento sem instalar as dependências. - - - - FreeCAD Addons - Suplementos FreeCAD - - - - Required Python modules - Módulos Python obrigatórios - - - - Optional Python modules - Módulos opcionais do Python - - - - DeveloperModeDialog - - - Addon Developer Tools - Ferramentas do Programador de Suplementos - - - - Path to Addon - Caminho para o Suplemento - - - - - Browse... - Explorar... - - - - Metadata - Metadados - - - - Primary branch - Ramo primário - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explicação do que este Suplemento fornece. Exibido no Gestor de Suplementos. Não é necessário especificar que este é um Suplemento do FreeCAD. - - - - Description - Descrição - - - - Discussion URL - URL de Discussão - - - - Icon - Ícone - - - - Bugtracker URL - URL do Seguidor de Erros - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Suportados os estilos Semantic (1.2.3-beta) ou CalVer (2022.08.30) - - - - Set to today (CalVer style) - Definir para hoje (estilo CalVer) - - - - - - - (Optional) - (Opcional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Exibido na lista Suplementos do Gestor de Suplementos. Não deve incluir a palavra "FreeCAD", e tem de ser um nome de diretório válido em todos os sistemas operativos suportados. - - - - README URL - URL do README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - DICA: Como isto é exibido no FreeCAD, no Gestor de Suplementos, não é necessário escrever coisas como "This is a FreeCAD Addon..." — descreva apenas o que faz. - - - - Repository URL - URL do Repositório - - - - Website URL - URL do Website - - - - Documentation URL - URL da Documentação - - - - Addon Name - Nome do Suplemento - - - - Version - Versão - - - - (Recommended) - (Recomendado) - - - - Minimum Python - Python mínimo - - - - (Optional, only 3.x version supported) - (Opcional, apenas é suportada a versão 3.x) - - - - Detect... - Detetar... - - - - Addon Contents - Conteúdo do Suplemento - - - - Dialog - - - Addon Manager - Gestor de Suplementos - - - - Edit Tags - Editar Etiquetas - - - - Comma-separated list of tags describing this item: - Lista de etiquetas separadas por vírgulas que descrevem este item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - DICA: São etiquetas comuns "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Aviso! Gestor de Extras! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - O Gestor de Extras oferece acesso a uma ampla biblioteca de extensões FreeCAD úteis de terceiros. Não podem ser dadas garantias sobre sua segurança ou funcionalidade. - - - - Continue - Continuar - - - - Cancel - Cancelar - - - - EditDependencyDialog - - - Edit Dependency - Editar Dependência - - - - Dependency Type - Tipo de Dependência - - - - Dependency - Dependência - - - - Package name, if "Other..." - Nome do Pacote, se "Outro..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTA: Se "Outro..." estiver selecionado, o pacote não está no ficheiro ALLOWED_PYTHON_PACKAGES.txt, e não será automaticamente instalado pelo Gestor de Suplementos. Envie um PR em <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> para pedir que um pacote seja adicionado. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Se esta for uma dependência opcional, o Gestor de Suplementos vai propor a sua instalação (quando possível), mas não irá impedir a instalação se o utilizador optar por não o fazer, ou não possa, instalar o pacote. - - - - Optional - Opcional - - - - ExpandedView - - - - Icon - Ícone - - - - - <h1>Package Name</h1> - <h1>Nome do Pacote</h1> - - - - - Version - Versão - - - - - (tags) - (etiquetas) - - - - - Description - Descrição - - - - - Maintainer - Mantido por - - - - Update Available - Atualização disponível - - - - labelSort - labelSort - - - - UpdateAvailable - AtualizacaoDisponivel - - - - Form - - - Licenses - Licenças - - - - License - Licença - - - - License file - Ficheiro da licença - - - - People - Pessoas - - - - Kind - Tipo - - - - Name - Nome - - - - Email - Correio eletrónico - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Mapeamento Avançado de Versão - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Versões futuras do Gestor de Suplementos FreeCAD vão permitir que os programadores definam um ramo específico ou etiqueta para uso com uma versão específica do FreeCAD (e.g. definir uma etiqueta específica que indique que a última versão do seu Suplemento suporta v0.19, etc.) - - - - FreeCAD Version - Versão do FreeCAD - - - - Best-available branch, tag, or commit - Melhor ramo, etiqueta ou confirmação (commit) disponível - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Versões do FreeCAD suportadas - - - - Minimum FreeCAD Version Supported - Versão mínima do FreeCAD suportada - - - - - Optional - Opcional - - - - Maximum FreeCAD Version Supported - Versão máxima do FreeCAD suportada - - - - Advanced version mapping... - Mapeamento avançado de versão... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opções do Gestor de Suplementos - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Se esta opção estiver selecionada, ao iniciar o Gestor de Suplementos, -será verificado se existem atualizações disponíveis para os suplementos instalados - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Transferir metadados da Macro (cerca de 10 MB) - - - - Cache update frequency - Frequência de atualização da Cache - - - - Manual (no automatic updates) - Manual (sem atualizações automáticas) - - - - Daily - Diariamente - - - - Weekly - Semanalmente - - - - Hide Addons without a license - Ocultar Suplementos sem licença - - - - Hide Addons with non-FSF Free/Libre license - Ocultar extras com licença não-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Ocultar extras com licença não-aprovada - - - - Hide Addons marked Python 2 Only - Ocultar extras marcados apenas para Python 2 - - - - Hide Addons marked Obsolete - Ocultar extras marcados como obsoletos - - - - Hide Addons that require a newer version of FreeCAD - Ocultar Suplementos que requerem uma versão mais recente do FreeCAD - - - - Custom repositories - Repositórios personalizados - - - - Proxy - Proxy - - - - No proxy - Sem proxy - - - - User system proxy - Proxy do sistema do utilizador - - - - User-defined proxy: - Proxy definido pelo utilizador: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Opções Avançadas - - - - Activate Addon Manager options intended for developers of new Addons. - Ativar opções do Gestor de Suplementos destinadas aos programadores de novos Suplementos. - - - - Addon developer mode - Modo de desenvolvedor de extras - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Desinstala uma macro ou bancada de trabalho selecionada - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Update - Atualizar - - - - Run Macro - Executar Macro - - - - Change branch - Mudar ramo - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Os seguintes pacotes do Python foram instalados localmente pelo Gestor de Suplementos para satisfazer as dependências do Suplemento. Localização da instalação: - - - - Package name - Nome do pacote - - - - Installed version - Versão instalada - - - - Available version - Versão disponível - - - - Used by - Usado por - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Atualizar todos os disponíveis - - - - SelectFromList - - - Dialog - Caixa de diálogo - - - - TextLabel - Rótulo de texto - - - - UpdateAllDialog - - - Updating Addons - A atualizar os Suplementos - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Item de Conteúdo - - - - Content type: - Tipo de conteúdo: - - - - Macro - Macro - - - - Preference Pack - Pacote de Preferências - - - - Workbench - Bancada de trabalho - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Explorar... - - - - Preference Pack Name - Nome do Pacote de Preferências - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Ícone - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Etiquetas... - - - - Dependencies... - Dependências... - - - - FreeCAD Versions... - Versões do FreeCAD... - - - - Other Metadata - Outros Metadados - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versão - - - - Description - Descrição - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Suportados os estilos Semantic (1.2.3-beta) ou CalVer (2022.08.30) - - - - Set to today (CalVer style) - Definir para hoje (estilo CalVer) - - - - Display Name - Nome a exibir - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Adicionar botão? - - - - Add a toolbar button for this macro? - Adicionar um botão na barra de ferramentas para esta macro? - - - - Yes - Sim - - - - No - Não - - - - Never - Nunca - - - - change_branch - - - Change Branch - Mudar Ramo - - - - Change to branch: - Mudar para o ramo: - - - - copyrightInformationDialog - - - Copyright Information - Informação de Direitos de Autor - - - - Copyright holder: - Detentor dos Direitos de Autor: - - - - Copyright year: - Ano dos Direitos de Autor: - - - - personDialog - - - Add Person - Adicionar Pessoa - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Uma pessoa que mantém é alguém que possui atualmente acesso de confirmação (commit) neste projeto. Um autor é qualquer pessoa a quem deseja dar crédito. - - - - Name: - Nome: - - - - Email: - Correio eletrónico: - - - - Email is required for maintainers, and optional for authors. - O correio eletrónico é obrigatório para mentenedores, e opcional para autores. - - - - proxy_authentication - - - Proxy login required - É necessário o início de sessão do proxy - - - - Proxy requires authentication - O proxy exige autenticação - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Nome de utilizador - - - - Password - Palavra-passe - - - - selectLicenseDialog - - - Select a license - Escolha uma licença - - - - About... - Acerca de... - - - - License name: - Nome da Licença: - - - - Path to license file: - Caminho para o ficheiro da licença: - - - - (if required by license) - (se exigido pela licença) - - - - Browse... - Explorar... - - - - Create... - Criar... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Selecionar Barra de Ferramentas - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Perguntar sempre - - - - toolbar_button - - - - Add button? - Adicionar botão? - - - - Add a toolbar button for this macro? - Adicionar um botão na barra de ferramentas para esta macro? - - - - Yes - Sim - - - - No - Não - - - - Never - Nunca - - - - AddonsInstaller - - - Starting up... - A iniciar... - - - - Worker process {} is taking a long time to stop... - O processo Trabalhador {} está a demorar muito tempo a parar... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Gestor de Suplementos - - - - You must restart FreeCAD for changes to take effect. - Tem de reiniciar o FreeCAD para que as alterações surtam efeito. - - - - Restart now - Reiniciar agora - - - - Restart later - Reiniciar mais tarde - - - - - Refresh local cache - Refresh local cache - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - A procurar atualizações... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Fechar - - - - Update all addons - Atualizar todos os suplementos - - - - Check for updates - A procurar atualizações - - - - Python dependencies... - Dependências do Python... - - - - Developer tools... - Ferramentas do Programador... - - - - Apply %n available update(s) - Aplicar atualizações disponíveis: %n - - - - No updates available - Nenhuma atualização disponível - - - - - - Cannot launch a new installer until the previous one has finished. - Não é possível iniciar um novo instalador até que o anterior tenha terminado. - - - - - - - Maintainer - Mantido por - - - - - - - Author - Autor - - - - New Python Version Detected - Nova Versão do Python Detetada - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Parece ser a primeira vez que esta versão do Python foi usada no Gestor de Suplementos. Pretende instalar as mesmas dependências automaticamente instaladas, para esta versão? - - - - Processing, please wait... - A processar. Por favor aguarde... - - - - - Update - Atualizar - - - - Updating... - A atualizar... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Não foi possível importar o QtNetwork — parece não estar instalado no seu sistema. O seu fornecedor pode ter um pacote para esta dependência (muitas vezes chamada "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Falha ao converter a porta proxy especificada '{}' para um número de porta - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Erro de parâmetro: definidas opções de proxy mutuamente exclusivas. Vai ser redefinido o valor padrão. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Erro de parâmetro: indicado um proxy do utilizador, mas nenhum proxy foi fornecido. Vai ser redefinido o valor padrão. - - - - Addon Manager: Unexpected {} response from server - Gestor de Suplementos: Resposta inesperada {} do servidor - - - - Error with encrypted connection - Erro com a ligação encriptada - - - - - - Confirm remove - Confirme a remoção - - - - Are you sure you want to uninstall {}? - Tem a certeza que quer desinstalar {}? - - - - - - Removing Addon - A remover o Suplemento - - - - Removing {} - A remover {} - - - - - Uninstall complete - Desinstalação concluída - - - - - Uninstall failed - Falha ao desinstalar - - - - Version {version} installed on {date} - Versão {version} instalada a {date} - - - - Version {version} installed - Versão {version} instalada - - - - Installed on {date} - Instalado a {date} - - - - - - - Installed - Instalado - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Verificação de atualização em curso - - - - Installation location - Local de instalação - - - - Repository URL - URL do Repositório - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Desativado - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - AVISO: Este suplemento requer o FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Sucesso - - - - Install - Instalar - - - - Uninstall - Desinstalar - - - - Enable - Ativar - - - - Disable - Desativar - - - - - Check for update - Verificar atualização - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Executar - - - - Change branch... - Mudar ramo... - - - - Return to package list - Voltar à lista de pacotes - - - - Checking connection - A verificar a ligação - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - A ligação falhou - - - - Missing dependency - Dependência em falta - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Outra... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Falha ao instalar a macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automática - - - - - Workbench - Bancada de trabalho - - - - Addon - Suplemento - - - - Python - Python - - - - Yes - Sim - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Pacote Python - - - - - Other... - Outra... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Requisito em Falta - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - O suplemento '{}' requer '{}', que não está disponível no seu FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - O suplemento '{}' requer as seguintes bancadas de trabalho, que não estão disponíveis no seu FreeCAD: - - - - Press OK to install anyway. - Pressione OK para instalar mesmo assim. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Este suplemento requer pacotes Python que não estão instalados e não podem ser instalados automaticamente. Para usar este suplemento, tem de instalar os seguintes pacotes Python manualmente: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Este Suplemento (ou uma das suas dependências) requer Python {}.{}, e o seu sistema possui Python {}.{}. A instalação foi cancelada. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - A instalar dependências - - - - - Cannot execute Python - Não é possível executar o Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Não é possível executar o pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Instalação do pacote falhou - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - A cancelar - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Executar - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Nome - - - - Class - Classe - - - - Description - Descrição - - - - Subdirectory - Subdirectory - - - - Files - Ficheiros - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - O Vermin detetou automaticamente uma versão requerida do Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - A deteção automática da versão do Python exigida para este Suplemento requer Vermin (https://pypi.org/project/vermin/). OK para instalar? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - O filtro é válido - - - - Filter regular expression is invalid - A expressão regular do filtro não é válida - - - - Search... - Procurar... - - - - Click for details about package {} - Clique para detalhes acerca do pacote {} - - - - Click for details about workbench {} - Clique para detalhes acerca da bancada de trabalho {} - - - - Click for details about macro {} - Clique para detalhes acerca da macro {} - - - - Maintainers: - Mantido por: - - - - Tags - Etiquetas - - - - {} ★ on GitHub - {} ★ no GitHub - - - - No ★, or not on GitHub - Sem ★, ou não no GitHub - - - - Created - Criado - - - - Updated - Atualizado - - - - Score: - Pontuação: - - - - - Up-to-date - Atualizado - - - - - - - - Update available - Atualização disponível - - - - - Pending restart - Reinício pendente - - - - - DISABLED - DESATIVADO - - - - Installed version - Versão instalada - - - - Unknown version - Versão desconhecida - - - - Installed on - Instalado a - - - - Available version - Versão disponível - - - - Filter by... - Filtrar por... - - - - Addon Type - Tipo de Suplemento - - - - - Any - Qualquer - - - - Macro - Macro - - - - Preference Pack - Pacote de Preferências - - - - Installation Status - Estado da Instalação - - - - Not installed - Não instalado - - - - Filter - Filtro - - - - DANGER: Developer feature - PERIGO: Recurso de programador - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - PERIGO: A troca de ramos é destinada a programadores e testadores beta, e pode resultar em documentos danificados e não retrocompatíveis, instabilidade, o programa deixar de funcionar e/ou ao fim prematuro do universo. Tem certeza que quer continuar? - - - - There are local changes - Existem alterações locais - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - AVISO: Este repositório tem alterações locais não confirmadas (uncommited). Tem certeza que deseja mudar de ramos (trazendo as alterações consigo)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Última Atualização - - - - Installation of Python package {} failed - Falha na instalação do pacote Python {} - - - - Installation of optional package failed - Falha na instalação do pacote opcional - - - - Installing required dependency {} - A instalar a dependência necessária {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Erro ao tentar importar {} - - - - An unknown error occurred - Ocorreu um erro desconhecido - - - - Could not find addon {} to remove it. - Não foi possível encontrar o suplemento {} para removê-lo. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - AVISO: Suplemento duplicado {} foi ignorado - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Falha ao ler metadados de {name} - - - - Failed to fetch code for macro '{name}' - Falha ao obter código para a macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Gestor de Suplementos: um processo trabalhador não completou a tarefa ao obter {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Das {num_macros} macros, {num_failed} excederam o tempo limite durante o processamento - - - - Addon Manager: a worker process failed to halt ({name}) - Gestor de Suplementos: um processo trabalhador falhou a parar ({name}) - - - - Timeout while fetching metadata for macro {} - Tempo limite excedido ao obter metadados para a macro {} - - - - Failed to kill process for macro {}! - - Falha ao terminar o processo para a macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Falha ao obter estatísticas do Suplemento de {} — apenas a ordenação alfabética estará correta - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Falha ao obter a pontuação do Suplemento de '{}' — ordenar por pontuação vai falhar - - - - - Repository URL - Preferences header for custom repositories - URL do Repositório - - - - Branch name - Preferences header for custom repositories - Nome do ramo - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - A fazer cópia de segurança do diretório original e a reclonar - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - A renomeação do ramo do Git falhou com a seguinte mensagem: - - - - Installing - A instalar - - - - Succeeded - Sucesso - - - - Failed - Falha - - - - Update was cancelled - A atualização foi cancelada - - - - some addons may have been updated - alguns suplementos podem ter sido atualizados - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - A carregar a informação para {} da wiki de Receitas de Macros FreeCAD... - - - - Loading page for {} from {}... - A carregar a página para {} de {}... - - - - Failed to download data from {} -- received response code {}. - Falha ao transferir dados a partir de {} — recebido o código de resposta {}. - - - - Composite view - Vista composta - - - - Expanded view - Vista expandida - - - - Compact view - Vista compacta - - - - Alphabetical - Sort order - Alfabeticamente - - - - Last Updated - Sort order - Última Atualização - - - - Date Created - Sort order - Data de Criação - - - - GitHub Stars - Sort order - Estrelas do GitHub - - - - Score - Sort order - Pontuação - - - - Std_AddonMgr - - - &Addon manager - &Gestor de suplementos - - - - Manage external workbenches, macros, and preference packs - Gerir bancadas de trabalho, macros, e pacote de preferências externas - - - - AddonInstaller - - - Finished removing {} - Remoção concluída de {} - - - - Failed to remove some files - Falha ao remover alguns ficheiros - - - - Addons installer - - - Finished updating the following addons - Atualização concluída para os seguintes suplementos - - - - Workbench - - - Auto-Created Macro Toolbar - Barra de ferramentas de Macros criada automaticamente - - - - QObject - - - Addon Manager - Gestor de Suplementos - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ro.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ro.qm deleted file mode 100644 index 11b255ea3a..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ro.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ro.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ro.ts deleted file mode 100644 index b64d749ee6..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ro.ts +++ /dev/null @@ -1,2485 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Depozit de cod - - - - Repository URL - URL repozitoriu - - - - Branch - Ramură - - - - CompactView - - - - Icon - Iconiță - - - - - <b>Package Name</b> - Numele Pachetului - - - - - Version - Versiunea - - - - - Description - Descriere - - - - Update Available - Actualizare disponibilă - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependințe - - - - Dependency type - Dependency type - - - - Name - Nume - - - - Optional? - Opţional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Această Adăugare are atât dependințe necesare cât și opționale. Trebuie să le instalezi pentru a putea folosi această Adăugare. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Descriere - - - - Discussion URL - Discussion URL - - - - Icon - Iconiță - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - URL repozitoriu - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Versiunea - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Manager de addon - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Continua - - - - Cancel - Renunţă - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - - Icon - Iconiță - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - Versiunea - - - - - (tags) - (tags) - - - - - Description - Descriere - - - - - Maintainer - Maintainer - - - - Update Available - Actualizare disponibilă - - - - labelSort - labelSort - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - Licenses - Licenses - - - - License - Licenţă - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - Nume - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manual (no automatic updates) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Proxy - Opțiuni Proxy - - - - No proxy - Fără proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Advanced Options - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Install - - - - Uninstall - Uninstall - - - - Update - Actualizare - - - - Run Macro - Run Macro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Dialog - - - - TextLabel - TextLabel - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Macrocomandă - - - - Preference Pack - Preference Pack - - - - Workbench - Banc de lucru - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Numele pachetului de preferințe - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Iconiță - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versiunea - - - - Description - Descriere - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Nume afișat - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Nume: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - AddonsInstaller - - - Starting up... - Starting up... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - Refresh local cache - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - Checking for updates... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Închide - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - - - - Maintainer - Maintainer - - - - - - - Author - Autor - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Actualizare - - - - Updating... - Updating... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installation location - - - - Repository URL - URL repozitoriu - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Dezactivat - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Install - Install - - - - Uninstall - Uninstall - - - - Enable - Activeaza - - - - Disable - Dezactivare - - - - - Check for update - Check for update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Execută - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automat - - - - - Workbench - Banc de lucru - - - - Addon - Addon - - - - Python - Python - - - - Yes - Yes - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Other... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Execută - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Nume - - - - Class - Clasă - - - - Description - Descriere - - - - Subdirectory - Subdirectory - - - - Files - Files - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Caută... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Etichete - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Installed version - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Available version - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Oricare - - - - Macro - Macrocomandă - - - - Preference Pack - Preference Pack - - - - Installation Status - Installation Status - - - - Not installed - Not installed - - - - Filter - Filtru - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - URL repozitoriu - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - Bară Macro creată automat - - - - QObject - - - Addon Manager - Manager de addon - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ru.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_ru.qm deleted file mode 100644 index 72cb9f2a1e..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_ru.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_ru.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_ru.ts deleted file mode 100644 index f6f3526490..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_ru.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Пользовательский репозиторий - - - - Repository URL - URL репозитория - - - - Branch - Ветка - - - - CompactView - - - - Icon - Иконка - - - - - <b>Package Name</b> - <b>Название пакета</b> - - - - - Version - Версия - - - - - Description - Описание - - - - Update Available - Доступно обновление - - - - UpdateAvailable - Доступно обновление - - - - DependencyDialog - - - Dependencies - Зависимости - - - - Dependency type - Тип зависимости - - - - Name - Название - - - - Optional? - Необязательное? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Разрешить зависимости - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Это Дополнение имеет следующие необходимые и необязательные зависимости. Вы должны установить их перед использованием этого дополнения. - -Хотите, чтобы менеджер дополнений установил их автоматически? Выберите "Игнорировать" для установки дополнения без установки зависимостей. - - - - FreeCAD Addons - Дополнения FreeCAD - - - - Required Python modules - Необходимые модули Python - - - - Optional Python modules - Необязательные модули Python - - - - DeveloperModeDialog - - - Addon Developer Tools - Инструменты разработчика дополнений - - - - Path to Addon - Путь к дополнению - - - - - Browse... - Обзор... - - - - Metadata - Метаданные - - - - Primary branch - Основная ветка - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Описание возможностей дополнения отображается в менеджере дополнений. Нет необходимости писать, что это дополнение для FreeCAD. - - - - Description - Описание - - - - Discussion URL - Ссылка на обсуждение - - - - Icon - Иконка - - - - Bugtracker URL - Ссылка для отслеживания ошибок - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Поддерживаются стили Semantic (1.2.3-beta) или CalVer (2022.08.30) - - - - Set to today (CalVer style) - Поставить сегодняшнюю дату (стиль CalVer) - - - - - - - (Optional) - (Необязательно) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Отображается в списке дополнений менеджера дополнений. Не должно включать слово "FreeCAD", и должно быть корректным именем каталога во всех поддерживаемых операционных системах. - - - - README URL - URL описания - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - СОВЕТ: Поскольку это отображается внутри FreeCAD, в диспетчере дополнений, нет необходимости занимать место словами типа "Это дополнение FreeCAD..." - просто опишите, что оно делает. - - - - Repository URL - URL репозитория - - - - Website URL - Ссылка на сайт - - - - Documentation URL - Ссылка на документацию - - - - Addon Name - Название дополнения - - - - Version - Версия - - - - (Recommended) - (Рекомендуется) - - - - Minimum Python - Минимальная версия Python - - - - (Optional, only 3.x version supported) - (Необязательно, поддерживается только версия 3.x) - - - - Detect... - Найти... - - - - Addon Contents - Содержимое дополнения - - - - Dialog - - - Addon Manager - Менеджер дополнений - - - - Edit Tags - Редактировать теги - - - - Comma-separated list of tags describing this item: - Список тегов, разделённых запятыми, описывающих этот элемент: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - ПОДСКАЗКА: Обычно теги содержат "Assembly", "FEM", "Mesh", "NURBS" и т.д. - - - - Add-on Manager: Warning! - Менеджер дополнений: Предупреждение! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Менеджер дополнений предоставляет доступ к обширной библиотеке полезных сторонних расширений FreeCAD. Не может быть никаких гарантий относительно их безопасности или функциональности. - - - - Continue - Продолжить - - - - Cancel - Отмена - - - - EditDependencyDialog - - - Edit Dependency - Редактировать зависимости - - - - Dependency Type - Тип зависимости - - - - Dependency - Зависимость - - - - Package name, if "Other..." - Название пакета, если "Другое..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - ПРИМЕЧАНИЕ: Если выбрано "Другое..." и название пакета отсутствует в ALLOWED_PYTHON_PACKAGES.txt, то пакет не будет автоматически установлен менеджером дополнений. Отправьте PR на <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a>, чтобы запросить добавление пакета. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Если это необязательная зависимость, менеджер дополнений предложит установить ее (когда это возможно), но не будет блокировать установку, если пользователь решит не устанавливать или не сможет установить пакет. - - - - Optional - Необязательное - - - - ExpandedView - - - - Icon - Иконка - - - - - <h1>Package Name</h1> - <h1>Название пакета</h1> - - - - - Version - Версия - - - - - (tags) - (теги) - - - - - Description - Описание - - - - - Maintainer - Поставщик ПО - - - - Update Available - Доступно обновление - - - - labelSort - Сортировка - - - - UpdateAvailable - Доступно обновление - - - - Form - - - Licenses - Лицензии - - - - License - Лицензия - - - - License file - Файл лицензии - - - - People - Контакты - - - - Kind - Роль - - - - Name - Имя - - - - Email - Эл. почта - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Расширенная настройка поддержки версий - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Предстоящие версии Менеджера дополнений FreeCAD будут поддерживать настройку разработчиком конкретной ветки или тега для использования с конкретной версией FreeCAD (например указание отдельного тега в качестве последней версии, поддерживаемой вашим дополнением v0.19 и т. д.) - - - - FreeCAD Version - Версия FreeCAD - - - - Best-available branch, tag, or commit - Наиболее доступная ветка, тэг или коммит - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Поддерживаемые версии FreeCAD - - - - Minimum FreeCAD Version Supported - Минимальная поддерживаемая версия FreeCAD - - - - - Optional - Дополнительно - - - - Maximum FreeCAD Version Supported - Максимальная поддерживаемая версия FreeCAD - - - - Advanced version mapping... - Расширенная настройка сопоставления версий... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Настройки менеджера дополнений - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Если выбран этот пункт, то при запуске менеджера дополнений -установленные дополнения будут проверены на наличие доступных обновлений - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Скачать метаданные макросов (примерно 10 Мб) - - - - Cache update frequency - Частота обновления кэша - - - - Manual (no automatic updates) - Вручную (без автоматического обновления) - - - - Daily - Ежедневно - - - - Weekly - Еженедельно - - - - Hide Addons without a license - Скрыть дополнения без лицензии - - - - Hide Addons with non-FSF Free/Libre license - Скрыть дополнения с лицензией отличной от СПО Free/Libre - - - - Hide Addons with non-OSI-approved license - Скрыть дополнения с лицензией, не одобренной OSI - - - - Hide Addons marked Python 2 Only - Скрыть дополнения, помеченные "Только Python 2" - - - - Hide Addons marked Obsolete - Скрыть дополнения, помеченные "Устаревшие" - - - - Hide Addons that require a newer version of FreeCAD - Скрыть дополнения, которые требуют более новой версии FreeCAD - - - - Custom repositories - Пользовательские репозитории - - - - Proxy - Прокси-сервер - - - - No proxy - Без прокси - - - - User system proxy - Использовать системный прокси - - - - User-defined proxy: - Заданный пользователем прокси: - - - - Score source URL - URL-адрес источника оценки - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - URL-адрес для данных о баллах дополнений (подробности о форматировании и хостинге см. на вики странице менеджера дополнений). - - - - Path to Git executable (optional): - Путь к исполняемому файлу git (необязательно): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Дополнительные настройки - - - - Activate Addon Manager options intended for developers of new Addons. - Активировать функции менеджера дополнений, предназначенные для разработчиков новых дополнений. - - - - Addon developer mode - Режим разработчика дополнений - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Удаление выбранного макроса или верстака - - - - Install - Установить - - - - Uninstall - Удалить - - - - Update - Обновить - - - - Run Macro - Выполнить макрос - - - - Change branch - Изменить ветку - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Управление зависимостями Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Следующие пакеты Python были установлены локально Менеджером дополнений для удовлетворения зависимостей. Место установки: - - - - Package name - Название пакета - - - - Installed version - Установленная версия - - - - Available version - Доступная версия - - - - Used by - Используется в - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Знак (*) в столбце "Используется в" указывает на необязательную зависимость. Заметьте, что в столбце "Используется в" показаны прямо импортированные пакеты. Также могут быть установлены другие Python пакеты, необходимые для этих пакетов,. - - - - Update all available - Обновить все - - - - SelectFromList - - - Dialog - Диалог - - - - TextLabel - Заголовок - - - - UpdateAllDialog - - - Updating Addons - Обновление дополнений - - - - Updating out-of-date addons... - Обновление устаревших дополнений... - - - - addContentDialog - - - Content Item - Содержимое элемента - - - - Content type: - Тип содержимого: - - - - Macro - Макрокоманда - - - - Preference Pack - Пакет настроек - - - - Workbench - Верстак - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Если это единственная вещь в дополнении, все остальные метаданные могут быть унаследованы от верхнего уровня, и не требует указания здесь. - - - - This is the only item in the Addon - Это единственный элемент в дополнении - - - - Main macro file - Основной файл макроса - - - - The file with the macro's metadata in it - Файл, содержащий метаданные, макроса - - - - - - Browse... - Обзор... - - - - Preference Pack Name - Название пакета настроек - - - - Workbench class name - Название класса верстака - - - - Class that defines "Icon" data member - Класс, определяющий элемент основных данных - - - - Subdirectory - Подкаталог - - - - Optional, defaults to name of content item - Необязательно, по умолчанию равно названию элемента - - - - Icon - Иконка - - - - Optional, defaults to inheriting from top-level Addon - Необязательно, по умолчанию наследуется от общих настроек дополнения - - - - Tags... - Теги... - - - - Dependencies... - Зависимости... - - - - FreeCAD Versions... - Версии FreeCAD... - - - - Other Metadata - Другие данные - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Отображается в списке Менеджера дополнений. Не следует указывать слово "FreeCAD". - - - - Version - Версия - - - - Description - Описание - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Поддерживаются стили Semantic (1.2.3-beta) или CalVer (2022.08.30) - - - - Set to today (CalVer style) - Поставить сегодняшнюю дату (стиль CalVer) - - - - Display Name - Отображаемое название - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Любые незаполненные поля унаследуют содержимое от метаданных верхнего уровня, поэтому технически все они являются необязательными. Для дополнений с несколькими элементами содержимого, каждый элемент должен предоставить уникальное отображаемое имя и описание. - - - - add_toolbar_button_dialog - - - Add button? - Добавить кнопку? - - - - Add a toolbar button for this macro? - Добавить кнопку на панель инструментов для этого макроса? - - - - Yes - Да - - - - No - Нет - - - - Never - Никогда - - - - change_branch - - - Change Branch - Изменить ветку - - - - Change to branch: - Перейти в ветку: - - - - copyrightInformationDialog - - - Copyright Information - Информация об авторских правах - - - - Copyright holder: - Владелец авторских прав: - - - - Copyright year: - Год авторских прав: - - - - personDialog - - - Add Person - Добавить участника проекта - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Поставщик ПО ― кто-то с возможностью коммита в этом проекте. Автор ― кто-либо еще внесший вклад. - - - - Name: - Имя: - - - - Email: - Эл. почта: - - - - Email is required for maintainers, and optional for authors. - Электронная почта обязательна для поставщиков ПО, но необязательна для авторов. - - - - proxy_authentication - - - Proxy login required - Требуется вход на прокси - - - - Proxy requires authentication - Для прокси сервера требуется авторизация - - - - Proxy: - Прокси сервер: - - - - Placeholder for proxy address - Введите сюда адрес прокси сервера - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Введите сюда proxy realm - - - - Username - Имя пользователя - - - - Password - Пароль - - - - selectLicenseDialog - - - Select a license - Выберите лицензию - - - - About... - О лицензии... - - - - License name: - Название лицензии: - - - - Path to license file: - Путь к файлу лицензии: - - - - (if required by license) - (если требуется лицензией) - - - - Browse... - Обзор... - - - - Create... - Создать... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Выберите Панель инструментов - - - - Select a toolbar to add this macro to: - Выберите панель инструментов, на которую добавить этот макрос: - - - - Ask every time - Всегда спрашивать - - - - toolbar_button - - - - Add button? - Добавить кнопку? - - - - Add a toolbar button for this macro? - Добавить кнопку на панель инструментов для этого макроса? - - - - Yes - Да - - - - No - Нет - - - - Never - Никогда - - - - AddonsInstaller - - - Starting up... - Запуск... - - - - Worker process {} is taking a long time to stop... - Работающий процесс {} занимает много времени при остановке... - - - - Previous cache process was interrupted, restarting... - - Предыдущий процесс кэширования был прерван, перезапуск... - - - - - Custom repo list changed, forcing recache... - - Пользовательский список репозитория изменён, запущено обновление кэша... - - - - - Addon manager - Менеджер дополнений - - - - You must restart FreeCAD for changes to take effect. - Вы должны перезапустить FreeCAD, чтобы изменения вступили в силу. - - - - Restart now - Перезагрузить сейчас - - - - Restart later - Перезагрузить позже - - - - - Refresh local cache - Обновить локальный кэш - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Обновление кэша... - - - - - Checking for updates... - Проверка обновлений... - - - - Temporary installation of macro failed. - Не удалось установить макрос. - - - - - Close - Закрыть - - - - Update all addons - Обновить все дополнения - - - - Check for updates - Проверить наличие обновлений - - - - Python dependencies... - Зависимости Python... - - - - Developer tools... - Инструменты разработчика... - - - - Apply %n available update(s) - Применить %n доступных обновлений - - - - No updates available - Обновлений нет - - - - - - Cannot launch a new installer until the previous one has finished. - Невозможно запустить новую установку, пока не завершена предыдущая. - - - - - - - Maintainer - Поставщик ПО - - - - - - - Author - Автор - - - - New Python Version Detected - Обнаружена новая версия Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Похоже, что эта версия Python впервые используется в Менеджере дополнений. Установить такие же необходимые зависимости? - - - - Processing, please wait... - Обработка, пожалуйста подождите... - - - - - Update - Обновить - - - - Updating... - Обновление... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Не удалось импортировать QtNetwork ― видимо, он не установлен в системе. У вашего дистрибутива может быть пакет для этой зависимости (обычно это "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Не удалось преобразовать указанный прокси порт '{}' в номер порта - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Ошибка параметров: введены взаимно исключающие параметры прокси. Используются параметры по умолчанию. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Ошибка параметров: выбран пользовательский прокси, но адрес прокси не введен. Используются параметры по умолчанию. - - - - Addon Manager: Unexpected {} response from server - Менеджер дополнений: Неожиданный ответ сервера {} - - - - Error with encrypted connection - Ошибка защищенного соединения - - - - - - Confirm remove - Подтвердите удаление - - - - Are you sure you want to uninstall {}? - Вы уверены, что хотите удалить {}? - - - - - - Removing Addon - Удаление дополнения - - - - Removing {} - Удаление {} - - - - - Uninstall complete - Удаление завершено - - - - - Uninstall failed - Удаление не удалось - - - - Version {version} installed on {date} - Версия {version} установлена {date} - - - - Version {version} installed - Установлена версия {version} - - - - Installed on {date} - Установлено {date} - - - - - - - Installed - Установлено - - - - Currently on branch {}, name changed to {} - В настоящее время в ветке {}, имя изменено на {} - - - - Git tag '{}' checked out, no updates possible - Версия git тэг '{}' получена, обновления невозможны - - - - Update check in progress - Выполняется проверка обновлений - - - - Installation location - Место установки - - - - Repository URL - URL репозитория - - - - Changed to branch '{}' -- please restart to use Addon. - Изменено на ветку '{}' -- пожалуйста, перезапустите, для использования дополненя. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Это дополнение было обновлено. Перезапустите FreeCAD, чтобы увидеть изменения. - - - - Disabled - Отключено - - - - Currently on branch {}, update available to version {} - Сейчас версия ветки {}, доступно обновление до версии {} - - - - Update available to version {} - Доступно обновление до версии {} - - - - This is the latest version available - Это последняя доступная версия - - - - WARNING: This addon is obsolete - ВНИМАНИЕ: Это дополнение устарело - - - - WARNING: This addon is Python 2 only - ВНИМАНИЕ: Это дополнение только для Python 2 - - - - WARNING: This addon requires FreeCAD {} - ВНИМАНИЕ: Для этого дополнения требуется FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - ВНИМАНИЕ: Это дополнение в настоящее время установлено, но отключено. Используйте кнопку 'включить' для повторного включения. - - - - This Addon will be enabled next time you restart FreeCAD. - Это дополнение будет включено при перезапуске FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Это дополнение будет отключено при перезапуске FreeCAD. - - - - - - Success - Успешно - - - - Install - Установить - - - - Uninstall - Удалить - - - - Enable - Включить - - - - Disable - Отключить - - - - - Check for update - Проверить обновления - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Запустить - - - - Change branch... - Изменить ветку... - - - - Return to package list - Вернуться к списку пакетов - - - - Checking connection - Проверка соединения - - - - Checking for connection to GitHub... - Проверка подключения к GitHub... - - - - Connection failed - Не удалось подключиться - - - - Missing dependency - Отсутствуют зависимости - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Не удалось импортировать QtNetwork ― смотрите панель отчёта для подробностей. Менеджер дополнений недоступен. - - - - Other... - For providing a license other than one listed - Другая... - - - - Select the corresponding license file in your Addon - Выберите соответствующий файл лицензии в вашем дополнении - - - - Location for new license file - Расположение нового файла лицензии - - - - Received {} response code from server - Получен ответ {} от сервера - - - - Failed to install macro {} - Не удалось установить макрос {} - - - - Failed to create installation manifest file: - - Не удалось создать файл манифеста установки: - - - - - Unrecognized content kind '{}' - Нераспознанный тип содержимого '{}' - - - - Unable to locate icon at {} - Не удалось найти иконку в {} - - - - Select an icon file for this content item - Выберите файл иконки для этого элемента содержимого - - - - - - {} is not a subdirectory of {} - {} не является подкаталогом {} - - - - Select the subdirectory for this content item - Выберите подкаталог для этого элемента содержимого - - - - Automatic - Автоматически - - - - - Workbench - Верстак - - - - Addon - Дополнение - - - - Python - Python - - - - Yes - Да - - - - Internal Workbench - Внутренний верстак - - - - External Addon - Внешнее дополнение - - - - Python Package - Пакет Python - - - - - Other... - Другое... - - - - Too many to list - Слишком много для отображения - - - - - - - - - Missing Requirement - Отсутствует зависимость - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Дополнению '{}' необходима зависимость '{}', которая недоступна в этой копии FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Дополнению '{}' необходимы следующие верстаки, недоступные в этой копии FreeCAD: - - - - Press OK to install anyway. - Нажмите OK, чтобы все равно установить. - - - - - Incompatible Python version - Несовместимая версия Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Это дополнение требует неустановленные пакеты Python, которые не могут быть установлены автоматически. Для использования этого дополнения вы должны вручную установить следующие пакеты Python: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Этому дополнению или его зависимостям необходим Python {}.{}, но установлен: {}.{}. Установка отменена. - - - - Optional dependency on {} ignored because it is not in the allow-list - Необязательная зависимость {} пропущена, потому что её нет в белом списке - - - - - Installing dependencies - Установка зависимостей - - - - - Cannot execute Python - Невозможно запустить Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Не удалось автоматически найти исполняемый файл Python или путь к нему установлен неправильно. Пожалуйста, проверьте путь к Python в настройках Менеджера дополнений. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Зависимости не могут быть установлены. Всё равно продолжить установку {}? - - - - - Cannot execute pip - Невозможно запустить pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Не удалось запустить pip, возможно он отсутствует в установленном вами Python. Убедитесь, что в вашей системе установлен pip, и повторите попытку. Неудачная команда была такая: - - - - - Continue with installation of {} anyway? - Всё равно продолжить установку {}? - - - - - Package installation failed - Установка пакета не удалась - - - - See Report View for detailed failure log. - Подробный журнал ошибок смотрите на панели отчетов. - - - - Installing Addon - Установка дополнения - - - - Installing FreeCAD Addon '{}' - Установка дополнения FreeCAD '{}' - - - - Cancelling - Отмена - - - - Cancelling installation of '{}' - Отмена установки '{}' - - - - {} was installed successfully - {0} успешно установлен - - - - - Installation Failed - Установка не удалась - - - - Failed to install {} - Не удалось установить {} - - - - - Create new toolbar - Создать новую панель инструментов - - - - - A macro installed with the FreeCAD Addon Manager - Макрос, установленный менеджером дополнений FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Запустить - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Не удаётся прочитать данные с GitHub: проверьте подключение к интернету и настройки прокси и повторите попытку. - - - - XML failure while reading metadata from file {} - Ошибка XML при чтении метаданных из файла {} - - - - Invalid metadata in file {} - Некорректные метаданные в файле {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ПРЕДУПРЕЖДЕНИЕ: Указанный в метаданных package.xml путь не соответствует полученной ветке. - - - - Name - Название - - - - Class - Класс - - - - Description - Описание - - - - Subdirectory - Подкаталог - - - - Files - Файлы - - - - Select the folder containing your Addon - Выберите папку, содержащую дополнение - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Отсутствует Vermin, операция отменяется. - - - - Scanning Addon for Python version compatibility - Проверка дополнения на совместимость с версией Python - - - - Minimum Python Version Detected - Определена минимальная версия Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin автоматически определил необходимую версию как Python 3.{} - - - - Install Vermin? - Установить Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Для автоматического определения необходимой версии Python требуется Vermin (https://pypi.org/project/vermin/). Установить? - - - - Attempting to install Vermin from PyPi - Установка Vermin из PyPi - - - - - Installation failed - Установка не удалась - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Не удалось установить Vermin ― подробности смотрите в панели отчётов. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Не удалось импортировать Vermin после установки ― невозможно сканировать дополнение. - - - - Select an icon file for this package - Выберите файл иконки для этого пакета - - - - Filter is valid - Фильтр корректен - - - - Filter regular expression is invalid - Некорректное регулярное выражение фильтра - - - - Search... - Поиск... - - - - Click for details about package {} - Нажмите для подробностей о пакете {} - - - - Click for details about workbench {} - Нажмите для подробностей о верстаке {} - - - - Click for details about macro {} - Нажмите для подробностей о макросе {} - - - - Maintainers: - Поставщики ПО: - - - - Tags - Теги - - - - {} ★ on GitHub - {} ★ на GitHub - - - - No ★, or not on GitHub - Нет ★ или не на GitHub - - - - Created - Создано - - - - Updated - Обновлено - - - - Score: - Оценка: - - - - - Up-to-date - Актуальная версия - - - - - - - - Update available - Доступно обновление - - - - - Pending restart - Ожидается перезапуск - - - - - DISABLED - ОТКЛЮЧЕНО - - - - Installed version - Установленная версия - - - - Unknown version - Неизвестная версия - - - - Installed on - Установлено - - - - Available version - Доступная версия - - - - Filter by... - Фильтр по... - - - - Addon Type - Тип дополнения - - - - - Any - Любое - - - - Macro - Макрос - - - - Preference Pack - Пакет настроек - - - - Installation Status - Статус установки - - - - Not installed - Не установлено - - - - Filter - Фильтр - - - - DANGER: Developer feature - ОПАСНО: Функция разработчика - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - ОПАСНО: Переключение веток предназначено для разработчиков и бета-тестеров и может привести к повреждению, несовместимости с предыдущими версиями документов, нестабильности, сбоям и/или преждевременной гибели вселенной. Вы уверены, что хотите продолжить? - - - - There are local changes - Имеются несохраненные локальные изменения - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ПРЕДУПРЕЖДЕНИЕ: В этом репозитории есть незафиксированные локальные изменения. Вы уверены, что хотите заменить ветки (что приведёт к изменениям у Вас)? - - - - Local - Table header for local git ref name - Локально - - - - Remote tracking - Table header for git remote tracking branch name - Удаленное отслеживание - - - - Last Updated - Table header for git update date - Последнее обновление - - - - Installation of Python package {} failed - Не удалось установить python пакет {} - - - - Installation of optional package failed - Не удалось установить необязательный пакет - - - - Installing required dependency {} - Установка требуемой зависимости {} - - - - Installation of Addon {} failed - Не удалось установить дополнение {} - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Не удалось декодировать файл {} дополнения '{}' - - - - Any dependency information in this file will be ignored - Любая информация о зависимостях в этом файле будет игнорироваться - - - - Unable to open macro wiki page at {} - Невозможно открыть страницу о макросе в вики {} - - - - Unable to fetch the code of this macro. - Не удаётся получить код макроса. - - - - Unable to retrieve a description from the wiki for macro {} - Не удаётся загрузить описание макроса {} с вики - - - - Unable to open macro code URL {} - Не удаётся открыть URL {} кода макроса - - - - Unable to fetch macro-specified file {} from {} - Не удалось загрузить файл {}, необходимый для макроса из {} - - - - Could not locate macro-specified file {} (expected at {}) - Не удалось найти необходимый для макроса файл {} (ожидался в {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Нераспознанный внутренний верстак '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Предупреждение разработчика Дополнения: URL-адрес репозитория, заданный в файле package.xml для дополнения {} ({}), не соответствует URL-адресу, с которого он был получен ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Предупреждение разработчика Дополнения: ветка репозитория, указанная в файле package.xml для дополнения {} ({}), не соответствует ветке, из которой оно было получено ({}) - - - - - Got an error when trying to import {} - Произошла ошибка при попытке импортировать {} - - - - An unknown error occurred - Произошла неизвестная ошибка - - - - Could not find addon {} to remove it. - Не удалось найти дополнение {}, чтобы удалить его. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Выполнение скрипта uninstall.py из дополнения не удалось. Продолжение удаления... - - - - Removed extra installed file {} - Удален дополнительно установленный файл {} - - - - Error while trying to remove extra installed file {} - Ошибка при попытке удалить дополнительно установленный файл {} - - - - Error while trying to remove macro file {}: - Ошибка при попытке удалить файл макроса {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Не удалось подключиться к GitHub. Проверьте подключение и настройки прокси. - - - - WARNING: Duplicate addon {} ignored - ВНИМАНИЕ: Повторяющееся дополнение {} игнорируется - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Произошла ошибка при обновлении макросов с GitHub, попытка очистить недоустановленную версию... - - - - Attempting to do a clean checkout... - Попытка очистки недоустановленной версии... - - - - Clean checkout succeeded - Недоустановленная версия успешно удалена - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Не удалось обновить макрос с GitHub ― попробуйте очистить кэш менеджера дополнений. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Ошибка подключения к Wiki, FreeCAD не может получить список Вики по макросам в данное время - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Не удалось прочитать метаданные из {name} - - - - Failed to fetch code for macro '{name}' - Не удалось получить код для макроса '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Менеджер дополнений: рабочему процессу не удалось загрузить {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - При обработке {num_macros} макрос(ов/а), у {num_failed} истекло время ожидания - - - - Addon Manager: a worker process failed to halt ({name}) - Менеджер дополнений: рабочий процесс ({name}) не удалось остановить - - - - Timeout while fetching metadata for macro {} - Время ожидания истекло при получении метаданных для макроса {} - - - - Failed to kill process for macro {}! - - Не удалось завершить процесс для макроса {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Не удалось получить статистику дополнения из {}. Корректно будет работать только сортировка по алфавиту - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Не удалось получить оценку дополнения из '{}' - сортировка по оценкам не будет работать - - - - - Repository URL - Preferences header for custom repositories - URL репозитория - - - - Branch name - Preferences header for custom repositories - Название ветки - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Делается резервная копия исходного каталога и обновляется повторно - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Переименование ветки Git не удалось со следующим сообщением: - - - - Installing - Установка - - - - Succeeded - Успешно - - - - Failed - Не удалось - - - - Update was cancelled - Обновление было отменено - - - - some addons may have been updated - некоторые дополнения были обновлены - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Загрузка информации о {} из страницы вики рецептов макросов FreeCAD... - - - - Loading page for {} from {}... - Загрузка страницы о {} из {}... - - - - Failed to download data from {} -- received response code {}. - Не удалось загрузить данные из {} -- получен код ответа {}. - - - - Composite view - Составной вид - - - - Expanded view - Расширенный вид - - - - Compact view - Компактный вид - - - - Alphabetical - Sort order - В алфавитном порядке - - - - Last Updated - Sort order - Последнее обновление - - - - Date Created - Sort order - Дата создания - - - - GitHub Stars - Sort order - GitHub звёзды - - - - Score - Sort order - Оценка - - - - Std_AddonMgr - - - &Addon manager - &Менеджер дополнений - - - - Manage external workbenches, macros, and preference packs - Управление внешними верстаками, макросами и пакетами настроек - - - - AddonInstaller - - - Finished removing {} - Завершено удаление {} - - - - Failed to remove some files - Не удалось удалить некоторые файлы - - - - Addons installer - - - Finished updating the following addons - Завершено обновление следующих дополнений - - - - Workbench - - - Auto-Created Macro Toolbar - Автоматически созданная панель инструментов для макроса - - - - QObject - - - Addon Manager - Менеджер дополнений - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sk.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_sk.qm deleted file mode 100644 index 8f1391d90e..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_sk.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sk.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_sk.ts deleted file mode 100644 index 263a67601c..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_sk.ts +++ /dev/null @@ -1,1168 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Custom repository - - - - Repository URL - Repository URL - - - - Branch - Branch - - - - CompactView - - - Form - Forma - - - - Icon - Ikona - - - - <b>Package Name</b> - <b>Package Name</b> - - - - Version - Verzia - - - - Description - Popis - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependencies - - - - Dependency type - Dependency type - - - - Name - Názov - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Popis - - - - Discussion URL - Discussion URL - - - - Icon - Ikona - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Repository URL - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Verzia - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Správca doplnkov - - - - Downloading info... - Preberajú sa informácie... - - - - Pause cache update - Pause cache update - - - - Refresh local cache - Refresh local cache - - - - Download and apply all available updates - Preberie a aplikuje všetky dostupné aktualizácie - - - - Update all Addons - Update all Addons - - - - Check for updates - Check for updates - - - - View and update Python package dependencies - View and update Python package dependencies - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Close the Addon Manager - Zavrie správcu doplnkov - - - - Close - Zavrieť - - - - Welcome to the Addon Manager - Welcome to the Addon Manager - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Download Settings - Download Settings - - - - Automatically check installed Addons for updates - Automatically check installed Addons for updates - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - No proxy - Bez proxy - - - - System proxy - System proxy - - - - User-defined proxy: - User-defined proxy: - - - - These and other settings are available in the FreeCAD Preferences window. - These and other settings are available in the FreeCAD Preferences window. - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - Form - Forma - - - - Icon - Ikona - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - Version - Verzia - - - - (tags) - (tags) - - - - Description - Popis - - - - Maintainer - Správca - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - - Form - Forma - - - - Licenses - Licenses - - - - License - Licencia - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - Názov - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires git) - Automatically check for updates at start (requires git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - - Addons - Addons - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manual (no automatic updates) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Show option to change branches (requires git) - Show option to change branches (requires git) - - - - Disable git (fall back to ZIP downloads only) - Disable git (fall back to ZIP downloads only) - - - - disableGit - disableGit - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - developerMode - developerMode - - - - Proxy - Proxy - - - - No proxy - Bez proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Python executable (optional): - Python executable (optional): - - - - The path to the Python executable for package installation with pip. Autodetected if needed and not specified. - The path to the Python executable for package installation with pip. Autodetected if needed and not specified. - - - - git executable (optional): - git executable (optional): - - - - The path to the git executable. Autodetected if needed and not specified. - The path to the git executable. Autodetected if needed and not specified. - - - - Advanced Options - Advanced Options - - - - PackageDetails - - - Form - Forma - - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Inštalovať - - - - Uninstall - Odinštalovať - - - - Update - Aktualizovať - - - - Run Macro - Spustiť makro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Dialógové okno - - - - TextLabel - Popisok - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Makro - - - - Preference Pack - Preference Pack - - - - Workbench - Pracovný priestor - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Ikona - - - - actualIcon - actualIcon - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Verzia - - - - Description - Popis - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch or tag: - Change to branch or tag: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Name: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sl.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_sl.qm deleted file mode 100644 index e90a8457e4..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_sl.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sl.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_sl.ts deleted file mode 100644 index b3ae456359..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_sl.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Skladišče po meri - - - - Repository URL - Spletni naslov skladišča - - - - Branch - Veja - - - - CompactView - - - - Icon - Ikona - - - - - <b>Package Name</b> - <b>Naziv paketa</b> - - - - - Version - Različica - - - - - Description - Opis - - - - Update Available - Na voljo je nadgradnja - - - - UpdateAvailable - Posodobitev na voljo - - - - DependencyDialog - - - Dependencies - Odvisnosti - - - - Dependency type - Vrsta odvisnosti - - - - Name - Naziv - - - - Optional? - Neobvezno? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Razreši odvisnosti - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Ta Dodatek ima naslednje obvezne in neobvezne odvisnosti. Namestiti jih je potrebno pred uporabo Dodatka. - -Ali želite, da jih upravljalinik dodatkov namesti samodejno? Izberite "Prezri", če želite namestiti Dodatek brez, da bi namestili odvisnosti. - - - - FreeCAD Addons - FreeCADovi dodatki - - - - Required Python modules - Potrebni Pythonovi moduil - - - - Optional Python modules - Neobvezni Pythonovi moduli - - - - DeveloperModeDialog - - - Addon Developer Tools - Orodja za razvijalce dodatkov - - - - Path to Addon - Pot do dodatka - - - - - Browse... - Prebrskaj ... - - - - Metadata - Samopodatki - - - - Primary branch - Glavna veja - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Kaj ta dodatek ponuja je prikazano v Upravljalniku dodatkov. Ni nujno, da je tam navedeno ali je to FreeCADov dodatek. - - - - Description - Opis - - - - Discussion URL - Spletni naslov razprave - - - - Icon - Ikona - - - - Bugtracker URL - Spletni naslov do sledilnika hroščev - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Podprta sta Semantic (1.2.3.-beta) ali CalVer (2022.08.30) sloga - - - - Set to today (CalVer style) - Nastavi na danes (slog CalVer) - - - - - - - (Optional) - (Neobvezno) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Prikazano v seznamu dodatkov iz Upravljalnika dodatkov. Ne sme vsebovati besede "FreeCAD" in mora biti veljavno ime mape v vseh podprtih operacijskih sistemih. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - Nasvet: Ker je to prikazano v upravljalniku dodatko znotraj FreeCADa, ni treba tratiti prostora z opisi, kot npr. "To je FreeCADov dodatek ..." -- povejte le, kaj dela. - - - - Repository URL - Spletni naslov skladišča - - - - Website URL - Naslov spletne strani - - - - Documentation URL - Spletni naslov dokumentacije - - - - Addon Name - Ime dodatka - - - - Version - Različica - - - - (Recommended) - (Priporočljivo) - - - - Minimum Python - Najmanj Python - - - - (Optional, only 3.x version supported) - (Izbirno, podprta le različica 3.x) - - - - Detect... - Zaznaj... - - - - Addon Contents - Vsebina dodatka - - - - Dialog - - - Addon Manager - Upravljalnik dodatkov - - - - Edit Tags - Uredi značke - - - - Comma-separated list of tags describing this item: - Z vejico ločen seznam značk, ki opisujejo ta predmet: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - Namig: Običajne oznake vključujejo "Assembly", "FEM", "Mesh", "NURBS" itd. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Nadaljuj - - - - Cancel - Prekliči - - - - EditDependencyDialog - - - Edit Dependency - Uredi odvisnosti - - - - Dependency Type - Vrsta odvisnosti - - - - Dependency - Odvisnost - - - - Package name, if "Other..." - Ime paketa, če "Drugo ..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - OPOMB: Če je izbrano "Drugo ...", paketa ni v datoteki ALLOWED_PYTHON_PACKAGES.txt in ga bo upravljalnik vtičnikov samodejno namestil. Če želite zaprosti za dodajanje paketa, oddajte predobjavo na <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a>. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - To je neobvezna odvisnost, ki jo bo upravljalnik dodatkov ponudil namestiti, (ko je to mogoče) vendar ne bo onemogočil namestitve, če uporabnik ne bo želel ali mogel namestiti paketa. - - - - Optional - Neobvezno - - - - ExpandedView - - - - Icon - Ikona - - - - - <h1>Package Name</h1> - <h1>Naziv paketa</h1> - - - - - Version - Različica - - - - - (tags) - (značke) - - - - - Description - Opis - - - - - Maintainer - Vzdrževalec - - - - Update Available - Na voljo je nadgradnja - - - - labelSort - labelSort - - - - UpdateAvailable - Posodobitev na voljo - - - - Form - - - Licenses - Licence - - - - License - Dovoljenje - - - - License file - Datoteka z licenco - - - - People - Osebe - - - - Kind - Vrsta - - - - Name - Ime - - - - Email - E-pošta - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Preslikava napredne različice - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Prihajajoče različice FreeCADovega upravljalnika dodatkov bodo podpirale razvijalce z nastavitvijo določene veje ali značke za delo s točno določeno različico FreeCADa (npr. nastavitev posebne značke, da zadnja različica vašega vtičnika podpira v0.19 itn.) - - - - FreeCAD Version - Rezličica FreeCADa - - - - Best-available branch, tag, or commit - Najprimernejša razpoložljiva veja, značka ali predaja - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Podprte FreeCAD različice - - - - Minimum FreeCAD Version Supported - Najstarejša še podprta različica FreeCADa - - - - - Optional - Neobvezno - - - - Maximum FreeCAD Version Supported - Najnovejša podprta različica FreeCADa - - - - Advanced version mapping... - Preslikava napredne različice ... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Nastavitve urejevalnika dodatkov - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Prenesi samopodatke o makrih (približno 10 MB) - - - - Cache update frequency - Pogostnost posodobitve predpomnilnika - - - - Manual (no automatic updates) - Ročno (brez samodejnih posodobitev) - - - - Daily - Dnevno - - - - Weekly - Tedensko - - - - Hide Addons without a license - Skrij dodatke brez dovoljenja - - - - Hide Addons with non-FSF Free/Libre license - Skrij dodatke brez Libre dovoljenja organizacije FSF - - - - Hide Addons with non-OSI-approved license - Skrij dodatke brez dovoljenja Odprtokodne pobude (OSI) - - - - Hide Addons marked Python 2 Only - Skrij dodatke z oznako Le Python 2 - - - - Hide Addons marked Obsolete - Skrij dodatke z oznako Zastarelo - - - - Hide Addons that require a newer version of FreeCAD - Skrij dodatke, ki zahtevajo novejšo različico FreeCADa - - - - Custom repositories - Skladišča po meri - - - - Proxy - Posredniški strežnik - - - - No proxy - Ni posredniškega strežnika - - - - User system proxy - Posredniški strežnik uporabniškega okolja - - - - User-defined proxy: - Posredniški strežnik, ki ga določi uporabnik: - - - - Score source URL - Vrednoten spletni naslov vira - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Spletni naslov podatkov o točkovanju dodatka (več o oblikovanju in gostovanju si poglejte na vikistani Upravljalnik dodatkov - Addon Manager). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Napredne možnosti - - - - Activate Addon Manager options intended for developers of new Addons. - Omogoči možnosti upravljalnika dodatkov, ki so namenjene razvijalcem novih dodatkov. - - - - Addon developer mode - Razvijalski način dodatkov - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Odmesti izbrani makro ali delovno okolje - - - - Install - Namesti - - - - Uninstall - Odmesti - - - - Update - Posodobitev - - - - Run Macro - Zaženi makro - - - - Change branch - Spremeni vejo - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Upravljaj Pythonove odvisnosti - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Upravljalnik dodatkov je za zadostitev odvisnosti vtičnika krajevno namestil naslednje Pythonove pakete. Mesto namestitve: - - - - Package name - Ime paketa - - - - Installed version - Nameščena različica - - - - Available version - Razpoložljiva različica - - - - Used by - Uporablja - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Zvezdica (*) v stolpcu "Uporablja" pomeni neobvezno odvisnost. Pozor, seznam "Uporablja" navaja neposredne uvoze v dodatke. Možno je, da so nameščeni tudi drugi Pythonovi paketi, ki so od teh paketov odvisni. - - - - Update all available - Posodobi vse razpoložljive - - - - SelectFromList - - - Dialog - Pogovorno okno - - - - TextLabel - Besedilna oznaka - - - - UpdateAllDialog - - - Updating Addons - Posodabljanje dodatkov - - - - Updating out-of-date addons... - Posodabljanje zastarelih dodatkov ... - - - - addContentDialog - - - Content Item - Predmeti vsebine - - - - Content type: - Vrsta vsebine: - - - - Macro - Makro - - - - Preference Pack - Prednastavitveni sveženj - - - - Workbench - Delovno okolje - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Če je to edina stvar v dodatku, se lahko vsi ostali samopodatki prenesejo z višje ravni in jih ni treba posebej navajati. - - - - This is the only item in the Addon - To je edni predmet v dodatku - - - - Main macro file - Glavna datoteka makra - - - - The file with the macro's metadata in it - Datoteka z makrovimi samopodatki - - - - - - Browse... - Prebrskaj ... - - - - Preference Pack Name - Ime prednastavitvenega svežnja - - - - Workbench class name - Ime razreda delovnega okolja - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Podmapa - - - - Optional, defaults to name of content item - Po meri, privzeto na ime vsebovanega predmeta - - - - Icon - Ikona - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Značke... - - - - Dependencies... - Odvisnosti ... - - - - FreeCAD Versions... - Rezličica FreeCADa ... - - - - Other Metadata - Drugi sampodatki - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Prikazano v upravljalnikovem seznamu dodatkov. Ne sme vsebovati besede "FreeCAD". - - - - Version - Različica - - - - Description - Opis - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Podprta sta sloga Semantic (1.2.3.-beta) ali CalVer (2022.08.30) - - - - Set to today (CalVer style) - Nastavi na danes (slog CalVer) - - - - Display Name - Prikazano ime - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Vsa polja, ki jih pustite prazna, prevzamejo vsebino nadrejenih samopodatkov Dodatka, zato bi lahko rekli, da so neobvezna. Pri Dodatkih z večimi vsebinskimi predmeti mora vsak tak predmet omogočati edinstveno ime in opis. - - - - add_toolbar_button_dialog - - - Add button? - Želite dodati gumb? - - - - Add a toolbar button for this macro? - Želite dodati gumb tega makra v orodno vrstico? - - - - Yes - Da - - - - No - Ne - - - - Never - Nikoli - - - - change_branch - - - Change Branch - Spremeni vejo - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Podatki o avtorskih pravicah - - - - Copyright holder: - Imetnik avtorskih pravic: - - - - Copyright year: - Leto avtorskih pravic: - - - - personDialog - - - Add Person - Dodaj osebo - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Vzdrževalec je tisti, ki ima odobren dostop do projekta. Ustvarjalec pa je vsak, ki mu želite priznati zasluge. - - - - Name: - Ime: - - - - Email: - E-pošta: - - - - Email is required for maintainers, and optional for authors. - Epošta je za vzdrževalce zahtevana, za stvaritelje pa neobvezna. - - - - proxy_authentication - - - Proxy login required - Potreben vpis v posredniški strežnik - - - - Proxy requires authentication - Posredniški strežnik zahteva overitev - - - - Proxy: - Posredniški strežnik: - - - - Placeholder for proxy address - Prostornik naslova posredniškega strežnika - - - - Realm: - Področje: - - - - Placeholder for proxy realm - Prostornik področja posredniškega strežnika - - - - Username - Uporabniško ime - - - - Password - Geslo - - - - selectLicenseDialog - - - Select a license - Izberi licenco - - - - About... - O programu ... - - - - License name: - Ime licence: - - - - Path to license file: - Pot do datoteke z licenco: - - - - (if required by license) - (če je zahtevano po licenci) - - - - Browse... - Prebrskaj ... - - - - Create... - Ustvari... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Izberite orodno vrstico - - - - Select a toolbar to add this macro to: - Izberite orodno vrstico, v katero želite vstaviti ta makro: - - - - Ask every time - Vedno vprašaj - - - - toolbar_button - - - - Add button? - Želite dodati gumb? - - - - Add a toolbar button for this macro? - Želite dodati gumb tega makra v orodno vrstico? - - - - Yes - Da - - - - No - Ne - - - - Never - Nikoli - - - - AddonsInstaller - - - Starting up... - Pričenjanje ... - - - - Worker process {} is taking a long time to stop... - Delovni proces {} se predolgo zaustavlja ... - - - - Previous cache process was interrupted, restarting... - - Predhodno predpomnenje je bilo prekinjeno, ponovni zagon ... - - - - - Custom repo list changed, forcing recache... - - Skladiščni seznam po meri se je spremenil, prisilno ponovno predpomnenje ... - - - - - Addon manager - Upravljalnik dodatkov - - - - You must restart FreeCAD for changes to take effect. - Da bi spremembe stopile v veljavo, morate ponovno zagnati FreeCAD. - - - - Restart now - Takojšnji pozagon - - - - Restart later - Pozaženi pozneje - - - - - Refresh local cache - Osveži krajevni predpomnilnik - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Posodabljanje predpomnilnika ... - - - - - Checking for updates... - Preverjanje za posodobitve … - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Zapri - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Novega namestilnika ni mogoče zagnati, dokler se prejšnji ne konča. - - - - - - - Maintainer - Vzdrževalec - - - - - - - Author - Ustvarjalec - - - - New Python Version Detected - Zaznana je nova Pythonova različica - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Kaže, da je tokrat ta različica Pythona prvič uporabljena z Upravljalnikom dodatkov (Addon Manager). Ali želite zanjo samodejno namestiti enako odvisnost? - - - - Processing, please wait... - V obdelavi, prosimo, počakajte ... - - - - - Update - Posodobi - - - - Updating... - Posodabljanje ... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - QtNetwork-a ni mogoče uvoziti - kaže, da ni nameščen na vašem sistemu. Morda ima vaš ponudnik paket za to odvisnost (pogosto imenovan "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Pretvarjanje izbranih vrat posredniškega strežnika '{}' v številko vrat je spodletela - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Napaka določilke: nastavljene medsebojno izključuječe možnosti posredniškega strežnika. Ponastavljanje na privzeto. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Napaka določilke: posredniški strežnik nakazan, vendar ni na voljo. Ponastavljanje na privzeto. - - - - Addon Manager: Unexpected {} response from server - Upravljalnik dodatkov: Nepričakovan {} odziv strežnika - - - - Error with encrypted connection - Napaka kodirane povezave - - - - - - Confirm remove - Potrdi odstranitev - - - - Are you sure you want to uninstall {}? - Ali res želite odmestiti {}? - - - - - - Removing Addon - Odmeščanje dodatka - - - - Removing {} - Odmešča se {} - - - - - Uninstall complete - Odmestitev zaključena - - - - - Uninstall failed - Odmestitev spodletela - - - - Version {version} installed on {date} - Različica {version} nameščena {date} - - - - Version {version} installed - Različica {version} nameščena - - - - Installed on {date} - Nameščeno {date} - - - - - - - Installed - Nameščeno - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installation location - - - - Repository URL - Spletni naslov skladišča - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Disabled - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Install - Namesti - - - - Uninstall - Odmesti - - - - Enable - Omogoči - - - - Disable - Onemogoči - - - - - Check for update - Check for update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Zaženi (postopek), - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Samodejno - - - - - Workbench - Delovno okolje - - - - Addon - Dodatek - - - - Python - Python - - - - Yes - Da - - - - Internal Workbench - Notranje delovno okolje - - - - External Addon - Zunanji dodatek - - - - Python Package - Pythonov paket - - - - - Other... - Drugo ... - - - - Too many to list - Preveč za navedbo - - - - - - - - - Missing Requirement - Neizpolnjen pogoj - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Dodatek '{}' potrebuje '{}', ki za vašo različico FreeCADa ni na voljo. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Dodatek '{}' potrebuje naslednja delovna okolja, ki pa za vašo različico FreeCADa niso na voljo: - - - - Press OK to install anyway. - Pritisnite V redu, če želite vseeno namestiti. - - - - - Incompatible Python version - Nezdružljiva različica Pythona - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Neobvezna odvisnost od {} prezrta, saj ni na seznamu dopustnih - - - - - Installing dependencies - Nameščanje odvisnosti - - - - - Cannot execute Python - Pythona ni mogoče izvesti - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Pythonove izvršljive datoteke ni mogoče samodejno najti ali pa je pot napačno nastavljena. Preverite pot do Pythona v prednastavitvah Upravljalnika dodatkov. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Odvisnosti ni bilo mogoče namestiti. Ali želite vseeno nadaljevati z namestitvijo {}? - - - - - Cannot execute pip - Slike v sliki ni mogoče izvesti - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Ali želite vseeno nadaljevati z namestitvijo {}? - - - - - Package installation failed - Namestitev paketa spodletela - - - - See Report View for detailed failure log. - Za podrobnejši zapisnik o napaki poglejte Poročevalni pogled. - - - - Installing Addon - Nameščanje dodatka - - - - Installing FreeCAD Addon '{}' - Nameščanje FreeCADovega dodatka '{}' - - - - Cancelling - Preklic - - - - Cancelling installation of '{}' - Preklicevanje nameščanja '{}' - - - - {} was installed successfully - {} je bil uspešno nameščen - - - - - Installation Failed - Namestitev spodletela - - - - Failed to install {} - Spodletelo nameščanje {} - - - - - Create new toolbar - Ustvari novo orodno vrstico - - - - - A macro installed with the FreeCAD Addon Manager - Makro nameščen s FreeCAD-ovim Upravljalnikom dodatkov - - - - - Run - Indicates a macro that can be 'run' - Zaženi - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Podatkov na GitHubu ni mogoče brati: preverite spletno povezavo in nastavitve posredniškega strežnika ter poskusite ponovno. - - - - XML failure while reading metadata from file {} - XML napaka pri branju samopodatkov iz datoteke {} - - - - Invalid metadata in file {} - Neveljavni samopodatki v datoteki {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - OPOZORILO: Pot, določena v samopodatkih package.xml, se ne sklada s trenutno prevzeto vejo. - - - - Name - Naziv - - - - Class - Razred - - - - Description - Opis - - - - Subdirectory - Podmapa - - - - Files - Datoteke - - - - Select the folder containing your Addon - Izberite mapo z vašim dodatkom - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Brez Vermina, prekinitev dejanja. - - - - Scanning Addon for Python version compatibility - Pregledovanje združljivosti dodatka s Pythonovo različico - - - - Minimum Python Version Detected - Zaznana je minimalna Pythonova različica - - - - Vermin auto-detected a required version of Python 3.{} - Vermin je samodejno zaznal zahtevano različico Pythona 3.{} - - - - Install Vermin? - Želite namestiti Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Samodejno zaznavanje potrebne različice Pythona javlja, da je za ta dodatek potreben Vermin (https://pypi.org/project/vermin/). Dovolite namestitev? - - - - Attempting to install Vermin from PyPi - Poskus namestitve Vermina s PyPi - - - - - Installation failed - Nameščanje spodletelo - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Iskanje ... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Značke - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Nameščena različica - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Razpoložljiva različica - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Po želji - - - - Macro - Makro - - - - Preference Pack - Prednastavitveni sveženj - - - - Installation Status - Installation Status - - - - Not installed - Not installed - - - - Filter - Sito - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Ni mogoče odpreti vikistrani z makri na naslovu {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Upravljalnik dodatkov: delovni proces je med pridobivanjem {name} spodletel - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Upravljalnik dodatkov: delovni proces se ni mogel zaustaviti ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Spletni naslov skladišča - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Posodobitev je bila preklicana - - - - some addons may have been updated - nekateri dodatki so bili lahko posodobljeni - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Upravljalnik dodatkov - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sr-CS.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_sr-CS.qm deleted file mode 100644 index c241a07760..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_sr-CS.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sr-CS.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_sr-CS.ts deleted file mode 100644 index 7bae0858c0..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_sr-CS.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Sopstveno spremište - - - - Repository URL - URL adresa spremišta - - - - Branch - Grana - - - - CompactView - - - - Icon - Ikona - - - - - <b>Package Name</b> - <b>Ime paketa</b> - - - - - Version - Verzija - - - - - Description - Opis - - - - Update Available - Dostupno jе ažuriranjе - - - - UpdateAvailable - Na raspolaganju je novija verzija - - - - DependencyDialog - - - Dependencies - Zavisnosti - - - - Dependency type - Vrsta zavisnosti - - - - Name - Ime - - - - Optional? - Neobavezno? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Reši zavisnosti - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Ovaj Dodatak ima sledeće obavezne i neobavezne zavisnosti. Moraš ih instalirati da bi mogao da koristiš ovaj Dodatak. - -Da li želiš da ih Menadžer dodataka automatski instalira? Izaberi "Zanemari" da instaliraš dodatak bez instaliranja zavisnosti. - - - - FreeCAD Addons - FreeCAD Dodaci - - - - Required Python modules - Potrebni Python moduli - - - - Optional Python modules - Neobavezni Python moduli - - - - DeveloperModeDialog - - - Addon Developer Tools - Alatke za programere dodataka - - - - Path to Addon - Putanja do Dodatka - - - - - Browse... - Potraži... - - - - Metadata - Metapodaci - - - - Primary branch - Glavna grana - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Objašnjenje šta ovaj Dodatak pruža. Prikazuje se u Menadžeru dodataka. Nije neophodno da se navodi da je ovo dodatak za FreeCAD. - - - - Description - Opis - - - - Discussion URL - URL adresa diskusije - - - - Icon - Ikona - - - - Bugtracker URL - URL adresa sistema za praćenje grešaka - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Podržani su Semantic (1.2.3-beta) ili CalVer (2022.08.30) stilovi - - - - Set to today (CalVer style) - Postavljeno na danas (CalVer stil) - - - - - - - (Optional) - (neobavezno) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Prikazuje se na listi Menadžera dodataka. Ne bi trebalo da sadrži reč "FreeCAD" i mora postojati važeće ime fascikle za sve podržane operativne sisteme. - - - - README URL - URL adresa datoteke README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - SAVET: Pošto je ovo prikazano u Menadžeru dodataka FreeCAD programa, nije neophodno da zauzimaš prostor govoreći stvari poput "Ovo je FreeCAD dodatak..." -- samo reci šta radi. - - - - Repository URL - URL adresa spremišta - - - - Website URL - URL adresa veb sajta - - - - Documentation URL - URL adresa dokumentacije - - - - Addon Name - Ime dodatka - - - - Version - Verzija - - - - (Recommended) - (Preporučeno) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Neobavezno, podržana je samo verzija 3.x) - - - - Detect... - Otkrij... - - - - Addon Contents - Sadržaj dodatka - - - - Dialog - - - Addon Manager - Menadžer dodataka - - - - Edit Tags - Uredi tagove - - - - Comma-separated list of tags describing this item: - Lista tagova razdvojenih zarezima koje opisuju ovu stavku: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - SAVET: Uobičajeni tagovi uključuju "Sklop", "FEM", "Mreža", "NURBS", etc. - - - - Add-on Manager: Warning! - Menadžer dodataka: Upozorenje! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Menadžer dodataka pruža pristup biblioteci korisnih FreeCAD dodataka nezavisnih proizvođača. Dodatke koristite na svoju odgovornost pošto FreeCAD ne može garantovati za njihovu bezbednosti ili funkcionalnosti. - - - - Continue - Nastavi - - - - Cancel - Otkaži - - - - EditDependencyDialog - - - Edit Dependency - Uredi zavisnost - - - - Dependency Type - Vrsta zavisnosti - - - - Dependency - Zavisnost - - - - Package name, if "Other..." - Ime paketa, ako je "Ostalo..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NAPOMENA: Ako je "Ostalo..." izabran, paket se ne nalazi u datoteci ALLOVED_PYTHON_PACKAGES.txt i Menadžer dodataka ga neće automatski instalirati. Pošalji PR na <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> da zatraži dodavanje paketa. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Ako je ovo neobavezna zavisnost, Menadžer dodataka će ponuditi da je instalira (kada je to moguće), ali neće blokirati instalaciju ako korisnik odluči da ne instalira ili ne može da instalira paket. - - - - Optional - Neobavezno - - - - ExpandedView - - - - Icon - Ikona - - - - - <h1>Package Name</h1> - <h1>Ime paketa</h1> - - - - - Version - Verzija - - - - - (tags) - (tagovi) - - - - - Description - Opis - - - - - Maintainer - Programer zadužen za održavanje - - - - Update Available - Dostupno jе ažuriranjе - - - - labelSort - labelSort - - - - UpdateAvailable - Na raspolaganju je novija verzija - - - - Form - - - Licenses - Licence - - - - License - Licenca - - - - License file - Datoteka licence - - - - People - Osobe - - - - Kind - Vrsta - - - - Name - Ime - - - - Email - Elektronska pošta - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Napredno mapiranje verzija - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Predstojeće verzije FreeCAD Menadžera dodataka će podržavati programersko podešavanje određene grane ili tagove za upotrebu sa određenom verzijom FreeCAD-a (npr. podešavanje određenog tag-a kao poslednje verzije vašeg Dodatka za podršku v0.19, itd.) - - - - FreeCAD Version - FreeCAD verzija - - - - Best-available branch, tag, or commit - Najbolja dostupna grana, tag ili commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Podržane FreeCAD verzije - - - - Minimum FreeCAD Version Supported - Minimalna podržana FreeCAD verzija - - - - - Optional - Neobavezno - - - - Maximum FreeCAD Version Supported - Maksimalna podržana FreeCAD verzija - - - - Advanced version mapping... - Napredno mapiranje verzija... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Opcije menadžera dodataka - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Ako je ova opcija izabrana, prilikom pokretanja Menadžera dodataka -će biti provereno da li postoje dostupna ažuriranja za instalirane dodatke - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Preuzmi makro metapodatke (približno 10MB) - - - - Cache update frequency - Učestalost ažuriranja keša - - - - Manual (no automatic updates) - Ručno (bez automatskog ažuriranja) - - - - Daily - Dnevno - - - - Weekly - Nedeljno - - - - Hide Addons without a license - Sakrij dodatke bez licence - - - - Hide Addons with non-FSF Free/Libre license - Sakrij dodatke koji nemaju FSF Free/Libre licencu - - - - Hide Addons with non-OSI-approved license - Sakrij dodatke koji nemaju OSI odobrenu licencu - - - - Hide Addons marked Python 2 Only - Sakrij Dodatke sa oznakom "Samo Python 2" - - - - Hide Addons marked Obsolete - Sakrij Dodatke označene kao zastareli - - - - Hide Addons that require a newer version of FreeCAD - Sakrij Dodatke koji zahtevaju noviju verziju FreeCAD-a - - - - Custom repositories - Sopstveno spremište - - - - Proxy - Proksi - - - - No proxy - Bez proksi - - - - User system proxy - Korisnički sistemski proksi - - - - User-defined proxy: - Korisnički proksi: - - - - Score source URL - URL izvora ocena - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - URL za оцене додатка (za više detalja pogledaj wiki stranu Addon Manager). - - - - Path to Git executable (optional): - Staza ka izvršnoj git datoteci (Neobavezno): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Napredne opcije - - - - Activate Addon Manager options intended for developers of new Addons. - Aktiviraj opcije menadžera dodataka namenjene programerima novih dodataka. - - - - Addon developer mode - Režim programera dodataka - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Deinstaliraj izabrani makro ili radno okruženje - - - - Install - Instaliraj - - - - Uninstall - Deinstaliraj - - - - Update - Ažuriranje - - - - Run Macro - Pokreni makro - - - - Change branch - Promeni granu - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Upravljanje Python zavisnostima - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Sledeće Python pakete je lokalno instalirao Menadžer dodataka da bi zadovoljio zavisnosti dodataka. Lokacija instalacije: - - - - Package name - Ime paketa - - - - Installed version - Instalirana verzija - - - - Available version - Dostupna verzija - - - - Used by - Koristio - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Zvezdica t.j. asteriks (*) u polju "Koristio" kolone označava neobaveznu zavisnost. Imaj na umu da 'Koristio' samo beleži direktan uvoz u Dodatak. Možda su instalirani i drugi Python paketi od kojih ti paketi zavise. - - - - Update all available - Ažuriraj sve dostupno - - - - SelectFromList - - - Dialog - Dijalog - - - - TextLabel - Tekstualna oznaka - - - - UpdateAllDialog - - - Updating Addons - Ažuriranje Dodataka - - - - Updating out-of-date addons... - Ažuriranje zastarelih dodataka... - - - - addContentDialog - - - Content Item - Stavka sa sadržajem - - - - Content type: - Vrsta sadržaja: - - - - Macro - Makro - - - - Preference Pack - Paket podešavanja - - - - Workbench - Radno okruženje - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Ako je ovo jedina stvar u Dodatku, svi ostali metapodaci mogu biti nasleđeni sa najvišeg nivoa i ne moraju se ovde navoditi. - - - - This is the only item in the Addon - Ovo je jedina stavka u Dodatku - - - - Main macro file - Glavna makro datoteka - - - - The file with the macro's metadata in it - Datoteka sa metapodacima makro-a u njoj - - - - - - Browse... - Potraži... - - - - Preference Pack Name - Ime paketa podešavanja - - - - Workbench class name - Ime klase radnog okruženja - - - - Class that defines "Icon" data member - Klasa koja određuje podatak člana "Icon" - - - - Subdirectory - Podfascikla - - - - Optional, defaults to name of content item - Opciono, podrazumevano je ime stavke sa sadržajem - - - - Icon - Ikona - - - - Optional, defaults to inheriting from top-level Addon - Opciono, podrazumevano nasleđivanje od Dodatka najvišeg nivoa - - - - Tags... - Tagovi... - - - - Dependencies... - Zavisnosti... - - - - FreeCAD Versions... - FreeCAD verzija... - - - - Other Metadata - Ostali metapodaci - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Prikazuje se na listi Menadžera dodataka. Ne bi trebalo da sadrži reč "FreeCAD". - - - - Version - Verzija - - - - Description - Opis - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Podržani su Semantic (1.2.3-beta) ili CalVer (2022.08.30) stilovi - - - - Set to today (CalVer style) - Postavljeno na danas (CalVer stil) - - - - Display Name - Prikazano ime - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Sva polja ostavljena prazna su nasleđena od metapodataka dodatka najvišeg nivoa, tako da tehnički, sva su neobavezna. Za dodatke sa više stavki sa sadržajem, svaka stavka treba da omogući jedinstveno ime i opis. - - - - add_toolbar_button_dialog - - - Add button? - Dodaj dugme? - - - - Add a toolbar button for this macro? - Želiš li dodati dugme na paleti alatki za ovaj makro? - - - - Yes - Da - - - - No - Ne - - - - Never - Nikada - - - - change_branch - - - Change Branch - Promeni granu - - - - Change to branch: - Promeni granu: - - - - copyrightInformationDialog - - - Copyright Information - Informacije o autorskim pravima - - - - Copyright holder: - Nosilac autorskih prava: - - - - Copyright year: - Godina od kad važi autorsko pravo: - - - - personDialog - - - Add Person - Dodaj osobu - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Programer zadužen za održavanje je neko sa trenutnim pristupom ovom projektu. Autor je neko, kome možeš da odaš priznanje. - - - - Name: - Ime: - - - - Email: - E-pošta: - - - - Email is required for maintainers, and optional for authors. - E-pošta je neophodna za osobu odgovornu za održavanje, a neobavezno za autore. - - - - proxy_authentication - - - Proxy login required - Potrebna je prijava za proksi - - - - Proxy requires authentication - Proksi zahteva autentifikaciju - - - - Proxy: - Proksi: - - - - Placeholder for proxy address - Rezervisano mesto za proksi adresu - - - - Realm: - Oblast: - - - - Placeholder for proxy realm - Rezervisano mesto za proksi oblast - - - - Username - Korisničko ime - - - - Password - Lozinka - - - - selectLicenseDialog - - - Select a license - Izaberi licencu - - - - About... - O... - - - - License name: - Naziv licence: - - - - Path to license file: - Putanja do datoteke licence: - - - - (if required by license) - (ako to zahteva licenca) - - - - Browse... - Potraži... - - - - Create... - Napravi... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Izaberi paletu alatki - - - - Select a toolbar to add this macro to: - Izaberi paletu alatki u koju ćeš dodati ovaj makro: - - - - Ask every time - Pitaj svaki put - - - - toolbar_button - - - - Add button? - Dodaj dugme? - - - - Add a toolbar button for this macro? - Želiš li dodati dugme na paleti alatki za ovaj makro? - - - - Yes - Da - - - - No - Ne - - - - Never - Nikada - - - - AddonsInstaller - - - Starting up... - Pokreće se... - - - - Worker process {} is taking a long time to stop... - Radni proces {} se dugo zaustavlja... - - - - Previous cache process was interrupted, restarting... - - Prethodni proces keširanja je prekinut, ponovo se pokreće... - - - - - Custom repo list changed, forcing recache... - - Korisnička lista spremišta je promenjena, prinudno ponovno keširanje... - - - - - Addon manager - Menadžer dodataka - - - - You must restart FreeCAD for changes to take effect. - Moraš ponovo pokrenuti FreeCAD da bi promene stupile na snagu. - - - - Restart now - Ponovo pokreni sada - - - - Restart later - Ponovo pokreni kasnije - - - - - Refresh local cache - Osveži lokalni keš - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Ažuriranje keša... - - - - - Checking for updates... - Proveravam da li postoje ažuriranja... - - - - Temporary installation of macro failed. - Privremena instalacija makro-a nije uspela. - - - - - Close - Zatvori - - - - Update all addons - Ažuriraj sve dodatke - - - - Check for updates - Proveri ažuriranja - - - - Python dependencies... - Python zavisnosti... - - - - Developer tools... - Alati za programere... - - - - Apply %n available update(s) - Primeni %n dostupnih ažuriranja - - - - No updates available - Nema dostupnih ažuriranja - - - - - - Cannot launch a new installer until the previous one has finished. - Ne može se pokrenuti novi program za instalaciju dok se prethodni ne završi. - - - - - - - Maintainer - Programer zadužen za održavanje - - - - - - - Author - Autor - - - - New Python Version Detected - Otkrivena je nova verzija Python-a - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Čini se da je ovo prvi put da je ova verzija Python-a korišćena sa menadžerom dodataka. Da li želiš za njega da instaliraš iste automatski instalirane zavisnosti? - - - - Processing, please wait... - Obrađuje se, sačekaj... - - - - - Update - Ažuriranje - - - - Updating... - Ažuriranje... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Nije moguće uvesti QtNetwork -- izgleda da nije instaliran na tvom sistemu. Tvoj provajder možda ima paket za ovu zavisnost (često se na primer naziva, "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Konvertovanje navedenog proksi porta '{}' nije uspelo - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Greška u parametru: postavljene su međusobno isključive proksi opcije. Vraćanje na podrazumevane vrednosti. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Greška u parametru: korisnički proksi je naznačen, ali nije obezbeđen. Vraćanje na podrazumevane vrednosti. - - - - Addon Manager: Unexpected {} response from server - Menadžer dodataka: Neočekivani {} odgovor od servera - - - - Error with encrypted connection - Greška šifrovane veze - - - - - - Confirm remove - Potvrdi uklanjanje - - - - Are you sure you want to uninstall {}? - Da li si siguran da želiš da deinstaliraš {}? - - - - - - Removing Addon - Uklanjanje Dodatka - - - - Removing {} - Уклања се {} - - - - - Uninstall complete - Deinstaliranje je završeno - - - - - Uninstall failed - Deinstaliranje nije uspelo - - - - Version {version} installed on {date} - Dana {date} instalirana je verzija {version} - - - - Version {version} installed - Instalirana je verzija {version} - - - - Installed on {date} - Instalirano {date} - - - - - - - Installed - Instalirano - - - - Currently on branch {}, name changed to {} - Trenutno na grani {}, promenjeno je ime u {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, ažuriranja nisu moguća - - - - Update check in progress - U toku je provera ažuriranja - - - - Installation location - Lokacija instalacije - - - - Repository URL - URL adresa spremišta - - - - Changed to branch '{}' -- please restart to use Addon. - Promenjeno u granu '{}' -- ponovo pokreni da bi koristio Dodatak. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Ovaj dodatak je ažuriran. Ponovo pokrenite FreeCAD da biste videli promene. - - - - Disabled - Onemogućen unos - - - - Currently on branch {}, update available to version {} - Na grani {} dostupno je ažuriranje do verzije {} - - - - Update available to version {} - Dostupno je ažuriranje do verzije {} - - - - This is the latest version available - Ovo je najnovija dostupna verzija - - - - WARNING: This addon is obsolete - UPOZORENJE: Ovaj dodatak je zastareo - - - - WARNING: This addon is Python 2 only - UPOZORENJE: Ovaj dodatak je samo za Python 2 - - - - WARNING: This addon requires FreeCAD {} - UPOZORENJE: Ovaj dodatak zahteva FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - UPOZORENJE: Ovaj dodatak je trenutno instaliran, ali je onemogućen. Koristi 'omogući' dugme da bi ponovo omogućio. - - - - This Addon will be enabled next time you restart FreeCAD. - Ovaj Dodatak će biti omogućen sledeći put kada ponovo pokreneš FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Ovaj Dodatak će biti onemogućen sledeći put kada ponovo pokreneš FreeCAD. - - - - - - Success - Uspešno - - - - Install - Instaliraj - - - - Uninstall - Deinstaliraj - - - - Enable - Omogući - - - - Disable - Onemogući - - - - - Check for update - Provеri ažuriranja - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Pokreni - - - - Change branch... - Promeni granu... - - - - Return to package list - Vrati se na listu paketa - - - - Checking connection - Proverava se veza - - - - Checking for connection to GitHub... - Proverava se veza sa GitHub-om... - - - - Connection failed - Veza nije uspostavljena - - - - Missing dependency - Nedostaje zavisnost - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Nije moguće uvesti QtNetwork – pogledaj Pregledač objava za detalje. Menadžer dodataka nije dostupan. - - - - Other... - For providing a license other than one listed - Ostalo... - - - - Select the corresponding license file in your Addon - Izaberi odgovarajuću datoteku licence u svom Dodatku - - - - Location for new license file - Lokacija za novu licencnu datoteku - - - - Received {} response code from server - Primljen {} kod odgovora sa servera - - - - Failed to install macro {} - Instaliranje makro-a {} nije uspelo - - - - Failed to create installation manifest file: - - Nije uspelo pravljenje manifest datoteke instalacije: - - - - - Unrecognized content kind '{}' - Nepoznata vrsta sadržaja '{}' - - - - Unable to locate icon at {} - Nije moguće pronaći ikonu u {} - - - - Select an icon file for this content item - Izaberi datoteku ikone za ovu stavku sadržaja - - - - - - {} is not a subdirectory of {} - {} nije podfascikla {} - - - - Select the subdirectory for this content item - Izaberi podfasciklu za ovu stavku sadržaja - - - - Automatic - Automatski - - - - - Workbench - Radno okruženje - - - - Addon - Dodatni modul - - - - Python - Python - - - - Yes - Da - - - - Internal Workbench - Unutrašnje radno okruženje - - - - External Addon - Spoljni Dodatak - - - - Python Package - Python paket - - - - - Other... - Ostalo... - - - - Too many to list - Previše ih je da bi se izlistali - - - - - - - - - Missing Requirement - Nedostaje Zahtev - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Dodatak '{}' zahteva '{}', što nije dostupno u tvojoj kopiji FreeCAD-a. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Dodatak '{}' zahteva sledeća radna okrženja koja nisu dostupna u tvojoj kopiji FreeCAD-a: - - - - Press OK to install anyway. - Pritisni U redu da bi ipak instalirao. - - - - - Incompatible Python version - Nekompatibilna verzija Python-a - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Ovaj Dodatak zahteva Python pakete koji nisu instalirani i ne mogu se instalirati automatski. Da bi koristio ovo radno okruženje, moraš ručno da instaliraš sledeće Python pakete: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Ovaj Dodatak (ili jedna od njegovih zavisnosti) zahteva Pithon {}.{}, a tvoj sistem radi na {}.{}. Instalacija je prekinuta. - - - - Optional dependency on {} ignored because it is not in the allow-list - Neobavezna zavisnost od {} se zanemaruje jer se ne nalazi na listi dozvoljenih - - - - - Installing dependencies - Instaliranje zavisnosti - - - - - Cannot execute Python - Nije moguće izvršiti Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Automatsko pronalaženje izvršne datoteke Python-a nije uspelo, ili je putanja pogrešno zadata. Proveri ispravnost ove putanje u podešavanjima za Menadžer dodataka. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Zavisnosti se ne mogu instalirati. Želiš li ipak nastaviti sa instalacijom {}? - - - - - Cannot execute pip - Nije moguće izvršiti pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Izvršavanje pip-a nije uspelo, izgleda da on nedostaje u tvojoj Python instalaciji. Uveri se da tvoj sistem ima instaliran pip i pokušaj ponovo. Neuspela komanda je bila: - - - - - Continue with installation of {} anyway? - Želiš li ipak nastaviti sa instalacijom {}? - - - - - Package installation failed - Instaliranje paketa nije uspelo - - - - See Report View for detailed failure log. - Pogledaj Pregledač objava za detaljan dnevnik grešaka. - - - - Installing Addon - Instaliranje Dodatka - - - - Installing FreeCAD Addon '{}' - Instaliranje FreeCAD dodatka '{}' - - - - Cancelling - Otkazivanje - - - - Cancelling installation of '{}' - Otkazivanje instalacije '{}' - - - - {} was installed successfully - {} je uspešno instaliran - - - - - Installation Failed - Instalacija nije uspela - - - - Failed to install {} - Instaliranje {} nije uspelo - - - - - Create new toolbar - Napravi novu paletu sa alatkama - - - - - A macro installed with the FreeCAD Addon Manager - Makro instaliran sa FreeCAD Menadžerom dodataka - - - - - Run - Indicates a macro that can be 'run' - Pokreni - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Nije moguće pročitati podatke sa GitHub-a: proveri internet vezu i podešavanja proksija i pokušaj ponovo. - - - - XML failure while reading metadata from file {} - XML greška pri čitanju metapodataka iz datoteke {} - - - - Invalid metadata in file {} - Nevažeći metapodaci u datoteci {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - UPOZORENJE: Putanja navedena u metapodacima package.xml ne odgovara trenutnoј checked-out grani. - - - - Name - Ime - - - - Class - Klasa - - - - Description - Opis - - - - Subdirectory - Podfascikla - - - - Files - Datoteke - - - - Select the folder containing your Addon - Izaberi fasciklu u kojoj se nalazi tvoj Dodatak - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Nema Vermin-a, operacija se otkazuje. - - - - Scanning Addon for Python version compatibility - Skeniranje Dodatka radi utvrđivanja kompatibilne verzije Pythom-a - - - - Minimum Python Version Detected - Otkrivena je minimalna verzija Python-a - - - - Vermin auto-detected a required version of Python 3.{} - Vermin je automatski otkrio potrebnu verziju Python-a 3.{} - - - - Install Vermin? - Instaliraj Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Za automatsko otkrivanje potrebne verzije Python-a za ovaj dodatak potreban je Vermin (https://pipi.org/project/vermin/). Pritisnite U redu ako želite instalirati? - - - - Attempting to install Vermin from PyPi - Pokušaj instaliranja Vermin-a sa PyPi-ja - - - - - Installation failed - Instalacija nije uspela - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Instalacija Vermin-a nije uspela – proveri Pregledač objava za detalje. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Uvoz Vermin-a nakon instalacije nije uspeo - ne može da se skenira Dodatak. - - - - Select an icon file for this package - Izaberi datoteku ikone za ovaj paket - - - - Filter is valid - Filter je važeći - - - - Filter regular expression is invalid - Regularni izraz filtra je nevažeći - - - - Search... - Pretraži... - - - - Click for details about package {} - Klikni za detalje o paketu {} - - - - Click for details about workbench {} - Klikni za detalje o radnom okruženju {} - - - - Click for details about macro {} - Klikni za detalje o makro-u {} - - - - Maintainers: - Programeri zaduženi za održavanje: - - - - Tags - Tagovi - - - - {} ★ on GitHub - {} ★ na GitHub - - - - No ★, or not on GitHub - Nema ★, ili nema na GitHub - - - - Created - Napravljeno - - - - Updated - Ažurirano - - - - Score: - Ocena: - - - - - Up-to-date - Ažurirano - - - - - - - - Update available - Dostupno jе ažuriranjе - - - - - Pending restart - Ponovno pokretanje na čekanju - - - - - DISABLED - ONEMOGUĆENO - - - - Installed version - Instalirana verzija - - - - Unknown version - Nepoznata verzija - - - - Installed on - Instaliran na - - - - Available version - Dostupna verzija - - - - Filter by... - Filter... - - - - Addon Type - Vrsta dodatka - - - - - Any - Bilo koji - - - - Macro - Makro - - - - Preference Pack - Paket podešavanja - - - - Installation Status - Status instalacije - - - - Not installed - Nije instalirano - - - - Filter - Filter - - - - DANGER: Developer feature - OPASNOST: Funkcija za programere - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - OPASNOST: Prebacivanje grana je namenjeno programerima i beta testerima i može da dovede do oštećenih dokumenata koji nisu kompatibilni unazad, nestabilnosti, kvarova i/ili preranog toplotnog kolapsa univerzuma. Da li si siguran da želiš da nastaviš? - - - - There are local changes - Postoje lokalne promene - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - UPOZORENjE: Ovo spremište ima nepovezane lokalne promene. Da li si siguran da želiš da promeniš grane (donoseći promene sa sobom)? - - - - Local - Table header for local git ref name - Lokalno - - - - Remote tracking - Table header for git remote tracking branch name - Daljinsko praćenje - - - - Last Updated - Table header for git update date - Poslednje ažurirano - - - - Installation of Python package {} failed - Instalacija Python paketa {} nije uspela - - - - Installation of optional package failed - Instalacija neobaveznog paketa nije uspela - - - - Installing required dependency {} - Instaliranje neophodne zavisnosti {} - - - - Installation of Addon {} failed - Instalacija Dodatka {} nije uspela - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Dekodiranje {} datoteke za Dodatak '{}' nije uspelo - - - - Any dependency information in this file will be ignored - Sve informacije u ovoj datoteci o zavisnosti će biti zanemarene - - - - Unable to open macro wiki page at {} - Nije moguće otvoriti makro wiki stranicu na {} - - - - Unable to fetch the code of this macro. - Nije moguće preuzeti kod ovog makroa. - - - - Unable to retrieve a description from the wiki for macro {} - Nije moguće preuzeti opis sa wiki-ja za makro {} - - - - Unable to open macro code URL {} - Nije moguće otvoriti URL adresu koda makro-a {} - - - - Unable to fetch macro-specified file {} from {} - Nije moguće preuzeti datoteku {} navedenu makroom iz {} - - - - Could not locate macro-specified file {} (expected at {}) - Nije moguće locirati datoteku navedenu makro-om {} (trebala je biti u {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Neprepoznato unutrašnje radno okruženje '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Upozorenje za programere dodataka: URL adresa spremišta zadata u package.xml datoteci za dodatak {} ({}) ne odgovara URL adresi sa koje je preuzet ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Upozorenje za programere dodataka: Grana spremišta postavljena u package.xml datoteci za dodatak {} ({}) se ne podudara sa granom iz koje je preuzeta ({}) - - - - - Got an error when trying to import {} - Greška pri pokušaju uvoza {} - - - - An unknown error occurred - Došlo je do nepoznate greške - - - - Could not find addon {} to remove it. - Nije moguće pronaći Dodatak {} za uklanjanje. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Izvršavanje uninstall.py skripte Dodatka nije uspelo. Nastavlja se sa deinstaliranjem... - - - - Removed extra installed file {} - Uklonjena je dodatno instalirana datoteka {} - - - - Error while trying to remove extra installed file {} - Greška pri pokušaju uklanjanja dodatno instalirane datoteke {} - - - - Error while trying to remove macro file {}: - Greška pri pokušaju uklanjanja datoteke makro-a {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Povezivanje sa GitHub-om nije uspelo. Proveri podešavanja veze i proksija. - - - - WARNING: Duplicate addon {} ignored - UPOZORENJE: Duplikat dodatka {} je ignorisan - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Došlo je do greške pri ažuriranju makro-a sa GitHub-a, pokušavam clean checkout... - - - - Attempting to do a clean checkout... - Pokušavam da uradim clean checkout... - - - - Clean checkout succeeded - Clean checkout je uspeo - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Ažuriranje makro-a sa GitHub-a nije uspelo -- pokušaj da obrišete keš memoriju Menadžera dodataka. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Greška pri povezivanju na Wiki, FreeCAD trenutno ne može da preuzme Wiki listu makro-a - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Čitanje metapodataka sa {name} nije uspelo - - - - Failed to fetch code for macro '{name}' - Nije uspelo preuzimanje koda za makro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Menadžer dodataka: radni proces nije uspeo da se završi tokom preuzimanja {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Za {num_macros} makro je prekoračen je vremenski limit, {num_failed} tokom obrade - - - - Addon Manager: a worker process failed to halt ({name}) - Menadžer dodataka: radni proces nije uspeo da se zaustavi ({name}) - - - - Timeout while fetching metadata for macro {} - Isteklo je vreme za preuzimanje metapodataka za makro {} - - - - Failed to kill process for macro {}! - - Ubijanje procesa za makro {} nije uspelo! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Nije uspelo preuzimanje statistike o dodatku od {} – samo će sortiranje po abecednom redu biti tačno - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Neuspešno preuzimanje ocena o dodatku od '{}' -- sortiranje po ocenama neće uspeti - - - - - Repository URL - Preferences header for custom repositories - URL adresa spremišta - - - - Branch name - Preferences header for custom repositories - Ime grane - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Pravljenje rezervne kopije originalne fascikle i ponovno kloniranje - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Preimenovanje Git grane nije uspelo sa sledećom porukom: - - - - Installing - Instaliranje - - - - Succeeded - Uspešno - - - - Failed - Neuspešno - - - - Update was cancelled - Ažuriranje je otkazano - - - - some addons may have been updated - neki dodaci su možda ažurirani - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Učitavanje informacija za {} sa wiki strana FreeCAD Macro Recipes... - - - - Loading page for {} from {}... - Učitavanje stranice za {} od {}... - - - - Failed to download data from {} -- received response code {}. - Preuzimanje podataka sa {} nije uspelo -- primljen je kod odgovora {}. - - - - Composite view - Razdvojeni izgled - - - - Expanded view - Proširen izgled - - - - Compact view - Kompaktan izgled - - - - Alphabetical - Sort order - Po abecednom redu - - - - Last Updated - Sort order - Poslednje ažurirano - - - - Date Created - Sort order - Datum kreiranja - - - - GitHub Stars - Sort order - Github zvezde - - - - Score - Sort order - Ocena - - - - Std_AddonMgr - - - &Addon manager - &Menadžer dodataka - - - - Manage external workbenches, macros, and preference packs - Upravljaj spoljnim radnim okruženjima, makro-ima i paketima podešavanja - - - - AddonInstaller - - - Finished removing {} - Završeno uklanjanje {} - - - - Failed to remove some files - Uklanjanje nekih datoteka nije uspelo - - - - Addons installer - - - Finished updating the following addons - Završeno je ažuriranje sledećih dodataka - - - - Workbench - - - Auto-Created Macro Toolbar - Automatski napravljena Makro paleta alatki - - - - QObject - - - Addon Manager - Menadžer dodataka - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sr.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_sr.qm deleted file mode 100644 index ac04ef1284..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_sr.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sr.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_sr.ts deleted file mode 100644 index ea447d6f4c..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_sr.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Сопствено спремиште - - - - Repository URL - URL адреса спремишта - - - - Branch - Грана - - - - CompactView - - - - Icon - Икона - - - - - <b>Package Name</b> - <b>Име пакета</b> - - - - - Version - Верзија - - - - - Description - Опис - - - - Update Available - Доступно је ажурирање - - - - UpdateAvailable - На располагању је новија верзија - - - - DependencyDialog - - - Dependencies - Зависности - - - - Dependency type - Врста зависности - - - - Name - Име - - - - Optional? - Необавезно? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Реши зависности - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Овај Додатак има следеће обавезне и необавезне зависности. Мораш их инсталирати да би могао користити овај Додатак. - -Да ли желиш да их Менаџер додатака аутоматски инсталира? Изабери "Занемари" да инсталираш додатак без инсталирања зависности. - - - - FreeCAD Addons - FreeCAD Додаци - - - - Required Python modules - Потребни Python модули - - - - Optional Python modules - Необавезни Python модули - - - - DeveloperModeDialog - - - Addon Developer Tools - Алатке за програмере додатака - - - - Path to Addon - Путања до Додатка - - - - - Browse... - Потражи... - - - - Metadata - Метаподаци - - - - Primary branch - Главна грана - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Објашњење шта овај додатак пружа. Приказује се у Менаџеру додатака. Није неопходно да се наводи да је ово додатак за FreeCAD. - - - - Description - Опис - - - - Discussion URL - URL адреса дискусије - - - - Icon - Икона - - - - Bugtracker URL - URL адреса система за праћење грешака - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Подржани су Semantic (1.2.3-beta) или CalVer (2022.08.30) стилови - - - - Set to today (CalVer style) - Постављено на данас (CalVer стил) - - - - - - - (Optional) - (необавезно) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Приказује се на листи Менаџера додатака. Не би требало да садржи реч "FreeCAD", и мора постојати важеће име фасцикле за све подржане оперативне системе. - - - - README URL - URL адреса датотеке README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - САВЕТ: Пошто је ово приказано у Менаџеру додатака FreeCAD програма, није неопходно да заузимаш простор говорећи ствари попут "Ово је FreeCAD додатак..." -- само реци шта ради. - - - - Repository URL - URL адреса спремишта - - - - Website URL - URL адреса веб сајта - - - - Documentation URL - URL адреса документације - - - - Addon Name - Име додатка - - - - Version - Верзија - - - - (Recommended) - (Препоручено) - - - - Minimum Python - Минимум Python - - - - (Optional, only 3.x version supported) - (Необавезно, подржана је само верзија 3.x) - - - - Detect... - Откриј... - - - - Addon Contents - Садржај додатка - - - - Dialog - - - Addon Manager - Менаџер додатака - - - - Edit Tags - Уреди тагове - - - - Comma-separated list of tags describing this item: - Листа тагова раздвојених зарезима које описују ову ставку: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - САВЕТ: Уобичајени тагови укључују "Склоп", "FEM", "Мрежа", "NURBS", etc. - - - - Add-on Manager: Warning! - Менаџер додатака: Упозорење! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Менаџер додатака пружа приступ библиотеци корисних FreeCAD додатака независних произвођача. Додатке користите на своју одговорност пошто FreeCAD не може гарантовати за њихову безбедности или функционалности. - - - - Continue - Настави - - - - Cancel - Откажи - - - - EditDependencyDialog - - - Edit Dependency - Уреди зависност - - - - Dependency Type - Врста зависности - - - - Dependency - Зависност - - - - Package name, if "Other..." - Име пакета, ако је "Остало..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - НАПОМЕНА: Ако је "Ostalo..." изабран, пакет се не налази у датотеци ALLOWED_PYTHON_PACKAGES.txt и Менаџер додатака га неће аутоматски инсталирати. Пошаљи PR на <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> да затражи додавање пакета. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Ако је ово необавезна зависност, Менаџер додатака ће понудити да је инсталира (када је то могуће), али неће блокирати инсталацију ако корисник одлучи да не инсталира или не може да инсталира пакет. - - - - Optional - Необавезно - - - - ExpandedView - - - - Icon - Икона - - - - - <h1>Package Name</h1> - <h1>Име пакета</h1> - - - - - Version - Верзија - - - - - (tags) - (тагови) - - - - - Description - Опис - - - - - Maintainer - Програмер задужен за одржавање - - - - Update Available - Доступно је ажурирање - - - - labelSort - labelSort - - - - UpdateAvailable - На располагању је новија верзија - - - - Form - - - Licenses - Лиценце - - - - License - Лиценца - - - - License file - Датотека лиценце - - - - People - Особе - - - - Kind - Врста - - - - Name - Име - - - - Email - Електронска пошта - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Напредно мапирање верзија - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Предстојеће верзије FreeCAD Менаџера додатака ће подржавати програмерско подешавање одређених грана или тагова за употребу са одређеном верзијом FreeCAD-а (нпр. подешавање одређеног таг-а као последње верзије вашег Додатка за подршку v0.19, итд.) - - - - FreeCAD Version - FreeCAD верзија - - - - Best-available branch, tag, or commit - Најбоља доступна грана, таг или commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Подржане FreeCAD верзије - - - - Minimum FreeCAD Version Supported - Минимална подржана FreeCAD верзија - - - - - Optional - Необавезно - - - - Maximum FreeCAD Version Supported - Максимална подржана FreeCAD верзија - - - - Advanced version mapping... - Напредно мапирање верзија... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Опције Менаџера додатака - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Ако је ова опција изабрана, приликом покретања Менаџера додатака -ће бити проверено да ли постоје доступна ажурирања за инсталиране додатке - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Преузми макро метаподатке (приближно 10MB) - - - - Cache update frequency - Учесталост ажурирања кеша - - - - Manual (no automatic updates) - Ручно (без аутоматског ажурирања) - - - - Daily - Дневно - - - - Weekly - Недељно - - - - Hide Addons without a license - Sakrij dodatke bez licence - - - - Hide Addons with non-FSF Free/Libre license - Сакриј додатке који немају FSF Free/Libre лиценцу - - - - Hide Addons with non-OSI-approved license - Сакриј додатке који немају ОСИ одобрену лиценцу - - - - Hide Addons marked Python 2 Only - Сакриј Додатке са ознаком "Само Python 2" - - - - Hide Addons marked Obsolete - Сакриј Додатке означене као застарели - - - - Hide Addons that require a newer version of FreeCAD - Сакриј Додатке који захтевају новију верзију FreeCAD-а - - - - Custom repositories - Сопствено спремиште - - - - Proxy - Прокси, Посреднички сервер - - - - No proxy - Без прокси - - - - User system proxy - Кориснички системски прокси - - - - User-defined proxy: - Кориснички прокси: - - - - Score source URL - URL извора оцена - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - УРЛ за оцене додатка (за више детаља погледај wики страну Аддон Манагер). - - - - Path to Git executable (optional): - Путања до Git извршне датотеке (необавезно): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Напредне опције - - - - Activate Addon Manager options intended for developers of new Addons. - Активирај опције Менаџера додатака намењене програмерима нових додатака. - - - - Addon developer mode - Режим програмера додатака - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Деинсталирај изабрани макро или радно окружење - - - - Install - Инсталирај - - - - Uninstall - Деинсталирај - - - - Update - Ажурирање - - - - Run Macro - Покрени макро - - - - Change branch - Промени грану - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Управљање Python зависностима - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Следеће Python пакете је локално инсталирао Менаџер додатака да би задовољио зависности додатака. Локација инсталације: - - - - Package name - Име пакета - - - - Installed version - Инсталирана верзија - - - - Available version - Доступна верзија - - - - Used by - Koristio - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Звездица т.ј. астерикс (*) у пољу "Користио" колоне означава необавезну зависност. Имај на уму да 'Користио' само бележи директан увоз у Додатак. Можда су инсталирани и други Пyтхон пакети од којих ти пакети зависе. - - - - Update all available - Ажурирај све доступно - - - - SelectFromList - - - Dialog - Дијалог - - - - TextLabel - Текстуална ознака - - - - UpdateAllDialog - - - Updating Addons - Ажурирање Додатака - - - - Updating out-of-date addons... - Ажурирање застарелих додатака... - - - - addContentDialog - - - Content Item - Ставка са садржајем - - - - Content type: - Врста садржаја: - - - - Macro - Макро - - - - Preference Pack - Пакет подешавања - - - - Workbench - Радно окружење - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Ако је ово једина ствар у Додатку, сви остали метаподаци могу бити наслеђени са највишег нивоа и не морају се овде наводити. - - - - This is the only item in the Addon - Ово је једина ставка у Додатку - - - - Main macro file - Главна макро датотека - - - - The file with the macro's metadata in it - Датотека са метаподацима макро-а у њој - - - - - - Browse... - Потражи... - - - - Preference Pack Name - Име пакета подешавања - - - - Workbench class name - Име класе радног окружења - - - - Class that defines "Icon" data member - Класа која одређује податак члана "Icon" - - - - Subdirectory - Подфасцикла - - - - Optional, defaults to name of content item - Опционо, подразумевано је име ставке са садржајем - - - - Icon - Икона - - - - Optional, defaults to inheriting from top-level Addon - Опционо, подразумевано наслеђивање од Додатка највишег нивоа - - - - Tags... - Тагови... - - - - Dependencies... - Зависности... - - - - FreeCAD Versions... - FreeCAD верзија... - - - - Other Metadata - Остали метаподаци - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Приказује се на листи Менаџера додатака. Не би требало да садржи реч "FreeCAD". - - - - Version - Верзија - - - - Description - Опис - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Подржани су Semantic (1.2.3-beta) или CalVer (2022.08.30) стилови - - - - Set to today (CalVer style) - Постављено на данас (CalVer стил) - - - - Display Name - Приказано име - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Сва поља остављена празна су наслеђена од метаподатака додатка највишег нивоа, тако да технички, сва су необавезна. За додатке са више ставки са садржајем, свака ставка треба да омогући јединствено име и опис. - - - - add_toolbar_button_dialog - - - Add button? - Додај дугме? - - - - Add a toolbar button for this macro? - Желиш ли додати дугме на палети алатки за овај макро? - - - - Yes - Да - - - - No - Не - - - - Never - Никада - - - - change_branch - - - Change Branch - Промени грану - - - - Change to branch: - Промени грану: - - - - copyrightInformationDialog - - - Copyright Information - Информације о ауторским правима - - - - Copyright holder: - Носилац ауторских права: - - - - Copyright year: - Година од кад важи ауторско право: - - - - personDialog - - - Add Person - Додај особу - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Програмер задужен за одржавање је неко са тренутним приступом овом пројекту. Аутор је неко, коме можеш да одаш признање. - - - - Name: - Име: - - - - Email: - Е-пошта: - - - - Email is required for maintainers, and optional for authors. - Е-пошта је неопходна за особу одговорну за одржавање, а необавезно за ауторе. - - - - proxy_authentication - - - Proxy login required - Потребна је пријава за прокси - - - - Proxy requires authentication - Прокси захтева аутентификацију - - - - Proxy: - Прокси: - - - - Placeholder for proxy address - Резервисано место за прокси адресу - - - - Realm: - Област: - - - - Placeholder for proxy realm - Резервисано место за прокси област - - - - Username - Корисничко име - - - - Password - Лозинка - - - - selectLicenseDialog - - - Select a license - Изабери лиценцу - - - - About... - О... - - - - License name: - Назив лиценце: - - - - Path to license file: - Путања до датотеке лиценце: - - - - (if required by license) - (ако то захтева лиценца) - - - - Browse... - Потражи... - - - - Create... - Направи... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Изабери палету алатки - - - - Select a toolbar to add this macro to: - Изабери палету алатки у коју ћеш додати овај макро: - - - - Ask every time - Питај сваки пут - - - - toolbar_button - - - - Add button? - Додај дугме? - - - - Add a toolbar button for this macro? - Желиш ли додати дугме на палети алатки за овај макро? - - - - Yes - Да - - - - No - Не - - - - Never - Никада - - - - AddonsInstaller - - - Starting up... - Покреће се... - - - - Worker process {} is taking a long time to stop... - Радни процес {} се дуго зауставља... - - - - Previous cache process was interrupted, restarting... - - Претходни процес кеширања је прекинут, поново се покреће... - - - - - Custom repo list changed, forcing recache... - - Корисничка листа спремишта је промењена, принудно поновно кеширање... - - - - - Addon manager - Менаџер додатака - - - - You must restart FreeCAD for changes to take effect. - Мораш поново покренути FreeCAD да би промене ступиле на снагу. - - - - Restart now - Поново покрени сада - - - - Restart later - Поново покрени касније - - - - - Refresh local cache - Освежи локални кеш - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Ажурирање кеша... - - - - - Checking for updates... - Проверавам да ли постоје ажурирања... - - - - Temporary installation of macro failed. - Привремена инсталација макро-а није успела. - - - - - Close - Затвори - - - - Update all addons - Ажурирај све додатке - - - - Check for updates - Провери ажурирања - - - - Python dependencies... - Python зависности... - - - - Developer tools... - Алати за програмере... - - - - Apply %n available update(s) - Примени %n доступних ажурирања - - - - No updates available - Нема доступних ажурирања - - - - - - Cannot launch a new installer until the previous one has finished. - Не може се покренути нови програм за инсталацију док се претходни не заврши. - - - - - - - Maintainer - Програмер задужен за одржавање - - - - - - - Author - Аутор - - - - New Python Version Detected - Откривена је нова верзија Python-а - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Чини се да је ово први пут да је ова верзија Python-а коришћена са Менаџером додатака. Да ли желиш за њега да инсталираш исте аутоматски инсталиране зависности? - - - - Processing, please wait... - Обрађује се, сачекај... - - - - - Update - Ажурирање - - - - Updating... - Ажурирање... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Није могуће увести QtNetwork -- изгледа да није инсталиран твом на систему. Твој провајдер можда има пакет за ову зависност (често се на пример назива, "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Конвертовање наведеног прокси порта '{}' није успело - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Грешка у параметру: постављене су међусобно искључиве прокси опције. Враћање на подразумеване вредности. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Грешка у параметру: кориснички прокси је назначен, али није обезбеђен. Враћање на подразумеване вредности. - - - - Addon Manager: Unexpected {} response from server - Менаџер додатака: Неочекивани {} одговор од сервера - - - - Error with encrypted connection - Грешка шифроване везе - - - - - - Confirm remove - Потврди уклањање - - - - Are you sure you want to uninstall {}? - Да ли си сигуран да желиш да деинсталираш {}? - - - - - - Removing Addon - Уклањање Додатка - - - - Removing {} - Уклања се {} - - - - - Uninstall complete - Деинсталирање је завршено - - - - - Uninstall failed - Деинсталирање није успело - - - - Version {version} installed on {date} - Дана {date} инсталирана је верзија {version} - - - - Version {version} installed - Инсталирана је верзија {version} - - - - Installed on {date} - Инсталирано {date} - - - - - - - Installed - Инсталирано - - - - Currently on branch {}, name changed to {} - Тренутно на грани {}, промењено је име у {} - - - - Git tag '{}' checked out, no updates possible - Git таг '{}' checked out, ажурирања нису могућа - - - - Update check in progress - У току је провера ажурирања - - - - Installation location - Локација инсталације - - - - Repository URL - URL адреса спремишта - - - - Changed to branch '{}' -- please restart to use Addon. - Промењено у грану '{}' -- поново покрени да би користио Додатак. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Овај додатак је ажуриран. Поново покрените FreeCAD да бисте видели промене. - - - - Disabled - Онемогућен унос - - - - Currently on branch {}, update available to version {} - На грани {} доступно је ажурирање до верзије {} - - - - Update available to version {} - Доступно је ажурирање до верзије {} - - - - This is the latest version available - Ово је најновија доступна верзија - - - - WARNING: This addon is obsolete - УПОЗОРЕЊЕ: Овај додатак је застарео - - - - WARNING: This addon is Python 2 only - УПОЗОРЕЊЕ: Овај додатак је само за Python 2 - - - - WARNING: This addon requires FreeCAD {} - УПОЗОРЕЊЕ: Овај додатак захтева FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - УПОЗОРЕЊЕ: Овај додатак је тренутно инсталиран, али онемогућен. Користи 'омогући' дугме да би поново омогућио. - - - - This Addon will be enabled next time you restart FreeCAD. - Овај Додатак ће бити омогућен следећи пут када поново покренеш FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Овај Додатак ће бити онемогућен следећи пут када поново покренеш FreeCAD. - - - - - - Success - Успешно - - - - Install - Инсталирај - - - - Uninstall - Деинсталирај - - - - Enable - Омогући - - - - Disable - Онемогући - - - - - Check for update - Провери ажурирања - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Покрени - - - - Change branch... - Промени грану... - - - - Return to package list - Врати се на листу пакета - - - - Checking connection - Проверава се веза - - - - Checking for connection to GitHub... - Проверава се веза са GitHub-ом... - - - - Connection failed - Веза није успостављена - - - - Missing dependency - Недостаје зависност - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Није могуће увести QtNetwork – погледај Прегледач објава за детаље. Менаджер додатака није доступан. - - - - Other... - For providing a license other than one listed - Остало... - - - - Select the corresponding license file in your Addon - Изабери одговарајућу датотеку лиценце у свом Додатку - - - - Location for new license file - Локација за нову лиценцну датотеку - - - - Received {} response code from server - Примљен {} код одговора са сервера - - - - Failed to install macro {} - Инсталирање макро-а {} није успело - - - - Failed to create installation manifest file: - - Није успело прављење манифест датотеке инсталације: - - - - - Unrecognized content kind '{}' - Непозната врста садржаја '{}' - - - - Unable to locate icon at {} - Није могуће пронаћи икону у {} - - - - Select an icon file for this content item - Изабери датотеку иконе за ову ставку садржаја - - - - - - {} is not a subdirectory of {} - {} није подфасцикла {} - - - - Select the subdirectory for this content item - Изабери подфасциклу за ову ставку садржаја - - - - Automatic - Аутоматски - - - - - Workbench - Радно окружење - - - - Addon - Додатни модул - - - - Python - Python - - - - Yes - Да - - - - Internal Workbench - Унутрашње радно окружење - - - - External Addon - Cпољни Додатак - - - - Python Package - Python пакет - - - - - Other... - Остало... - - - - Too many to list - Превише их је да би се излистали - - - - - - - - - Missing Requirement - Недостаје Захтев - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Додатак '{}' захтева '{}', што није доступно у твојојј копији FreeCAD-а. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Додатак '{}' захтева следећа радна окружења, која нису доступна у твојој копији FreeCAD-а: - - - - Press OK to install anyway. - Притисни У реду да би ипак инсталирао. - - - - - Incompatible Python version - Некомпатибилна верзија Python-а - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Овај додатак захтева Python пакете који нису инсталирани и не могу се инсталирати аутоматски. Да бисте користили овај додатак, морате ручно да инсталирате следеће Python пакете: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Овај Додатак (или једна од његових зависности) захтева Python {}.{}, а ваш систем ради {}.{}. Инсталација је отказана. - - - - Optional dependency on {} ignored because it is not in the allow-list - Необавезна зависност од {} се занемарује јер се не налази на листи дозвољених - - - - - Installing dependencies - Инсталирање зависности - - - - - Cannot execute Python - Није могуће извршити Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Аутоматско проналажење извршне датотеке Python-а није успело, или је путања погрешно задата. Провери исправност ове путање у подешавањима за Менаџер додатака. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Зависности се не могу инсталирати. Желиш ли ипак наставити са инсталацијом {}? - - - - - Cannot execute pip - Није могуће извршити pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Извршавање pip-а није успело, изгледа да он недостаје у твојој Python инсталацији. Увери се да твој систем има инсталиран pip и покушај поново. Неуспела команда је била: - - - - - Continue with installation of {} anyway? - Желиш ли ипак наставити са инсталацијом {}? - - - - - Package installation failed - Инсталирање пакета није успело - - - - See Report View for detailed failure log. - Погледај Прегледач објава за детаљан дневник грешака. - - - - Installing Addon - Инсталирање Додатка - - - - Installing FreeCAD Addon '{}' - Инсталирање FreeCAD Додатка '{}' - - - - Cancelling - Отказивање - - - - Cancelling installation of '{}' - Отказивање од инсталације '{}' - - - - {} was installed successfully - {} је успешно инсталиран - - - - - Installation Failed - Инсталација није успела - - - - Failed to install {} - Инсталирање {} није успело - - - - - Create new toolbar - Направи нову палету са алаткама - - - - - A macro installed with the FreeCAD Addon Manager - Макро инсталиран са FreeCAD Менаџером додатака - - - - - Run - Indicates a macro that can be 'run' - Покрени - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Није могуће прочитати податке са GitHub-а: провери интернет везу и подешавања проксија и покушај поново. - - - - XML failure while reading metadata from file {} - XML грешка при читању метаподатака из датотеке {} - - - - Invalid metadata in file {} - Неважећи метаподаци у датотеци {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - УПОЗОРЕЊЕ: Путања наведена у метаподацима package.xml не одговара тренутној checked-out грани. - - - - Name - Име - - - - Class - Класа - - - - Description - Опис - - - - Subdirectory - Подфасцикла - - - - Files - Датотеке - - - - Select the folder containing your Addon - Изабери фасциклу у којој се налази твој Додатак - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Нема Вермин-а, операција се отказује. - - - - Scanning Addon for Python version compatibility - Скенирање Додатка ради утврђивања компатибилне верзије Python-а - - - - Minimum Python Version Detected - Откривена је минимална верзија Python-а - - - - Vermin auto-detected a required version of Python 3.{} - Vermin је аутоматски открио потребну верзију Python-а 3.{} - - - - Install Vermin? - Инсталирај Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - За аутоматско откривање потребне верзије Python-а за овај додатак потребан је Vermin (https://pypi.org/project/vermin/). Притисните У реду ако желите инсталирати? - - - - Attempting to install Vermin from PyPi - Покушај инсталирања Vermin-a са PyPi-ја - - - - - Installation failed - Инсталација није успела - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Инсталација Vermin-а није успела – провери Прегледач објава за детаље. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Увоз Vermin-а након инсталације није успео - не може да се скенира Додатак. - - - - Select an icon file for this package - Изабери датотеку иконе за овај пакет - - - - Filter is valid - Филтер је важећи - - - - Filter regular expression is invalid - Регуларни израз филтра је неважећи - - - - Search... - Претрага... - - - - Click for details about package {} - Кликни за детаље о пакету {} - - - - Click for details about workbench {} - Кликни за детаље о радном окружењу {} - - - - Click for details about macro {} - Кликни за детаље о макро-у {} - - - - Maintainers: - Програмери задужени за одржавање: - - - - Tags - Тагови - - - - {} ★ on GitHub - {} ★ на GitHub - - - - No ★, or not on GitHub - Нема ★, или нема на GitHub - - - - Created - Направљено - - - - Updated - Ажурирано - - - - Score: - Оцена: - - - - - Up-to-date - Ажурирано - - - - - - - - Update available - Доступно је ажурирање - - - - - Pending restart - Поновно покретање на чекању - - - - - DISABLED - ОНЕМОГУЋЕНО - - - - Installed version - Инсталирана верзија - - - - Unknown version - Непозната верзија - - - - Installed on - Инсталиран на - - - - Available version - Доступна верзија - - - - Filter by... - Филтери... - - - - Addon Type - Врста додатка - - - - - Any - Било који - - - - Macro - Макро - - - - Preference Pack - Пакет подешавања - - - - Installation Status - Статус инсталације - - - - Not installed - Није инсталирано - - - - Filter - Филтер - - - - DANGER: Developer feature - ОПАСНОСТ: Функција за програмере - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - ОПАСНОСТ: Пребацивање грана је намењено програмерима и бета тестерима и може да доведе до оштећених докумената који нису компатибилни уназад, нестабилности, кварова и/или прераног топлотног колапса универзума. Да ли си сигуран да желиш да наставиш? - - - - There are local changes - Постоје локалне промене - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - УПОЗОРЕЊЕ: Ово спремиште има неповезане локалне промене. Да ли си сигуран да желиш да промениш гране (доносећи промене са собом)? - - - - Local - Table header for local git ref name - Локално - - - - Remote tracking - Table header for git remote tracking branch name - Даљинско праћење - - - - Last Updated - Table header for git update date - Последње ажурирано - - - - Installation of Python package {} failed - Инсталација Python пакета {} није успела - - - - Installation of optional package failed - Инсталација необавезног пакета није успела - - - - Installing required dependency {} - Инсталирање неопходне зависности {} - - - - Installation of Addon {} failed - Инсталација Додатка {} није успела - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Декодирање {} датотеке за Додатак '{}' није успело - - - - Any dependency information in this file will be ignored - Све информације у овој датотеци о зависности ће бити занемарене - - - - Unable to open macro wiki page at {} - Није могуће отворити макро wiki страницу на {} - - - - Unable to fetch the code of this macro. - Није могуће преузети код овог макроа. - - - - Unable to retrieve a description from the wiki for macro {} - Није могуће преузети опис са wiki-ја за макро {} - - - - Unable to open macro code URL {} - Није могуће отворити URL адресу кода макроа {} - - - - Unable to fetch macro-specified file {} from {} - Није могуће преузети датотеку {} наведену макроом из {} - - - - Could not locate macro-specified file {} (expected at {}) - Није могуће лоцирати датотеку наведену макро-ом {} (требала је бити у {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Непрепознато унутрашње радно окружење '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Упозорење за програмере додатака: URL адреса спремишта задата у package.xml датотеци за додатак {} ({}) не одговара URL адреси са које је преузет ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Упозорење за програмере додатака: Грана спремишта постављена у package.xml датотеци за додатак {} ({}) се не подудара са граном из које је преузета ({}) - - - - - Got an error when trying to import {} - Грешка при покушају увоза {} - - - - An unknown error occurred - Дошло је до непознате грешке - - - - Could not find addon {} to remove it. - Није могуће пронаћи Додатак {} за уклањање. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Извршавање uninstall.py скрипте Додатка није успело. Наставља се са деинсталирањем... - - - - Removed extra installed file {} - Уклоњена је додатно инсталирана датотека {} - - - - Error while trying to remove extra installed file {} - Грешка при покушају уклањања додатно инсталиране датотеке {} - - - - Error while trying to remove macro file {}: - Грешка при покушају уклањања датотеке макро-а {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Повезивање са GitHub-ом није успело. Провери подешавања везе и проксија. - - - - WARNING: Duplicate addon {} ignored - УПОЗОРЕЊЕ: Дупликат додатка {} је игнорисан - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Дошло је до грешке при ажурирању макро-а са GitHub-а, покушавам clean checkout... - - - - Attempting to do a clean checkout... - Покушавам да урадим clean checkout... - - - - Clean checkout succeeded - Clean checkout је успео - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Ажурирање макро-а са GitHub-а није успело -- покушај да обришете кеш меморију Менаџера додатака. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Грешка при повезивању на Wiki, FreeCAD тренутно не може да преузме Wiki листу макро-а - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Читање метаподатака са {name} није успело - - - - Failed to fetch code for macro '{name}' - Није успело преузимање кода за '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Менаџер додатака: радни процес није успео да се заврши током преузимања {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - За {num_macros} макро је прекорачен је временски лимит, {num_failed} током обраде - - - - Addon Manager: a worker process failed to halt ({name}) - Менаџер додатака: радни процес није успео да се заустави ({name}) - - - - Timeout while fetching metadata for macro {} - Истекло је време за преузимање метаподатака за макро {} - - - - Failed to kill process for macro {}! - - Убијање процеса за макро {} није успело! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Није успело преузимање статистике о додатку од {} – само ће сортирање по абецедном реду бити тачно - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Неуспешно преузимање о додатку од '{}' -- сортирање по оценама неће успети - - - - - Repository URL - Preferences header for custom repositories - URL адреса спремишта - - - - Branch name - Preferences header for custom repositories - Име гране - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Прављење резервне копије оригиналне фасцикле и поновно клонирање - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Преименовање Git гране није успело са следећом поруком: - - - - Installing - Инсталирање - - - - Succeeded - Уcпешно - - - - Failed - Неуспешно - - - - Update was cancelled - Ажурирање је отказано - - - - some addons may have been updated - неки додаци су можда ажурирани - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Учитавање информација за {} са wiki страна FreeCAD Macro Recipes... - - - - Loading page for {} from {}... - Учитавање странице за {} од {}... - - - - Failed to download data from {} -- received response code {}. - Преузимање података са {} није успело -- примљен је код одговора {}. - - - - Composite view - Раздвојени изглед - - - - Expanded view - Проширен приказ - - - - Compact view - Компактан изглед - - - - Alphabetical - Sort order - По абецедном реду - - - - Last Updated - Sort order - Последње ажурирано - - - - Date Created - Sort order - Датум креирања - - - - GitHub Stars - Sort order - GitHub звезде - - - - Score - Sort order - Оцена - - - - Std_AddonMgr - - - &Addon manager - &Менаџер додатака - - - - Manage external workbenches, macros, and preference packs - Управљај спољним радним окружењима, макро-има и пакетима подешавања - - - - AddonInstaller - - - Finished removing {} - Завршено уклањање {} - - - - Failed to remove some files - Уклањање неких датотека није успело - - - - Addons installer - - - Finished updating the following addons - Завршено је ажурирање следећих додатака - - - - Workbench - - - Auto-Created Macro Toolbar - Аутоматски направљена Макро палета алатки - - - - QObject - - - Addon Manager - Менаџер додатака - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sv-SE.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_sv-SE.qm deleted file mode 100644 index c0989a0439..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_sv-SE.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_sv-SE.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_sv-SE.ts deleted file mode 100644 index 5b091d0000..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_sv-SE.ts +++ /dev/null @@ -1,2486 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Anpassat kodarkiv - - - - Repository URL - Kodarkiv URL - - - - Branch - Gren - - - - CompactView - - - - Icon - Ikon - - - - - <b>Package Name</b> - <b>Paketnamn</b> - - - - - Version - Version - - - - - Description - Beskrivning - - - - Update Available - Uppdatering tillgänglig - - - - UpdateAvailable - Uppdatering Tillgänglig - - - - DependencyDialog - - - Dependencies - Beroenden - - - - Dependency type - Beroendetyp - - - - Name - Namn - - - - Optional? - Valfri? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Lös beroenden - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Detta Tillägg har följande nödvändiga och valfria beroenden. Du måste installera dem innan detta TIllägg kan användas. - -Vill du att TIlläggshanteraren ska installera dem automatiskt? Välj "Ignorera" för att installera Tillägget utan att installera dess beroenden. - - - - FreeCAD Addons - FreeCAD Tillägg - - - - Required Python modules - Obligatoriska Pythonmoduler - - - - Optional Python modules - Valfria Pythonmoduler - - - - DeveloperModeDialog - - - Addon Developer Tools - Utvecklarverktyg För Tillägg - - - - Path to Addon - Sökväg till Tillägg - - - - - Browse... - Bläddra... - - - - Metadata - Metadata - - - - Primary branch - Primär gren - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Förklaring till vad detta Tillägg tillhandahåller. Visas i Tilläggshanteraren. Det är inte nödvändigt för detta att ange att det är ett tillägg för FreeCAD. - - - - Description - Beskrivning - - - - Discussion URL - Diskussion URL - - - - Icon - Ikon - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantisk (1.2.3-beta) eller CalVer (2022.08.30) stilar stöds - - - - Set to today (CalVer style) - Sätt till idag (CalVer-stil) - - - - - - - (Optional) - (Valfri) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Visas i Tilläggshanterarens lista över TIllägg. Ska inte innehålla orded "FreeCAD" och måste vara ett giltigt katalognamn på alla operativsystem som stöds. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - Tips: Eftersom detta visas i FreeCADs Tilläggshanterare är det inte nödvändigt att skriva saker som "Detta är ett Tillägg till FreeCAD" -- skriv bara vad Tillägget gör. - - - - Repository URL - Kodarkiv URL - - - - Website URL - Hemsida URL - - - - Documentation URL - Dokumentation URL - - - - Addon Name - Tilläggsnamn - - - - Version - Version - - - - (Recommended) - (Rekommenderad) - - - - Minimum Python - Minimiversion Python - - - - (Optional, only 3.x version supported) - (Valfri, endast version 3.x stöds) - - - - Detect... - Upptäck... - - - - Addon Contents - Tillägg Innehåll - - - - Dialog - - - Addon Manager - Tilläggshanterare - - - - Edit Tags - Redigera Taggar - - - - Comma-separated list of tags describing this item: - Kommaseparerad lista med taggar som beskriver detta objekt: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Fortsätt - - - - Cancel - Avbryt - - - - EditDependencyDialog - - - Edit Dependency - Redigera beroende - - - - Dependency Type - Beroendetyp - - - - Dependency - Beroende - - - - Package name, if "Other..." - Paketets namn, om "Andra..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Om detta är ett frivilligt beroende, kommer Tilläggshanteraren att erbjuda att installera det (när det är möjligt), men kommer inte att blockera installationen om användaren väljer att, eller inte kan, installera paketet. - - - - Optional - Valfri - - - - ExpandedView - - - - Icon - Ikon - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - Version - - - - - (tags) - (taggar) - - - - - Description - Beskrivning - - - - - Maintainer - Underhållare - - - - Update Available - Uppdatering tillgänglig - - - - labelSort - labelSort - - - - UpdateAvailable - Uppdatering Tillgänglig - - - - Form - - - Licenses - Licenser - - - - License - Licens - - - - License file - Licensfil - - - - People - Personer - - - - Kind - Sort - - - - Name - Namn - - - - Email - E-post - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD-version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - FreeCAD-versioner Som Stöds - - - - Minimum FreeCAD Version Supported - Minsta Version Av FreeCAD Som Stöds - - - - - Optional - Valfri - - - - Maximum FreeCAD Version Supported - Högsta Version Av FreeCAD Som Stöds - - - - Advanced version mapping... - Avancerad versionsmappning - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Val för tilläggshanteraren - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Om detta alternativ är valt söker tilläggshanteraren efter uppdateringar för installerade tillägg då den startas - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Hämta metadata för makron (cirka 10 MB) - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manuell (inga automatiska uppdateringar) - - - - Daily - Dagligen - - - - Weekly - Veckovis - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Dölj tillägg som enbart stödjer Python 2 - - - - Hide Addons marked Obsolete - Dölj tillägg som har markerats som föråldrade - - - - Hide Addons that require a newer version of FreeCAD - Dölj tillägg som kräver en nyare version av FreeCAD - - - - Custom repositories - Custom repositories - - - - Proxy - Proxy - - - - No proxy - Ingen proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - Användardefinierad proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Avancerade alternativ - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Installera - - - - Uninstall - Avinstallera - - - - Update - Uppdatera - - - - Run Macro - Kör makro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Hantera Python-beroenden - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Paketnamn - - - - Installed version - Installerad version - - - - Available version - Tillgänglig version - - - - Used by - Används av - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Uppdatera alla tillgängliga - - - - SelectFromList - - - Dialog - Dialog - - - - TextLabel - TextLabel - - - - UpdateAllDialog - - - Updating Addons - Uppdaterar tillägg - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Makro - - - - Preference Pack - Preference Pack - - - - Workbench - Arbetsbänk - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Bläddra... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Underkatalog - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Ikon - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Beroenden... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Annan metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Version - - - - Description - Beskrivning - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantisk (1.2.3-beta) eller CalVer (2022.08.30) stilar stöds - - - - Set to today (CalVer style) - Sätt till idag (CalVer-stil) - - - - Display Name - Visningsnamn - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Lägg till knapp? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Ja - - - - No - Nej - - - - Never - Aldrig - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Upphovsrättsinformation - - - - Copyright holder: - Upphovsrättsinnehavare: - - - - Copyright year: - Upphovsrättsår: - - - - personDialog - - - Add Person - Lägg till person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Namn: - - - - Email: - E-post: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Användarnamn - - - - Password - Lösenord - - - - selectLicenseDialog - - - Select a license - Välj en licens - - - - About... - Om... - - - - License name: - Licensnamn: - - - - Path to license file: - Sökväg till licensfil: - - - - (if required by license) - (if required by license) - - - - Browse... - Bläddra... - - - - Create... - Skapa... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Fråga varje gång - - - - toolbar_button - - - - Add button? - Lägg till knapp? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Ja - - - - No - Nej - - - - Never - Aldrig - - - - AddonsInstaller - - - Starting up... - Startar upp... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Tilläggshanterare - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Starta om nu - - - - Restart later - Starta om senare - - - - - Refresh local cache - Uppdatera lokal cache - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Uppdaterar cache... - - - - - Checking for updates... - Söker efter uppdateringar... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Stäng - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - - - - Maintainer - Underhållare - - - - - - - Author - Upphovsman - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Uppdatera - - - - Updating... - Uppdaterar... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Bekräfta borttagning - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Tar bort {} - - - - - Uninstall complete - Avinstallation slutförd - - - - - Uninstall failed - Avinstallation misslyckades - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installerad den {date} - - - - - - - Installed - Installerad - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installationsplats - - - - Repository URL - Kodarkiv URL - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Inaktiverad - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Install - Installera - - - - Uninstall - Avinstallera - - - - Enable - Aktivera - - - - Disable - Avaktivera - - - - - Check for update - Check for update - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Kör - - - - Change branch... - Change branch... - - - - Return to package list - Tillbaka till paketlistan - - - - Checking connection - Kontrollerar anslutning - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Anslutningen misslyckades - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Annat... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Plats för ny licensfil - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Det gick inte att installera makro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automatisk - - - - - Workbench - Arbetsbänk - - - - Addon - Tillägg - - - - Python - Python - - - - Yes - Ja - - - - Internal Workbench - Intern arbetsbänk - - - - External Addon - Externt tillägg - - - - Python Package - Python Package - - - - - Other... - Annat... - - - - Too many to list - För många för att lista - - - - - - - - - Missing Requirement - Krav ej uppfyllda - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installerar beroenden - - - - - Cannot execute Python - Kan inte köra Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Avbryter - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installationen misslyckades - - - - Failed to install {} - Det gick inte att installera {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - Ett makro installerat med FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Kör - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Ogiltig metadata i fil {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Namn - - - - Class - Klass - - - - Description - Beskrivning - - - - Subdirectory - Underkatalog - - - - Files - Filer - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Installera Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installationen misslyckades - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Välj en ikonfil för detta paket - - - - Filter is valid - Filtret är giltigt - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Sök... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Taggar - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Uppdatering tillgänglig - - - - - Pending restart - Väntande omstart - - - - - DISABLED - INAKTIVERAD - - - - Installed version - Installerad version - - - - Unknown version - Okänd version - - - - Installed on - Installerad den - - - - Available version - Tillgänglig version - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Vilken som - - - - Macro - Makro - - - - Preference Pack - Preference Pack - - - - Installation Status - Installation Status - - - - Not installed - Inte installerad - - - - Filter - Filter - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - Det finns lokala ändringar - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Kan inte hämta koden för detta makro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - Ett okänt fel har uppstått - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Tog bort extra installerad fil {} - - - - Error while trying to remove extra installed file {} - Fel vid försök att ta bort extra installerad fil {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Kodarkiv URL - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installerar - - - - Succeeded - Succeeded - - - - Failed - Misslyckades - - - - Update was cancelled - Uppdateringen avbröts - - - - some addons may have been updated - vissa tillägg kan ha uppdaterats - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Tog bort {} - - - - Failed to remove some files - Det gick inte att ta bort några filer - - - - Addons installer - - - Finished updating the following addons - Uppdatering av följande tillägg slutfördes - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Tilläggshanterare - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_tr.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_tr.qm deleted file mode 100644 index e412bc823e..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_tr.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_tr.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_tr.ts deleted file mode 100644 index afca5bd446..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_tr.ts +++ /dev/null @@ -1,2488 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Özel depo - - - - Repository URL - Depo URL' si - - - - Branch - Dal - - - - CompactView - - - - Icon - Simge - - - - - <b>Package Name</b> - <b>Paket Adı</b> - - - - - Version - Sürüm - - - - - Description - Açıklama - - - - Update Available - Güncelleme Mevcut - - - - UpdateAvailable - Güncelleme Mevcut - - - - DependencyDialog - - - Dependencies - Bağımlılıklar - - - - Dependency type - Bağımlılık türü - - - - Name - Isim - - - - Optional? - İsteğe bağlı? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Bağımlılıkları Çöz - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Bu Eklenti aşağıdaki gerekli ve isteğe bağlı bağımlılıklara sahiptir. Bu Eklentinin kullanılabilmesi için bunları yüklemeniz gerekir. - -Eklenti Yöneticisinin bunları otomatik olarak kurmasını istiyor musunuz? Eklentiyi bağımlılıklar olmadan kurmak için " Yoksay " seçin. - - - - FreeCAD Addons - FreeCAD Eklentileri - - - - Required Python modules - Gerekli Python modülleri - - - - Optional Python modules - İsteğe bağlı Python modülleri - - - - DeveloperModeDialog - - - Addon Developer Tools - Eklenti Geliştirici Araçları - - - - Path to Addon - Eklentiyi giden yol - - - - - Browse... - Gözat... - - - - Metadata - Üst veri - - - - Primary branch - Birincil dal - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Bu Eklentinin neler sağladığının açıklaması. Eklenti Yöneticisinde görüntülenir. Bunun için bunun bir FreeCAD Eklentisi olduğunu belirtmemize gerek yoktur. - - - - Description - Açıklama - - - - Discussion URL - Tartışma URL'si - - - - Icon - Simge - - - - Bugtracker URL - Hata İzleyici URL'si - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) ya da CalVer (2022.08.30) stilleri desteklenir - - - - Set to today (CalVer style) - Bugüne ayarla (CalVer stili) - - - - - - - (Optional) - (Isteğe bağlı) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - BENIOKU URL'si - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Depo URL' si - - - - Website URL - Web Sitesi URL’si - - - - Documentation URL - Döküman URL'si - - - - Addon Name - Eklenti Adı - - - - Version - Sürüm - - - - (Recommended) - (Önerilen) - - - - Minimum Python - Min. Python - - - - (Optional, only 3.x version supported) - (İsteğe bağlı, yalnızca 3.x sürümü desteklenir) - - - - Detect... - Algıla... - - - - Addon Contents - Eklenti İçeriği - - - - Dialog - - - Addon Manager - Eklenti Yöneticisi - - - - Edit Tags - Etiketleri Düzenle - - - - Comma-separated list of tags describing this item: - Bu öğeyi açıklayan virgülle ayrılmış etiketler listesi: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Devam - - - - Cancel - İptal - - - - EditDependencyDialog - - - Edit Dependency - Bağımlılığı Düzenle - - - - Dependency Type - Bağımlılığı Biçimi - - - - Dependency - Bağımlılık - - - - Package name, if "Other..." - Paket adı, eğer "Diğer..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Isteğe bağlı - - - - ExpandedView - - - - Icon - Simge - - - - - <h1>Package Name</h1> - <h1>Paket Adı</h1> - - - - - Version - Sürüm - - - - - (tags) - (etiketler) - - - - - Description - Açıklama - - - - - Maintainer - Geliştirici - - - - Update Available - Güncelleme Mevcut - - - - labelSort - labelSort - - - - UpdateAvailable - Güncelleme Mevcut - - - - Form - - - Licenses - Lisanslar - - - - License - Lisans - - - - License file - Lisans dosyası - - - - People - Kişiler - - - - Kind - Tür - - - - Name - Isim - - - - Email - E-Posta - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Gelişmiş Sürüm Eşleme - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Sürümü - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Desteklenen FreeCAD Sürümleri - - - - Minimum FreeCAD Version Supported - Desteklenen En Düşük FreeCAD Sürümü - - - - - Optional - Isteğe bağlı - - - - Maximum FreeCAD Version Supported - Desteklenen En Yüksek FreeCAD Sürümü - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Eklenti yöneticisi seçenekleri - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Makro MetaVerilerini indirin (yaklaşık 10MB) - - - - Cache update frequency - Arabellek güncelleme sıklığı - - - - Manual (no automatic updates) - Elle (otomatik güncellemeler yok) - - - - Daily - Günlük - - - - Weekly - Haftalık - - - - Hide Addons without a license - Lisansa sahip olmayan eklentileri gizle - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Geçersiz olarak işaretlenmiş Eklentileri Gizle - - - - Hide Addons that require a newer version of FreeCAD - FreeCAD'in daha yeni bir sürümünü gerektiren Eklentileri Gizle - - - - Custom repositories - Özel depolar - - - - Proxy - Vekil Sunucu - - - - No proxy - Vekil sunucu yok - - - - User system proxy - Kullanıcı sistem vekil sunucusu - - - - User-defined proxy: - Kullanıcı tanımlı vekil sunucu: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Gelişmiş seçenekler - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Eklenti geliştirici modu - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Yükle - - - - Uninstall - Kaldır - - - - Update - Güncelle - - - - Run Macro - Makro Çalıştır - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Python Bağımlılıklarını Yönet - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Paket adı - - - - Installed version - Kurulu sürüm - - - - Available version - Bulunan sürüm - - - - Used by - Kullanıldı - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Tüm uygun eklentileri güncelle - - - - SelectFromList - - - Dialog - Pencere - - - - TextLabel - MetinEtiketi - - - - UpdateAllDialog - - - Updating Addons - Eklentiler güncellenyor - - - - Updating out-of-date addons... - Güncel olmayan eklentilerin güncellenmesi... - - - - addContentDialog - - - Content Item - İçerik öğeleri - - - - Content type: - İçerik tipi: - - - - Macro - Makro - - - - Preference Pack - Ön tanımlar paketi - - - - Workbench - Tezgah - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Ana makro dosyası - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Gözat... - - - - Preference Pack Name - Tercih Paketi Adı - - - - Workbench class name - Tezgah sınıfı adı - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Alt dizin - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Simge - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Etiketler... - - - - Dependencies... - Bağımlılık... - - - - FreeCAD Versions... - FreeCAD Sürümü... - - - - Other Metadata - Diğer meta veriler - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Sürüm - - - - Description - Açıklama - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) ya da CalVer (2022.08.30) stilleri desteklenir - - - - Set to today (CalVer style) - Bugüne ayarla (CalVer stili) - - - - Display Name - İsmi Görüntüle - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Tuş ekle? - - - - Add a toolbar button for this macro? - Bu makro için bir araç çubuğu düğmesi eklensin mi? - - - - Yes - Evet - - - - No - Hayır - - - - Never - Asla - - - - change_branch - - - Change Branch - Branch Değiştir - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Telif Hakkı Bilgisi - - - - Copyright holder: - Telif hakkı sahibi: - - - - Copyright year: - Telif Hakkı Yılı: - - - - personDialog - - - Add Person - Kişi Ekle - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Geliştirici, bu projede geçerli taahhüt erişimine sahip olan kişidir. Bir yazar, kredi vermek istediğiniz herhangi bir kişidir. - - - - Name: - Adı: - - - - Email: - E-Posta: - - - - Email is required for maintainers, and optional for authors. - E-posta, geliştiriciler için gereklidir, yazarlar için isteğe bağlıdır. - - - - proxy_authentication - - - Proxy login required - Vekil sunucu girişi gerekli - - - - Proxy requires authentication - Vekil sunucu kimlik doğrulaması gerektiriyor - - - - Proxy: - Vekil Sunucu: - - - - Placeholder for proxy address - Vekil sunucu adresi için yer tutucu - - - - Realm: - Erişim Alanı: - - - - Placeholder for proxy realm - Proxy alanı için yer tutucu - - - - Username - Kullanıcı adı - - - - Password - Şifre - - - - selectLicenseDialog - - - Select a license - Bir lisans seçin - - - - About... - Hakkında... - - - - License name: - Lisans adı: - - - - Path to license file: - Lisans dosyasının yolu: - - - - (if required by license) - (lisans gerektiriyorsa) - - - - Browse... - Gözat... - - - - Create... - Oluştur... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Araç Çubuğunu Seç - - - - Select a toolbar to add this macro to: - Bu makroyu eklemek için bir araç çubuğu seçin: - - - - Ask every time - Her seferinde sor - - - - toolbar_button - - - - Add button? - Tuş ekle? - - - - Add a toolbar button for this macro? - Bu makro için bir araç çubuğu düğmesi eklensin mi? - - - - Yes - Evet - - - - No - Hayır - - - - Never - Asla - - - - AddonsInstaller - - - Starting up... - Başlatılıyor... - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Eklenti Yöneticisi - - - - You must restart FreeCAD for changes to take effect. - Değişikliklerin uygulanması için FreeCAD' ı yeniden başlatmalısınız. - - - - Restart now - Şimdi yeniden başlat - - - - Restart later - Daha sonra yeniden başlat - - - - - Refresh local cache - Yerel önbelleği yenile - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Önbellek güncelleniyor... - - - - - Checking for updates... - Güncellemeler kontrol ediliyor... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Kapat - - - - Update all addons - Tüm Eklentileri Güncelle - - - - Check for updates - Güncellemeleri denetle - - - - Python dependencies... - Python gereksinimleri... - - - - Developer tools... - Geliştirici araçları.... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - Güncelleme Mevcut Değil - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - - - - Maintainer - Geliştirici - - - - - - - Author - Yazar - - - - New Python Version Detected - Yeni Python Sürümü Tespit Edildi - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - İşleminiz yapılıyor, Lütfen bekleyiniz... - - - - - Update - Güncelle - - - - Updating... - Güncelleniyor... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Kaldırmayı onayla - - - - Are you sure you want to uninstall {}? - {} kaldırmak istediğinizden emin misiniz? - - - - - - Removing Addon - Eklentiyi Kaldırma - - - - Removing {} - {} kaldırılıyor - - - - - Uninstall complete - Kaldırma işlemi tamamlandı - - - - - Uninstall failed - Kaldırma işlemi başarısız oldu - - - - Version {version} installed on {date} - Sürüm {version}, {date} tarihinde yüklendi - - - - Version {version} installed - Sürüm {version} yüklendi - - - - Installed on {date} - {date} tarihinde yüklendi - - - - - - - Installed - Yüklendi - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git etiketi '{}' kontrol edildi, güncelleme mümkün değil - - - - Update check in progress - Güncellemelerin kontrol edilmesi devam ediyor - - - - Installation location - Kurulum konumu - - - - Repository URL - Depo URL' si - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Devre dışı - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Başarılı - - - - Install - Yükle - - - - Uninstall - Kaldır - - - - Enable - Etkinleştir - - - - Disable - Devre dışı - - - - - Check for update - Güncellemeleri kontrol et - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Çalıştırmak - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Bağlantı kontrol ediliyor - - - - Checking for connection to GitHub... - Github bağlantısı kontrol ediliyor... - - - - Connection failed - Bağlantı başarısız oldu - - - - Missing dependency - Eksik bağımlılık - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Diğer... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Otomatik - - - - - Workbench - Tezgah - - - - Addon - Eklenti - - - - Python - Python - - - - Yes - Evet - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Diğer... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Bağımlılıklar kuruluyor - - - - - Cannot execute Python - Python çalıştırılamıyor - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Yürütülebilir Python dosyanız otomatik olarak bulunamadı veya yol yanlış ayarlanmış. Lütfen Python yolu için Eklenti Yöneticisi tercihlerini kontrol edin. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Paket kurulumu başarısız oldu - - - - See Report View for detailed failure log. - Ayrıntılı hata raporu için Rapor Görünümü'ne bakın. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - İptal Ediliyor - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Kurulum Başarısız Oldu - - - - Failed to install {} - Yükleme başarısız {} - - - - - Create new toolbar - Yeni araç çubuğu oluştur - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Çalıştırmak - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Isim - - - - Class - Sınıf - - - - Description - Açıklama - - - - Subdirectory - Alt dizin - - - - Files - Dosyalar - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Kurulum Başarısız Oldu - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Ara... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Sorumlular: - - - - Tags - Etiketler - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Güncel - - - - - - - - Update available - Güncelleme mevcut - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Kurulu sürüm - - - - Unknown version - Bilinmeyen sürüm - - - - Installed on - Yüklendiği konum - - - - Available version - Mevcut sürüm - - - - Filter by... - Filter by... - - - - Addon Type - Eklenti Türü - - - - - Any - Herhangi biri - - - - Macro - Makro - - - - Preference Pack - Ön tanımlar paketi - - - - Installation Status - Kurulum Durumu - - - - Not installed - Yüklenmedi - - - - Filter - Filtre - - - - DANGER: Developer feature - TEHLİKE: Geliştirici özelliği - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Son Güncellenme Tarihi - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Depo URL' si - - - - Branch name - Preferences header for custom repositories - Şube adı - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Kuruluyor - - - - Succeeded - Başarılı - - - - Failed - Başarısız - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Genişletilmiş görünüm - - - - Compact view - Kompakt görünüm - - - - Alphabetical - Sort order - Alfabetik - - - - Last Updated - Sort order - Son Güncelleme - - - - Date Created - Sort order - Oluşturulma Tarihi - - - - GitHub Stars - Sort order - GitHub Yıldızları - - - - Score - Sort order - Puan - - - - Std_AddonMgr - - - &Addon manager - &Eklenti Yöneticisi - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Bazı dosyalar kaldırılamadı - - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Eklenti Yöneticisi - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_uk.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_uk.qm deleted file mode 100644 index 79b233c328..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_uk.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_uk.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_uk.ts deleted file mode 100644 index 01cc1543ef..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_uk.ts +++ /dev/null @@ -1,2488 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Користувацький репозиторій - - - - Repository URL - URL репозиторію - - - - Branch - Гілка - - - - CompactView - - - - Icon - Піктограма - - - - - <b>Package Name</b> - <b>Назва Додатку</b> - - - - - Version - Версія - - - - - Description - Опис - - - - Update Available - Наявні оновлення - - - - UpdateAvailable - Наявність Оновлення - - - - DependencyDialog - - - Dependencies - Залежності - - - - Dependency type - Тип залежності - - - - Name - Назва - - - - Optional? - Необов'язково? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Встановлення залежностей - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - Додаток має наступні обовʼязкові та необовʼязкові залежності. Необхідно встановити їх, перш ніж користуватись додатком. - -Хочете, щоб менеджер додатків встановив їх автоматично? Виберіть «Ігнорувати», щоб встановити додаток без залежностей. - - - - FreeCAD Addons - Додатки FreeCAD - - - - Required Python modules - Необхідні Python модулі - - - - Optional Python modules - Додаткові Python модулі - - - - DeveloperModeDialog - - - Addon Developer Tools - Інструменти розробника Додатків - - - - Path to Addon - Шлях до Додатка - - - - - Browse... - Огляд... - - - - Metadata - Метадані - - - - Primary branch - Основна гілка - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Пояснення, що надає цей Додаток. Показується в Менеджері Додатків. Для цього не обов'язково вказувати, що це Додаток FreeCAD. - - - - Description - Опис - - - - Discussion URL - URL-адреса дискусій - - - - Icon - Піктограма - - - - Bugtracker URL - URL-адреса багтрекеру - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Підтримуються стилі Semantic (1.2.3-beta) або CalVer (2022.08.30) - - - - Set to today (CalVer style) - Встановити дату на сьогодні (стиль CalVer) - - - - - - - (Optional) - (Необов'язково) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Показується в списку додатків Менеджера Додатків. Не повинна містити слова "FreeCAD", і має бути дійсним ім'ям каталогу на всіх підтримуваних операційних системах. - - - - README URL - URL-адреса README - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - ПОРАДА: Оскільки це показується в межах FreeCAD, в Менеджері Додатків, нема потреби займати місце, кажучи щось на кшталт "Це Додаток FreeCAD..." - просто скажіть, що він робить. - - - - Repository URL - URL репозиторію - - - - Website URL - URL-адреса веб-сайту - - - - Documentation URL - URL-адреса документації - - - - Addon Name - Назва Додатку - - - - Version - Версія - - - - (Recommended) - (Рекомендовано) - - - - Minimum Python - Мінімальна версія Python - - - - (Optional, only 3.x version supported) - (Необов'язково, підтримується тільки версія 3.x) - - - - Detect... - Виявити... - - - - Addon Contents - Вміст Додатку - - - - Dialog - - - Addon Manager - Менеджер додатків - - - - Edit Tags - Редагувати Мітки - - - - Comma-separated list of tags describing this item: - Перелік міток через кому, які описують цей елемент: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - ПІДКАЗКА: Зазвичай теги містять "Assembly", "FEM", "Mesh", "NURBS" тощо. - - - - Add-on Manager: Warning! - Менеджер додатків: Увага! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Менеджер додатків надає доступ до розширеної бібліотеки корисних сторонніх розширень FreeCAD. Жодних гарантій не можна робити щодо їх безпеки або функціональності. - - - - Continue - Продовжити - - - - Cancel - Скасувати - - - - EditDependencyDialog - - - Edit Dependency - Редагувати залежність - - - - Dependency Type - Тип залежності - - - - Dependency - Залежність - - - - Package name, if "Other..." - Назва пакету, якщо "Інше..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - ПРИМІТКА: Якщо вибрано "Інше..." і назва пакета відсутня в ALLOWED_PYTHON_PACKAGES.txt, то пакет не буде автоматично встановлений Менеджером доповнень. Надішліть PR на <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a>, щоб запросити додавання пакета. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - Якщо це необов'язкова залежність, Диспетчер доповнень запропонує встановити її (коли це можливо), але не заблокує встановлення, якщо користувач вирішить не встановлювати пакет або не зможе його встановити. - - - - Optional - Необов'язково - - - - ExpandedView - - - - Icon - Піктограма - - - - - <h1>Package Name</h1> - <h1>Назва Додатку</h1> - - - - - Version - Версія - - - - - (tags) - (теги) - - - - - Description - Опис - - - - - Maintainer - Розробник - - - - Update Available - Доступне оновлення - - - - labelSort - позначка сортування - - - - UpdateAvailable - Наявність Оновлення - - - - Form - - - Licenses - Ліцензії - - - - License - Ліцензія - - - - License file - Файл ліцензії - - - - People - Люди - - - - Kind - Тип - - - - Name - Назва - - - - Email - E-mail - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Розширене відображення версій - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Майбутні версії Менеджер доповнень FreeCAD буде підтримувати розробників' встановлення конкретної гілки або тегу для використання з певною версією FreeCAD (наприклад, встановлення специфічного тегу як останньої версії вашого Доповнення для підтримки v0.19, і т. д.) - - - - FreeCAD Version - Версія FreeCAD - - - - Best-available branch, tag, or commit - Найкраще доступна гілка, тег або коміт - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Підтримувані версії FreeCAD - - - - Minimum FreeCAD Version Supported - Мінімальна версія FreeCAD, що підтримується - - - - - Optional - Необов'язково - - - - Maximum FreeCAD Version Supported - Максимальна версія FreeCAD, що підтримується - - - - Advanced version mapping... - Розширене зіставлення версій... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Параметри Менеджера Додатків - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - Якщо ця опція вибрана, при запуску Менеджера доповнень, -встановлені доповнення буде перевірено на наявність оновлень - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - Завантажити метадані Макросів (приблизно 10 Мб) - - - - Cache update frequency - Частота оновлення кешу - - - - Manual (no automatic updates) - Вручну (без автоматичного оновлення) - - - - Daily - Щоденно - - - - Weekly - Щотиждня - - - - Hide Addons without a license - Приховати доповнення без ліцензії - - - - Hide Addons with non-FSF Free/Libre license - Приховати доповнення з ліцензією non-FSF Free/Libre - - - - Hide Addons with non-OSI-approved license - Приховати доповнення з ліцензіями, не схваленими OSI - - - - Hide Addons marked Python 2 Only - Приховати Додатки для Python 2 - - - - Hide Addons marked Obsolete - Приховати застарілі Додатки - - - - Hide Addons that require a newer version of FreeCAD - Приховати додатки для новіших версій FreeCAD - - - - Custom repositories - Власні репозиторії - - - - Proxy - Проксі - - - - No proxy - Без проксі-сервера - - - - User system proxy - Використовувати системний - - - - User-defined proxy: - Заданий користувачем: - - - - Score source URL - URL-адреса джерела оцінки - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - URL-адреса для даних про оцінку доповнення (див. вікі-сторінку Менеджера доповнень для отримання інформації про форматування та хостинг). - - - - Path to Git executable (optional): - Шлях до виконуваного Git-файлу (необов'язково): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - Додаткові Опції - - - - Activate Addon Manager options intended for developers of new Addons. - Активувати опції Менеджеру Додатків, призначені для розробників нових Додатків. - - - - Addon developer mode - Режим розробника додатків - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Видалити вибраний макрос або робоче середовище - - - - Install - Встановити - - - - Uninstall - Видалити - - - - Update - Оновити - - - - Run Macro - Запустити Макрос - - - - Change branch - Змінити гілку - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Керування залежностями Python - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - Наступні пакети Python було встановлено локально Менеджером Додатків для забезпечення залежностей. Шлях до пакетів: - - - - Package name - Назва пакету - - - - Installed version - Встановлена версія - - - - Available version - Доступна версія - - - - Used by - Використовується - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - Знак (*) у стовпці "Використовується в" вказує на необов'язкову залежність. Зауважте, що в стовпці "Використовується в" показані прямо імпортовані пакети. Інші пакети Python, необхідні для цих пакетів, також можуть бути встановлені. - - - - Update all available - Доступне оновлення - - - - SelectFromList - - - Dialog - Діалогове вікно - - - - TextLabel - ТекстовийНадпис - - - - UpdateAllDialog - - - Updating Addons - Оновлення доповнень - - - - Updating out-of-date addons... - Оновлення застарілих доповнень... - - - - addContentDialog - - - Content Item - Елемент вмісту - - - - Content type: - Тип вмісту: - - - - Macro - Макрос - - - - Preference Pack - Набір Налаштувань - - - - Workbench - Робочі середовища - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - Якщо це єдине, що є в доповненні, всі інші метадані можуть бути успадковані з верхнього рівня, і їх не потрібно вказувати тут. - - - - This is the only item in the Addon - Це єдиний елемент у доповненні - - - - Main macro file - Основний файл макросу - - - - The file with the macro's metadata in it - Файл з метаданими макросу - - - - - - Browse... - Огляд... - - - - Preference Pack Name - Імʼя Набору Налаштувань - - - - Workbench class name - Назва класу робочого простору - - - - Class that defines "Icon" data member - Клас, що визначає елемент "Icon" - - - - Subdirectory - Підкаталог - - - - Optional, defaults to name of content item - Необов'язково, за замовчуванням назва елемента вмісту - - - - Icon - Піктограма - - - - Optional, defaults to inheriting from top-level Addon - Необов'язково, за замовчуванням успадковується від доповнення верхнього рівня - - - - Tags... - Мітки... - - - - Dependencies... - Залежності... - - - - FreeCAD Versions... - FreeCAD версії... - - - - Other Metadata - Інші метадані - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Відображається у списку Менеджера доповнень. Не може містити слово "FreeCAD". - - - - Version - Версія - - - - Description - Опис - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Підтримуються стилі Semantic (1.2.3-beta) або CalVer (2022.08.30) - - - - Set to today (CalVer style) - Встановити дату на сьогодні (стиль CalVer) - - - - Display Name - Відображуване ім'я - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Будь-які поля, залишені незаповненими, заповнюються з метаданих Додатку верхнього рівня, тому технічно всі вони є необов'язковими. Для Додатків з декількох елементів, кожен з них повинен мати унікальну Назву та Опис. - - - - add_toolbar_button_dialog - - - Add button? - Додати кнопку? - - - - Add a toolbar button for this macro? - Додати кнопку на панель для запуску цього макросу? - - - - Yes - Так - - - - No - Ні - - - - Never - Ні (Не питати більше) - - - - change_branch - - - Change Branch - Змінити гілку - - - - Change to branch: - Перейти до гілки: - - - - copyrightInformationDialog - - - Copyright Information - Інформація про авторські права - - - - Copyright holder: - Власник авторських прав: - - - - Copyright year: - Рік авторських прав: - - - - personDialog - - - Add Person - Додати персону - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - Супроводжувач - це особа з поточним доступом до коммітів у цьому проєкт. Автор - це будь-хто інший, для кого ви хочете вказати авторство. - - - - Name: - Назва: - - - - Email: - E-mail: - - - - Email is required for maintainers, and optional for authors. - Електронна пошта є обов'язковою для супроводжувачів та необов'язковою для авторів. - - - - proxy_authentication - - - Proxy login required - Потрібен вхід через проксі-сервер - - - - Proxy requires authentication - Проксі-сервер вимагає автентифікації - - - - Proxy: - Проксі-сервер: - - - - Placeholder for proxy address - Введіть тут адресу проксі-сервера - - - - Realm: - Місце: - - - - Placeholder for proxy realm - Місце для проксі-сервера - - - - Username - Імʼя користувача - - - - Password - Пароль - - - - selectLicenseDialog - - - Select a license - Оберіть ліцензію - - - - About... - Про... - - - - License name: - Назва ліцензії: - - - - Path to license file: - Шлях до файлу ліцензії: - - - - (if required by license) - (якщо вимагається ліцензією) - - - - Browse... - Огляд... - - - - Create... - Створити... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Виберіть Панель Інструментів - - - - Select a toolbar to add this macro to: - Виберіть Панель Інструментів до якої додати макрос: - - - - Ask every time - Запитувати щоразу - - - - toolbar_button - - - - Add button? - Додати кнопку? - - - - Add a toolbar button for this macro? - Додати кнопку на панель для запуску цього макросу? - - - - Yes - Так - - - - No - Ні - - - - Never - Ні (Не питати більше) - - - - AddonsInstaller - - - Starting up... - Запуск... - - - - Worker process {} is taking a long time to stop... - Зупинка запущеного процесу {} займає багато часу... - - - - Previous cache process was interrupted, restarting... - - Попередній процес кешування було перервано, перезапуск... - - - - - Custom repo list changed, forcing recache... - - Змінено список користувацьких репозиторіїв, що призводить до повторного кешування... - - - - - Addon manager - Менеджер доповнень - - - - You must restart FreeCAD for changes to take effect. - Необхідно перезапустити FreeCAD, щоб зміни набрали сили. - - - - Restart now - Перезавантажити зараз - - - - Restart later - Перезавантажити пізніше - - - - - Refresh local cache - Оновити локальний кеш - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - Оновлення кешу... - - - - - Checking for updates... - Перевірка оновлень... - - - - Temporary installation of macro failed. - Не вдалося встановити макрос. - - - - - Close - Закрити - - - - Update all addons - Оновити всі доповнення - - - - Check for updates - Перевірити наявність оновлень - - - - Python dependencies... - Python залежності... - - - - Developer tools... - Інструменти розробника... - - - - Apply %n available update(s) - Застосувати %n доступних оновлень - - - - No updates available - Оновлень немає - - - - - - Cannot launch a new installer until the previous one has finished. - Неможливо запустити нове встановлення, поки не завершено попереднє. - - - - - - - Maintainer - Розробник - - - - - - - Author - Автор - - - - New Python Version Detected - Виявлено нову версію Python - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - Схоже, що ця версія Python вперше використовується з Менеджером доповнень. Чи бажаєте ви встановити для нього ті ж самі автоматично встановлені залежності? - - - - Processing, please wait... - Обробка, зачекайте будь ласка... - - - - - Update - Оновити - - - - Updating... - Оновлення... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - QtNetwork не можна імпортувати - її не встановлено у системі. Ваш постачальник може мати пакет для цієї залежності (часто його називають ""python3-pyside2.qtnetwork"") - - - - Failed to convert the specified proxy port '{}' to a port number - Не вдалося перетворити вказаний проксі-порт '{}' на номер порту - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Помилка параметра: встановлено взаємовиключні параметри проксі. Скидання до налаштувань за замовчуванням. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Помилка параметра: вказано проксі користувача, але проксі не надано. Скидання до значень за замовчуванням. - - - - Addon Manager: Unexpected {} response from server - Менеджер доповнень: Неочікувана {} відповідь від сервера - - - - Error with encrypted connection - Помилка із зашифрованим з'єднанням - - - - - - Confirm remove - Підтвердіть видалення - - - - Are you sure you want to uninstall {}? - Ви впевнені, що хочете видалити {}? - - - - - - Removing Addon - Видалення доповнення - - - - Removing {} - Видалення {} - - - - - Uninstall complete - Видалення завершено - - - - - Uninstall failed - Не вдалося видалити - - - - Version {version} installed on {date} - Версія {version} встановлена {date} - - - - Version {version} installed - Версія {version} встановлена - - - - Installed on {date} - Встановлено {date} - - - - - - - Installed - Встановлено - - - - Currently on branch {}, name changed to {} - Наразі на гілці {}, назву змінено на {} - - - - Git tag '{}' checked out, no updates possible - Git-тег '{}' перевірено, оновлення неможливі - - - - Update check in progress - Триває перевірка оновлень - - - - Installation location - Місце встановлення - - - - Repository URL - URL репозиторію - - - - Changed to branch '{}' -- please restart to use Addon. - Змінено на гілку '{}' -- будь ласка, перезапустіть, щоб використовувати доповнення. - - - - This Addon has been updated. Restart FreeCAD to see changes. - Це доповнення було оновлено. Перезапустіть FreeCAD, щоб побачити зміни. - - - - Disabled - Вимкнено - - - - Currently on branch {}, update available to version {} - Наразі на гілці {} доступне оновлення до версії {} - - - - Update available to version {} - Доступне оновлення до версії {} - - - - This is the latest version available - Це остання доступна версія - - - - WARNING: This addon is obsolete - УВАГА: Це доповнення застаріле - - - - WARNING: This addon is Python 2 only - УВАГА: Це доповнення лише для Python 2 - - - - WARNING: This addon requires FreeCAD {} - УВАГА: Для роботи цього доповнення потрібен FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - УВАГА: Це доповнення наразі встановлено, але вимкнено. Використовуйте кнопку 'увімкнути' для повторного ввімкнення. - - - - This Addon will be enabled next time you restart FreeCAD. - Це доповнення буде ввімкнено під час наступного перезапуску FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - Це доповнення буде вимкнено під час наступного перезапуску FreeCAD. - - - - - - Success - Успішно - - - - Install - Встановити - - - - Uninstall - Видалити - - - - Enable - Ввімкнути - - - - Disable - Вимкнути - - - - - Check for update - Перевірити наявність оновлень - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - Запустити - - - - Change branch... - Змінити гілку... - - - - Return to package list - Повернутись до списку пакетів - - - - Checking connection - Перевірка підключення - - - - Checking for connection to GitHub... - Перевірка підключення до GitHub... - - - - Connection failed - Не вдалося встановити з'єднання - - - - Missing dependency - Відсутня залежність - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Не вдалося імпортувати QtNetwork - дивіться Перегляд звіту для подробиць. Менеджер доповнень недоступний. - - - - Other... - For providing a license other than one listed - Інше... - - - - Select the corresponding license file in your Addon - Виберіть відповідний файл ліцензії у вашому доповненні - - - - Location for new license file - Розташування нового файлу ліцензії - - - - Received {} response code from server - Отримано {} код відповіді від сервера - - - - Failed to install macro {} - Не вдалося встановити макрос {} - - - - Failed to create installation manifest file: - - Не вдалося створити файл маніфесту встановлення: - - - - - Unrecognized content kind '{}' - Нерозпізнаний тип вмісту '{}' - - - - Unable to locate icon at {} - Не вдалося знайти піктограму в {} - - - - Select an icon file for this content item - Виберіть файл піктограми для цього елемента вмісту - - - - - - {} is not a subdirectory of {} - {} не є підкаталогом {} - - - - Select the subdirectory for this content item - Вибери підкаталог для цього елемента вмісту - - - - Automatic - Автоматичний - - - - - Workbench - Робочі середовища - - - - Addon - Додаток - - - - Python - Python - - - - Yes - Так - - - - Internal Workbench - Внутрішня робоча область - - - - External Addon - Зовнішнє доповнення - - - - Python Package - Пакет Python - - - - - Other... - Інше... - - - - Too many to list - Забагато для списку - - - - - - - - - Missing Requirement - Відсутні вимоги - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Доповнення '{}' вимагає '{}', яке відсутнє у вашій копії FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Доповнення '{}' потребує наступних робочих просторів, які відсутні у вашій копії FreeCAD: - - - - Press OK to install anyway. - Для встановлення в будь-якому разі натисніть OK. - - - - - Incompatible Python version - Несумісна версія Python - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - Для роботи цього доповнення потрібні пакети Python, які не встановлені й не можуть бути встановлені автоматично. Для використання цього доповнення ви повинні встановити наступні пакети Python вручну: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - Цей доповнення (або одна з його залежностей) потребує Python {}.{}, а у вашій системі запущено {}.{}. Встановлення скасовано. - - - - Optional dependency on {} ignored because it is not in the allow-list - Необов'язкова залежність від {} ігнорується, оскільки її немає у списку дозволених - - - - - Installing dependencies - Встановлення залежностей - - - - - Cannot execute Python - Не вдалося виконати Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Не вдалося автоматично знайти виконуваний файл Python, або шлях до нього вказано неправильно. Будь ласка, перевірте шлях до Python в параметрах Менеджера доповнень. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Не вдалося встановити залежності. Все одно продовжити встановлення {}? - - - - - Cannot execute pip - Неможливо виконати pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Не вдалося виконати pip, який може бути відсутнім у вашому пакеті Python. Переконайтеся, що у вашій системі встановлено pip, і повторіть спробу. Не вдалося виконати команду: - - - - - Continue with installation of {} anyway? - Продовжити встановлення {} у будь-якому випадку? - - - - - Package installation failed - Не вдалося встановити пакет - - - - See Report View for detailed failure log. - Докладний журнал помилок дивіться у Звіті. - - - - Installing Addon - Встановлення доповнення - - - - Installing FreeCAD Addon '{}' - Встановлення FreeCAD доповнення '{}' - - - - Cancelling - Скасування - - - - Cancelling installation of '{}' - Скасування встановлення '{}' - - - - {} was installed successfully - {} було успішно встановлено - - - - - Installation Failed - Помилка встановлення - - - - Failed to install {} - Не вдалося встановити {} - - - - - Create new toolbar - Створити нову панель інструментів - - - - - A macro installed with the FreeCAD Addon Manager - Макрос, встановлений за допомогою Диспетчера доповнень FreeCAD - - - - - Run - Indicates a macro that can be 'run' - Запустити - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Не вдається прочитати дані з GitHub: перевірте налаштування інтернет-з'єднання та проксі та спробуйте ще раз. - - - - XML failure while reading metadata from file {} - Помилка XML під час читання метаданих з файлу {} - - - - Invalid metadata in file {} - Неприпустимі метадані у файлі {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - ПОПЕРЕДЖЕННЯ: Шлях, вказаний у метаданих package.xml, не збігається з поточною перевіреною гілкою. - - - - Name - Назва - - - - Class - Клас - - - - Description - Опис - - - - Subdirectory - Підкаталог - - - - Files - Файли - - - - Select the folder containing your Addon - Виберіть папку з вашим доповненням - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - Немає Vermin, скасування операції. - - - - Scanning Addon for Python version compatibility - Перевірка доповнення на сумісність версій Python - - - - Minimum Python Version Detected - Виявлено мінімальну версію Python - - - - Vermin auto-detected a required version of Python 3.{} - Vermin автоматично визначив необхідну версію Python 3.{} - - - - Install Vermin? - Встановити Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Для автоматичного визначення необхідної версії Python для цього доповнення потрібен Vermin (https://pypi.org/project/vermin/). Встановити? - - - - Attempting to install Vermin from PyPi - Спроба встановити Vermin з PyPi - - - - - Installation failed - Помилка встановлення - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Не вдалося встановити Vermin -- для деталей перевірте звіт. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Не вдалося імпортувати Vermin після встановлення - неможливо сканувати доповнення. - - - - Select an icon file for this package - Виберіть файл піктограми для цього пакета - - - - Filter is valid - Фільтр дійсний - - - - Filter regular expression is invalid - Регулярний вираз фільтра є недійсним - - - - Search... - Шукати... - - - - Click for details about package {} - Натисніть, щоб дізнатися більше про пакет {} - - - - Click for details about workbench {} - Натисніть, щоб дізнатися більше про робочий простір {} - - - - Click for details about macro {} - Натисніть, щоб дізнатися більше про макрос {} - - - - Maintainers: - Супровідники: - - - - Tags - Мітки - - - - {} ★ on GitHub - {} ★ на GitHub - - - - No ★, or not on GitHub - Немає ★ або немає на GitHub - - - - Created - Створено - - - - Updated - Оновлено - - - - Score: - Оцінка: - - - - - Up-to-date - Актуально - - - - - - - - Update available - Доступне оновлення - - - - - Pending restart - Очікує перезавантаження - - - - - DISABLED - ВИМКНЕНО - - - - Installed version - Встановлена версія - - - - Unknown version - Невідома версія - - - - Installed on - Встановлено на - - - - Available version - Доступна версія - - - - Filter by... - Фільтрувати за... - - - - Addon Type - Тип доповнення - - - - - Any - Будь-який - - - - Macro - Макрос - - - - Preference Pack - Набір Налаштувань - - - - Installation Status - Стан встановлення - - - - Not installed - Не встановлено - - - - Filter - Фільтр - - - - DANGER: Developer feature - НЕБЕЗПЕКА: Функція розробника - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - НЕБЕЗПЕКА: Перемикання гілок призначено для розробників і бета-тестерів, і може призвести до пошкодження документів, відсутності зворотної сумісності, нестабільності, збоїв і/або передчасної теплової смерті всесвіту. Ви впевнені, що хочете продовжити? - - - - There are local changes - Наявні локальні зміни - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - ПОПЕРЕДЖЕННЯ: Цей репозиторій має нефіксовані локальні зміни. Ви впевнені, що хочете змінити гілки (тим самим принісши зміни)? - - - - Local - Table header for local git ref name - Локально - - - - Remote tracking - Table header for git remote tracking branch name - Дистанційне відстеження - - - - Last Updated - Table header for git update date - Останнє оновлення - - - - Installation of Python package {} failed - Не вдалося встановити пакет Python {} - - - - Installation of optional package failed - Не вдалося встановити необов'язковий пакет - - - - Installing required dependency {} - Встановлення необхідної залежності {} - - - - Installation of Addon {} failed - Помилка встановлення доповнення {} - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - Не вдалося декодувати файл {} доповнення '{}' - - - - Any dependency information in this file will be ignored - Будь-яка інформація про залежності у цьому файлі буде проігнорована - - - - Unable to open macro wiki page at {} - Не вдалося відкрити вікі-сторінку макросів за адресою {} - - - - Unable to fetch the code of this macro. - Не вдається отримати код макросу. - - - - Unable to retrieve a description from the wiki for macro {} - Не вдається отримати опис з wiki для макросу {} - - - - Unable to open macro code URL {} - Не вдалося відкрити URL-адресу макросу {} - - - - Unable to fetch macro-specified file {} from {} - Не вдається отримати файл {}, вказаний у макросі, з {} - - - - Could not locate macro-specified file {} (expected at {}) - Не вдалося знайти вказаний макросом файл {} (очікувався за адресою {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Нерозпізнаний внутрішній робочий простір '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Попередження розробника доповнення: URL-адреса сховища, задана у файлі package.xml для доповнення {} ({}), не відповідає URL-адресі, з якої вона була отримана ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Попередження розробника доповнення: гілка репозиторію, зазначена у файлі package.xml для надбудови {} ({}), не відповідає гілці, з якої її було отримано ({}) - - - - - Got an error when trying to import {} - Виникла помилка при спробі імпорту {} - - - - An unknown error occurred - Сталася невідома помилка - - - - Could not find addon {} to remove it. - Не вдалося знайти доповнення {}, щоб видалити його. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Виконання скрипту uninstall.py доповнення' не вдалося. Продовження видалення... - - - - Removed extra installed file {} - Видалено додатково встановлений файл {} - - - - Error while trying to remove extra installed file {} - Помилка при спробі видалення додаткового встановленого файлу {} - - - - Error while trying to remove macro file {}: - Помилка при спробі видалити файл макросу {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Не вдалося підʼєднатися до GitHub. Перевірте зʼєднання та параметри проксі-сервера. - - - - WARNING: Duplicate addon {} ignored - УВАГА: Дублікат доповнення {} проігноровано - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - Виникла помилка при оновленні макросів з GitHub, спроба чистої перевірки... - - - - Attempting to do a clean checkout... - Спроба зробити чисту перевірку... - - - - Clean checkout succeeded - Чиста перевірка успішно виконана - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Не вдалося оновити макроси з GitHub - спробуйте очистити кеш Менеджера доповнень. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Помилка підключення до Wiki, FreeCAD наразі не може отримати список макросів Wiki - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - Помилка читання метаданих з {name} - - - - Failed to fetch code for macro '{name}' - Не вдалося отримати код для макросу '{name}' - - - - Addon Manager: a worker process failed to complete while fetching {name} - Менеджер доповнень: робочий процес не вдалося завершити під час отримання {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - З {num_macros} макросів {num_failed} завершилися під час обробки - - - - Addon Manager: a worker process failed to halt ({name}) - Менеджер доповнень: не вдалося зупинити робочий процес ({name}) - - - - Timeout while fetching metadata for macro {} - Тайм-аут під час отримання метаданих для макросу {} - - - - Failed to kill process for macro {}! - - Не вдалося завершити процес для макросу {}! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Не вдалося отримати статистику доповнення з {} -- точним буде лише сортування за алфавітом - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Не вдалося отримати оцінку доповнення з '{}' -- сортування за оцінкою не вдасться - - - - - - Repository URL - Preferences header for custom repositories - URL репозиторію - - - - Branch name - Preferences header for custom repositories - Назва гілки - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - Створення резервної копії вихідного каталогу та повторне клонування - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Перейменування гілки git завершилося невдало з наступним повідомленням: - - - - Installing - Встановлення - - - - Succeeded - Успішно - - - - Failed - Помилка - - - - Update was cancelled - Оновлення було скасовано - - - - some addons may have been updated - деякі додатки можуть бути оновлені - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Завантаження інформації для {} з вікі-сторінки рецептів макросів FreeCAD... - - - - Loading page for {} from {}... - Завантаження сторінки для {} з {}... - - - - Failed to download data from {} -- received response code {}. - Не вдалося завантажити дані з {} -- отримано код відповіді {}. - - - - Composite view - Композитний вигляд - - - - Expanded view - Розширений вигляд - - - - Compact view - Компактний вигляд - - - - Alphabetical - Sort order - За алфавітом - - - - Last Updated - Sort order - Останнє оновлення - - - - Date Created - Sort order - Дата створення - - - - GitHub Stars - Sort order - Зірки на Github - - - - Score - Sort order - Оцінка - - - - Std_AddonMgr - - - &Addon manager - &Менеджер доповнень - - - - Manage external workbenches, macros, and preference packs - Керування зовнішніми робочими просторами, макросами та пакетами налаштувань - - - - AddonInstaller - - - Finished removing {} - Завершено видалення {} - - - - Failed to remove some files - Не вдалося видалити деякі файли - - - - Addons installer - - - Finished updating the following addons - Завершено оновлення наступних доповнень - - - - Workbench - - - Auto-Created Macro Toolbar - Автоматично створено панель інструментів макросу - - - - QObject - - - Addon Manager - Менеджер додатків - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_val-ES.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_val-ES.qm deleted file mode 100644 index dea7cac0a9..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_val-ES.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_val-ES.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_val-ES.ts deleted file mode 100644 index 7d186889d5..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_val-ES.ts +++ /dev/null @@ -1,2494 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Custom repository - - - - Repository URL - Repository URL - - - - Branch - Branch - - - - CompactView - - - - Icon - Icona - - - - - <b>Package Name</b> - <b>Package Name</b> - - - - - Version - Versió - - - - - Description - Descripció - - - - Update Available - Update Available - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependencies - - - - Dependency type - Dependency type - - - - Name - Nom - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Descripció - - - - Discussion URL - Discussion URL - - - - Icon - Icona - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Repository URL - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Versió - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Addon Manager - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Add-on Manager: Warning! - Add-on Manager: Warning! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - - - - Continue - Continua - - - - Cancel - Cancel·la - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - - Icon - Icona - - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - - Version - Versió - - - - - (tags) - (tags) - - - - - Description - Descripció - - - - - Maintainer - Maintainer - - - - Update Available - Update Available - - - - labelSort - labelSort - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - Licenses - Licenses - - - - License - Llicència - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - Nom - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - - - - Automatically check for updates at start (requires git) - Automatically check for updates at start (requires git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manual (no automatic updates) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons without a license - Hide Addons without a license - - - - Hide Addons with non-FSF Free/Libre license - Hide Addons with non-FSF Free/Libre license - - - - Hide Addons with non-OSI-approved license - Hide Addons with non-OSI-approved license - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Proxy - Proxy - - - - No proxy - Sense servidor intermediari - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Score source URL - Score source URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - - - - Path to Git executable (optional): - Path to Git executable (optional): - - - - The path to the git executable. Autodetected if needed and not specified. - The path to the git executable. Autodetected if needed and not specified. - - - - Advanced Options - Advanced Options - - - - Show option to change branches (requires git) - Show option to change branches (requires git) - - - - Disable git (fall back to ZIP downloads only) - Disable git (fall back to ZIP downloads only) - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Install - - - - Uninstall - Uninstall - - - - Update - Actualitza - - - - Run Macro - Run Macro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Diàleg - - - - TextLabel - EtiquetaText - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Macro - - - - Preference Pack - Preference Pack - - - - Workbench - Banc de treball - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Icona - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Versió - - - - Description - Descripció - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch: - Change to branch: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Nom: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - AddonsInstaller - - - Starting up... - Starting up... - - - - Loading addon information - Loading addon information - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - Refresh local cache - - - - Updating cache... - Updating cache... - - - - - Checking for updates... - Checking for updates... - - - - Temporary installation of macro failed. - Temporary installation of macro failed. - - - - - Close - Tanca - - - - Update all addons - Update all addons - - - - Check for updates - Check for updates - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Apply %n available update(s) - Apply %n available update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - - - - Maintainer - Maintainer - - - - - - - Author - Autor - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Actualitza - - - - Updating... - Updating... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - Currently on branch {}, name changed to {} - Currently on branch {}, name changed to {} - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - Update check in progress - Update check in progress - - - - Installation location - Installation location - - - - Changed to branch '{}' -- please restart to use Addon. - Changed to branch '{}' -- please restart to use Addon. - - - - This Addon has been updated. Restart FreeCAD to see changes. - This Addon has been updated. Restart FreeCAD to see changes. - - - - Disabled - Disabled - - - - Currently on branch {}, update available to version {} - Currently on branch {}, update available to version {} - - - - Update available to version {} - Update available to version {} - - - - This is the latest version available - This is the latest version available - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 only - WARNING: This addon is Python 2 only - - - - WARNING: This addon requires FreeCAD {} - WARNING: This addon requires FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - This Addon will be enabled next time you restart FreeCAD. - This Addon will be enabled next time you restart FreeCAD. - - - - This Addon will be disabled next time you restart FreeCAD. - This Addon will be disabled next time you restart FreeCAD. - - - - - - Success - Success - - - - Branch change succeeded, please restart to use the new version. - Branch change succeeded, please restart to use the new version. - - - - Install - Install - - - - Uninstall - Uninstall - - - - Enable - Habilita - - - - Disable - Desactiva - - - - - Check for update - Check for update - - - - Run - executa - - - - Change branch... - Change branch... - - - - Return to package list - Return to package list - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Failed to create installation manifest file: - - Failed to create installation manifest file: - - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Automàtica - - - - - Workbench - Banc de treball - - - - Addon - Addon - - - - Python - Python - - - - Yes - Yes - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Other... - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - executa - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Nom - - - - Class - Classe - - - - Description - Descripció - - - - Subdirectory - Subdirectory - - - - Files - Fitxers - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Search... - Busca... - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Tags - - - - {} ★ on GitHub - {} ★ on GitHub - - - - No ★, or not on GitHub - No ★, or not on GitHub - - - - Created - Created - - - - Updated - Updated - - - - Score: - Score: - - - - - Up-to-date - Up-to-date - - - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Installed version - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Available version - - - - Filter by... - Filter by... - - - - Addon Type - Addon Type - - - - - Any - Qualsevol - - - - Macro - Macro - - - - Preference Pack - Preference Pack - - - - Installation Status - Installation Status - - - - Not installed - Not installed - - - - Filter - Filtre - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - Local - Table header for local git ref name - Local - - - - Remote tracking - Table header for git remote tracking branch name - Remote tracking - - - - Last Updated - Table header for git update date - Last Updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded package.xml for {} - Downloaded package.xml for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Downloaded metadata.txt for {} - Downloaded metadata.txt for {} - - - - Downloaded requirements.txt for {} - Downloaded requirements.txt for {} - - - - Downloaded icon for {} - Downloaded icon for {} - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (expected at {}) - Could not locate macro-specified file {} (expected at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - - Got an error when trying to import {} - Got an error when trying to import {} - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Git is disabled, skipping git macros - Git is disabled, skipping git macros - - - - Attempting to change non-git Macro setup to use git - - Attempting to change non-git Macro setup to use git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Unable to fetch git updates for workbench {} - Unable to fetch git updates for workbench {} - - - - git status failed for {} - git status failed for {} - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Caching macro code... - Caching macro code... - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Getting metadata from macro {} - Getting metadata from macro {} - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Retrieving macro description... - Retrieving macro description... - - - - Retrieving info from git - Retrieving info from git - - - - Retrieving info from wiki - Retrieving info from wiki - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - Failed to get Addon score from '{}' -- sorting by score will fail - - - - - Repository URL - Preferences header for custom repositories - Repository URL - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic git update failed with the following message: - Basic git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using git - Failed to clone {} into {} using git - - - - Git branch rename failed with the following message: - Git branch rename failed with the following message: - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - Loading info for {} from the FreeCAD Macro Recipes wiki... - - - - Loading page for {} from {}... - Loading page for {} from {}... - - - - Failed to download data from {} -- received response code {}. - Failed to download data from {} -- received response code {}. - - - - Composite view - Composite view - - - - Expanded view - Expanded view - - - - Compact view - Compact view - - - - Alphabetical - Sort order - Alphabetical - - - - Last Updated - Sort order - Last Updated - - - - Date Created - Sort order - Date Created - - - - GitHub Stars - Sort order - GitHub Stars - - - - Score - Sort order - Score - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - - Workbench - - - Auto-Created Macro Toolbar - Auto-Created Macro Toolbar - - - - QObject - - - Addon Manager - Addon Manager - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_vi.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_vi.qm deleted file mode 100644 index 9e2d085650..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_vi.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_vi.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_vi.ts deleted file mode 100644 index 6a461cfe2d..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_vi.ts +++ /dev/null @@ -1,2477 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - Custom repository - - - - Repository URL - Repository URL - - - - Branch - Branch - - - - CompactView - - - Form - Hình thức - - - - Icon - Biểu tượng - - - - <b>Package Name</b> - <b>Package Name</b> - - - - Version - Phiên bản - - - - Description - Mô tả - - - - UpdateAvailable - UpdateAvailable - - - - DependencyDialog - - - Dependencies - Dependencies - - - - Dependency type - Dependency type - - - - Name - Tên - - - - Optional? - Optional? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - Resolve Dependencies - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - - - - FreeCAD Addons - FreeCAD Addons - - - - Required Python modules - Required Python modules - - - - Optional Python modules - Optional Python modules - - - - DeveloperModeDialog - - - Addon Developer Tools - Addon Developer Tools - - - - Path to Addon - Path to Addon - - - - - Browse... - Browse... - - - - Metadata - Metadata - - - - Primary branch - Primary branch - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - - - - Description - Mô tả - - - - Discussion URL - Discussion URL - - - - Icon - Biểu tượng - - - - Bugtracker URL - Bugtracker URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - - - - (Optional) - (Optional) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - - - - README URL - README URL - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - - - - Repository URL - Repository URL - - - - Website URL - Website URL - - - - Documentation URL - Documentation URL - - - - Addon Name - Addon Name - - - - Version - Phiên bản - - - - (Recommended) - (Recommended) - - - - Minimum Python - Minimum Python - - - - (Optional, only 3.x version supported) - (Optional, only 3.x version supported) - - - - Detect... - Detect... - - - - Addon Contents - Addon Contents - - - - Dialog - - - Addon Manager - Addon Manager - - - - Downloading info... - Thông tin tải xuống... - - - - Pause cache update - Pause cache update - - - - Refresh local cache - Refresh local cache - - - - Download and apply all available updates - Download and apply all available updates - - - - Update all Addons - Update all Addons - - - - Check for updates - Check for updates - - - - View and update Python package dependencies - View and update Python package dependencies - - - - Python dependencies... - Python dependencies... - - - - Developer tools... - Developer tools... - - - - Close the Addon Manager - Close the Addon Manager - - - - Close - Đóng - - - - Edit Tags - Edit Tags - - - - Comma-separated list of tags describing this item: - Comma-separated list of tags describing this item: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - - - - Welcome to the Addon Manager - Welcome to the Addon Manager - - - - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - The addons that can be installed here are not officially part of FreeCAD, and are not reviewed by the FreeCAD team. Make sure you know what you are installing! - - - - Download Settings - Download Settings - - - - Automatically check installed Addons for updates - Automatically check installed Addons for updates - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - No proxy - No proxy - - - - System proxy - System proxy - - - - User-defined proxy: - User-defined proxy: - - - - These and other settings are available in the FreeCAD Preferences window. - These and other settings are available in the FreeCAD Preferences window. - - - - EditDependencyDialog - - - Edit Dependency - Edit Dependency - - - - Dependency Type - Dependency Type - - - - Dependency - Dependency - - - - Package name, if "Other..." - Package name, if "Other..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - - - - Optional - Optional - - - - ExpandedView - - - Form - Hình thức - - - - Icon - Biểu tượng - - - - <h1>Package Name</h1> - <h1>Package Name</h1> - - - - Version - Phiên bản - - - - (tags) - (tags) - - - - Description - Mô tả - - - - Maintainer - Maintainer - - - - UpdateAvailable - UpdateAvailable - - - - Form - - - - Form - Hình thức - - - - Licenses - Licenses - - - - License - Giấy phép - - - - License file - License file - - - - People - People - - - - Kind - Kind - - - - Name - Tên - - - - Email - Email - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - Advanced Version Mapping - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - - - - FreeCAD Version - FreeCAD Version - - - - Best-available branch, tag, or commit - Best-available branch, tag, or commit - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - Supported FreeCAD Versions - - - - Minimum FreeCAD Version Supported - Minimum FreeCAD Version Supported - - - - - Optional - Optional - - - - Maximum FreeCAD Version Supported - Maximum FreeCAD Version Supported - - - - Advanced version mapping... - Advanced version mapping... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - Addon manager options - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates -(this requires the GitPython package installed on your system) - - - - Automatically check for updates at start (requires git) - Automatically check for updates at start (requires git) - - - - Download Macro metadata (approximately 10MB) - Download Macro metadata (approximately 10MB) - - - - Cache update frequency - Cache update frequency - - - - Manual (no automatic updates) - Manual (no automatic updates) - - - - Daily - Daily - - - - Weekly - Weekly - - - - Hide Addons marked Python 2 Only - Hide Addons marked Python 2 Only - - - - Hide Addons marked Obsolete - Hide Addons marked Obsolete - - - - Hide Addons that require a newer version of FreeCAD - Hide Addons that require a newer version of FreeCAD - - - - Custom repositories - Custom repositories - - - - Proxy - Proxy - - - - No proxy - No proxy - - - - User system proxy - User system proxy - - - - User-defined proxy: - User-defined proxy: - - - - Python executable (optional): - Python executable (optional): - - - - The path to the Python executable for package installation with pip. Autodetected if needed and not specified. - The path to the Python executable for package installation with pip. Autodetected if needed and not specified. - - - - git executable (optional): - git executable (optional): - - - - The path to the git executable. Autodetected if needed and not specified. - The path to the git executable. Autodetected if needed and not specified. - - - - Advanced Options - Advanced Options - - - - Show option to change branches (requires git) - Show option to change branches (requires git) - - - - Disable git (fall back to ZIP downloads only) - Disable git (fall back to ZIP downloads only) - - - - Activate Addon Manager options intended for developers of new Addons. - Activate Addon Manager options intended for developers of new Addons. - - - - Addon developer mode - Addon developer mode - - - - PackageDetails - - - Form - Hình thức - - - - Uninstalls a selected macro or workbench - Uninstalls a selected macro or workbench - - - - Install - Install - - - - Uninstall - Uninstall - - - - Update - Cập nhật - - - - Run Macro - Run Macro - - - - Change branch - Change branch - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - Manage Python Dependencies - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - - - - Package name - Package name - - - - Installed version - Installed version - - - - Available version - Available version - - - - Used by - Used by - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - - - - Update all available - Update all available - - - - SelectFromList - - - Dialog - Hộp thoại - - - - TextLabel - Văn bản dán nhãn - - - - UpdateAllDialog - - - Updating Addons - Updating Addons - - - - Updating out-of-date addons... - Updating out-of-date addons... - - - - addContentDialog - - - Content Item - Content Item - - - - Content type: - Content type: - - - - Macro - Macro - - - - Preference Pack - Preference Pack - - - - Workbench - Bàn làm việc - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - - - - This is the only item in the Addon - This is the only item in the Addon - - - - Main macro file - Main macro file - - - - The file with the macro's metadata in it - The file with the macro's metadata in it - - - - - - Browse... - Browse... - - - - Preference Pack Name - Preference Pack Name - - - - Workbench class name - Workbench class name - - - - Class that defines "Icon" data member - Class that defines "Icon" data member - - - - Subdirectory - Subdirectory - - - - Optional, defaults to name of content item - Optional, defaults to name of content item - - - - Icon - Biểu tượng - - - - actualIcon - actualIcon - - - - Optional, defaults to inheriting from top-level Addon - Optional, defaults to inheriting from top-level Addon - - - - Tags... - Tags... - - - - Dependencies... - Dependencies... - - - - FreeCAD Versions... - FreeCAD Versions... - - - - Other Metadata - Other Metadata - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - - - - Version - Phiên bản - - - - Description - Mô tả - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - - - - Set to today (CalVer style) - Set to today (CalVer style) - - - - Display Name - Display Name - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - - - - add_toolbar_button_dialog - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - change_branch - - - Change Branch - Change Branch - - - - Change to branch or tag: - Change to branch or tag: - - - - copyrightInformationDialog - - - Copyright Information - Copyright Information - - - - Copyright holder: - Copyright holder: - - - - Copyright year: - Copyright year: - - - - personDialog - - - Add Person - Add Person - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - - - - Name: - Tên: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - Email is required for maintainers, and optional for authors. - - - - proxy_authentication - - - Proxy login required - Proxy login required - - - - Proxy requires authentication - Proxy requires authentication - - - - Proxy: - Proxy: - - - - Placeholder for proxy address - Placeholder for proxy address - - - - Realm: - Realm: - - - - Placeholder for proxy realm - Placeholder for proxy realm - - - - Username - Username - - - - Password - Password - - - - selectLicenseDialog - - - Select a license - Select a license - - - - About... - About... - - - - License name: - License name: - - - - Path to license file: - Path to license file: - - - - (if required by license) - (if required by license) - - - - Browse... - Browse... - - - - Create... - Create... - - - - select_toolbar_dialog - - - - - - Select Toolbar - Select Toolbar - - - - Select a toolbar to add this macro to: - Select a toolbar to add this macro to: - - - - Ask every time - Ask every time - - - - toolbar_button - - - - Add button? - Add button? - - - - Add a toolbar button for this macro? - Add a toolbar button for this macro? - - - - Yes - Yes - - - - No - No - - - - Never - Never - - - - AddonsInstaller - - - Addon Manager - Addon Manager - - - - Starting up... - Starting up... - - - - Loading addon information - Loading addon information - - - - Worker process {} is taking a long time to stop... - Worker process {} is taking a long time to stop... - - - - Previous cache process was interrupted, restarting... - - Previous cache process was interrupted, restarting... - - - - - Custom repo list changed, forcing recache... - - Custom repo list changed, forcing recache... - - - - - Addon manager - Addon manager - - - - You must restart FreeCAD for changes to take effect. - You must restart FreeCAD for changes to take effect. - - - - Restart now - Restart now - - - - Restart later - Restart later - - - - - Refresh local cache - Refresh local cache - - - - Updating cache... - Updating cache... - - - - Could not find addon '{}' to select - - Could not find addon '{}' to select - - - - - - Checking for updates... - Checking for updates... - - - - Apply {} update(s) - Apply {} update(s) - - - - No updates available - No updates available - - - - - - Cannot launch a new installer until the previous one has finished. - Cannot launch a new installer until the previous one has finished. - - - - Execution of macro failed. See console for failure details. - Execution of macro failed. See console for failure details. - - - - - - - Maintainer - Maintainer - - - - - - - Author - Tác giả - - - - New Python Version Detected - New Python Version Detected - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - - - - Processing, please wait... - Processing, please wait... - - - - - Update - Cập nhật - - - - Updating... - Updating... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - Failed to convert the specified proxy port '{}' to a port number - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - Parameter error: mutually exclusive proxy options set. Resetting to default. - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - - - - Addon Manager: Unexpected {} response from server - Addon Manager: Unexpected {} response from server - - - - Error with encrypted connection - Error with encrypted connection - - - - - - Confirm remove - Confirm remove - - - - Are you sure you want to uninstall {}? - Are you sure you want to uninstall {}? - - - - - - Removing Addon - Removing Addon - - - - Removing {} - Removing {} - - - - - Uninstall complete - Uninstall complete - - - - - Uninstall failed - Uninstall failed - - - - Addon Manager Warning: Could not import QtWebEngineWidgets -- README data will display as text-only - Addon Manager Warning: Could not import QtWebEngineWidgets -- README data will display as text-only - - - - Version {version} installed on {date} - Version {version} installed on {date} - - - - Version {version} installed - Version {version} installed - - - - Installed on {date} - Installed on {date} - - - - - - - Installed - Installed - - - - On branch {}, update available to version - On branch {}, update available to version - - - - Update available to version - Update available to version - - - - An update is available - An update is available - - - - Git tag '{}' checked out, no updates possible - Git tag '{}' checked out, no updates possible - - - - This is the latest version available for branch {} - This is the latest version available for branch {} - - - - Updated, please restart FreeCAD to use - Updated, please restart FreeCAD to use - - - - Update check in progress - Update check in progress - - - - Automatic update checks disabled - Automatic update checks disabled - - - - Installation location - Installation location - - - - WARNING: This addon is obsolete - WARNING: This addon is obsolete - - - - WARNING: This addon is Python 2 Only - WARNING: This addon is Python 2 Only - - - - WARNING: This addon requires FreeCAD - WARNING: This addon requires FreeCAD - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - - - - - No URL or wiki page provided by this macro - No URL or wiki page provided by this macro - - - - Could not load README data from URL {} - Could not load README data from URL {} - - - - This Addon will be enabled next time you restart fci. - This Addon will be enabled next time you restart fci. - - - - This Addon will be disabled next time you restart fci. - This Addon will be disabled next time you restart fci. - - - - - - Success - Success - - - - Branch change succeeded, please restart to use the new version. - Branch change succeeded, please restart to use the new version. - - - - Changed to git ref '{}' -- please restart to use Addon. - Changed to git ref '{}' -- please restart to use Addon. - - - - Page JavaScript reported - Page JavaScript reported - - - - Install - Install - - - - Uninstall - Uninstall - - - - Check for Update - Check for Update - - - - Run Macro - Run Macro - - - - Change Branch - Change Branch - - - - Enable - Bật - - - - Disable - Không cho phép - - - - Return to package list - Return to package list - - - - QtWebEngine Python bindings not installed -- using fallback README display. See Report View for details and installation instructions. - QtWebEngine Python bindings not installed -- using fallback README display. See Report View for details and installation instructions. - - - - The page is taking a long time to load... showing the data we have so far... - The page is taking a long time to load... showing the data we have so far... - - - - Checking connection - Checking connection - - - - Checking for connection to GitHub... - Checking for connection to GitHub... - - - - Connection failed - Connection failed - - - - Missing dependency - Missing dependency - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - - - - Other... - For providing a license other than one listed - Other... - - - - Select the corresponding license file in your Addon - Select the corresponding license file in your Addon - - - - Location for new license file - Location for new license file - - - - Received {} response code from server - Received {} response code from server - - - - Failed to install macro {} - Failed to install macro {} - - - - Unrecognized content kind '{}' - Unrecognized content kind '{}' - - - - Unable to locate icon at {} - Unable to locate icon at {} - - - - Select an icon file for this content item - Select an icon file for this content item - - - - - - {} is not a subdirectory of {} - {} is not a subdirectory of {} - - - - Select the subdirectory for this content item - Select the subdirectory for this content item - - - - Automatic - Tự động - - - - Workbench - Bàn làm việc - - - - Addon - Addon - - - - Python - Python - - - - Yes - Yes - - - - Internal Workbench - Internal Workbench - - - - External Addon - External Addon - - - - Python Package - Python Package - - - - - Other... - Other... - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually: - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually: - - - - Too many to list - Too many to list - - - - - - - - - Missing Requirement - Missing Requirement - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - - - - Press OK to install anyway. - Press OK to install anyway. - - - - - Incompatible Python version - Incompatible Python version - - - - This Addon (or one if its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - This Addon (or one if its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - - - - Optional dependency on {} ignored because it is not in the allow-list - Optional dependency on {} ignored because it is not in the allow-list - - - - - Installing dependencies - Installing dependencies - - - - - Cannot execute Python - Cannot execute Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - - - - Dependencies could not be installed. Continue with installation of {} anyway? - Dependencies could not be installed. Continue with installation of {} anyway? - - - - - Cannot execute pip - Cannot execute pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - - - - - Continue with installation of {} anyway? - Continue with installation of {} anyway? - - - - - Package installation failed - Package installation failed - - - - See Report View for detailed failure log. - See Report View for detailed failure log. - - - - Installing Addon - Installing Addon - - - - Installing FreeCAD Addon '{}' - Installing FreeCAD Addon '{}' - - - - Cancelling - Cancelling - - - - Cancelling installation of '{}' - Cancelling installation of '{}' - - - - {} was installed successfully - {} was installed successfully - - - - - Installation Failed - Installation Failed - - - - Failed to install {} - Failed to install {} - - - - - Create new toolbar - Create new toolbar - - - - - A macro installed with the FreeCAD Addon Manager - A macro installed with the FreeCAD Addon Manager - - - - - Run - Indicates a macro that can be 'run' - Chạy - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - - - - XML failure while reading metadata from file {} - XML failure while reading metadata from file {} - - - - Invalid metadata in file {} - Invalid metadata in file {} - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - - - - Name - Tên - - - - Class - Lớp - - - - Description - Mô tả - - - - Subdirectory - Subdirectory - - - - Files - Files - - - - Select the folder containing your Addon - Select the folder containing your Addon - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - No Vermin, cancelling operation. - - - - Scanning Addon for Python version compatibility - Scanning Addon for Python version compatibility - - - - Minimum Python Version Detected - Minimum Python Version Detected - - - - Vermin auto-detected a required version of Python 3.{} - Vermin auto-detected a required version of Python 3.{} - - - - Install Vermin? - Install Vermin? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - - - - Attempting to install Vermin from PyPi - Attempting to install Vermin from PyPi - - - - - Installation failed - Installation failed - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - Failed to install Vermin -- check Report View for details. - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - Failed to import vermin after installation -- cannot scan Addon. - - - - Select an icon file for this package - Select an icon file for this package - - - - Filter is valid - Filter is valid - - - - Filter regular expression is invalid - Filter regular expression is invalid - - - - Click for details about package {} - Click for details about package {} - - - - Click for details about workbench {} - Click for details about workbench {} - - - - Click for details about macro {} - Click for details about macro {} - - - - Maintainers: - Maintainers: - - - - Tags - Tags - - - - updated - updated - - - - - Up-to-date - Up-to-date - - - - - - Update available - Update available - - - - - Pending restart - Pending restart - - - - - DISABLED - DISABLED - - - - Installed version - Installed version - - - - Unknown version - Unknown version - - - - Installed on - Installed on - - - - Available version - Available version - - - - Show Addons containing: - Show Addons containing: - - - - All - Tất cả - - - - Workbenches - Bàn làm việc - - - - Macros - Macro - - - - Preference Packs - Preference Packs - - - - Status: - Status: - - - - Any - Bất kỳ - - - - Not installed - Not installed - - - - Filter - Bộ lọc - - - - OK - Đồng ý - - - - DANGER: Developer feature - DANGER: Developer feature - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - - - - There are local changes - There are local changes - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - - - - - - Branch - git terminology - Branch - - - - Tag - git terminology - Tag - - - - Kind - Table header for git ref type (e.g. either Tag or Branch) - Kind - - - - Local name - Table header for git ref name - Local name - - - - Tracking - Table header for git remote tracking branch name name - Theo dõi - - - - Local updated - Table header for git update time of local branch - Local updated - - - - Remote updated - Table header for git update time of remote branch - Remote updated - - - - Installation of Python package {} failed - Installation of Python package {} failed - - - - Installation of optional package failed - Installation of optional package failed - - - - Installing required dependency {} - Installing required dependency {} - - - - Installation of Addon {} failed - Installation of Addon {} failed - - - - Downloaded package.xml for {} - Downloaded package.xml for {} - - - - Failed to decode {} file for Addon '{}' - Failed to decode {} file for Addon '{}' - - - - Any dependency information in this file will be ignored - Any dependency information in this file will be ignored - - - - Downloaded metadata.txt for {} - Downloaded metadata.txt for {} - - - - Downloaded requirements.txt for {} - Downloaded requirements.txt for {} - - - - Downloaded icon for {} - Downloaded icon for {} - - - - Unable to open macro wiki page at {} - Unable to open macro wiki page at {} - - - - Unable to fetch the code of this macro. - Unable to fetch the code of this macro. - - - - Unable to retrieve a description from the wiki for macro {} - Unable to retrieve a description from the wiki for macro {} - - - - Unable to open macro code URL {} - Unable to open macro code URL {} - - - - Unable to fetch macro-specified file {} from {} - Unable to fetch macro-specified file {} from {} - - - - Could not locate macro-specified file {} (should have been at {}) - Could not locate macro-specified file {} (should have been at {}) - - - - {}: Unrecognized internal workbench '{}' - {}: Unrecognized internal workbench '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - - - - An unknown error occurred - An unknown error occurred - - - - Could not find addon {} to remove it. - Could not find addon {} to remove it. - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - - - - Removed extra installed file {} - Removed extra installed file {} - - - - Error while trying to remove extra installed file {} - Error while trying to remove extra installed file {} - - - - Error while trying to remove macro file {}: - Error while trying to remove macro file {}: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - Failed to connect to GitHub. Check your connection and proxy settings. - - - - WARNING: Duplicate addon {} ignored - WARNING: Duplicate addon {} ignored - - - - Workbenches list was updated. - Workbenches list was updated. - - - - Git is disabled, skipping git macros - Git is disabled, skipping git macros - - - - Attempting to change non-git Macro setup to use git - - Attempting to change non-git Macro setup to use git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - An error occurred updating macros from GitHub, trying clean checkout... - - - - Attempting to do a clean checkout... - Attempting to do a clean checkout... - - - - Clean checkout succeeded - Clean checkout succeeded - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - - - - Unable to fetch git updates for workbench {} - Unable to fetch git updates for workbench {} - - - - git status failed for {} - git status failed for {} - - - - Failed to read metadata from {name} - Failed to read metadata from {name} - - - - Failed to fetch code for macro '{name}' - Failed to fetch code for macro '{name}' - - - - Caching macro code... - Caching macro code... - - - - Addon Manager: a worker process failed to complete while fetching {name} - Addon Manager: a worker process failed to complete while fetching {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - Out of {num_macros} macros, {num_failed} timed out while processing - - - - Addon Manager: a worker process failed to halt ({name}) - Addon Manager: a worker process failed to halt ({name}) - - - - Getting metadata from macro {} - Getting metadata from macro {} - - - - Timeout while fetching metadata for macro {} - Timeout while fetching metadata for macro {} - - - - Failed to kill process for macro {}! - - Failed to kill process for macro {}! - - - - - Retrieving macro description... - Retrieving macro description... - - - - Retrieving info from git - Retrieving info from git - - - - Retrieving info from wiki - Retrieving info from wiki - - - - Repository URL - Preferences header for custom repositories - Repository URL - - - - Branch name - Preferences header for custom repositories - Branch name - - - - Basic git update failed with the following message: - Basic git update failed with the following message: - - - - Backing up the original directory and re-cloning - Backing up the original directory and re-cloning - - - - Failed to clone {} into {} using git - Failed to clone {} into {} using git - - - - Installing - Installing - - - - Succeeded - Succeeded - - - - Failed - Failed - - - - Update was cancelled - Update was cancelled - - - - some addons may have been updated - some addons may have been updated - - - - Std_AddonMgr - - - &Addon manager - &Addon manager - - - - Manage external workbenches, macros, and preference packs - Manage external workbenches, macros, and preference packs - - - - AddonInstaller - - - Finished removing {} - Finished removing {} - - - - Failed to remove some files - Failed to remove some files - - - - Addons installer - - - Finished updating the following addons - Finished updating the following addons - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-CN.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_zh-CN.qm deleted file mode 100644 index 8352867329..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-CN.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-CN.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_zh-CN.ts deleted file mode 100644 index f34f691d06..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-CN.ts +++ /dev/null @@ -1,2486 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - 自定义插件仓库 - - - - Repository URL - 仓库的网址 - - - - Branch - 分支 - - - - CompactView - - - - Icon - 图标 - - - - - <b>Package Name</b> - <b>软件包名称</b> - - - - - Version - 版本 - - - - - Description - 描述 - - - - Update Available - 更新可用 - - - - UpdateAvailable - 可用更新 - - - - DependencyDialog - - - Dependencies - 依赖 - - - - Dependency type - 依赖类型 - - - - Name - 名称 - - - - Optional? - 可选的? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - 解析依赖 - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - 此插件具有以下所需和可选的依赖关系。您必须先安装它们,然后才能使用此插件。 - -您想要插件管理器自动安装它们吗?选择 “忽略” 将直接安装插件,而不安装依赖项。 - - - - FreeCAD Addons - FreeCAD 插件 - - - - Required Python modules - 必需的 Python 模块 - - - - Optional Python modules - 可选的 Python 模块 - - - - DeveloperModeDialog - - - Addon Developer Tools - 插件开发者工具 - - - - Path to Addon - 插件路径 - - - - - Browse... - 浏览... - - - - Metadata - 元数据 - - - - Primary branch - 主要分支 - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - 此插件提供的解释,在插件管理器中显示。这个插件无需声明它是一个 FreeCAD 插件。 - - - - Description - 描述 - - - - Discussion URL - 讨论网址 - - - - Icon - 图标 - - - - Bugtracker URL - Bug 跟踪网址 - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - 支持语义化版本 (1.2.3-beta) 或日期版本 (2022.08.30) 风格 - - - - Set to today (CalVer style) - 设置为今日(CalVer风格) - - - - - - - (Optional) - (可选的) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - 显示在附加组件管理器'的附加组件列表中。 不应包含单词 "FreeCAD",并且必须是所有支持的操作系统上的有效目录名。 - - - - README URL - README 网址 - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - 提示:因为它是显示在 FreeCAD 内部的附加组件管理器中,所以无需占用空间来表达类似 "这是一个 FreeCAD 附加组件......"之类的描述——只需说明其用途即可。 - - - - Repository URL - 仓库的网址 - - - - Website URL - 网站网址 - - - - Documentation URL - 文档网址 - - - - Addon Name - 附加组件名称 - - - - Version - 版本 - - - - (Recommended) - (推荐) - - - - Minimum Python - 最低 Python 版本 - - - - (Optional, only 3.x version supported) - (可选,仅支持 3.x 版本) - - - - Detect... - 检测… - - - - Addon Contents - 附加组件内容 - - - - Dialog - - - Addon Manager - 插件管理器 - - - - Edit Tags - 编辑标签 - - - - Comma-separated list of tags describing this item: - 逗号分隔的描述此项目的标签列表: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - 提示:常用标签包括“装配”、“有限元方法(FEM)”、“网格”、“非均匀有理B样条(NURBS)”等。 - - - - Add-on Manager: Warning! - 插件库:警告 ! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - Add-on Manager提供了一个广泛的扩展库,包含有用的第三方FreeCAD 扩展。不保证其安全性或功能。 - - - - Continue - 继续 - - - - Cancel - 取消 - - - - EditDependencyDialog - - - Edit Dependency - 编辑依赖 - - - - Dependency Type - 依赖类型 - - - - Dependency - 依赖 - - - - Package name, if "Other..." - 如果选择其他包,请输入包名称 - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - 注意:如果选择了“其他...”,则该包不在ALLOWED_PYTHON_PACKAGES.txt文件中,Addon Manager将不会自动安装它。请在<a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a>提交一个PR请求添加一个包。 - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - 如果这是一个可选的依赖项,Addon Manager 将在可能的情况下提供安装它,但如果用户选择不安装或无法安装该包,Addon Manager 不会阻止安装。 - - - - Optional - 可选的 - - - - ExpandedView - - - - Icon - 图标 - - - - - <h1>Package Name</h1> - <h1>软件包名称</h1> - - - - - Version - 版本 - - - - - (tags) - (标签) - - - - - Description - 描述 - - - - - Maintainer - 维护者 - - - - Update Available - 更新可用 - - - - labelSort - 标签排序 - - - - UpdateAvailable - 可用更新 - - - - Form - - - Licenses - 许可证 - - - - License - 授权许可 - - - - License file - 许可证文件 - - - - People - 人员 - - - - Kind - 类型 - - - - Name - 名称 - - - - Email - 邮箱 - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - 高级版本映射 - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - FreeCAD 附加组件管理器即将推出的版本将支持由开发者' 设置一个特定分支或标签用于特定版本的 FreeCAD (例如,设置一个特定标签作为您的附加组件的最后版本,以支持 v0.19,等等)。 - - - - FreeCAD Version - FreeCAD 版本 - - - - Best-available branch, tag, or commit - 最佳可用分支,标记或提交 - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - 支持的 FreeCAD 版本 - - - - Minimum FreeCAD Version Supported - 支持的最低 FreeCAD 版本 - - - - - Optional - 可选的 - - - - Maximum FreeCAD Version Supported - 支持的最高 FreeCAD 版本 - - - - Advanced version mapping... - 高级版本映射... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - 插件管理器选项 - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - 如果选中了这个选项,在启动Addon Manager时,已安装的插件将检查是否有可用的更新。 - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - 下载宏元数据(大约10MB) - - - - Cache update frequency - 缓存更新频率 - - - - Manual (no automatic updates) - 手动(不自动更新) - - - - Daily - 每天 - - - - Weekly - 每周 - - - - Hide Addons without a license - 在许可中隐藏附加组件 - - - - Hide Addons with non-FSF Free/Libre license - 隐藏非 FSF Free/Libre 许可证的附加组件 - - - - Hide Addons with non-OSI-approved license - 隐藏非OSI许可的附加组件 - - - - Hide Addons marked Python 2 Only - 隐藏标记为 Python 2 的插件 - - - - Hide Addons marked Obsolete - 隐藏标记过时的插件 - - - - Hide Addons that require a newer version of FreeCAD - 隐藏需要更新版本的 FreeCAD 的插件 - - - - Custom repositories - 自定义仓库 - - - - Proxy - 代理 - - - - No proxy - 无代理 - - - - User system proxy - 使用系统代理 - - - - User-defined proxy: - 使用默认代理: - - - - Score source URL - 源代码 URL - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - Addon Score 数据的 URL(请参见Addon Manager的维基页面了解格式化和托管详情)。 - - - - Path to Git executable (optional): - Git 可执行文件路径(可选): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - 高级选项 - - - - Activate Addon Manager options intended for developers of new Addons. - 激活为新附加组件开发者设计的附加组件管理器选项。 - - - - Addon developer mode - 附加组件开发者模式 - - - - PackageDetails - - - Uninstalls a selected macro or workbench - 卸载选定的宏或工作台 - - - - Install - 安装 - - - - Uninstall - 卸载 - - - - Update - 更新 - - - - Run Macro - 运行宏 - - - - Change branch - 更改分支 - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - 管理 Python 依赖 - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - 以下Python 软件包已被附加组件管理器本地安装以满足附加组件依赖。安装位置: - - - - Package name - 安装包名 - - - - Installed version - 已安装的版本 - - - - Available version - 可用版本 - - - - Used by - 使用于 - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - 在“Used by”(被使用)列中的星号(*)表示一个可选的依赖项。请注意,“Used by”只记录Addon中的直接导入。其他那些包所依赖的Python包也可能已经被安装。 - - - - Update all available - 更新所有可用 - - - - SelectFromList - - - Dialog - 对话框 - - - - TextLabel - 文本标签 - - - - UpdateAllDialog - - - Updating Addons - 更新附加组件ing - - - - Updating out-of-date addons... - 正在更新过期的插件... - - - - addContentDialog - - - Content Item - 内容项目 - - - - Content type: - 内容类型: - - - - Macro - - - - - Preference Pack - 首选项配置包 - - - - Workbench - 工作台 - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - 如果这是附加组件中唯一的东西,所有其他元数据都可以从顶层继承。 无需在此处指定。 - - - - This is the only item in the Addon - 这是附加组件中唯一的项目 - - - - Main macro file - 主宏文件 - - - - The file with the macro's metadata in it - 带宏的元数据的文件们 - - - - - - Browse... - 浏览... - - - - Preference Pack Name - 首选项配置包名称 - - - - Workbench class name - 工作台类名称 - - - - Class that defines "Icon" data member - 定义 "图标" 数据成员的类 - - - - Subdirectory - 子目录 - - - - Optional, defaults to name of content item - 可选,默认内容项名称 - - - - Icon - 图标 - - - - Optional, defaults to inheriting from top-level Addon - 可选,默认从顶级附加组件继承。 - - - - Tags... - 标签… - - - - Dependencies... - 依赖… - - - - FreeCAD Versions... - FreeCAD 版本… - - - - Other Metadata - 其他元数据 - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - 显示在Addon Manager的插件列表中。不应该包括“FreeCAD”这个词。 - - - - Version - 版本 - - - - Description - 描述 - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - 支持语义化版本 (1.2.3-beta) 或日期版本 (2022.08.30) 风格 - - - - Set to today (CalVer style) - 设置为今日(CalVer风格) - - - - Display Name - 显示名称 - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - 任何留空的字段都是从顶层Addon元数据继承而来的,因此它们在技术上都是可选的。对于具有多个内容项的插件,每个项都应该提供一个唯一的显示名称和描述。 - - - - add_toolbar_button_dialog - - - Add button? - 添加按钮 - - - - Add a toolbar button for this macro? - 为此宏添加工具栏按钮? - - - - Yes - - - - - No - - - - - Never - 从不 - - - - change_branch - - - Change Branch - 更改分支 - - - - Change to branch: - 更改分支: - - - - copyrightInformationDialog - - - Copyright Information - 版权信息 - - - - Copyright holder: - 版权所有人: - - - - Copyright year: - 版权年份: - - - - personDialog - - - Add Person - 添加人员 - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - 维护者是在这个项目上拥有当前提交访问权限的人。作者是您的任何其他人,对ta的贡献做出肯定。 - - - - Name: - 名称: - - - - Email: - Email: - - - - Email is required for maintainers, and optional for authors. - 电子邮箱对于维护者必须填写,对于作者可以不填写 - - - - proxy_authentication - - - Proxy login required - 代理需要登录 - - - - Proxy requires authentication - 代理服务器需要验证 - - - - Proxy: - 代理: - - - - Placeholder for proxy address - 代理地址占位符 - - - - Realm: - 域: - - - - Placeholder for proxy realm - 代理域占位符 - - - - Username - 用户名 - - - - Password - 密码 - - - - selectLicenseDialog - - - Select a license - 选择一个许可证 - - - - About... - 关于... - - - - License name: - 许可名称: - - - - Path to license file: - 许可文件路径: - - - - (if required by license) - (如果许可需要) - - - - Browse... - 浏览... - - - - Create... - 创建… - - - - select_toolbar_dialog - - - - - - Select Toolbar - 选择工具栏 - - - - Select a toolbar to add this macro to: - 选择工具栏添加此宏: - - - - Ask every time - 每次都询问 - - - - toolbar_button - - - - Add button? - 添加按钮 - - - - Add a toolbar button for this macro? - 为此宏添加工具栏按钮? - - - - Yes - - - - - No - - - - - Never - 从不 - - - - AddonsInstaller - - - Starting up... - 正在启动… - - - - Worker process {} is taking a long time to stop... - 工作进程 {} 需要很长时间才能停止... - - - - Previous cache process was interrupted, restarting... - - 先前的缓存进程被中断,正在重新启动... - - - - - Custom repo list changed, forcing recache... - - 自定义仓库列表产生变动,正在强制重新缓存... - - - - - Addon manager - 附加组件管理器 - - - - You must restart FreeCAD for changes to take effect. - 您必须容器 FreeCAD 才能应用这些更改 - - - - Restart now - 立即重启 - - - - Restart later - 稍后重启 - - - - - Refresh local cache - 刷新本地缓存 - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - 正在更新缓存… - - - - - Checking for updates... - 正在检查更新… - - - - Temporary installation of macro failed. - 临时安装宏失败。 - - - - - Close - 关闭 - - - - Update all addons - 更新所有插件 - - - - Check for updates - 检查更新 - - - - Python dependencies... - Python 依赖... - - - - Developer tools... - 开发者工具... - - - - Apply %n available update(s) - 应用 %n 可用的更新(s) - - - - No updates available - 暂时无更新 - - - - - - Cannot launch a new installer until the previous one has finished. - 在前一个安装程序完成之前,无法启动新安装程序。 - - - - - - - Maintainer - 维护者 - - - - - - - Author - 作者 - - - - New Python Version Detected - 检测到新的 Python 版本 - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - 这似乎是第一次在附加组件管理器中使用此版本的 Python 。 您想要为它安装相同的自动安装依赖关系吗? - - - - Processing, please wait... - 正在处理,请稍候... - - - - - Update - 更新 - - - - Updating... - 正在更新… - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - 无法导入 QtNetwork -- 它似乎未安装在您的系统上。 您的提供商可能有此依赖关系的软件包(通常称为 "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - 将指定的代理端口 '{}' 转换为端口号失败 - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - 参数错误:设置了相互排斥的代理选项。重置为默认值。 - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - 参数错误:用户代理已说明,但没有提供代理。重置为默认值。 - - - - Addon Manager: Unexpected {} response from server - 附加组件管理器:服务器发生了未知响应: {} - - - - Error with encrypted connection - 加密连接错误 - - - - - - Confirm remove - 确认删除 - - - - Are you sure you want to uninstall {}? - 您确定要卸载 {0} 吗? - - - - - - Removing Addon - 移除附加组件 - - - - Removing {} - 正在删除 {} - - - - - Uninstall complete - 卸载完成 - - - - - Uninstall failed - 卸载失败 - - - - Version {version} installed on {date} - 版本 {version} 安装在 {date} - - - - Version {version} installed - 版本 {version} 已安装 - - - - Installed on {date} - 安装于{date} - - - - - - - Installed - 已安装 - - - - Currently on branch {}, name changed to {} - 目前在分支 {},名称已更改为{} - - - - Git tag '{}' checked out, no updates possible - Git 标签 '{}' 签出,没有可能的更新 - - - - Update check in progress - 更新检查进行中 - - - - Installation location - 安装位置 - - - - Repository URL - 仓库的网址 - - - - Changed to branch '{}' -- please restart to use Addon. - 已更改为分支 '{}' -- 请重启以使用附加组件 - - - - This Addon has been updated. Restart FreeCAD to see changes. - 此插件已更新。重启FreeCAD 以查看更改。 - - - - Disabled - 禁用 - - - - Currently on branch {}, update available to version {} - 目前处于分支 {}, 更新到版本 {} - - - - Update available to version {} - 可更新至版本 {} - - - - This is the latest version available - 这是可用的最新版本 - - - - WARNING: This addon is obsolete - 警告:此插件已过期 - - - - WARNING: This addon is Python 2 only - 警告:此插件只能使用Python 2 - - - - WARNING: This addon requires FreeCAD {} - 警告:此插件需要 FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - 警告:此插件目前已安装,但已禁用。请使用 '启用' 按钮重新启用。 - - - - This Addon will be enabled next time you restart FreeCAD. - 此附加组件将在您下次重启 FreeCAD 时启用。 - - - - This Addon will be disabled next time you restart FreeCAD. - 此附加组件将在您下次重启 FreeCAD 时启用。 - - - - - - Success - 成功 - - - - Install - 安装 - - - - Uninstall - 卸载 - - - - Enable - 启用 - - - - Disable - 禁用 - - - - - Check for update - 检查更新 - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - 运行 - - - - Change branch... - 更改分支... - - - - Return to package list - 返回列表 - - - - Checking connection - 检查连接中 - - - - Checking for connection to GitHub... - 正在检查到 GitHub 的连接... - - - - Connection failed - 连接失败 - - - - Missing dependency - 缺少依赖 - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - 无法导入 QtNetwork -- 查看报表视图以获得详细信息。插件管理器不可用。 - - - - Other... - For providing a license other than one listed - 其它… - - - - Select the corresponding license file in your Addon - 在您的附加组件中选择相应的许可文件 - - - - Location for new license file - 新许可证文件的位置 - - - - Received {} response code from server - 从服务器收到响应代码 {} - - - - Failed to install macro {} - 安装宏失败 {} - - - - Failed to create installation manifest file: - - 创建安装清单文件失败: - - - - - Unrecognized content kind '{}' - 无法识别的内容类型 '{}' - - - - Unable to locate icon at {} - 无法在 {} 找到图标 - - - - Select an icon file for this content item - 为此内容项选择图标文件 - - - - - - {} is not a subdirectory of {} - {} 不是 {} 的子目录 - - - - Select the subdirectory for this content item - 选择此内容项的子目录 - - - - Automatic - 自动 - - - - - Workbench - 工作台 - - - - Addon - 附加组件 - - - - Python - Python - - - - Yes - - - - - Internal Workbench - 内部工作台 - - - - External Addon - 外部附加组件 - - - - Python Package - Python包 - - - - - Other... - 其它… - - - - Too many to list - 列表数据过多 - - - - - - - - - Missing Requirement - 缺少要求 - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - 附加组件 '{}' 需要 '{}', 这在您的 FreeCAD 副本中不可用。 - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - 插件 '{}' 需要下列工作台, 这在您的 FreeCAD 副本中不可用。 - - - - Press OK to install anyway. - 按“确定”安装。 - - - - - Incompatible Python version - 不兼容 Python 版本 - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - 此附加软件依赖的Python软件包没有安装, 也不能自动安装。要使用此附加软件,您必须手动安装以下Python软件包: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - 这个附加组件 (或它的一个依赖) 需要 Python {}.{},您的系统正在运行 {}.{}。安装已取消。 - - - - Optional dependency on {} ignored because it is not in the allow-list - 忽略对 {} 的可选依赖,因为它不在允许列表 - - - - - Installing dependencies - 安装依赖项 - - - - - Cannot execute Python - 无法执行 Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - 自动定位您的 Python 可执行文件失败,或者路径设置不正确。请检查 Python 插件管理器首选项设置。 - - - - Dependencies could not be installed. Continue with installation of {} anyway? - 无法安装依赖关系。继续安装 {} 吗? - - - - - Cannot execute pip - 无法执行 pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - 无法执行pip命令,你可能还没有安装pip. 请确保您的系统安装了pip并再试一次. 无法执行的命令是: - - - - - Continue with installation of {} anyway? - 继续安装 {} 吗? - - - - - Package installation failed - 软件包安装失败 - - - - See Report View for detailed failure log. - 查看报告视图以获取详细记录 - - - - Installing Addon - 正在安装附加项目 - - - - Installing FreeCAD Addon '{}' - 正在安装FreeCAD附加项目'{}' - - - - Cancelling - 正在取消 - - - - Cancelling installation of '{}' - 正在取消 '{}' 的安装 - - - - {} was installed successfully - {} 已成功安装 - - - - - Installation Failed - 安装失败 - - - - Failed to install {} - 无法安装{} - - - - - Create new toolbar - 创建新工具栏 - - - - - A macro installed with the FreeCAD Addon Manager - 使用 FreeCAD 插件管理器安装的宏 - - - - - Run - Indicates a macro that can be 'run' - 运行 - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - 无法从 GitHub 获取数据:请检查您的互联网连接和代理设置,然后重试。 - - - - XML failure while reading metadata from file {} - 从文件 {} 读取元数据时XML 失败 - - - - Invalid metadata in file {} - 文件 {} 中的元数据无效 - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - 警告:package.xml 元数据中指定的路径与当前签出分支不匹配。 - - - - Name - 名称 - - - - Class - 种类 - - - - Description - 描述 - - - - Subdirectory - 子目录 - - - - Files - 文件 - - - - Select the folder containing your Addon - 选择包含附加组件的文件夹 - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - 无Vermin,取消操作。 - - - - Scanning Addon for Python version compatibility - 检查附加组件与Python的版本兼容性中 - - - - Minimum Python Version Detected - 检测到最低Python版本要求 - - - - Vermin auto-detected a required version of Python 3.{} - Vermin 检测到需要 Python 3.{} 的版本 - - - - Install Vermin? - 安装Vermin吗? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - 自动检测此附加组件所需的 Python 版本需要 Vermin (https://pypi.org/project/vermin/)。要安装吗? - - - - Attempting to install Vermin from PyPi - 正在尝试从 PyPi 安装 Vermin - - - - - Installation failed - 安装失败 - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - 安装 Vermin 失败 -- 请查看报告视图以获取详细信息。 - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - 安装后无法导入vermin - 无法扫描附加项目。 - - - - Select an icon file for this package - 选择此软件包的ico图标文件 - - - - Filter is valid - 筛选器有效 - - - - Filter regular expression is invalid - 过滤正则表达式无效 - - - - Search... - 搜索... - - - - Click for details about package {} - 点击获取软件包 {} 的详细信息 - - - - Click for details about workbench {} - 点击查看工作台的详细信息 {} - - - - Click for details about macro {} - 点击查看宏的详细信息 {} - - - - Maintainers: - 维护者: - - - - Tags - 标签 - - - - {} ★ on GitHub - {} Github上的★数 - - - - No ★, or not on GitHub - 没有★,或者不在Github上 - - - - Created - 创造日期 - - - - Updated - 更新日期 - - - - Score: - 评分: - - - - - Up-to-date - 已是最新 - - - - - - - - Update available - 有可用的更新 - - - - - Pending restart - 等待重启 - - - - - DISABLED - 禁用 - - - - Installed version - 已安装的版本 - - - - Unknown version - 未知版本 - - - - Installed on - 安装于 - - - - Available version - 可用版本 - - - - Filter by... - 筛选条件... - - - - Addon Type - 附加组件类型 - - - - - Any - 任意 - - - - Macro - - - - - Preference Pack - 首选项配置包 - - - - Installation Status - 安装状态 - - - - Not installed - 未安装 - - - - Filter - 筛选器 - - - - DANGER: Developer feature - 警告: 开发者功能 - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - 警告:切换分支操作应由开发者或测试者完成,可能导致软件故障、找不到复原教程、不稳定、崩溃和/或宇宙毁灭。您确定要继续吗? - - - - There are local changes - 局部内容有更改 - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - 警告:此仓库有未承诺的本地更改。您确定要更改分支 (与您联系变化) 吗? - - - - Local - Table header for local git ref name - 本地 - - - - Remote tracking - Table header for git remote tracking branch name - 远程跟踪 - - - - Last Updated - Table header for git update date - 最后更新 - - - - Installation of Python package {} failed - 安装Python软件包 {} 失败 - - - - Installation of optional package failed - 可选软件包安装失败 - - - - Installing required dependency {} - 正在安装需要的依赖关系{} - - - - Installation of Addon {} failed - 插件 {} 安装失败 - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - 为附加组件 '{}' 解码 {} 文件失败 - - - - Any dependency information in this file will be ignored - 此文件中的任何依赖信息将被忽略 - - - - Unable to open macro wiki page at {} - 无法在 {} 打开宏的 wiki 页面 - - - - Unable to fetch the code of this macro. - 无法获取此宏的代码。 - - - - Unable to retrieve a description from the wiki for macro {} - 无法从 wiki 获取此宏的描述。 - - - - Unable to open macro code URL {} - 无法打开宏代码 URL {} - - - - Unable to fetch macro-specified file {} from {} - - - - - Could not locate macro-specified file {} (expected at {}) - 无法定位宏指定的文件 {} (预期在 {}) - - - - {}: Unrecognized internal workbench '{}' - {}: 无法识别的内部工作台 '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - 附加组件开发者警告: 在 package.xml 文件中为附加组件 {} 设置的资源库 URL ({}) 与获取它的 URL ({}) 不匹配 - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - 附加组件开发者警告: 在 package.xml 文件中为附加组件 {} 设置的资源库分支 ({}) 与获取它的分支 ({}) 不匹配 - - - - - Got an error when trying to import {} - 尝试导入 {} 时出错 - - - - An unknown error occurred - 发生未知错误 - - - - Could not find addon {} to remove it. - 未找到要移除的附件{} 。 - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - 执行插件'的uninstall.py脚本失败。正在继续卸载... - - - - Removed extra installed file {} - 已移除额外安装的文件 {} - - - - Error while trying to remove extra installed file {} - 尝试删除额外安装的文件 {} 时出错 - - - - Error while trying to remove macro file {}: - 尝试删除宏文件 {} 时出错 - - - - Failed to connect to GitHub. Check your connection and proxy settings. - 连接到 GitHub 失败。请检查您的连接和代理设置。 - - - - WARNING: Duplicate addon {} ignored - 警告:重复插件 {} 已忽略 - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - 从 GitHub 更新宏时出错,正在尝试干净签出(clean checkout)... - - - - Attempting to do a clean checkout... - 正在尝试干净签出(clean checkout)... - - - - Clean checkout succeeded - 干净签出(clean checkout) 成功 - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - 从 GitHub 更新宏失败 -- 尝试清理插件管理器'缓存。 - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - 连接到 Wiki 时出错,FreeCAD 此时无法获取 Wiki 宏列表 - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - 从 {name} 读取元数据失败 - - - - Failed to fetch code for macro '{name}' - 获取宏 '{name}' 代码失败 - - - - Addon Manager: a worker process failed to complete while fetching {name} - 插件管理器:工作进程未能获取 {name} - - - - Out of {num_macros} macros, {num_failed} timed out while processing - 在{num_macros} 个宏中 {num_failed} 个处理时超时 - - - - Addon Manager: a worker process failed to halt ({name}) - 插件管理器:工作进程未能停止 ({name}) - - - - Timeout while fetching metadata for macro {} - 获取宏 {} 元数据时超时 - - - - Failed to kill process for macro {}! - - 为宏 {} 杀死进程失败! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - 从 {} 获取附加组件统计失败——只有按字母顺序排序才是准确的 - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - 从'{}' 获取附加组件分数失败——通过分数排序将失败 - - - - - Repository URL - Preferences header for custom repositories - 仓库的网址 - - - - Branch name - Preferences header for custom repositories - 分支名称 - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - 正在备份原始目录并重新克隆 - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git 分支重命名失败: - - - - Installing - 正在安装 - - - - Succeeded - 成功 - - - - Failed - 失败 - - - - Update was cancelled - 更新已取消 - - - - some addons may have been updated - 一些附加组件可能已更新 - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - 从 FreeCAD 宏代码 wiki 中加载 {} 信息... - - - - Loading page for {} from {}... - 从 {} 加载 {} 页面... - - - - Failed to download data from {} -- received response code {}. - 无法从 {} 下载数据 -- 收到的响应代码 {}。 - - - - Composite view - 复合视图 - - - - Expanded view - 展开视图 - - - - Compact view - 精简视图 - - - - Alphabetical - Sort order - 按字母顺序 - - - - Last Updated - Sort order - 最后更新 - - - - Date Created - Sort order - 创建日期 - - - - GitHub Stars - Sort order - GitHub 点赞数 - - - - Score - Sort order - 分数 - - - - Std_AddonMgr - - - &Addon manager - 附加组件管理器 (&A) - - - - Manage external workbenches, macros, and preference packs - 管理外部工作台、宏和首选项配置包 - - - - AddonInstaller - - - Finished removing {} - 移除 {} 已完成。 - - - - Failed to remove some files - 未能删除某些文件 - - - - Addons installer - - - Finished updating the following addons - 已完成更新以下附加组件 - - - - Workbench - - - Auto-Created Macro Toolbar - 自动创建的宏工具栏 - - - - QObject - - - Addon Manager - 插件管理器 - - - diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-TW.qm b/src/Mod/AddonManager/Resources/translations/AddonManager_zh-TW.qm deleted file mode 100644 index 69f45cfb9d..0000000000 Binary files a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-TW.qm and /dev/null differ diff --git a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-TW.ts b/src/Mod/AddonManager/Resources/translations/AddonManager_zh-TW.ts deleted file mode 100644 index d67f2abed0..0000000000 --- a/src/Mod/AddonManager/Resources/translations/AddonManager_zh-TW.ts +++ /dev/null @@ -1,2487 +0,0 @@ - - - - - AddCustomRepositoryDialog - - - Custom repository - 自訂儲存庫 - - - - Repository URL - 儲存庫網址 - - - - Branch - 分支 - - - - CompactView - - - - Icon - 圖示 - - - - - <b>Package Name</b> - <b>套件名稱</b> - - - - - Version - 版本 - - - - - Description - 說明 - - - - Update Available - 有可用更新 - - - - UpdateAvailable - 可獲得更新 - - - - DependencyDialog - - - Dependencies - 相依性 - - - - Dependency type - 相依類別 - - - - Name - 名稱 - - - - Optional? - 選用? - - - - DependencyResolutionDialog - - - - Resolve Dependencies - 解決相依性 - - - - This Addon has the following required and optional dependencies. You must install them before this Addon can be used. - -Do you want the Addon Manager to install them automatically? Choose "Ignore" to install the Addon without installing the dependencies. - 此附加元件需要以下必要和選用相依套件。您必須在使用此附加元件之前安裝它們。 - -您是否希望附加元件管理員自動安裝它們?選擇"忽略"以安裝附加元件而不安裝相依套件。 - - - - FreeCAD Addons - FreeCAD 附件元件 - - - - Required Python modules - 所需之 Python 模組 - - - - Optional Python modules - 可選的 Python 模組 - - - - DeveloperModeDialog - - - Addon Developer Tools - 附加元件開發者工具 - - - - Path to Addon - 附加元件路徑 - - - - - Browse... - 瀏覽... - - - - Metadata - 後設資料選項 - - - - Primary branch - 主要分支 - - - - - Explanation of what this Addon provides. Displayed in the Addon Manager. It is not necessary for this to state that this is a FreeCAD Addon. - 說明此附加元件提供什麼。在附加元件管理員中顯示。沒有必要指明這是 FreeCAD 附加元件 - - - - Description - 說明 - - - - Discussion URL - 討論網址 - - - - Icon - 圖示 - - - - Bugtracker URL - 錯誤追蹤系統的URL - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - 支援 Semantic (1.2.3-beta 版) 或 CalVer (2022.08.30 版) 風格 - - - - Set to today (CalVer style) - 設置為今天(CalVer格式) - - - - - - - (Optional) - (可選) - - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD", and must be a valid directory name on all support operating systems. - 顯示在附加元件管理員'的附加元件清單中。不應包括單詞 "FreeCAD",並且必須是所有支援操作系統上的有效目錄名稱。 - - - - README URL - README 網址 - - - - TIP: Since this is displayed within FreeCAD, in the Addon Manager, it is not necessary to take up space saying things like "This is a FreeCAD Addon..." -- just say what it does. - 提示:由於這是在 FreeCAD 中顯示的,附加元件管理員中不需要佔用空間說明 "這是 FreeCAD 的附加元件...",只需說明其功能即可。 - - - - Repository URL - 儲存庫網址 - - - - Website URL - 網址 - - - - Documentation URL - 文件網址 - - - - Addon Name - 附加元件名稱 - - - - Version - 版本 - - - - (Recommended) - (建議) - - - - Minimum Python - 最低要求的Python版本 - - - - (Optional, only 3.x version supported) - (可選,只支援 3.x 版) - - - - Detect... - 偵測... - - - - Addon Contents - 附加元件內容 - - - - Dialog - - - Addon Manager - 附加元件管理員 - - - - Edit Tags - 編輯標籤 - - - - Comma-separated list of tags describing this item: - 逗號分隔的標籤清單以描述此項目: - - - - HINT: Common tags include "Assembly", "FEM", "Mesh", "NURBS", etc. - 提示:常見的標籤包括 "Assembly&quot、"FEM"、"Mesh"、"NURBS" 等。 - - - - Add-on Manager: Warning! - 附加元件管理員:警告! - - - - The Add-on Manager provides access to an extensive library of useful third-party FreeCAD extensions. No guarantees can be made regarding their safety or functionality. - 附加元件管理員提供存取有用的第三方 FreeCAD 擴充功能的廣泛函式庫。無法保證其安全性或功能性。 - - - - Continue - 繼續 - - - - Cancel - 取消 - - - - EditDependencyDialog - - - Edit Dependency - 編輯相依性 - - - - Dependency Type - 相依類型 - - - - Dependency - 相依性 - - - - Package name, if "Other..." - 套件名稱,若 " 其它..." - - - - NOTE: If "Other..." is selected, the package is not in the ALLOWED_PYTHON_PACKAGES.txt file, and will not be automatically installed by the Addon Manager. Submit a PR at <a href="https://github.com/FreeCAD/FreeCAD-addons">https://github.com/FreeCAD/FreeCAD-addons</a> to request addition of a package. - 注意:如果選擇了 "其他...",該套件不在 ALLOWED_PYTHON_PACKAGES.txt 文件中,將不會被附加元件管理員自動安裝。請提交一個 PR 到 <a href="https://github.com/FreeCAD/FreeCAD-addons">>https://github.com/FreeCAD/FreeCAD-addons</a>,以請求添加該套件。 - - - - If this is an optional dependency, the Addon Manager will offer to install it (when possible), but will not block installation if the user chooses not to, or cannot, install the package. - 如果這是一個可選相依,附加元件管理員將在可能的情況下提供安裝選項,但如果使用者選擇不安裝或無法安裝該套件,將不會阻止安裝。 - - - - Optional - 選用項 - - - - ExpandedView - - - - Icon - 圖示 - - - - - <h1>Package Name</h1> - <h1>套件名稱</h1> - - - - - Version - 版本 - - - - - (tags) - (標籤) - - - - - Description - 說明 - - - - - Maintainer - 維護者 - - - - Update Available - 有可用更新 - - - - labelSort - 標籤排序 - - - - UpdateAvailable - 可獲得更新 - - - - Form - - - Licenses - 授權條款 - - - - License - 版權 - - - - License file - 授權檔案 - - - - People - - - - - Kind - 類別 - - - - Name - 名稱 - - - - Email - 電子郵件 - - - - FreeCADVersionToBranchMapDialog - - - Advanced Version Mapping - 進階版本對映 - - - - Upcoming versions of the FreeCAD Addon Manager will support developers' setting a specific branch or tag for use with a specific version of FreeCAD (e.g. setting a specific tag as the last version of your Addon to support v0.19, etc.) - 即將推出的 FreeCAD 附加元件管理員的版本將支援開發人員為特定版本的 FreeCAD 設定特定的分支或標籤(例如,設定特定的標籤作為您的附加元件支援 v0.19 的最後一個版本等)。 - - - - FreeCAD Version - FreeCAD 版本 - - - - Best-available branch, tag, or commit - 最佳可用的分支、標籤或提交 - - - - FreeCADVersionsDialog - - - Supported FreeCAD Versions - 所支援之 FreeCAD 版本 - - - - Minimum FreeCAD Version Supported - 所支援的最低 FreeCAD 版本 - - - - - Optional - 選用項 - - - - Maximum FreeCAD Version Supported - 所支援的最高 FreeCAD 版本 - - - - Advanced version mapping... - 進階版本對映... - - - - Gui::Dialog::DlgSettingsAddonManager - - - Addon manager options - 附加元件管理員選項 - - - - If this option is selected, when launching the Addon Manager, -installed addons will be checked for available updates - 如果選擇此選項,,則啟動附加元件管理員時, -將檢查已安裝的附件元件是否有可用更新 - - - - Automatically check for updates at start (requires Git) - Automatically check for updates at start (requires Git) - - - - Download Macro metadata (approximately 10MB) - 下載巨集後設資料(約 10 MB) - - - - Cache update frequency - 快取更新頻率 - - - - Manual (no automatic updates) - 手動 (非自動更新) - - - - Daily - 每日 - - - - Weekly - 每週 - - - - Hide Addons without a license - 隱藏未授權的附加元件 - - - - Hide Addons with non-FSF Free/Libre license - 隱藏具有非自由軟體基金會(FSF)自由許可的附加元件 - - - - Hide Addons with non-OSI-approved license - 隱藏具有非開放原始碼促進會(OSI)批准的許可證的附加元件 - - - - Hide Addons marked Python 2 Only - 隱藏標記只能使用於 Python 2 之附加元件 - - - - Hide Addons marked Obsolete - 隱藏已標記為過時的附加元件 - - - - Hide Addons that require a newer version of FreeCAD - 隱藏需要更新版本的 FreeCAD 的附加元件 - - - - Custom repositories - 自訂儲存庫 - - - - Proxy - 代理伺服器 - - - - No proxy - 不使用代理伺服器 - - - - User system proxy - 使用系統代理伺服器 - - - - User-defined proxy: - 使用者定義的代理伺服器: - - - - Score source URL - 得分來源網址 - - - - The URL for the Addon Score data (see Addon Manager wiki page for formatting and hosting details). - 附加元件資料的網址(請參閱附加元件管理員維基頁面以查看格式和主機詳細資訊)。 - - - - Path to Git executable (optional): - Git 可執行檔的路徑(選填): - - - - The path to the Git executable. Autodetected if needed and not specified. - The path to the Git executable. Autodetected if needed and not specified. - - - - Show option to change branches (requires Git) - Show option to change branches (requires Git) - - - - Disable Git (fall back to ZIP downloads only) - Disable Git (fall back to ZIP downloads only) - - - - Advanced Options - 進階選項 - - - - Activate Addon Manager options intended for developers of new Addons. - 啟用針對新附加元件開發者設計的附加元件管理員選項。 - - - - Addon developer mode - 附加元件開發者模式 - - - - PackageDetails - - - Uninstalls a selected macro or workbench - 解除安裝一選定巨集或工作台 - - - - Install - 安裝 - - - - Uninstall - 解除安裝 - - - - Update - 更新 - - - - Run Macro - 執行巨集 - - - - Change branch - 變更分支 - - - - PythonDependencyUpdateDialog - - - Manage Python Dependencies - 管理 Python 相依性 - - - - The following Python packages have been installed locally by the Addon Manager to satisfy Addon dependencies. Installation location: - 以下 Python 套件已由附加元件管理員安裝在本地以滿足附加元件相依性。安裝位置: - - - - Package name - 套件名稱 - - - - Installed version - 已安裝版本 - - - - Available version - 可用版本 - - - - Used by - 使用中 - - - - An asterisk (*) in the "Used by" column indicates an optional dependency. Note that Used by only records direct imports in the Addon. Other Python packages that those packages depend upon may have been installed as well. - 在 "被使用" 列中的星號(*)表示可選相依性。請注意,“被使用”僅記錄附加元件中的直接匯入。這些套件所相依的其他 Python 套件可能也已安裝。 - - - - Update all available - 更新所有可用更新 - - - - SelectFromList - - - Dialog - 對話方塊 - - - - TextLabel - 文字標籤 - - - - UpdateAllDialog - - - Updating Addons - 更新附加元件 - - - - Updating out-of-date addons... - 正在更新過時的附加元件... - - - - addContentDialog - - - Content Item - 內容項目 - - - - Content type: - 內容類型: - - - - Macro - 巨集 - - - - Preference Pack - 偏好設定包 - - - - Workbench - 工作台 - - - - If this is the only thing in the Addon, all other metadata can be inherited from the top level, and does not need to be specified here. - 如果這是附加元件中唯一的內容,則所有其他後設資料都可以從最高階繼承,不需要在此處指定。 - - - - This is the only item in the Addon - 這是附加元件中唯一的項目 - - - - Main macro file - 主巨集檔 - - - - The file with the macro's metadata in it - 包含巨集後設資料的檔案 - - - - - - Browse... - 瀏覽... - - - - Preference Pack Name - 偏好設定包名稱 - - - - Workbench class name - 工作台類別名稱 - - - - Class that defines "Icon" data member - 定義 "圖示 "資料成員之類別 - - - - Subdirectory - 子目錄 - - - - Optional, defaults to name of content item - 可選項,預設值為內容項目的名稱 - - - - Icon - 圖示 - - - - Optional, defaults to inheriting from top-level Addon - 可選的,預設繼承自最高階附加元件 - - - - Tags... - 標籤... - - - - Dependencies... - 相依性... - - - - FreeCAD Versions... - FreeCAD 版本... - - - - Other Metadata - 其它後設資料 - - - - Displayed in the Addon Manager's list of Addons. Should not include the word "FreeCAD". - 顯示在附加元件管理員的附加元件列表中。不應包括單詞 "FreeCAD"。 - - - - Version - 版本 - - - - Description - 說明 - - - - Semantic (1.2.3-beta) or CalVer (2022.08.30) styles supported - 支援 Semantic (1.2.3-beta 版) 或 CalVer (2022.08.30 版) 風格 - - - - Set to today (CalVer style) - 設置為今天(CalVer格式) - - - - Display Name - 顯示名稱 - - - - Any fields left blank are inherited from the top-level Addon metadata, so technically they are all optional. For Addons with multiple content items, each item should provide a unique Display Name and Description. - 所有未填寫的欄位都是繼承自最高階附加元件後設資料,因此從技術上講,它們都是可選的。對於具有多個內容項目的附加元件,每個項目應提供唯一的顯示名稱和描述。 - - - - add_toolbar_button_dialog - - - Add button? - 添加按鈕? - - - - Add a toolbar button for this macro? - 選擇要加入此巨集的工具列按鈕 ? - - - - Yes - - - - - No - - - - - Never - 決不 - - - - change_branch - - - Change Branch - 變更分支 - - - - Change to branch: - 變更分支: - - - - copyrightInformationDialog - - - Copyright Information - 版權資訊 - - - - Copyright holder: - 版權所有人: - - - - Copyright year: - 版權年份: - - - - personDialog - - - Add Person - 添加人員 - - - - A maintainer is someone with current commit access on this project. An author is anyone else you'd like to give credit to. - 一位維護者是指在該專案上具有目前提交存取權限的人。而作者則是指您'想要歸功的其他任何人。 - - - - Name: - 名稱: - - - - Email: - 電子郵件: - - - - Email is required for maintainers, and optional for authors. - 維護者需要提供電子郵件,而作者可以選擇性提供。 - - - - proxy_authentication - - - Proxy login required - 代理伺服器必須登入 - - - - Proxy requires authentication - 代理伺服器需要認證 - - - - Proxy: - 代理伺服器: - - - - Placeholder for proxy address - 代理伺服器位址的佔位符號 - - - - Realm: - 領域: - - - - Placeholder for proxy realm - 代理伺服器領域的佔位符號 - - - - Username - 使用者名稱 - - - - Password - 密碼 - - - - selectLicenseDialog - - - Select a license - 選擇授權 - - - - About... - 關於... - - - - License name: - 許可證名稱: - - - - Path to license file: - 授權檔案路徑: - - - - (if required by license) - (如果根據許可證要求) - - - - Browse... - 瀏覽... - - - - Create... - 建立... - - - - select_toolbar_dialog - - - - - - Select Toolbar - 選擇工具列 - - - - Select a toolbar to add this macro to: - 選擇要加入此巨集的工具列: - - - - Ask every time - 每次都詢問 - - - - toolbar_button - - - - Add button? - 添加按鈕? - - - - Add a toolbar button for this macro? - 選擇要加入此巨集的工具列按鈕 ? - - - - Yes - - - - - No - - - - - Never - 決不 - - - - AddonsInstaller - - - Starting up... - 啟動中... - - - - Worker process {} is taking a long time to stop... - 工作行程 {} 正在花費較長時間停止... - - - - Previous cache process was interrupted, restarting... - - 先前快取行程被中斷,正在重新啟動... - - - - Custom repo list changed, forcing recache... - - 自訂儲存庫列表已更改,正在強制重新快取... - - - - - Addon manager - 附加元件管理員 - - - - You must restart FreeCAD for changes to take effect. - 您必須重新啟動 FreeCAD 以使更改生效。 - - - - Restart now - 現在重新啟動 - - - - Restart later - 稍後重新啟動 - - - - - Refresh local cache - 刷新本地端快取 - - - - Creating addon list - Creating addon list - - - - Loading addon list - Loading addon list - - - - Creating macro list - Creating macro list - - - - Updating cache... - 更新快取... - - - - - Checking for updates... - 檢查更新... - - - - Temporary installation of macro failed. - 巨集的暫存安裝失敗。 - - - - - Close - 關閉 - - - - Update all addons - 更新所有附加元件 - - - - Check for updates - 檢查更新 - - - - Python dependencies... - Python 相依性... - - - - Developer tools... - 開發者工具... - - - - Apply %n available update(s) - 套用 %n 可用更新 - - - - No updates available - 沒有可用更新 - - - - - - Cannot launch a new installer until the previous one has finished. - 在前一個安裝程式完成之前無法啟動新的安裝程式。 - - - - - - - Maintainer - 維護者 - - - - - - - Author - 作者 - - - - New Python Version Detected - 偵測到新的 Python 版本 - - - - This appears to be the first time this version of Python has been used with the Addon Manager. Would you like to install the same auto-installed dependencies for it? - 這似乎是第一次使用這個版本的 Python 與附加元件管理員。您是否想要為其安裝相同的自動安裝相依套件? - - - - Processing, please wait... - 處理中,請稍候... - - - - - Update - 更新 - - - - Updating... - 正在更新... - - - - Could not import QtNetwork -- it does not appear to be installed on your system. Your provider may have a package for this dependency (often called "python3-pyside2.qtnetwork") - 無法匯入 QtNetwork -- 該套件似乎未安裝在您的系統上。您的供應商可能提供了此相依性套件(通常被稱為 "python3-pyside2.qtnetwork") - - - - Failed to convert the specified proxy port '{}' to a port number - 無法將指定的代理伺服器埠 '{}' 轉換為埠的編號 - - - - Parameter error: mutually exclusive proxy options set. Resetting to default. - 參數錯誤:設定互斥代理伺服器選項。重置為預設值。 - - - - Parameter error: user proxy indicated, but no proxy provided. Resetting to default. - 參數錯誤:指示使用者代理伺服器,但並未提供。重置為預設值。 - - - - Addon Manager: Unexpected {} response from server - 附加元件管理員:從伺服器收到意外的 {} 回應 - - - - Error with encrypted connection - 加密連線出現錯誤 - - - - - - Confirm remove - 確認移除 - - - - Are you sure you want to uninstall {}? - 您確定要解除安裝 {} 嗎? - - - - - - Removing Addon - 移除附加元件 - - - - Removing {} - 正在刪除 {} - - - - - Uninstall complete - 解除安裝完成 - - - - - Uninstall failed - 解除安裝失敗 - - - - Version {version} installed on {date} - 版本 {version} 已於 {date} 安裝 - - - - Version {version} installed - 版本 {version} 已安裝 - - - - Installed on {date} - 安裝於 {date} - - - - - - - Installed - 己安裝 - - - - Currently on branch {}, name changed to {} - 目前在分支 {},名稱已更改為 {} - - - - Git tag '{}' checked out, no updates possible - 已檢查 Git 標籤 '{}',無法進行更新 - - - - Update check in progress - 正在檢查更新 - - - - Installation location - 安裝位置 - - - - Repository URL - 儲存庫網址 - - - - Changed to branch '{}' -- please restart to use Addon. - 已切換至分支 '{}' -- 請重新啟動以使用附加元件。 - - - - This Addon has been updated. Restart FreeCAD to see changes. - 這個附加元件已經更新。請重新啟動 FreeCAD 以查看變更。 - - - - Disabled - 已停用 - - - - Currently on branch {}, update available to version {} - 目前在分支 {},有可用的更新至版本 {} - - - - Update available to version {} - 可升級至版本 {} - - - - This is the latest version available - 這是目前可用的最新版本 - - - - WARNING: This addon is obsolete - 警告:此附加元件已過時 - - - - WARNING: This addon is Python 2 only - 警告:此附加元件僅支持Python 2 - - - - WARNING: This addon requires FreeCAD {} - 警告:此附加元件需要 FreeCAD {} - - - - WARNING: This addon is currently installed, but disabled. Use the 'enable' button to re-enable. - 警告:此附加元件目前已安裝,但是被停用。使用 '啟用' 按鈕以重新啟用。 - - - - This Addon will be enabled next time you restart FreeCAD. - 此附加元件將會在您重新起動 FreeCAD 後啟用。 - - - - This Addon will be disabled next time you restart FreeCAD. - 此附加元件將會在您重新起動 FreeCAD 後停用。 - - - - - - Success - 成功 - - - - Install - 安裝 - - - - Uninstall - 解除安裝 - - - - Enable - 啟用 - - - - Disable - 停用 - - - - - Check for update - 檢查更新 - - - - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - Branch change succeeded. -Moved -from: {} -to: {} -Please restart to use the new version. - - - - Run - 執行 - - - - Change branch... - 變更分支... - - - - Return to package list - 返回套件列表 - - - - Checking connection - 正在檢查連線 - - - - Checking for connection to GitHub... - 正在檢查通往 GitHub 之連線... - - - - Connection failed - 連線失敗 - - - - Missing dependency - 缺少相依套件 - - - - Could not import QtNetwork -- see Report View for details. Addon Manager unavailable. - 無法匯入 QtNetwork - 請參閱報告檢視以了解細節。附加元件管理員不可用。 - - - - Other... - For providing a license other than one listed - 其他... - - - - Select the corresponding license file in your Addon - 選擇附加元件中相對應的授權檔案 - - - - Location for new license file - 新授權檔案的位置 - - - - Received {} response code from server - 由伺服器收到 {} 回應碼 - - - - Failed to install macro {} - 安裝巨集 {} 失敗 - - - - Failed to create installation manifest file: - - 無法建立安裝清單檔案: - - - - - Unrecognized content kind '{}' - 未識別的內容種類 '{}' - - - - Unable to locate icon at {} - 無法在 {} 位置找到圖示 - - - - Select an icon file for this content item - 選擇一個用於此內容項目的圖示檔案 - - - - - - {} is not a subdirectory of {} - {} 不是 {} 的一個子目錄 - - - - Select the subdirectory for this content item - 選擇一個用於此內容項目的子目錄 - - - - Automatic - 自動 - - - - - Workbench - 工作台 - - - - Addon - 附加元件 - - - - Python - Python - - - - Yes - - - - - Internal Workbench - 內部工作台 - - - - External Addon - 外部附加元件 - - - - Python Package - Python 套件 - - - - - Other... - 其他... - - - - Too many to list - 太多以至於無法列出 - - - - - - - - - Missing Requirement - 缺少要求 - - - - Addon '{}' requires '{}', which is not available in your copy of FreeCAD. - 附加元件 '{}' 需要 '{}',但在您的 FreeCAD 版本中不可用。 - - - - Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD: - 附加元件 '{}' 需要底下工作台,但在您的 FreeCAD 版本中不可用。 - - - - Press OK to install anyway. - 按 OK 以進行安裝。 - - - - - Incompatible Python version - 不相容的 Python 版本 - - - - This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually: - 此附加元件需要未安裝的 Python 套件,無法自動安裝。要使用此工作台,您必須手動安裝以下 Python 套件: - - - - This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled. - 此附加元件 (或其一相依元件) 需要 Python {}.{}, 而您的系統正在執行 {}.{}. 安裝取消. - - - - Optional dependency on {} ignored because it is not in the allow-list - 可選相依性 {} 被忽略因其不在可允許清單中 - - - - - Installing dependencies - 正在安裝相依性 - - - - - Cannot execute Python - 無法執行 Python - - - - Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python. - 自動定位您的 Python 可執行檔失敗,或者設置的路徑不正確。請檢查附加元件管理員偏好設定中 Python 路徑的設置。 - - - - Dependencies could not be installed. Continue with installation of {} anyway? - 相依性套件無法被安裝。無論如何繼續 {} 的安裝作業? - - - - - Cannot execute pip - 無法執行 pip - - - - Failed to execute pip, which may be missing from your Python installation. Please ensure your system has pip installed and try again. The failed command was: - 無法執行 pip,可能是因為您的 Python 安裝缺少 pip。請確保您的系統已安裝 pip,然後再試一次。失敗的指令是: - - - - - Continue with installation of {} anyway? - 不管怎樣繼續安裝 {} ? - - - - - Package installation failed - 套件安裝失敗 - - - - See Report View for detailed failure log. - 詳細的失敗日誌請查看報告檢視。 - - - - Installing Addon - 安裝附加元件 - - - - Installing FreeCAD Addon '{}' - 安裝 FreeCAD 附加元件 '{}' - - - - Cancelling - 正在取消 - - - - Cancelling installation of '{}' - 取消安裝 '{}' - - - - {} was installed successfully - {} 已成功安裝 - - - - - Installation Failed - 安裝失敗 - - - - Failed to install {} - {} 安裝失敗 - - - - - Create new toolbar - 建立新工具列 - - - - - A macro installed with the FreeCAD Addon Manager - 使用 FreeCAD 附加元件管理員安裝的巨集 - - - - - Run - Indicates a macro that can be 'run' - 執行 - - - - Unable to read data from GitHub: check your internet connection and proxy settings and try again. - 無法自 GitHub 讀取資料:請檢查您的網路連線與代理伺服器設定並且再次嘗試。 - - - - XML failure while reading metadata from file {} - 讀取檔案 {} 中的後設資料時發生 XML 錯誤 - - - - Invalid metadata in file {} - 在檔案 {} 中無效的後設資料 - - - - WARNING: Path specified in package.xml metadata does not match currently checked-out branch. - 警告:在 package.xml 後設資料中指定的路徑與當前檢查出的分支不匹配。 - - - - Name - 名稱 - - - - Class - 類別 (Class) - - - - Description - 說明 - - - - Subdirectory - 子目錄 - - - - Files - 檔案 - - - - Select the folder containing your Addon - 選擇內含你的附加元件之資料夾 - - - - No Vermin, cancelling operation. - NOTE: Vermin is a Python package and proper noun - do not translate - 沒有 Vermin 套件,正在取消操作。 - - - - Scanning Addon for Python version compatibility - 掃描附加元件以檢查 Python 版本的相容性 - - - - Minimum Python Version Detected - 偵測到的最低 Python 版本 - - - - Vermin auto-detected a required version of Python 3.{} - Vermin 自動檢測到所需的 Python 3.{} 版本 - - - - Install Vermin? - 安裝 Vermin 套件? - - - - Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install? - 自動偵測此附加元件所需的 Python 版本需要使用 Vermin 套件 -(https://pypi.org/project/vermin/)。確定安裝 ? - - - - Attempting to install Vermin from PyPi - 試圖從 PyPi 安裝 Vermin 套件 - - - - - Installation failed - 安裝失敗 - - - - Failed to install Vermin -- check Report View for details. - 'Vermin' is the name of a Python package, do not translate - 安裝 Vermin 套件失敗 - 檢查報告檢視以看細節。 - - - - Failed to import vermin after installation -- cannot scan Addon. - 'vermin' is the name of a Python package, do not translate - 安裝後無法匯入 vermin - 無法掃瞄附加元件。 - - - - Select an icon file for this package - 選擇一個用於此套件的圖示檔案 - - - - Filter is valid - 過濾器有效 - - - - Filter regular expression is invalid - 過濾器正規表示式無效 - - - - Search... - 搜尋... - - - - Click for details about package {} - 點擊查看套件 {} 詳細資料 - - - - Click for details about workbench {} - 點擊查看工作台 {} 詳細資料 - - - - Click for details about macro {} - 點擊查看巨集 {} 詳細資料 - - - - Maintainers: - 維護者: - - - - Tags - 標籤 - - - - {} ★ on GitHub - 在 GitHub 上的星數 {} ★ - - - - No ★, or not on GitHub - 沒有星星 ★,或不存在 GitHub 上 - - - - Created - 已建立 - - - - Updated - 已更新 - - - - Score: - 分數: - - - - - Up-to-date - 最新 - - - - - - - - Update available - 有可用更新 - - - - - Pending restart - 等待重啟 - - - - - DISABLED - 已被停用 - - - - Installed version - 已安裝版本 - - - - Unknown version - 未知版本 - - - - Installed on - 安裝在 - - - - Available version - 可用版本 - - - - Filter by... - 依據...過濾 - - - - Addon Type - 附加元件類型 - - - - - Any - 任何 - - - - Macro - 巨集 - - - - Preference Pack - 偏好設定包 - - - - Installation Status - 安裝狀態 - - - - Not installed - 未安裝 - - - - Filter - 過濾器 - - - - DANGER: Developer feature - 危險:開發者功能 - - - - DANGER: Switching branches is intended for developers and beta testers, and may result in broken, non-backwards compatible documents, instability, crashes, and/or the premature heat death of the universe. Are you sure you want to continue? - 危險:分支切換是針對開發人員和測試版本的,可能導致損壞、不向後相容的文件、不穩定性、崩潰,和/或宇宙的提前熱死。您確定要繼續嗎? - - - - There are local changes - 這些是本地更改 - - - - WARNING: This repo has uncommitted local changes. Are you sure you want to change branches (bringing the changes with you)? - 警告:此存儲庫具有未提交的本地更改。您確定要切換分支(將更改帶入新分支)嗎? - - - - Local - Table header for local git ref name - 本地 - - - - Remote tracking - Table header for git remote tracking branch name - 遠端追蹤 - - - - Last Updated - Table header for git update date - 上次更新 - - - - Installation of Python package {} failed - 安裝 Python 套件 {} 失敗 - - - - Installation of optional package failed - 安裝可選套件失敗 - - - - Installing required dependency {} - 安裝所需的相依性套件 {} - - - - Installation of Addon {} failed - 安裝附加元件 {} 失敗 - - - - Downloaded {} for {} - Downloaded {} for {} - - - - Failed to decode {} file for Addon '{}' - 解碼附加元件的檔案 {} 失敗 '{}' - - - - Any dependency information in this file will be ignored - 此檔案中的任何相依性資訊將會被忽略 - - - - Unable to open macro wiki page at {} - 無法打開巨集維基頁面 {} - - - - Unable to fetch the code of this macro. - 無法取得這個巨集的程式碼。 - - - - Unable to retrieve a description from the wiki for macro {} - 無法從維基獲取巨集 {} 的描述 - - - - Unable to open macro code URL {} - 無法打開巨集程式碼的網址 {} - - - - Unable to fetch macro-specified file {} from {} - 無法從 {} 擷取巨集指定的檔案 {} - - - - Could not locate macro-specified file {} (expected at {}) - 無法找到巨集指定的檔案 {}(預期在 {}) - - - - {}: Unrecognized internal workbench '{}' - {}:未識別的內部工作台 '{}' - - - - Addon Developer Warning: Repository URL set in package.xml file for addon {} ({}) does not match the URL it was fetched from ({}) - 附加元件開發者警告:給附加元件{} ({}) 之 package.xml 檔中的儲存庫網址集與截取自 ({}) 的網址不匹配 - - - - Addon Developer Warning: Repository branch set in package.xml file for addon {} ({}) does not match the branch it was fetched from ({}) - 附加元件開發者警告:給附加元件{} ({}) 之 package.xml 檔中的儲存庫分支集與截取自 ({}) 的分支不匹配 - - - - - Got an error when trying to import {} - 當試著匯入 {} 時發生錯誤 - - - - An unknown error occurred - 發生未知的錯誤 - - - - Could not find addon {} to remove it. - 找不到要移除的附加元件 {}。 - - - - Execution of Addon's uninstall.py script failed. Proceeding with uninstall... - 無法執行附加元件的 uninstall.py 腳本。繼續進行解除安裝... - - - - Removed extra installed file {} - 已移除多餘已安裝檔案 {} - - - - Error while trying to remove extra installed file {} - 當試著移除額外已安裝檔案 {} 時發生錯誤 - - - - Error while trying to remove macro file {}: - 當試著移除巨集檔 {} 時發生錯誤: - - - - Failed to connect to GitHub. Check your connection and proxy settings. - 連接到 GitHub 失敗。請檢查您的連線與代理伺服器設定。 - - - - WARNING: Duplicate addon {} ignored - 警告:重複的附加元件 {} 被忽略 - - - - Git is disabled, skipping Git macros - Git is disabled, skipping Git macros - - - - Attempting to change non-Git Macro setup to use Git - - Attempting to change non-Git Macro setup to use Git - - - - - An error occurred updating macros from GitHub, trying clean checkout... - 自 GitHub 更新巨集時發生錯誤,試著進行乾淨檢查... - - - - Attempting to do a clean checkout... - 企圖進行一個乾淨的檢查... - - - - Clean checkout succeeded - 乾淨檢查成功 - - - - Failed to update macros from GitHub -- try clearing the Addon Manager's cache. - 無法從 GitHub 更新巨集 - 請嘗試清除附加元件管理員的快取。 - - - - Error connecting to the Wiki, FreeCAD cannot retrieve the Wiki macro list at this time - 連接到維基時出現錯誤,FreeCAD 目前無法檢索維基巨集列表 - - - - Checking {} for update - Checking {} for update - - - - Unable to fetch Git updates for workbench {} - Unable to fetch Git updates for workbench {} - - - - Git status failed for {} - Git status failed for {} - - - - Caching {} macro - Caching {} macro - - - - Caching macros - Caching macros - - - - Failed to read metadata from {name} - 由 {name} 讀取後設資料失敗 - - - - Failed to fetch code for macro '{name}' - 無法擷取巨集 '{name}' 的程式碼 - - - - Addon Manager: a worker process failed to complete while fetching {name} - 附加元件管理員:在擷取 {name} 時,工作行程未能完成 - - - - Out of {num_macros} macros, {num_failed} timed out while processing - 在 {num_macros} 個巨集中,有 {num_failed} 個在處理時超時。 - - - - Addon Manager: a worker process failed to halt ({name}) - 附加元件管理員:在停止 ({name}) 時,工作行程未能完成 - - - - Timeout while fetching metadata for macro {} - 在擷取巨集 {} 的後設資料時超時 - - - - Failed to kill process for macro {}! - - 無法終止巨集 {} 的行程! - - - - - Failed to get Addon statistics from {} -- only sorting alphabetically will be accurate - - 無法從 {} 獲取附加元件統計資料 — 僅以字母順序排序將是準確的 - - - - - Failed to get Addon score from '{}' -- sorting by score will fail - - 無法從 '{}' 獲取附加元件分數 — 按分數排序將失敗 - - - - - Repository URL - Preferences header for custom repositories - 儲存庫網址 - - - - Branch name - Preferences header for custom repositories - 分支名稱 - - - - Basic Git update failed with the following message: - Basic Git update failed with the following message: - - - - Backing up the original directory and re-cloning - 備份原始目錄並重新克隆 - - - - Failed to clone {} into {} using Git - Failed to clone {} into {} using Git - - - - Git branch rename failed with the following message: - Git 分支重命名失敗,出現以下訊息: - - - - Installing - 安裝中 - - - - Succeeded - 成功 - - - - Failed - 失敗 - - - - Update was cancelled - 更新已取消 - - - - some addons may have been updated - 某些附加元件可能已經被更新了 - - - - Loading info for {} from the FreeCAD Macro Recipes wiki... - 從 FreeCAD 巨集食譜維基載入 {} 的資訊... - - - - Loading page for {} from {}... - 從 {} 載入 {} 的頁面... - - - - Failed to download data from {} -- received response code {}. - 無法從 {} 下載資料 — 收到回應碼 {}。 - - - - Composite view - 組合視圖 - - - - Expanded view - 擴展視圖 - - - - Compact view - 精簡視圖 - - - - Alphabetical - Sort order - 按字母順序的 - - - - Last Updated - Sort order - 上次更新 - - - - Date Created - Sort order - 建立日期 - - - - GitHub Stars - Sort order - GitHub的星星數 - - - - Score - Sort order - 得分 - - - - Std_AddonMgr - - - &Addon manager - &附加元件管理員 - - - - Manage external workbenches, macros, and preference packs - 管理外部工作台、巨集和偏好設定套件 - - - - AddonInstaller - - - Finished removing {} - 完成移除 {} - - - - Failed to remove some files - 移除某些檔案失敗 - - - - Addons installer - - - Finished updating the following addons - 已完成更新底下附加元件 - - - - Workbench - - - Auto-Created Macro Toolbar - 自動建立之巨集工具列 - - - - QObject - - - Addon Manager - 附加元件管理員 - - - diff --git a/src/Mod/AddonManager/TODO.md b/src/Mod/AddonManager/TODO.md deleted file mode 100644 index b1d3e7735f..0000000000 --- a/src/Mod/AddonManager/TODO.md +++ /dev/null @@ -1,8 +0,0 @@ -# Addon Manager Future Work - -* Reduce coupling between data and UI, switching logical groupings of widgets into a MVC or similar framework. - * Particularly in the addons list -* Implement a server-side cache of Addon metadata. -* Implement an "offline mode" that does not attempt to use remote data for anything. -* When installing a Preference Pack, offer to apply it once installed, and to undo after that. -* Better support "headless" mode, with no GUI. diff --git a/src/Mod/AddonManager/TestAddonManagerApp.py b/src/Mod/AddonManager/TestAddonManagerApp.py deleted file mode 100644 index 12392ea2c5..0000000000 --- a/src/Mod/AddonManager/TestAddonManagerApp.py +++ /dev/null @@ -1,100 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import addonmanager_freecad_interface as fci - -# Unit tests for the Addon Manager module -from AddonManagerTest.app.test_utilities import ( - TestUtilities as AddonManagerTestUtilities, -) -from AddonManagerTest.app.test_addon import ( - TestAddon as AddonManagerTestAddon, -) -from AddonManagerTest.app.test_cache import ( - TestCache as AddonManagerTestCache, -) -from AddonManagerTest.app.test_macro import ( - TestMacro as AddonManagerTestMacro, -) -from AddonManagerTest.app.test_git import ( - TestGit as AddonManagerTestGit, -) -from AddonManagerTest.app.test_installer import ( - TestAddonInstaller as AddonManagerTestAddonInstaller, - TestMacroInstaller as AddonManagerTestMacroInstaller, -) -from AddonManagerTest.app.test_dependency_installer import ( - TestDependencyInstaller as AddonManagerTestDependencyInstaller, -) -from AddonManagerTest.app.test_uninstaller import ( - TestAddonUninstaller as AddonManagerTestAddonUninstaller, - TestMacroUninstaller as AddonManagerTestMacroUninstaller, -) -from AddonManagerTest.app.test_freecad_interface import ( - TestConsole as AddonManagerTestConsole, - TestParameters as AddonManagerTestParameters, - TestDataPaths as AddonManagerTestDataPaths, -) -from AddonManagerTest.app.test_metadata import ( - TestDependencyType as AddonManagerTestDependencyType, - TestMetadataReader as AddonManagerTestMetadataReader, - TestMetadataReaderIntegration as AddonManagerTestMetadataReaderIntegration, - TestUrlType as AddonManagerTestUrlType, - TestVersion as AddonManagerTestVersion, - TestMetadataAuxiliaryFunctions as AddonManagerTestMetadataAuxiliaryFunctions, -) - - -class TestListTerminator: - pass - - -# Basic usage mostly to get static analyzers to stop complaining about unused imports -try: - import FreeCAD -except ImportError: - FreeCAD = None -loaded_gui_tests = [ - AddonManagerTestUtilities, - AddonManagerTestAddon, - AddonManagerTestCache, - AddonManagerTestMacro, - AddonManagerTestGit, - AddonManagerTestAddonInstaller, - AddonManagerTestMacroInstaller, - AddonManagerTestDependencyInstaller, - AddonManagerTestAddonUninstaller, - AddonManagerTestMacroUninstaller, - AddonManagerTestConsole, - AddonManagerTestParameters, - AddonManagerTestDataPaths, - AddonManagerTestDependencyType, - AddonManagerTestMetadataReader, - AddonManagerTestMetadataReaderIntegration, - AddonManagerTestUrlType, - AddonManagerTestVersion, - AddonManagerTestMetadataAuxiliaryFunctions, - TestListTerminator, # Needed to prevent the last test from running twice -] -for test in loaded_gui_tests: - fci.Console.PrintLog(f"Loaded tests from {test.__name__}\n") diff --git a/src/Mod/AddonManager/TestAddonManagerGui.py b/src/Mod/AddonManager/TestAddonManagerGui.py deleted file mode 100644 index 25202537f1..0000000000 --- a/src/Mod/AddonManager/TestAddonManagerGui.py +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -import addonmanager_freecad_interface as fci - -# Unit test for the Addon Manager module GUI -from AddonManagerTest.gui.test_gui import TestGui as AddonManagerTestGui - -from AddonManagerTest.gui.test_workers_utility import ( - TestWorkersUtility as AddonManagerTestWorkersUtility, -) -from AddonManagerTest.gui.test_workers_startup import ( - TestWorkersStartup as AddonManagerTestWorkersStartup, -) -from AddonManagerTest.gui.test_installer_gui import ( - TestInstallerGui as AddonManagerTestInstallerGui, -) -from AddonManagerTest.gui.test_installer_gui import ( - TestMacroInstallerGui as AddonManagerTestMacroInstallerGui, -) -from AddonManagerTest.gui.test_update_all_gui import ( - TestUpdateAllGui as AddonManagerTestUpdateAllGui, -) -from AddonManagerTest.gui.test_uninstaller_gui import ( - TestUninstallerGUI as AddonManagerTestUninstallerGUI, -) - - -class TestListTerminator: - pass - - -# Basic usage mostly to get static analyzers to stop complaining about unused imports -loaded_gui_tests = [ - AddonManagerTestGui, - AddonManagerTestWorkersUtility, - AddonManagerTestWorkersStartup, - AddonManagerTestInstallerGui, - AddonManagerTestMacroInstallerGui, - AddonManagerTestUpdateAllGui, - AddonManagerTestUninstallerGUI, - TestListTerminator, # Needed to prevent the last test from running twice -] -for test in loaded_gui_tests: - fci.Console.PrintLog(f"Loaded tests from {test.__name__}\n") diff --git a/src/Mod/AddonManager/Widgets/CMakeLists.txt b/src/Mod/AddonManager/Widgets/CMakeLists.txt deleted file mode 100644 index 939e257e2e..0000000000 --- a/src/Mod/AddonManager/Widgets/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -SET(AddonManagerWidget_SRCS - __init__.py - addonmanager_colors.py - addonmanager_widget_addon_buttons.py - addonmanager_widget_filter_selector.py - addonmanager_widget_global_buttons.py - addonmanager_widget_package_details_view.py - addonmanager_widget_progress_bar.py - addonmanager_widget_readme_browser.py - addonmanager_widget_search.py - addonmanager_widget_view_control_bar.py - addonmanager_widget_view_selector.py -) - -SOURCE_GROUP("" FILES ${AddonManagerWidget_SRCS}) - -ADD_CUSTOM_TARGET(AddonManagerWidget ALL - SOURCES ${AddonManagerWidget_SRCS} -) - -fc_copy_sources(AddonManagerWidget "${CMAKE_BINARY_DIR}/Mod/AddonManager/Widgets" ${AddonManagerWidget_SRCS}) - -INSTALL( - FILES - ${AddonManagerWidget_SRCS} - DESTINATION - Mod/AddonManager/Widgets -) diff --git a/src/Mod/AddonManager/Widgets/__init__.py b/src/Mod/AddonManager/Widgets/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/Mod/AddonManager/Widgets/addonmanager_colors.py b/src/Mod/AddonManager/Widgets/addonmanager_colors.py deleted file mode 100644 index 7d08a07421..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_colors.py +++ /dev/null @@ -1,48 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -from enum import Enum, auto - -import FreeCADGui -from PySide import QtGui - - -def is_darkmode() -> bool: - """Heuristics to determine if we are in a darkmode stylesheet""" - pl = FreeCADGui.getMainWindow().palette() - return pl.color(QtGui.QPalette.Window).lightness() < 128 - - -def warning_color_string() -> str: - """A shade of red, adapted to darkmode if possible. Targets a minimum 7:1 contrast ratio.""" - return "rgb(255,105,97)" if is_darkmode() else "rgb(215,0,21)" - - -def bright_color_string() -> str: - """A shade of green, adapted to darkmode if possible. Targets a minimum 7:1 contrast ratio.""" - return "rgb(48,219,91)" if is_darkmode() else "rgb(36,138,61)" - - -def attention_color_string() -> str: - """A shade of orange, adapted to darkmode if possible. Targets a minimum 7:1 contrast ratio.""" - return "rgb(255,179,64)" if is_darkmode() else "rgb(255,149,0)" diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_addon_buttons.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_addon_buttons.py deleted file mode 100644 index e5ffc3fdc1..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_addon_buttons.py +++ /dev/null @@ -1,118 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a QWidget-derived class for displaying the single-addon buttons.""" - -from enum import Enum, auto - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(_: str, text: str): - return text - - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore, QtGui, QtWidgets - - -class ButtonBarDisplayMode(Enum): - TextOnly = auto() - IconsOnly = auto() - TextAndIcons = auto() - - -class WidgetAddonButtons(QtWidgets.QWidget): - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.display_mode = ButtonBarDisplayMode.TextAndIcons - self._setup_ui() - self._set_icons() - self.retranslateUi(None) - - def set_display_mode(self, mode: ButtonBarDisplayMode): - """NOTE: Not really implemented yet -- TODO: Implement this functionality""" - if mode == self.display_mode: - return - self._setup_ui() - self._set_icons() - self.retranslateUi(None) - - def _setup_ui(self): - if self.layout(): - self.setLayout(None) # TODO: Check this - self.horizontal_layout = QtWidgets.QHBoxLayout() - self.horizontal_layout.setContentsMargins(0, 0, 0, 0) - self.back = QtWidgets.QToolButton(self) - self.install = QtWidgets.QPushButton(self) - self.uninstall = QtWidgets.QPushButton(self) - self.enable = QtWidgets.QPushButton(self) - self.disable = QtWidgets.QPushButton(self) - self.update = QtWidgets.QPushButton(self) - self.run_macro = QtWidgets.QPushButton(self) - self.change_branch = QtWidgets.QPushButton(self) - self.check_for_update = QtWidgets.QPushButton(self) - self.horizontal_layout.addWidget(self.back) - self.horizontal_layout.addStretch() - self.horizontal_layout.addWidget(self.check_for_update) - self.horizontal_layout.addWidget(self.install) - self.horizontal_layout.addWidget(self.uninstall) - self.horizontal_layout.addWidget(self.enable) - self.horizontal_layout.addWidget(self.disable) - self.horizontal_layout.addWidget(self.update) - self.horizontal_layout.addWidget(self.run_macro) - self.horizontal_layout.addWidget(self.change_branch) - self.setLayout(self.horizontal_layout) - - def set_show_back_button(self, show: bool) -> None: - self.back.setVisible(show) - - def _set_icons(self): - self.back.setIcon(QtGui.QIcon.fromTheme("back", QtGui.QIcon(":/icons/button_left.svg"))) - - def retranslateUi(self, _): - self.check_for_update.setText(translate("AddonsInstaller", "Check for update")) - self.install.setText(translate("AddonsInstaller", "Install")) - self.uninstall.setText(translate("AddonsInstaller", "Uninstall")) - self.disable.setText(translate("AddonsInstaller", "Disable")) - self.enable.setText(translate("AddonsInstaller", "Enable")) - self.update.setText(translate("AddonsInstaller", "Update")) - self.run_macro.setText(translate("AddonsInstaller", "Run")) - self.change_branch.setText(translate("AddonsInstaller", "Change branch...")) - self.back.setToolTip(translate("AddonsInstaller", "Return to package list")) diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_filter_selector.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_filter_selector.py deleted file mode 100644 index bb07ee3a28..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_filter_selector.py +++ /dev/null @@ -1,259 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a QWidget-derived class for displaying the view selection buttons.""" - -from enum import IntEnum - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(_: str, text: str): - return text - - -# Get whatever version of PySide we can -try: - from PySide import QtCore, QtWidgets # Use the FreeCAD wrapper -except ImportError: - try: - from PySide6 import QtCore, QtWidgets # Outside FreeCAD, try Qt6 first - except ImportError: - from PySide2 import QtCore, QtWidgets # Fall back to Qt5 - - -class FilterType(IntEnum): - """There are currently two sections in this drop down, for two different types of filters.""" - - PACKAGE_CONTENTS = 0 - INSTALLATION_STATUS = 1 - - -class StatusFilter(IntEnum): - """Predefined filters for status""" - - ANY = 0 - INSTALLED = 1 - NOT_INSTALLED = 2 - UPDATE_AVAILABLE = 3 - - -class ContentFilter(IntEnum): - """Predefined filters for addon content type""" - - ANY = 0 - WORKBENCH = 1 - MACRO = 2 - PREFERENCE_PACK = 3 - BUNDLE = 4 - OTHER = 5 - - -class Filter: - def __init__(self): - self.status_filter = StatusFilter.ANY - self.content_filter = ContentFilter.ANY - - -class WidgetFilterSelector(QtWidgets.QComboBox): - """A label and menu for selecting what sort of addons are displayed""" - - filter_changed = QtCore.Signal(object) # technically, actually class Filter - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.addon_type_index = 0 - self.installation_status_index = 0 - self.extra_padding = 64 - self._setup_ui() - self._setup_connections() - self.retranslateUi(None) - self.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents) - - def _setup_ui(self): - self._build_menu() - - def _build_menu(self): - self.clear() - self.addItem(translate("AddonsInstaller", "Filter by...")) - self.insertSeparator(self.count()) - self.addItem(translate("AddonsInstaller", "Addon Type")) - self.addon_type_index = self.count() - 1 - self.addItem( - translate("AddonsInstaller", "Any"), (FilterType.PACKAGE_CONTENTS, ContentFilter.ANY) - ) - self.addItem( - translate("AddonsInstaller", "Workbench"), - (FilterType.PACKAGE_CONTENTS, ContentFilter.WORKBENCH), - ) - self.addItem( - translate("AddonsInstaller", "Macro"), - (FilterType.PACKAGE_CONTENTS, ContentFilter.MACRO), - ) - self.addItem( - translate("AddonsInstaller", "Preference Pack"), - (FilterType.PACKAGE_CONTENTS, ContentFilter.PREFERENCE_PACK), - ) - self.addItem( - translate("AddonsInstaller", "Bundle"), - (FilterType.PACKAGE_CONTENTS, ContentFilter.BUNDLE), - ) - self.addItem( - translate("AddonsInstaller", "Other"), - (FilterType.PACKAGE_CONTENTS, ContentFilter.OTHER), - ) - self.insertSeparator(self.count()) - self.addItem(translate("AddonsInstaller", "Installation Status")) - self.installation_status_index = self.count() - 1 - self.addItem( - translate("AddonsInstaller", "Any"), (FilterType.INSTALLATION_STATUS, StatusFilter.ANY) - ) - self.addItem( - translate("AddonsInstaller", "Not installed"), - (FilterType.INSTALLATION_STATUS, StatusFilter.NOT_INSTALLED), - ) - self.addItem( - translate("AddonsInstaller", "Installed"), - (FilterType.INSTALLATION_STATUS, StatusFilter.INSTALLED), - ) - self.addItem( - translate("AddonsInstaller", "Update available"), - (FilterType.INSTALLATION_STATUS, StatusFilter.UPDATE_AVAILABLE), - ) - model: QtCore.QAbstractItemModel = self.model() - for row in range(model.rowCount()): - if row <= self.addon_type_index: - model.item(row).setEnabled(False) - elif row < self.installation_status_index: - item = model.item(row) - item.setCheckState(QtCore.Qt.Unchecked) - elif row == self.installation_status_index: - model.item(row).setEnabled(False) - else: - item = model.item(row) - item.setCheckState(QtCore.Qt.Unchecked) - - for row in range(model.rowCount()): - data = self.itemData(row) - if data: - item = model.item(row) - if data[0] == FilterType.PACKAGE_CONTENTS and data[1] == ContentFilter.ANY: - item.setCheckState(QtCore.Qt.Checked) - elif data[0] == FilterType.INSTALLATION_STATUS and data[1] == StatusFilter.ANY: - item.setCheckState(QtCore.Qt.Checked) - else: - item.setCheckState(QtCore.Qt.Unchecked) - - def set_contents_filter(self, contents_filter: ContentFilter): - model = self.model() - for row in range(model.rowCount()): - item = model.item(row) - user_data = self.itemData(row) - if user_data and user_data[0] == FilterType.PACKAGE_CONTENTS: - if user_data[1] == contents_filter: - item.setCheckState(QtCore.Qt.Checked) - else: - item.setCheckState(QtCore.Qt.Unchecked) - self._update_first_row_text() - - def set_status_filter(self, status_filter: StatusFilter): - model = self.model() - for row in range(model.rowCount()): - item = model.item(row) - user_data = self.itemData(row) - if user_data and user_data[0] == FilterType.INSTALLATION_STATUS: - if user_data[1] == status_filter: - item.setCheckState(QtCore.Qt.Checked) - else: - item.setCheckState(QtCore.Qt.Unchecked) - self._update_first_row_text() - - def _setup_connections(self): - self.activated.connect(self._selected) - - def _adjust_dropdown_width(self): - max_width = 0 - font_metrics = self.fontMetrics() - for index in range(self.count()): - width = font_metrics.horizontalAdvance(self.itemText(index)) - max_width = max(max_width, width) - self.view().setMinimumWidth(max_width + self.extra_padding) - - def retranslateUi(self, _): - self._build_menu() - self._adjust_dropdown_width() - - def _selected(self, row: int): - if row == 0: - return - if row == self.installation_status_index or row == self.addon_type_index: - self.setCurrentIndex(0) - return - model = self.model() - selected_data = self.itemData(row) - if not selected_data: - return - selected_row_type = selected_data[0] - - for row in range(model.rowCount()): - item = model.item(row) - user_data = self.itemData(row) - if user_data and user_data[0] == selected_row_type: - if user_data[1] == selected_data[1]: - item.setCheckState(QtCore.Qt.Checked) - else: - item.setCheckState(QtCore.Qt.Unchecked) - self._emit_current_filter() - self.setCurrentIndex(0) - self._update_first_row_text() - - def _emit_current_filter(self): - model = self.model() - new_filter = Filter() - for row in range(model.rowCount()): - item = model.item(row) - data = self.itemData(row) - if data and item.checkState() == QtCore.Qt.Checked: - if data[0] == FilterType.INSTALLATION_STATUS: - new_filter.status_filter = data[1] - elif data[0] == FilterType.PACKAGE_CONTENTS: - new_filter.content_filter = data[1] - self.filter_changed.emit(new_filter) - - def _update_first_row_text(self): - model = self.model() - state1 = "" - state2 = "" - for row in range(model.rowCount()): - item = model.item(row) - if item.checkState() == QtCore.Qt.Checked: - if not state1: - state1 = item.text() - else: - state2 = item.text() - break - model.item(0).setText(translate("AddonsInstaller", "Filter") + f": {state1}, {state2}") diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_global_buttons.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_global_buttons.py deleted file mode 100644 index 67833201bd..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_global_buttons.py +++ /dev/null @@ -1,110 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a QWidget-derived class for displaying a set of buttons that affect the Addon -Manager as a whole (rather than a specific Addon). Typically inserted at the bottom of the Addon -Manager main window.""" - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(_: str, text: str, details: str = "", n: int = 0): - return text - - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtGui, QtWidgets - - -class WidgetGlobalButtonBar(QtWidgets.QWidget): - """A QWidget-derived class for displaying a set of buttons that affect the Addon Manager as a - whole (rather than a specific Addon).""" - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.horizontal_layout = None - self.refresh_local_cache = None - self.update_all_addons = None - self.check_for_updates = None - self.python_dependencies = None - self.developer_tools = None - self.close = None - self._update_ui() - self.retranslateUi(None) - self._set_icons() - - def _update_ui(self): - self.horizontal_layout = QtWidgets.QHBoxLayout() - self.refresh_local_cache = QtWidgets.QPushButton(self) - self.update_all_addons = QtWidgets.QPushButton(self) - self.check_for_updates = QtWidgets.QPushButton(self) - self.python_dependencies = QtWidgets.QPushButton(self) - self.developer_tools = QtWidgets.QPushButton(self) - self.close = QtWidgets.QPushButton(self) - self.horizontal_layout.addWidget(self.refresh_local_cache) - self.horizontal_layout.addWidget(self.update_all_addons) - self.horizontal_layout.addWidget(self.check_for_updates) - self.horizontal_layout.addWidget(self.python_dependencies) - self.horizontal_layout.addWidget(self.developer_tools) - self.horizontal_layout.addStretch() - self.horizontal_layout.addWidget(self.close) - self.setLayout(self.horizontal_layout) - - def _set_icons(self): - self.update_all_addons.setIcon(QtGui.QIcon(":/icons/button_valid.svg")) - self.check_for_updates.setIcon(QtGui.QIcon(":/icons/view-refresh.svg")) - self.close.setIcon(QtGui.QIcon.fromTheme("close", QtGui.QIcon(":/icons/process-stop.svg"))) - - def retranslateUi(self, _): - self.refresh_local_cache.setText(translate("AddonsInstaller", "Close")) - self.update_all_addons.setText(translate("AddonsInstaller", "Update all addons")) - self.check_for_updates.setText(translate("AddonsInstaller", "Check for updates")) - self.python_dependencies.setText(translate("AddonsInstaller", "Python dependencies...")) - self.developer_tools.setText(translate("AddonsInstaller", "Developer tools...")) - self.close.setText(translate("AddonsInstaller", "Close")) - - def set_number_of_available_updates(self, updates: int): - if updates > 0: - self.update_all_addons.setEnabled(True) - self.update_all_addons.setText( - translate("AddonsInstaller", "Apply %n available update(s)", "", updates) - ) - else: - self.update_all_addons.setEnabled(False) - self.update_all_addons.setText(translate("AddonsInstaller", "No updates available")) diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_package_details_view.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_package_details_view.py deleted file mode 100644 index 0ce79da106..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_package_details_view.py +++ /dev/null @@ -1,361 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 The FreeCAD Project Association AISBL * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -from dataclasses import dataclass -from enum import Enum, auto -import os -from typing import Optional - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(_: str, text: str): - return text - - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore, QtWidgets - -from .addonmanager_widget_addon_buttons import WidgetAddonButtons -from .addonmanager_widget_readme_browser import WidgetReadmeBrowser -from .addonmanager_colors import warning_color_string, attention_color_string, bright_color_string - - -class MessageType(Enum): - Message = auto() - Warning = auto() - Error = auto() - - -@dataclass -class UpdateInformation: - unchecked: bool = True - check_in_progress: bool = False - update_available: bool = False - detached_head: bool = False - version: str = "" - tag: str = "" - branch: Optional[str] = None - - -@dataclass -class WarningFlags: - obsolete: bool = False - python2: bool = False - required_freecad_version: Optional[str] = None - non_osi_approved = False - non_fsf_libre = False - - -class PackageDetailsView(QtWidgets.QWidget): - """The view class for the package details""" - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.button_bar = None - self.readme_browser = None - self.message_label = None - self.location_label = None - self.url_label = None - self.installed = False - self.disabled = False - self.update_info = UpdateInformation() - self.warning_flags = WarningFlags() - self.installed_version = None - self.installed_branch = None - self.installed_timestamp = None - self.can_disable = True - self._setup_ui() - - def _setup_ui(self): - self.vertical_layout = QtWidgets.QVBoxLayout(self) - self.button_bar = WidgetAddonButtons(self) - self.readme_browser = WidgetReadmeBrowser(self) - self.message_label = QtWidgets.QLabel(self) - self.location_label = QtWidgets.QLabel(self) - self.url_label = QtWidgets.QLabel(self) - self.url_label.setOpenExternalLinks(True) - self.location_label.setOpenExternalLinks(True) - self.vertical_layout.addWidget(self.button_bar) - self.vertical_layout.addWidget(self.message_label) - self.vertical_layout.addWidget(self.location_label) - self.vertical_layout.addWidget(self.url_label) - self.vertical_layout.addWidget(self.readme_browser) - self.button_bar.hide() # Start with no bar - - def set_location(self, location: Optional[str]): - if location is not None: - location_path = os.path.normpath(location) - text = ( - f"{translate('AddonsInstaller', 'Installation location')}: " - f'{location_path}' - ) - self.location_label.setText(text) - self.location_label.show() - else: - self.location_label.hide() - - def set_url(self, url: Optional[str]): - if url is not None: - text = ( - translate("AddonsInstaller", "Repository URL") - + ': ' - + url - + "" - ) - self.url_label.setText(text) - self.url_label.show() - else: - self.url_label.hide() - - def set_installed( - self, - installed: bool, - on_date: Optional[str] = None, - version: Optional[str] = None, - branch: Optional[str] = None, - ): - self.installed = installed - self.installed_timestamp = on_date - self.installed_version = version - self.installed_branch = branch - if not self.installed: - self.set_location(None) - self._sync_ui_state() - - def set_update_available(self, info: UpdateInformation): - self.update_info = info - self._sync_ui_state() - - def set_disabled(self, disabled: bool): - self.disabled = disabled - self._sync_ui_state() - - def allow_disabling(self, allow: bool): - self.can_disable = allow - self._sync_ui_state() - - def allow_running(self, show: bool): - self.button_bar.run_macro.setVisible(show) - - def set_warning_flags(self, flags: WarningFlags): - self.warning_flags = flags - self._sync_ui_state() - - def set_new_disabled_status(self, disabled: bool): - """If the user just changed the enabled/disabled state of the addon, display a message - indicating that will not take place until restart. Do not call except in a case of a - state change during this run.""" - - if disabled: - message = translate( - "AddonsInstaller", "This Addon will be disabled next time you restart FreeCAD." - ) - else: - message = translate( - "AddonsInstaller", "This Addon will be enabled next time you restart FreeCAD." - ) - self.message_label.setText(f"

{message}

") - self.message_label.setStyleSheet("color:" + attention_color_string()) - - def set_new_branch(self, branch: str): - """If the user just changed branches, update the message to show that a restart is - needed.""" - message_string = "

" - message_string += translate( - "AddonsInstaller", "Changed to branch '{}' -- please restart to use Addon." - ).format(branch) - message_string += "

" - self.message_label.setText(message_string) - self.message_label.setStyleSheet("color:" + attention_color_string()) - - def set_updated(self): - """If the user has just updated the addon but not yet restarted, show an indication that - we are awaiting a restart.""" - message = translate( - "AddonsInstaller", "This Addon has been updated. Restart FreeCAD to see changes." - ) - self.message_label.setText(f"

{message}

") - self.message_label.setStyleSheet("color:" + attention_color_string()) - - def _sync_ui_state(self): - self._sync_button_state() - self._create_status_label_text() - - def _sync_button_state(self): - self.button_bar.install.setVisible(not self.installed) - self.button_bar.uninstall.setVisible(self.installed) - if not self.installed: - self.button_bar.disable.hide() - self.button_bar.enable.hide() - self.button_bar.update.hide() - self.button_bar.check_for_update.hide() - else: - self.button_bar.update.setVisible(self.update_info.update_available) - if self.update_info.detached_head: - self.button_bar.check_for_update.hide() - else: - self.button_bar.check_for_update.setVisible(not self.update_info.update_available) - if self.can_disable: - self.button_bar.enable.setVisible(self.disabled) - self.button_bar.disable.setVisible(not self.disabled) - else: - self.button_bar.enable.hide() - self.button_bar.disable.hide() - - def _create_status_label_text(self): - if self.installed: - installation_details = self._get_installation_details_string() - update_details = self._get_update_status_string() - message_text = f"{installation_details} {update_details}" - if self.disabled: - message_text += " [" + translate("AddonsInstaller", "Disabled") + "]" - self.message_label.setText(f"

{message_text}

") - if self.disabled: - self.message_label.setStyleSheet("color:" + warning_color_string()) - elif self.update_info.update_available: - self.message_label.setStyleSheet("color:" + attention_color_string()) - else: - self.message_label.setStyleSheet("color:" + bright_color_string()) - self.message_label.show() - elif self._there_are_warnings_to_show(): - warnings = self._get_warning_string() - self.message_label.setText(f"

{warnings}

") - self.message_label.setStyleSheet("color:" + warning_color_string()) - self.message_label.show() - else: - self.message_label.hide() - - def _get_installation_details_string(self) -> str: - version = self.installed_version - date = "" - installed_version_string = "" - if self.installed_timestamp: - date = QtCore.QLocale().toString( - QtCore.QDateTime.fromSecsSinceEpoch(int(round(self.installed_timestamp, 0))), - QtCore.QLocale.ShortFormat, - ) - if version and date: - installed_version_string += ( - translate("AddonsInstaller", "Version {version} installed on {date}").format( - version=version, date=date - ) - + ". " - ) - elif version: - installed_version_string += ( - translate("AddonsInstaller", "Version {version} installed") + "." - ).format(version=version) - elif date: - installed_version_string += ( - translate("AddonsInstaller", "Installed on {date}") + "." - ).format(date=date) - else: - installed_version_string += translate("AddonsInstaller", "Installed") + "." - return installed_version_string - - def _get_update_status_string(self) -> str: - if self.update_info.check_in_progress: - return translate("AddonsInstaller", "Update check in progress") + "." - elif self.update_info.unchecked: - return "" - if self.update_info.detached_head: - return ( - translate( - "AddonsInstaller", "Git tag '{}' checked out, no updates possible" - ).format(self.update_info.tag) - + "." - ) - if self.update_info.update_available: - if self.installed_branch and self.update_info.branch: - if self.installed_branch != self.update_info.branch: - return ( - translate( - "AddonsInstaller", "Currently on branch {}, name changed to {}" - ).format(self.installed_branch, self.update_info.branch) - + "." - ) - if self.update_info.version: - return ( - translate( - "AddonsInstaller", - "Currently on branch {}, update available to version {}", - ).format(self.installed_branch, str(self.update_info.version).strip()) - + "." - ) - return translate("AddonsInstaller", "Update available") + "." - if self.update_info.version: - return ( - translate("AddonsInstaller", "Update available to version {}").format( - str(self.update_info.version).strip() - ) - + "." - ) - return translate("AddonsInstaller", "Update available") + "." - return translate("AddonsInstaller", "This is the latest version available") + "." - - def _there_are_warnings_to_show(self) -> bool: - if self.disabled: - return True - if ( - self.warning_flags.obsolete - or self.warning_flags.python2 - or self.warning_flags.required_freecad_version - ): - return True - return False # TODO: Someday support optional warnings on license types - - def _get_warning_string(self) -> str: - if self.installed and self.disabled: - return translate( - "AddonsInstaller", - "WARNING: This addon is currently installed, but disabled. Use the 'enable' " - "button to re-enable.", - ) - if self.warning_flags.obsolete: - return translate("AddonsInstaller", "WARNING: This addon is obsolete") - if self.warning_flags.python2: - return translate("AddonsInstaller", "WARNING: This addon is Python 2 only") - if self.warning_flags.required_freecad_version: - return translate("AddonsInstaller", "WARNING: This addon requires FreeCAD {}").format( - self.warning_flags.required_freecad_version - ) - return "" diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_progress_bar.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_progress_bar.py deleted file mode 100644 index 1e9c0a1f20..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_progress_bar.py +++ /dev/null @@ -1,168 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a QWidget-derived class for displaying the cache load status.""" - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(_: str, text: str): - return text - - -# Get whatever version of PySide we can -try: - from PySide import QtCore, QtGui, QtWidgets # Use the FreeCAD wrapper -except ImportError: - try: - from PySide6 import QtCore, QtGui, QtWidgets # Outside FreeCAD, try Qt6 first - except ImportError: - from PySide2 import QtCore, QtGui, QtWidgets # Fall back to Qt5 - -from dataclasses import dataclass - -_TOTAL_INCREMENTS = 1000 - - -class Progress: - """Represents progress through a process composed of multiple sub-tasks.""" - - def __init__( - self, - *, - status_text: str = "", - number_of_tasks: int = 1, - current_task: int = 0, - current_task_progress: float = 0.0, - ): - if number_of_tasks < 1: - raise ValueError(f"Number of tasks must be at least one, not {number_of_tasks}") - if current_task < 0 or current_task >= number_of_tasks: - raise ValueError( - "Current task must be between 0 and the number of tasks " - f"({number_of_tasks}), not {current_task}" - ) - if current_task_progress < 0.0: - current_task_progress = 0.0 - elif current_task_progress > 100.0: - current_task_progress = 100.0 - self.status_text: str = status_text - self._number_of_tasks: int = number_of_tasks - self._current_task: int = current_task - self._current_task_progress: float = current_task_progress - - @property - def number_of_tasks(self): - return self._number_of_tasks - - @number_of_tasks.setter - def number_of_tasks(self, value: int): - if not isinstance(value, int): - raise TypeError("Number of tasks must be an integer") - if value < 1: - raise ValueError("Number of tasks must be at least one") - self._number_of_tasks = value - - @property - def current_task(self): - """The current task (zero-indexed, always less than the number of tasks)""" - return self._current_task - - @current_task.setter - def current_task(self, value: int): - if not isinstance(value, int): - raise TypeError("Current task must be an integer") - if value < 0: - raise ValueError("Current task must be at least zero") - if value >= self._number_of_tasks: - raise ValueError("Current task must be less than the total number of tasks") - self._current_task = value - - @property - def current_task_progress(self): - """Current task progress, guaranteed to be in the range [0.0, 100.0]. Attempts to set a - value outside that range are clamped to the range.""" - return self._current_task_progress - - @current_task_progress.setter - def current_task_progress(self, value: float): - """Set the current task's progress. Rather than raising an exception when the value is - outside the expected range of [0,100], clamp the task progress to allow for some - floating point imprecision in its calculation.""" - if value < 0.0: - value = 0.0 - elif value > 100.0: - value = 100.0 - self._current_task_progress = value - - def next_task(self) -> None: - """Increment the task counter and reset the progress""" - self.current_task += 1 - self.current_task_progress = 0.0 - - def overall_progress(self) -> float: - """Gets the overall progress as a fractional value in the range [0, 1]""" - base = self._current_task / self._number_of_tasks - fraction = self._current_task_progress / (100.0 * self._number_of_tasks) - return base + fraction - - -class WidgetProgressBar(QtWidgets.QWidget): - """A multipart progress bar widget, including a stop button and a status label.""" - - stop_clicked = QtCore.Signal() - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.vertical_layout = None - self.horizontal_layout = None - self.progress_bar = None - self.status_label = None - self.stop_button = None - self._setup_ui() - - def _setup_ui(self): - self.vertical_layout = QtWidgets.QVBoxLayout(self) - self.horizontal_layout = QtWidgets.QHBoxLayout() - self.progress_bar = QtWidgets.QProgressBar(self) - self.status_label = QtWidgets.QLabel(self) - self.stop_button = QtWidgets.QToolButton(self) - self.progress_bar.setMaximum(_TOTAL_INCREMENTS) - self.stop_button.clicked.connect(self.stop_clicked) - self.stop_button.setIcon( - QtGui.QIcon.fromTheme("stop", QtGui.QIcon(":/icons/debug-stop.svg")) - ) - self.vertical_layout.addLayout(self.horizontal_layout) - self.vertical_layout.addWidget(self.status_label) - self.horizontal_layout.addWidget(self.progress_bar) - self.horizontal_layout.addWidget(self.stop_button) - self.vertical_layout.setContentsMargins(0, 0, 0, 0) - self.horizontal_layout.setContentsMargins(0, 0, 0, 0) - - def set_progress(self, progress: Progress) -> None: - self.status_label.setText(progress.status_text) - self.progress_bar.setValue(progress.overall_progress() * _TOTAL_INCREMENTS) diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_readme_browser.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_readme_browser.py deleted file mode 100644 index fade43283d..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_readme_browser.py +++ /dev/null @@ -1,132 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 The FreeCAD Project Association AISBL * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** -import re - -import FreeCAD - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore, QtGui, QtWidgets - -from typing import Optional - - -class WidgetReadmeBrowser(QtWidgets.QTextBrowser): - """A QTextBrowser widget that emits signals for each requested image resource, allowing an external controller - to load and re-deliver those images. Once all resources have been re-delivered, the original data is redisplayed - with the images in-line. Call setUrl prior to calling setMarkdown or setHtml to ensure URLs are resolved - correctly.""" - - load_resource = QtCore.Signal(str) # Str is a URL to a resource - follow_link = QtCore.Signal(str) # Str is a URL to another page - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.image_map = {} - self.url = "" - self.stop = False - self.setOpenExternalLinks(True) - - def setUrl(self, url: str): - """Set the base URL of the page. Used to resolve relative URLs in the page source.""" - self.url = url - - def setMarkdown(self, md: str): - """Provides an optional fallback to the markdown library for older versions of Qt (prior to 5.15) that did not - have native markdown support. Lacking that, plaintext is displayed.""" - geometry = self.geometry() - if hasattr(super(), "setMarkdown"): - - super().setMarkdown(self._clean_markdown(md)) - else: - try: - import markdown - - html = markdown.markdown(md) - self.setHtml(html) - except ImportError: - self.setText(md) - FreeCAD.Console.Warning( - "Qt < 5.15 and no `import markdown` -- falling back to plain text display\n" - ) - self.setGeometry(geometry) - - def _clean_markdown(self, md: str): - # Remove some HTML tags ( for now just img and br, which are the most common offenders that break rendering ) - br_re = re.compile(r"") - img_re = re.compile(r"]+)(?:'|\").*?\/?>") - - cleaned = br_re.sub(r"\n", md) - cleaned = img_re.sub(r"[html tag removed]", cleaned) - - return cleaned - - def set_resource(self, resource_url: str, image: Optional[QtGui.QImage]): - """Once a resource has been fetched (or the fetch has failed), this method should be used to inform the widget - that the resource has been loaded. Note that the incoming image is scaled to 97% of the widget width if it is - larger than that.""" - self.image_map[resource_url] = self._ensure_appropriate_width(image) - - def loadResource(self, resource_type: int, name: QtCore.QUrl) -> object: - """Callback for resource loading. Called automatically by underlying Qt - code when external resources are needed for rendering. In particular, - here it is used to download and cache (in RAM) the images needed for the - README and Wiki pages.""" - if resource_type == QtGui.QTextDocument.ImageResource and not self.stop: - full_url = self._create_full_url(name.toString()) - if full_url not in self.image_map: - self.load_resource.emit(full_url) - self.image_map[full_url] = None - return self.image_map[full_url] - elif resource_type == QtGui.QTextDocument.MarkdownResource: - self.follow_link.emit(name.toString()) - return self.toMarkdown() - elif resource_type == QtGui.QTextDocument.HtmlResource: - self.follow_link.emit(name.toString()) - return self.toHtml() - return super().loadResource(resource_type, name) - - def _ensure_appropriate_width(self, image: QtGui.QImage) -> QtGui.QImage: - ninety_seven_percent = self.width() * 0.97 - if image.width() < ninety_seven_percent: - return image - return image.scaledToWidth(ninety_seven_percent) - - def _create_full_url(self, url: str) -> str: - if url.startswith("http"): - return url - if not self.url: - return url - lhs, slash, _ = self.url.rpartition("/") - return lhs + slash + url diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_search.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_search.py deleted file mode 100644 index 339f31fcdf..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_search.py +++ /dev/null @@ -1,104 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a QWidget-derived class for displaying the view selection buttons.""" - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(_: str, text: str): - return text - - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore, QtGui, QtWidgets - - -class WidgetSearch(QtWidgets.QWidget): - """A widget for selecting the Addon Manager's primary view mode""" - - search_changed = QtCore.Signal(str) - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self._setup_ui() - self._setup_connections() - self.retranslateUi(None) - - def _setup_ui(self): - self.horizontal_layout = QtWidgets.QHBoxLayout() - self.horizontal_layout.setContentsMargins(0, 0, 0, 0) - self.filter_line_edit = QtWidgets.QLineEdit(self) - self.filter_line_edit.setClearButtonEnabled(True) - self.horizontal_layout.addWidget(self.filter_line_edit) - self.filter_validity_label = QtWidgets.QLabel(self) - self.horizontal_layout.addWidget(self.filter_validity_label) - self.filter_validity_label.hide() # This widget starts hidden - self.setLayout(self.horizontal_layout) - - def _setup_connections(self): - self.filter_line_edit.textChanged.connect(self.set_text_filter) - - def set_text_filter(self, text_filter: str) -> None: - """Set the current filter. If the filter is valid, this will emit a filter_changed - signal. text_filter may be regular expression.""" - - if text_filter: - test_regex = QtCore.QRegularExpression(text_filter) - if test_regex.isValid(): - self.filter_validity_label.setToolTip( - translate("AddonsInstaller", "Filter is valid") - ) - icon = QtGui.QIcon.fromTheme("ok", QtGui.QIcon(":/icons/edit_OK.svg")) - self.filter_validity_label.setPixmap(icon.pixmap(16, 16)) - else: - self.filter_validity_label.setToolTip( - translate("AddonsInstaller", "Filter regular expression is invalid") - ) - icon = QtGui.QIcon.fromTheme("cancel", QtGui.QIcon(":/icons/edit_Cancel.svg")) - self.filter_validity_label.setPixmap(icon.pixmap(16, 16)) - self.filter_validity_label.show() - else: - self.filter_validity_label.hide() - self.search_changed.emit(text_filter) - - def retranslateUi(self, _): - self.filter_line_edit.setPlaceholderText( - QtCore.QCoreApplication.translate("AddonsInstaller", "Search...", None) - ) diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_view_control_bar.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_view_control_bar.py deleted file mode 100644 index 3d44a18954..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_view_control_bar.py +++ /dev/null @@ -1,169 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a class derived from QWidget for displaying the bar at the top of the addons list.""" - -from enum import IntEnum, auto - -try: - import FreeCAD -except ImportError: - FreeCAD = None - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore, QtGui, QtWidgets -from .addonmanager_widget_view_selector import WidgetViewSelector -from .addonmanager_widget_filter_selector import WidgetFilterSelector -from .addonmanager_widget_search import WidgetSearch - -translate = QtCore.QCoreApplication.translate - - -class SortOptions(IntEnum): - _SortRoleOffset = 100 - Alphabetical = QtCore.Qt.UserRole + _SortRoleOffset + 0 - LastUpdated = QtCore.Qt.UserRole + _SortRoleOffset + 1 - DateAdded = QtCore.Qt.UserRole + _SortRoleOffset + 2 - Stars = QtCore.Qt.UserRole + _SortRoleOffset + 3 - Score = QtCore.Qt.UserRole + _SortRoleOffset + 4 - - -default_sort_order = { - SortOptions.Alphabetical: QtCore.Qt.AscendingOrder, - SortOptions.LastUpdated: QtCore.Qt.DescendingOrder, - SortOptions.DateAdded: QtCore.Qt.DescendingOrder, - SortOptions.Stars: QtCore.Qt.DescendingOrder, - SortOptions.Score: QtCore.Qt.DescendingOrder, -} - - -class WidgetViewControlBar(QtWidgets.QWidget): - """A bar containing a view selection widget, a filter widget, and a search widget""" - - view_changed = QtCore.Signal(int) - filter_changed = QtCore.Signal(object) - search_changed = QtCore.Signal(str) - sort_changed = QtCore.Signal(int) - sort_order_changed = QtCore.Signal(QtCore.Qt.SortOrder) - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.has_rankings = False - self._setup_ui() - self._setup_connections() - self.retranslateUi(None) - self.sort_order = QtCore.Qt.AscendingOrder - self._set_sort_order_icon() - - def _setup_ui(self): - self.horizontal_layout = QtWidgets.QHBoxLayout() - self.horizontal_layout.setContentsMargins(0, 0, 0, 0) - self.view_selector = WidgetViewSelector(self) - self.filter_selector = WidgetFilterSelector(self) - self.sort_selector = QtWidgets.QComboBox(self) - self.sort_order_button = QtWidgets.QToolButton(self) - self.sort_order_button.setIcon( - QtGui.QIcon.fromTheme("ascending", QtGui.QIcon(":/icons/sort_ascending.svg")) - ) - self.search = WidgetSearch(self) - self.horizontal_layout.addWidget(self.view_selector) - self.horizontal_layout.addWidget(self.filter_selector) - self.horizontal_layout.addWidget(self.sort_selector) - self.horizontal_layout.addWidget(self.sort_order_button) - self.horizontal_layout.addWidget(self.search) - self.setLayout(self.horizontal_layout) - - def _sort_order_clicked(self): - if self.sort_order == QtCore.Qt.AscendingOrder: - self.set_sort_order(QtCore.Qt.DescendingOrder) - else: - self.set_sort_order(QtCore.Qt.AscendingOrder) - self.sort_order_changed.emit(self.sort_order) - - def set_sort_order(self, order: QtCore.Qt.SortOrder) -> None: - self.sort_order = order - self._set_sort_order_icon() - - def _set_sort_order_icon(self): - if self.sort_order == QtCore.Qt.AscendingOrder: - self.sort_order_button.setIcon( - QtGui.QIcon.fromTheme( - "view-sort-ascending", QtGui.QIcon(":/icons/sort_ascending.svg") - ) - ) - else: - self.sort_order_button.setIcon( - QtGui.QIcon.fromTheme( - "view-sort-descending", QtGui.QIcon(":/icons/sort_descending.svg") - ) - ) - - def set_rankings_available(self, rankings_available: bool) -> None: - self.has_rankings = rankings_available - self.retranslateUi(None) - - def _setup_connections(self): - self.view_selector.view_changed.connect(self.view_changed.emit) - self.filter_selector.filter_changed.connect(self.filter_changed.emit) - self.search.search_changed.connect(self.search_changed.emit) - self.sort_selector.currentIndexChanged.connect(self._sort_changed) - self.sort_order_button.clicked.connect(self._sort_order_clicked) - - def _sort_changed(self, index: int): - sort_role = self.sort_selector.itemData(index) - if sort_role is None: - sort_role = SortOptions.Alphabetical - self.set_sort_order(default_sort_order[sort_role]) - self.sort_changed.emit(sort_role) - self.sort_order_changed.emit(self.sort_order) - - def retranslateUi(self, _=None): - self.sort_selector.clear() - self.sort_selector.addItem( - translate("AddonsInstaller", "Alphabetical", "Sort order"), SortOptions.Alphabetical - ) - self.sort_selector.addItem( - translate("AddonsInstaller", "Last Updated", "Sort order"), SortOptions.LastUpdated - ) - self.sort_selector.addItem( - translate("AddonsInstaller", "Date Created", "Sort order"), SortOptions.DateAdded - ) - self.sort_selector.addItem( - translate("AddonsInstaller", "GitHub Stars", "Sort order"), SortOptions.Stars - ) - if self.has_rankings: - self.sort_selector.addItem( - translate("AddonsInstaller", "Score", "Sort order"), SortOptions.Score - ) diff --git a/src/Mod/AddonManager/Widgets/addonmanager_widget_view_selector.py b/src/Mod/AddonManager/Widgets/addonmanager_widget_view_selector.py deleted file mode 100644 index 7a65a0f655..0000000000 --- a/src/Mod/AddonManager/Widgets/addonmanager_widget_view_selector.py +++ /dev/null @@ -1,161 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Defines a QWidget-derived class for displaying the view selection buttons.""" - -from enum import IntEnum - -try: - import FreeCAD - - translate = FreeCAD.Qt.translate -except ImportError: - FreeCAD = None - - def translate(context: str, text: str): - return text - - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore, QtGui, QtWidgets - - -class AddonManagerDisplayStyle(IntEnum): - """The display mode of the Addon Manager""" - - COMPACT = 0 - EXPANDED = 1 - COMPOSITE = 2 - - -class WidgetViewSelector(QtWidgets.QWidget): - """A widget for selecting the Addon Manager's primary view mode""" - - view_changed = QtCore.Signal(int) - - def __init__(self, parent: QtWidgets.QWidget = None): - super().__init__(parent) - self.horizontal_layout = None - self.composite_button = None - self.expanded_button = None - self.compact_button = None - self._setup_ui() - self._setup_connections() - - def set_current_view(self, view: AddonManagerDisplayStyle): - """Set the current selection. Does NOT emit a view_changed signal, only changes the - interface display.""" - self.compact_button.setChecked(False) - self.expanded_button.setChecked(False) - self.composite_button.setChecked(False) - if view == AddonManagerDisplayStyle.COMPACT: - self.compact_button.setChecked(True) - elif view == AddonManagerDisplayStyle.EXPANDED: - self.expanded_button.setChecked(True) - elif view == AddonManagerDisplayStyle.COMPOSITE: - self.composite_button.setChecked(True) - else: - if FreeCAD is not None: - FreeCAD.Console.PrintWarning(f"Unrecognized display style {view}") - - def _setup_ui(self): - self.horizontal_layout = QtWidgets.QHBoxLayout() - self.horizontal_layout.setContentsMargins(0, 0, 0, 0) - self.horizontal_layout.setSpacing(2) - self.compact_button = QtWidgets.QToolButton(self) - self.compact_button.setObjectName("compact_button") - self.compact_button.setIcon( - QtGui.QIcon.fromTheme("back", QtGui.QIcon(":/icons/compact_view.svg")) - ) - self.compact_button.setCheckable(True) - self.compact_button.setAutoExclusive(True) - - self.expanded_button = QtWidgets.QToolButton(self) - self.expanded_button.setObjectName("expanded_button") - self.expanded_button.setCheckable(True) - self.expanded_button.setChecked(True) - self.expanded_button.setAutoExclusive(True) - self.expanded_button.setIcon( - QtGui.QIcon.fromTheme("expanded_view", QtGui.QIcon(":/icons/expanded_view.svg")) - ) - - self.composite_button = QtWidgets.QToolButton(self) - self.composite_button.setObjectName("composite_button") - if ( - QtCore.QLibraryInfo.version().majorVersion() == 5 - and QtCore.QLibraryInfo.version().minorVersion() < 15 - ): - self.composite_button.setEnabled(False) - self.composite_button.setCheckable(False) - self.composite_button.setChecked(False) - else: - self.composite_button.setCheckable(True) - self.composite_button.setChecked(True) - self.composite_button.setAutoExclusive(True) - self.composite_button.setIcon( - QtGui.QIcon.fromTheme("composite_button", QtGui.QIcon(":/icons/composite_view.svg")) - ) - self.horizontal_layout.addWidget(self.compact_button) - self.horizontal_layout.addWidget(self.expanded_button) - self.horizontal_layout.addWidget(self.composite_button) - - self.compact_button.clicked.connect( - lambda: self.view_changed.emit(AddonManagerDisplayStyle.COMPACT) - ) - self.expanded_button.clicked.connect( - lambda: self.view_changed.emit(AddonManagerDisplayStyle.EXPANDED) - ) - self.composite_button.clicked.connect( - lambda: self.view_changed.emit(AddonManagerDisplayStyle.COMPOSITE) - ) - - self.setLayout(self.horizontal_layout) - self.retranslateUi(None) - - def _setup_connections(self): - self.compact_button.clicked.connect( - lambda: self.view_changed.emit(AddonManagerDisplayStyle.COMPACT) - ) - self.expanded_button.clicked.connect( - lambda: self.view_changed.emit(AddonManagerDisplayStyle.EXPANDED) - ) - self.composite_button.clicked.connect( - lambda: self.view_changed.emit(AddonManagerDisplayStyle.COMPOSITE) - ) - - def retranslateUi(self, _): - self.composite_button.setToolTip(translate("AddonsInstaller", "Composite view")) - self.expanded_button.setToolTip(translate("AddonsInstaller", "Expanded view")) - self.compact_button.setToolTip(translate("AddonsInstaller", "Compact view")) diff --git a/src/Mod/AddonManager/__init__.py b/src/Mod/AddonManager/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/Mod/AddonManager/add_toolbar_button_dialog.ui b/src/Mod/AddonManager/add_toolbar_button_dialog.ui deleted file mode 100644 index bba50c3e53..0000000000 --- a/src/Mod/AddonManager/add_toolbar_button_dialog.ui +++ /dev/null @@ -1,105 +0,0 @@ - - - add_toolbar_button_dialog - - - - 0 - 0 - 257 - 62 - - - - Add button? - - - - - - Add a toolbar button for this macro? - - - true - - - - - - - - - Yes - - - - - - - No - - - - - - - Never - - - - - - - - - - - buttonYes - clicked() - add_toolbar_button_dialog - accept() - - - 47 - 40 - - - 128 - 30 - - - - - buttonNo - clicked() - add_toolbar_button_dialog - reject() - - - 128 - 40 - - - 128 - 30 - - - - - buttonNever - clicked() - add_toolbar_button_dialog - reject() - - - 209 - 40 - - - 128 - 30 - - - - - diff --git a/src/Mod/AddonManager/addonmanager.dox b/src/Mod/AddonManager/addonmanager.dox deleted file mode 100644 index d68ae607e9..0000000000 --- a/src/Mod/AddonManager/addonmanager.dox +++ /dev/null @@ -1,4 +0,0 @@ -/** \defgroup ADDONMANAGER Addon Manager - * \ingroup PYTHONWORKBENCHES - * \brief Application that handles the installation of user-made workbenches and macros - */ diff --git a/src/Mod/AddonManager/addonmanager_cache.py b/src/Mod/AddonManager/addonmanager_cache.py deleted file mode 100644 index a72d290be0..0000000000 --- a/src/Mod/AddonManager/addonmanager_cache.py +++ /dev/null @@ -1,118 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -from datetime import date, timedelta -import hashlib -import os - -import addonmanager_freecad_interface as fci -import addonmanager_utilities as utils - -translate = fci.translate - - -def local_cache_needs_update() -> bool: - """Determine whether we need to update the cache, based on user preference, and previous - cache update status. Returns either True or False.""" - - if not _cache_exists(): - return True - - if _last_update_was_interrupted(reset_status=True): - return True - - if _custom_repo_list_changed(): - return True - - # Figure out our cache update frequency: there is a combo box in the preferences dialog - # with three options: never, daily, and weekly. - days_between_updates = _days_between_updates() - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Addons") - last_cache_update_string = pref.GetString("LastCacheUpdate", "never") - - if last_cache_update_string == "never": - return True - elif days_between_updates > 0: - last_cache_update = date.fromisoformat(last_cache_update_string) - delta_update = timedelta(days=days_between_updates) - if date.today() >= last_cache_update + delta_update: - return True - elif days_between_updates == 0: - return True - - return False - - -def _days_between_updates() -> int: - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Addons") - update_frequency = pref.GetInt("UpdateFrequencyComboEntry", 0) - if update_frequency == 0: - return -1 - elif update_frequency == 1: - return 1 - elif update_frequency == 2: - return 7 - else: - return 0 - - -def _cache_exists() -> bool: - cache_path = fci.getUserCachePath() - am_path = os.path.join(cache_path, "AddonManager") - return os.path.exists(am_path) - - -def _last_update_was_interrupted(reset_status: bool) -> bool: - flag_file = utils.get_cache_file_name("CACHE_UPDATE_INTERRUPTED") - if os.path.exists(flag_file): - if reset_status: - os.remove(flag_file) - fci.Console.PrintMessage( - translate( - "AddonsInstaller", - "Previous cache process was interrupted, restarting...\n", - ) - ) - return True - - -def _custom_repo_list_changed() -> bool: - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Addons") - stored_hash = pref.GetString("CustomRepoHash", "") - custom_repos = pref.GetString("CustomRepositories", "") - if custom_repos: - hasher = hashlib.sha1() - hasher.update(custom_repos.encode("utf-8")) - new_hash = hasher.hexdigest() - else: - new_hash = "" - if new_hash != stored_hash: - pref.SetString("CustomRepoHash", new_hash) - fci.Console.PrintMessage( - translate( - "AddonsInstaller", - "Custom repo list changed, forcing recache...\n", - ) - ) - return True - return False diff --git a/src/Mod/AddonManager/addonmanager_connection_checker.py b/src/Mod/AddonManager/addonmanager_connection_checker.py deleted file mode 100644 index 1b721ce761..0000000000 --- a/src/Mod/AddonManager/addonmanager_connection_checker.py +++ /dev/null @@ -1,125 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""System for checking the network connection status asynchronously.""" - -import FreeCAD - -from PySide import QtCore, QtWidgets - -import NetworkManager -from addonmanager_workers_utility import ConnectionChecker - -translate = FreeCAD.Qt.translate - - -class ConnectionCheckerGUI(QtCore.QObject): - """Determine whether there is an active network connection, showing a progress message if it - starts to take too long, and an error message if the network cannot be accessed.""" - - connection_available = QtCore.Signal() - check_complete = QtCore.Signal() - - def __init__(self): - super().__init__() - - # Check the connection in a new thread, so FreeCAD stays responsive - self.connection_checker = ConnectionChecker() - self.signals_connected = False - - self.connection_message_timer = None - self.connection_check_message = None - - def start(self): - """Start the connection check""" - self.connection_checker.start() - self.connection_checker.success.connect(self._check_succeeded) - self.connection_checker.failure.connect(self._network_connection_failed) - self.signals_connected = True - - # If it takes longer than a half second to check the connection, show a message: - self.connection_message_timer = QtCore.QTimer.singleShot( - 500, self._show_connection_check_message - ) - - def _show_connection_check_message(self): - """Display a message informing the user that the check is in process""" - if not self.connection_checker.isFinished(): - self.connection_check_message = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.Information, - translate("AddonsInstaller", "Checking connection"), - translate("AddonsInstaller", "Checking for connection to GitHub..."), - QtWidgets.QMessageBox.Cancel, - ) - self.connection_check_message.buttonClicked.connect(self.cancel_network_check) - self.connection_check_message.show() - - def cancel_network_check(self, _): - """Cancel the check""" - if not self.connection_checker.isFinished(): - self._disconnect_signals() - self.connection_checker.requestInterruption() - self.connection_checker.wait(500) - self.connection_check_message.close() - self.check_complete.emit() - - def _network_connection_failed(self, message: str) -> None: - """Callback for failed connection check. Displays an error message, then emits the - check_complete signal (but not the connection available signal).""" - # This must run on the main GUI thread - if hasattr(self, "connection_check_message") and self.connection_check_message: - self.connection_check_message.close() - if NetworkManager.HAVE_QTNETWORK: - QtWidgets.QMessageBox.critical( - None, translate("AddonsInstaller", "Connection failed"), message - ) - else: - # pylint: disable=line-too-long - QtWidgets.QMessageBox.critical( - None, - translate("AddonsInstaller", "Missing dependency"), - translate( - "AddonsInstaller", - "Could not import QtNetwork -- see Report View for details. Addon Manager " - "unavailable.", - ), - ) - - self._disconnect_signals() - self.check_complete.emit() - - def _check_succeeded(self): - """Emit both the connection_available and the check_complete signals, in that order.""" - - if hasattr(self, "connection_check_message") and self.connection_check_message: - self.connection_check_message.close() - - self.connection_available.emit() - self._disconnect_signals() - self.check_complete.emit() - - def _disconnect_signals(self): - if self.signals_connected: - self.connection_checker.success.disconnect(self._check_succeeded) - self.connection_checker.failure.disconnect(self._network_connection_failed) - self.signals_connected = False diff --git a/src/Mod/AddonManager/addonmanager_dependency_installer.py b/src/Mod/AddonManager/addonmanager_dependency_installer.py deleted file mode 100644 index edead4ff53..0000000000 --- a/src/Mod/AddonManager/addonmanager_dependency_installer.py +++ /dev/null @@ -1,195 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Class to manage installation of sets of Python dependencies.""" - -import os -import subprocess -from typing import List - -import addonmanager_freecad_interface as fci -from addonmanager_pyside_interface import QObject, Signal, is_interruption_requested - -import addonmanager_utilities as utils -from addonmanager_installer import AddonInstaller, MacroInstaller -from Addon import Addon - -translate = fci.translate - - -class DependencyInstaller(QObject): - """Install Python dependencies using pip. Intended to be instantiated and then moved into a - QThread: connect the run() function to the QThread's started() signal.""" - - no_python_exe = Signal() - no_pip = Signal(str) # Attempted command - failure = Signal(str, str) # Short message, detailed message - finished = Signal(bool) # True if everything completed normally, otherwise false - - def __init__( - self, - addons: List[Addon], - python_requires: List[str], - python_optional: List[str], - location: os.PathLike = None, - ): - """Install the various types of dependencies that might be specified. If an optional - dependency fails this is non-fatal, but other failures are considered fatal. If location - is specified it overrides the FreeCAD user base directory setting: this is used mostly - for testing purposes and shouldn't be set by normal code in most circumstances. - """ - super().__init__() - self.addons = addons - self.python_requires = python_requires - self.python_optional = python_optional - self.location = location - self.required_succeeded = False - self.finished_successfully = False - - def run(self): - """Normally not called directly, but rather connected to the worker thread's started - signal.""" - try: - if self.python_requires or self.python_optional: - if self._verify_pip(): - if not is_interruption_requested(): - self._install_python_packages() - else: - self.required_succeeded = True - if not is_interruption_requested(): - self._install_addons() - self.finished_successfully = self.required_succeeded - except RuntimeError: - pass - self.finished.emit(self.finished_successfully) - - def _install_python_packages(self): - """Install required and optional Python dependencies using pip.""" - - if self.location: - vendor_path = os.path.join(self.location, "AdditionalPythonPackages") - else: - vendor_path = utils.get_pip_target_directory() - if not os.path.exists(vendor_path): - os.makedirs(vendor_path) - - self.required_succeeded = self._install_required(vendor_path) - self._install_optional(vendor_path) - - def _verify_pip(self) -> bool: - """Ensure that pip is working -- returns True if it is, or False if not. Also emits the - no_pip signal if pip cannot execute.""" - try: - proc = self._run_pip(["--version"]) - fci.Console.PrintMessage(proc.stdout + "\n") - if proc.returncode != 0: - return False - except subprocess.CalledProcessError: - call = utils.create_pip_call([]) - self.no_pip.emit(" ".join(call)) - return False - return True - - def _install_required(self, vendor_path: str) -> bool: - """Install the required Python package dependencies. If any fail a failure - signal is emitted and the function exits without proceeding with any additional - installations.""" - for pymod in self.python_requires: - if is_interruption_requested(): - return False - try: - proc = self._run_pip( - [ - "install", - "--target", - vendor_path, - pymod, - ] - ) - fci.Console.PrintMessage(proc.stdout + "\n") - except subprocess.CalledProcessError as e: - fci.Console.PrintError(str(e) + "\n") - self.failure.emit( - translate( - "AddonsInstaller", - "Installation of Python package {} failed", - ).format(pymod), - str(e), - ) - return False - return True - - def _install_optional(self, vendor_path: str): - """Install the optional Python package dependencies. If any fail a message is printed to - the console, but installation of the others continues.""" - for pymod in self.python_optional: - if is_interruption_requested(): - return - try: - proc = self._run_pip( - [ - "install", - "--target", - vendor_path, - pymod, - ] - ) - fci.Console.PrintMessage(proc.stdout + "\n") - except subprocess.CalledProcessError as e: - fci.Console.PrintError( - translate("AddonsInstaller", "Installation of optional package failed") - + ":\n" - + str(e) - + "\n" - ) - - def _run_pip(self, args): - final_args = utils.create_pip_call(args) - return self._subprocess_wrapper(final_args) - - @staticmethod - def _subprocess_wrapper(args) -> subprocess.CompletedProcess: - """Wrap subprocess call so test code can mock it.""" - return utils.run_interruptable_subprocess(args, timeout_secs=120) - - def _install_addons(self): - for addon in self.addons: - if is_interruption_requested(): - return - fci.Console.PrintMessage( - translate("AddonsInstaller", "Installing required dependency {}").format(addon.name) - + "\n" - ) - if addon.macro is None: - installer = AddonInstaller(addon) - else: - installer = MacroInstaller(addon) - result = installer.run() # Run in this thread, which should be off the GUI thread - if not result: - self.failure.emit( - translate("AddonsInstaller", "Installation of Addon {} failed").format( - addon.name - ), - "", - ) - return diff --git a/src/Mod/AddonManager/addonmanager_devmode.py b/src/Mod/AddonManager/addonmanager_devmode.py deleted file mode 100644 index 4888ae6076..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode.py +++ /dev/null @@ -1,699 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Classes to manage "Developer Mode" """ - -import os -import datetime -import subprocess - -import FreeCAD -import FreeCADGui -from freecad.utils import get_python_exe - -from PySide.QtWidgets import ( - QFileDialog, - QListWidgetItem, - QDialog, - QSizePolicy, - QMessageBox, -) -from PySide.QtGui import ( - QIcon, - QPixmap, -) -from PySide.QtCore import Qt -from addonmanager_git import GitManager, NoGitFound - -from addonmanager_devmode_add_content import AddContent -from addonmanager_devmode_validators import NameValidator, VersionValidator -from addonmanager_devmode_predictor import Predictor -from addonmanager_devmode_people_table import PeopleTable -from addonmanager_devmode_licenses_table import LicensesTable -import addonmanager_utilities as utils - -translate = FreeCAD.Qt.translate - -# pylint: disable=too-few-public-methods - -ContentTypeRole = Qt.UserRole -ContentIndexRole = Qt.UserRole + 1 - - -class AddonGitInterface: - """Wrapper to handle the git calls needed by this class""" - - git_manager = None - - def __init__(self, path): - self.git_exists = False - if not AddonGitInterface.git_manager: - try: - AddonGitInterface.git_manager = GitManager() - except NoGitFound: - FreeCAD.Console.PrintLog("No git found, Addon Manager Developer Mode disabled.") - return - - self.path = path - if os.path.exists(os.path.join(path, ".git")): - self.git_exists = True - self.branch = AddonGitInterface.git_manager.current_branch(self.path) - self.remote = AddonGitInterface.git_manager.get_remote(self.path) - - @property - def branches(self): - """The branches available for this repo.""" - if self.git_exists: - return AddonGitInterface.git_manager.get_branches(self.path) - return [] - - @property - def committers(self): - """The committers to this repo, in the last ten commits""" - if self.git_exists: - return AddonGitInterface.git_manager.get_last_committers(self.path, 10) - return [] - - @property - def authors(self): - """The committers to this repo, in the last ten commits""" - if self.git_exists: - return AddonGitInterface.git_manager.get_last_authors(self.path, 10) - return [] - - -# pylint: disable=too-many-instance-attributes - - -class DeveloperMode: - """The main Developer Mode dialog, for editing package.xml metadata graphically.""" - - def __init__(self): - # In the UI we want to show a translated string for the person type, but the underlying - # string must be the one expected by the metadata parser, in English - self.person_type_translation = { - "maintainer": translate("AddonsInstaller", "Maintainer"), - "author": translate("AddonsInstaller", "Author"), - } - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode.ui") - ) - self.people_table = PeopleTable() - self.licenses_table = LicensesTable() - large_size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - large_size_policy.setHorizontalStretch(2) - small_size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - small_size_policy.setHorizontalStretch(1) - self.people_table.widget.setSizePolicy(large_size_policy) - self.licenses_table.widget.setSizePolicy(small_size_policy) - self.dialog.peopleAndLicenseshorizontalLayout.addWidget(self.people_table.widget) - self.dialog.peopleAndLicenseshorizontalLayout.addWidget(self.licenses_table.widget) - self.pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - self.current_mod: str = "" - self.git_interface = None - self.has_toplevel_icon = False - self.metadata = None - - self._setup_dialog_signals() - - self.dialog.displayNameLineEdit.setValidator(NameValidator()) - self.dialog.versionLineEdit.setValidator(VersionValidator()) - self.dialog.minPythonLineEdit.setValidator(VersionValidator()) - - self.dialog.addContentItemToolButton.setIcon( - QIcon.fromTheme("add", QIcon(":/icons/list-add.svg")) - ) - self.dialog.removeContentItemToolButton.setIcon( - QIcon.fromTheme("remove", QIcon(":/icons/list-remove.svg")) - ) - - def show(self, parent=None, path: str = None): - """Show the main dev mode dialog""" - if parent: - self.dialog.setParent(parent) - if path and os.path.exists(path): - self.dialog.pathToAddonComboBox.setEditText(path) - elif self.pref.HasGroup("recentModsList"): - recent_mods_group = self.pref.GetGroup("recentModsList") - entry = recent_mods_group.GetString("Mod0", "") - if entry: - self._populate_dialog(entry) - self._update_recent_mods(entry) - self._populate_combo() - else: - self._clear_all_fields() - else: - self._clear_all_fields() - - result = self.dialog.exec() - if result == QDialog.Accepted: - self._sync_metadata_to_ui() - now = datetime.date.today() - self.metadata.Date = str(now) - self.metadata.write(os.path.join(self.current_mod, "package.xml")) - - def _populate_dialog(self, path_to_repo: str): - """Populate this dialog using the best available parsing of the contents of the repo at - path_to_repo. This is a multi-layered process that starts with any existing package.xml - file or other known metadata files, and proceeds through examining the contents of the - directory structure.""" - self.current_mod = path_to_repo - self._scan_for_git_info(self.current_mod) - - metadata_path = os.path.join(path_to_repo, "package.xml") - if os.path.exists(metadata_path): - try: - self.metadata = FreeCAD.Metadata(metadata_path) - except FreeCAD.Base.XMLBaseException as e: - FreeCAD.Console.PrintError( - translate( - "AddonsInstaller", - "XML failure while reading metadata from file {}", - ).format(metadata_path) - + "\n\n" - + str(e) - + "\n\n" - ) - except FreeCAD.Base.RuntimeError as e: - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "Invalid metadata in file {}").format( - metadata_path - ) - + "\n\n" - + str(e) - + "\n\n" - ) - - self._clear_all_fields() - - if not self.metadata: - self._predict_metadata() - - self.dialog.displayNameLineEdit.setText(self.metadata.Name) - self.dialog.descriptionTextEdit.setPlainText(self.metadata.Description) - self.dialog.versionLineEdit.setText(self.metadata.Version) - self.dialog.minPythonLineEdit.setText(self.metadata.PythonMin) - - self._populate_urls_from_metadata(self.metadata) - self._populate_contents_from_metadata(self.metadata) - - self._populate_icon_from_metadata(self.metadata) - - self.people_table.show(self.metadata) - self.licenses_table.show(self.metadata, self.current_mod) - - def _populate_urls_from_metadata(self, metadata): - """Use the passed metadata object to populate the urls""" - for url in metadata.Urls: - if url["type"] == "website": - self.dialog.websiteURLLineEdit.setText(url["location"]) - elif url["type"] == "repository": - self.dialog.repositoryURLLineEdit.setText(url["location"]) - branch_from_metadata = url["branch"] - branch_from_local_path = self.git_interface.branch - if branch_from_metadata != branch_from_local_path: - # pylint: disable=line-too-long - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "WARNING: Path specified in package.xml metadata does not match currently checked-out branch.", - ) - + "\n" - ) - self.dialog.branchComboBox.setCurrentText(branch_from_metadata) - elif url["type"] == "bugtracker": - self.dialog.bugtrackerURLLineEdit.setText(url["location"]) - elif url["type"] == "readme": - self.dialog.readmeURLLineEdit.setText(url["location"]) - elif url["type"] == "documentation": - self.dialog.documentationURLLineEdit.setText(url["location"]) - elif url["type"] == "discussion": - self.dialog.discussionURLLineEdit.setText(url["location"]) - - def _populate_contents_from_metadata(self, metadata): - """Use the passed metadata object to populate the contents list""" - contents = metadata.Content - self.dialog.contentsListWidget.clear() - for content_type in contents: - counter = 0 - for item in contents[content_type]: - contents_string = f"[{content_type}] " - info = [] - if item.Name: - info.append(translate("AddonsInstaller", "Name") + ": " + item.Name) - if item.Classname: - info.append(translate("AddonsInstaller", "Class") + ": " + item.Classname) - if item.Description: - info.append( - translate("AddonsInstaller", "Description") + ": " + item.Description - ) - if item.Subdirectory: - info.append( - translate("AddonsInstaller", "Subdirectory") + ": " + item.Subdirectory - ) - if item.File: - info.append(translate("AddonsInstaller", "Files") + ": " + ", ".join(item.File)) - contents_string += ", ".join(info) - - item = QListWidgetItem(contents_string) - item.setData(ContentTypeRole, content_type) - item.setData(ContentIndexRole, counter) - self.dialog.contentsListWidget.addItem(item) - counter += 1 - - def _populate_icon_from_metadata(self, metadata): - """Use the passed metadata object to populate the icon fields""" - self.dialog.iconDisplayLabel.setPixmap(QPixmap()) - icon = metadata.Icon - icon_path = None - if icon: - icon_path = os.path.join(self.current_mod, icon.replace("/", os.path.sep)) - self.has_toplevel_icon = True - else: - self.has_toplevel_icon = False - contents = metadata.Content - if "workbench" in contents: - for wb in contents["workbench"]: - icon = wb.Icon - path = wb.Subdirectory - if icon: - icon_path = os.path.join( - self.current_mod, path, icon.replace("/", os.path.sep) - ) - break - - if icon_path and os.path.isfile(icon_path): - icon_data = QIcon(icon_path) - if not icon_data.isNull(): - self.dialog.iconDisplayLabel.setPixmap(icon_data.pixmap(32, 32)) - self.dialog.iconPathLineEdit.setText(icon) - - def _predict_metadata(self): - """If there is no metadata, try to guess at values for it""" - self.metadata = FreeCAD.Metadata() - predictor = Predictor() - self.metadata = predictor.predict_metadata(self.current_mod) - - def _scan_for_git_info(self, path: str): - """Look for branch availability""" - self.git_interface = AddonGitInterface(path) - if self.git_interface.git_exists: - self.dialog.branchComboBox.clear() - for branch in self.git_interface.branches: - if branch and branch.startswith("origin/") and branch != "origin/HEAD": - self.dialog.branchComboBox.addItem(branch[len("origin/") :]) - self.dialog.branchComboBox.setCurrentText(self.git_interface.branch) - - def _clear_all_fields(self): - """Clear out all fields""" - self.dialog.displayNameLineEdit.clear() - self.dialog.descriptionTextEdit.clear() - self.dialog.versionLineEdit.clear() - self.dialog.websiteURLLineEdit.clear() - self.dialog.repositoryURLLineEdit.clear() - self.dialog.bugtrackerURLLineEdit.clear() - self.dialog.readmeURLLineEdit.clear() - self.dialog.documentationURLLineEdit.clear() - self.dialog.discussionURLLineEdit.clear() - self.dialog.minPythonLineEdit.clear() - self.dialog.iconDisplayLabel.setPixmap(QPixmap()) - self.dialog.iconPathLineEdit.clear() - - def _setup_dialog_signals(self): - """Set up the signal and slot connections for the main dialog.""" - - self.dialog.addonPathBrowseButton.clicked.connect(self._addon_browse_button_clicked) - self.dialog.pathToAddonComboBox.editTextChanged.connect(self._addon_combo_text_changed) - self.dialog.detectMinPythonButton.clicked.connect(self._detect_min_python_clicked) - self.dialog.iconBrowseButton.clicked.connect(self._browse_for_icon_clicked) - - self.dialog.addContentItemToolButton.clicked.connect(self._add_content_clicked) - self.dialog.removeContentItemToolButton.clicked.connect(self._remove_content_clicked) - self.dialog.contentsListWidget.itemSelectionChanged.connect(self._content_selection_changed) - self.dialog.contentsListWidget.itemDoubleClicked.connect(self._edit_content) - - self.dialog.versionToTodayButton.clicked.connect(self._set_to_today_clicked) - - # Finally, populate the combo boxes, etc. - self._populate_combo() - - # Disable all the "Remove" buttons until something is selected - self.dialog.removeContentItemToolButton.setDisabled(True) - - def _sync_metadata_to_ui(self): - """Take the data from the UI fields and put it into the stored metadata - object. Only overwrites known data fields: unknown metadata will be retained.""" - - if not self.metadata: - self.metadata = FreeCAD.Metadata() - - self.metadata.Name = self.dialog.displayNameLineEdit.text() - self.metadata.Description = self.dialog.descriptionTextEdit.document().toPlainText() - self.metadata.Version = self.dialog.versionLineEdit.text() - self.metadata.Icon = self.dialog.iconPathLineEdit.text() - - urls = [] - if self.dialog.websiteURLLineEdit.text(): - urls.append({"location": self.dialog.websiteURLLineEdit.text(), "type": "website"}) - if self.dialog.repositoryURLLineEdit.text(): - urls.append( - { - "location": self.dialog.repositoryURLLineEdit.text(), - "type": "repository", - "branch": self.dialog.branchComboBox.currentText(), - } - ) - if self.dialog.bugtrackerURLLineEdit.text(): - urls.append( - { - "location": self.dialog.bugtrackerURLLineEdit.text(), - "type": "bugtracker", - } - ) - if self.dialog.readmeURLLineEdit.text(): - urls.append({"location": self.dialog.readmeURLLineEdit.text(), "type": "readme"}) - if self.dialog.documentationURLLineEdit.text(): - urls.append( - { - "location": self.dialog.documentationURLLineEdit.text(), - "type": "documentation", - } - ) - if self.dialog.discussionURLLineEdit.text(): - urls.append( - { - "location": self.dialog.discussionURLLineEdit.text(), - "type": "discussion", - } - ) - self.metadata.Urls = urls - - if self.dialog.minPythonLineEdit.text(): - self.metadata.PythonMin = self.dialog.minPythonLineEdit.text() - else: - self.metadata.PythonMin = "0.0.0" # Code for "unset" - - # Content, people, and licenses should already be synchronized - - ############################################################################################### - # DIALOG SLOTS - ############################################################################################### - - def _addon_browse_button_clicked(self): - """Launch a modal file/folder selection dialog -- if something is selected, it is - processed by the parsing code and used to fill in the contents of the rest of the - dialog.""" - - start_dir = os.path.join(FreeCAD.getUserAppDataDir(), "Mod") - mod_dir = QFileDialog.getExistingDirectory( - parent=self.dialog, - caption=translate( - "AddonsInstaller", - "Select the folder containing your Addon", - ), - dir=start_dir, - ) - - if mod_dir and os.path.exists(mod_dir): - self.dialog.pathToAddonComboBox.setEditText(mod_dir) - - def _addon_combo_text_changed(self, new_text: str): - """Called when the text is changed, either because it was directly edited, or because - a new item was selected.""" - if new_text == self.current_mod: - # It doesn't look like it actually changed, bail out - return - self.metadata = None - self._clear_all_fields() - if not os.path.exists(new_text): - # This isn't a thing (Yet. Maybe the user is still typing?) - return - self._populate_dialog(new_text) - self._update_recent_mods(new_text) - self._populate_combo() - - def _populate_combo(self): - """Fill in the combo box with the values from the stored recent mods list, selecting the - top one. Does not trigger any signals.""" - combo = self.dialog.pathToAddonComboBox - combo.blockSignals(True) - recent_mods_group = self.pref.GetGroup("recentModsList") - recent_mods = set() - combo.clear() - for i in range(10): - entry_name = f"Mod{i}" - mod = recent_mods_group.GetString(entry_name, "None") - if mod != "None" and mod not in recent_mods and os.path.exists(mod): - recent_mods.add(mod) - combo.addItem(mod) - if recent_mods: - combo.setCurrentIndex(0) - combo.blockSignals(False) - - def _update_recent_mods(self, path): - """Update the list of recent mods, storing at most ten, with path at the top of the - list.""" - recent_mod_paths = [path] - if self.pref.HasGroup("recentModsList"): - recent_mods_group = self.pref.GetGroup("recentModsList") - - # This group has a maximum of ten entries, sorted by last-accessed date - for i in range(0, 10): - entry_name = f"Mod{i}" - entry = recent_mods_group.GetString(entry_name, "") - if entry and entry not in recent_mod_paths and os.path.exists(entry): - recent_mod_paths.append(entry) - - # Remove the whole thing, so we can recreate it from scratch - self.pref.RemGroup("recentModsList") - - if recent_mod_paths: - recent_mods_group = self.pref.GetGroup("recentModsList") - for i, mod in zip(range(10), recent_mod_paths): - entry_name = f"Mod{i}" - recent_mods_group.SetString(entry_name, mod) - - def _add_content_clicked(self): - """Callback: The Add Content button was clicked""" - dlg = AddContent(self.current_mod, self.metadata) - singleton = False - if self.dialog.contentsListWidget.count() == 0: - singleton = True - content_type, new_metadata = dlg.exec(singleton=singleton) - if content_type and new_metadata: - self.metadata.addContentItem(content_type, new_metadata) - self._populate_contents_from_metadata(self.metadata) - - def _remove_content_clicked(self): - """Callback: the remove content button was clicked""" - - item = self.dialog.contentsListWidget.currentItem() - if not item: - return - content_type = item.data(ContentTypeRole) - content_index = item.data(ContentIndexRole) - if self.metadata.Content[content_type] and content_index < len( - self.metadata.Content[content_type] - ): - content_name = self.metadata.Content[content_type][content_index].Name - self.metadata.removeContentItem(content_type, content_name) - self._populate_contents_from_metadata(self.metadata) - - def _content_selection_changed(self): - """Callback: the selected content item changed""" - items = self.dialog.contentsListWidget.selectedItems() - if items: - self.dialog.removeContentItemToolButton.setDisabled(False) - else: - self.dialog.removeContentItemToolButton.setDisabled(True) - - def _edit_content(self, item): - """Callback: a content row was double-clicked""" - dlg = AddContent(self.current_mod, self.metadata) - - content_type = item.data(ContentTypeRole) - content_index = item.data(ContentIndexRole) - - content = self.metadata.Content - metadata = content[content_type][content_index] - old_name = metadata.Name - new_type, new_metadata = dlg.exec(content_type, metadata, len(content) == 1) - if new_type and new_metadata: - self.metadata.removeContentItem(content_type, old_name) - self.metadata.addContentItem(new_type, new_metadata) - self._populate_contents_from_metadata(self.metadata) - - def _set_to_today_clicked(self): - """Callback: the "set to today" button was clicked""" - year = datetime.date.today().year - month = datetime.date.today().month - day = datetime.date.today().day - version_string = f"{year}.{month:>02}.{day:>02}" - self.dialog.versionLineEdit.setText(version_string) - - def _detect_min_python_clicked(self): - if not self._ensure_vermin_loaded(): - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "No Vermin, cancelling operation.", - "NOTE: Vermin is a Python package and proper noun - do not translate", - ) - + "\n" - ) - return - FreeCAD.Console.PrintMessage( - translate("AddonsInstaller", "Scanning Addon for Python version compatibility") - + "...\n" - ) - # pylint: disable=import-outside-toplevel - import vermin - - required_minor_version = 0 - for dir_path, _, filenames in os.walk(self.current_mod): - for filename in filenames: - if filename.endswith(".py"): - with open(os.path.join(dir_path, filename), encoding="utf-8") as f: - contents = f.read() - version_strings = vermin.version_strings(vermin.detect(contents)) - version = version_strings.split(",") - if len(version) >= 2: - # Only care about Py3, and only if there is a dot in the version: - if "." in version[1]: - py3 = version[1].split(".") - major = int(py3[0].strip()) - minor = int(py3[1].strip()) - if major == 3: - FreeCAD.Console.PrintLog( - f"Detected Python 3.{minor} required by {filename}\n" - ) - required_minor_version = max(required_minor_version, minor) - self.dialog.minPythonLineEdit.setText(f"3.{required_minor_version}") - QMessageBox.information( - self.dialog, - translate("AddonsInstaller", "Minimum Python Version Detected"), - translate( - "AddonsInstaller", - "Vermin auto-detected a required version of Python 3.{}", - ).format(required_minor_version), - QMessageBox.Ok, - ) - - def _ensure_vermin_loaded(self) -> bool: - try: - # pylint: disable=import-outside-toplevel,unused-import - import vermin - except ImportError: - # pylint: disable=line-too-long - response = QMessageBox.question( - self.dialog, - translate("AddonsInstaller", "Install Vermin?"), - translate( - "AddonsInstaller", - "Auto-detecting the required version of Python for this Addon requires Vermin (https://pypi.org/project/vermin/). OK to install?", - ), - QMessageBox.Yes | QMessageBox.Cancel, - ) - if response == QMessageBox.Cancel: - return False - FreeCAD.Console.PrintMessage( - translate("AddonsInstaller", "Attempting to install Vermin from PyPi") + "...\n" - ) - python_exe = get_python_exe() - vendor_path = os.path.join(FreeCAD.getUserAppDataDir(), "AdditionalPythonPackages") - if not os.path.exists(vendor_path): - os.makedirs(vendor_path) - - proc = subprocess.run( - [ - python_exe, - "-m", - "pip", - "install", - "--disable-pip-version-check", - "--target", - vendor_path, - "vermin", - ], - capture_output=True, - check=True, - ) - FreeCAD.Console.PrintMessage(proc.stdout.decode()) - if proc.returncode != 0: - QMessageBox.critical( - self.dialog, - translate("AddonsInstaller", "Installation failed"), - translate( - "AddonsInstaller", - "Failed to install Vermin -- check Report View for details.", - "'Vermin' is the name of a Python package, do not translate", - ), - QMessageBox.Cancel, - ) - return False - try: - # pylint: disable=import-outside-toplevel - import vermin - except ImportError: - QMessageBox.critical( - self.dialog, - translate("AddonsInstaller", "Installation failed"), - translate( - "AddonsInstaller", - "Failed to import vermin after installation -- cannot scan Addon.", - "'vermin' is the name of a Python package, do not translate", - ), - QMessageBox.Cancel, - ) - return False - return True - - def _browse_for_icon_clicked(self): - """Callback: when the "Browse..." button for the icon field is clicked""" - new_icon_path, _ = QFileDialog.getOpenFileName( - parent=self.dialog, - caption=translate( - "AddonsInstaller", - "Select an icon file for this package", - ), - dir=self.current_mod, - ) - - if not new_icon_path: - return - - base_path = self.current_mod.replace("/", os.path.sep) - icon_path = new_icon_path.replace("/", os.path.sep) - if base_path[-1] != os.path.sep: - base_path += os.path.sep - - if not icon_path.startswith(base_path): - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "{} is not a subdirectory of {}").format( - new_icon_path, self.current_mod - ) - + "\n" - ) - return - self.metadata.Icon = new_icon_path[len(base_path) :] - self._populate_icon_from_metadata(self.metadata) diff --git a/src/Mod/AddonManager/addonmanager_devmode_add_content.py b/src/Mod/AddonManager/addonmanager_devmode_add_content.py deleted file mode 100644 index 2907fbc8d4..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_add_content.py +++ /dev/null @@ -1,635 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains a class for adding a single content item, as well as auxiliary classes for -its dependent dialog boxes.""" - -import os -from typing import Optional, Tuple, List - -import FreeCAD -import FreeCADGui - -from Addon import INTERNAL_WORKBENCHES - -from PySide.QtWidgets import ( - QDialog, - QLayout, - QFileDialog, - QTableWidgetItem, - QSizePolicy, -) -from PySide.QtGui import QIcon -from PySide.QtCore import Qt - -from addonmanager_devmode_validators import ( - VersionValidator, - NameValidator, - PythonIdentifierValidator, -) -from addonmanager_devmode_people_table import PeopleTable -from addonmanager_devmode_licenses_table import LicensesTable - -# pylint: disable=too-few-public-methods - -translate = FreeCAD.Qt.translate - - -class AddContent: - """A dialog for adding a single content item to the package metadata.""" - - def __init__(self, path_to_addon: str, toplevel_metadata: FreeCAD.Metadata): - """path_to_addon is the full path to the toplevel directory of this Addon, and - toplevel_metadata is to overall package.xml Metadata object for this Addon. This - information is used to assist the use in filling out the dialog by providing - sensible default values.""" - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_add_content.ui") - ) - # These are in alphabetical order in English, but their actual label may be translated in - # the GUI. Store their underlying type as user data. - self.dialog.addonKindComboBox.setItemData(0, "macro") - self.dialog.addonKindComboBox.setItemData(1, "preferencepack") - self.dialog.addonKindComboBox.setItemData(2, "workbench") - self.dialog.addonKindComboBox.setItemData(3, "bundle") - self.dialog.addonKindComboBox.setItemData(4, "other") - - self.people_table = PeopleTable() - self.licenses_table = LicensesTable() - large_size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - large_size_policy.setHorizontalStretch(2) - small_size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - small_size_policy.setHorizontalStretch(1) - self.people_table.widget.setSizePolicy(large_size_policy) - self.licenses_table.widget.setSizePolicy(small_size_policy) - self.dialog.peopleAndLicenseshorizontalLayout.addWidget(self.people_table.widget) - self.dialog.peopleAndLicenseshorizontalLayout.addWidget(self.licenses_table.widget) - - self.toplevel_metadata = toplevel_metadata - self.metadata = None - self.path_to_addon = path_to_addon.replace("/", os.path.sep) - if self.path_to_addon[-1] != os.path.sep: - self.path_to_addon += os.path.sep # Make sure the path ends with a separator - - self.dialog.iconLabel.hide() # Until we have an icon to display - - self.dialog.iconBrowseButton.clicked.connect(self._browse_for_icon_clicked) - self.dialog.subdirectoryBrowseButton.clicked.connect(self._browse_for_subdirectory_clicked) - self.dialog.tagsButton.clicked.connect(self._tags_clicked) - self.dialog.dependenciesButton.clicked.connect(self._dependencies_clicked) - self.dialog.freecadVersionsButton.clicked.connect(self._freecad_versions_clicked) - - self.dialog.versionLineEdit.setValidator(VersionValidator()) - self.dialog.prefPackNameLineEdit.setValidator(NameValidator()) - self.dialog.displayNameLineEdit.setValidator(NameValidator()) - self.dialog.workbenchClassnameLineEdit.setValidator(PythonIdentifierValidator()) - - def exec( - self, - content_kind: str = "workbench", - metadata: FreeCAD.Metadata = None, - singleton: bool = True, - ) -> Optional[Tuple[str, FreeCAD.Metadata]]: - """Execute the dialog as a modal, returning a new Metadata object if the dialog - is accepted, or None if it is rejected. This metadata object represents a single - new content item. It's returned as a tuple with the object type as the first component, - and the metadata object itself as the second.""" - if metadata: - self.metadata = FreeCAD.Metadata(metadata) # Deep copy - else: - self.metadata = FreeCAD.Metadata() - self.dialog.singletonCheckBox.setChecked(singleton) - if singleton: - # This doesn't happen automatically the first time - self.dialog.otherMetadataGroupBox.hide() - index = self.dialog.addonKindComboBox.findData(content_kind) - if index == -1: - index = 2 # Workbench - FreeCAD.Console.PrintWarning( - translate("AddonsInstaller", "Unrecognized content kind '{}'").format(content_kind) - + "\n" - ) - self.dialog.addonKindComboBox.setCurrentIndex(index) - if metadata: - self._populate_dialog(metadata) - - self.dialog.layout().setSizeConstraint(QLayout.SetFixedSize) - result = self.dialog.exec() - if result == QDialog.Accepted: - return self._generate_metadata() - return None - - def _populate_dialog(self, metadata: FreeCAD.Metadata) -> None: - """Fill in the dialog with the details from the passed metadata object""" - addon_kind = self.dialog.addonKindComboBox.currentData() - if addon_kind == "workbench": - self.dialog.workbenchClassnameLineEdit.setText(metadata.Classname) - elif addon_kind == "macro": - files = self.metadata.File - if files: - self.dialog.macroFileLineEdit.setText(files[0]) - elif addon_kind == "preferencepack": - self.dialog.prefPackNameLineEdit.setText(self.metadata.Name) - elif addon_kind == "bundle" or addon_kind == "other": - pass - else: - raise RuntimeError("Invalid data found for selection") - - # Now set the rest of it - if metadata.Icon: - self._set_icon(metadata.Icon) - elif self.toplevel_metadata.Icon: - if metadata.Subdirectory and metadata.Subdirectory != "./": - self._set_icon("../" + self.toplevel_metadata.Icon) - else: - self._set_icon(self.toplevel_metadata.Icon) - else: - self.dialog.iconLabel.hide() - self.dialog.iconLineEdit.setText("") - - if metadata.Subdirectory: - self.dialog.subdirectoryLineEdit.setText(metadata.Subdirectory) - else: - self.dialog.subdirectoryLineEdit.setText("") - - self.dialog.displayNameLineEdit.setText(metadata.Name) - self.dialog.descriptionTextEdit.setPlainText(metadata.Description) - self.dialog.versionLineEdit.setText(metadata.Version) - - self.people_table.show(metadata) - self.licenses_table.show(metadata, self.path_to_addon) - - def _set_icon(self, icon_relative_path): - """Load the icon and display it, and its path, in the dialog.""" - icon_path = os.path.join(self.path_to_addon, icon_relative_path.replace("/", os.path.sep)) - if os.path.isfile(icon_path): - icon_data = QIcon(icon_path) - if not icon_data.isNull(): - self.dialog.iconLabel.setPixmap(icon_data.pixmap(32, 32)) - self.dialog.iconLabel.show() - else: - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "Unable to locate icon at {}").format(icon_path) + "\n" - ) - self.dialog.iconLineEdit.setText(icon_relative_path) - - def _generate_metadata(self) -> Tuple[str, FreeCAD.Metadata]: - """Create and return a new metadata object based on the contents of the dialog.""" - - if not self.metadata: - self.metadata = FreeCAD.Metadata() - - ########################################################################################## - # Required data: - current_data: str = self.dialog.addonKindComboBox.currentData() - if current_data == "preferencepack": - self.metadata.Name = self.dialog.prefPackNameLineEdit.text() - elif self.dialog.displayNameLineEdit.text(): - self.metadata.Name = self.dialog.displayNameLineEdit.text() - - if current_data == "workbench": - self.metadata.Classname = self.dialog.workbenchClassnameLineEdit.text() - elif current_data == "macro": - self.metadata.File = [self.dialog.macroFileLineEdit.text()] - ########################################################################################## - - self.metadata.Subdirectory = self.dialog.subdirectoryLineEdit.text() - self.metadata.Icon = self.dialog.iconLineEdit.text() - - # Early return if this is the only addon - if self.dialog.singletonCheckBox.isChecked(): - return current_data, self.metadata - - # Otherwise, process the rest of the metadata (display name is already done) - self.metadata.Description = self.dialog.descriptionTextEdit.document().toPlainText() - self.metadata.Version = self.dialog.versionLineEdit.text() - - maintainers = [] - authors = [] - for row in range(self.dialog.peopleTableWidget.rowCount()): - person_type = self.dialog.peopleTableWidget.item(row, 0).data() - name = self.dialog.peopleTableWidget.item(row, 1).text() - email = self.dialog.peopleTableWidget.item(row, 2).text() - if person_type == "maintainer": - maintainers.append({"name": name, "email": email}) - elif person_type == "author": - authors.append({"name": name, "email": email}) - self.metadata.Maintainer = maintainers - self.metadata.Author = authors - - licenses = [] - for row in range(self.dialog.licensesTableWidget.rowCount()): - new_license = { - "name": self.dialog.licensesTableWidget.item(row, 0).text, - "file": self.dialog.licensesTableWidget.item(row, 1).text(), - } - licenses.append(new_license) - self.metadata.License = licenses - - return self.dialog.addonKindComboBox.currentData(), self.metadata - - ############################################################################################### - # DIALOG SLOTS - ############################################################################################### - - def _browse_for_icon_clicked(self): - """Callback: when the "Browse..." button for the icon field is clicked""" - subdir = self.dialog.subdirectoryLineEdit.text() - start_dir = os.path.join(self.path_to_addon, subdir) - new_icon_path, _ = QFileDialog.getOpenFileName( - parent=self.dialog, - caption=translate( - "AddonsInstaller", - "Select an icon file for this content item", - ), - dir=start_dir, - ) - - if not new_icon_path: - return - - base_path = self.path_to_addon.replace("/", os.path.sep) - icon_path = new_icon_path.replace("/", os.path.sep) - if base_path[-1] != os.path.sep: - base_path += os.path.sep - - if not icon_path.startswith(base_path): - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "{} is not a subdirectory of {}").format( - icon_path, base_path - ) - + "\n" - ) - return - self._set_icon(new_icon_path[len(base_path) :]) - self.metadata.Icon = new_icon_path[len(base_path) :] - - def _browse_for_subdirectory_clicked(self): - """Callback: when the "Browse..." button for the subdirectory field is clicked""" - subdir = self.dialog.subdirectoryLineEdit.text() - start_dir = os.path.join(self.path_to_addon, subdir) - new_subdir_path = QFileDialog.getExistingDirectory( - parent=self.dialog, - caption=translate( - "AddonsInstaller", - "Select the subdirectory for this content item", - ), - dir=start_dir, - ) - if not new_subdir_path: - return - if new_subdir_path[-1] != "/": - new_subdir_path += "/" - - # Three legal possibilities: - # 1) This might be the toplevel directory, in which case we want to set - # metadata.Subdirectory to "./" - # 2) This might be a subdirectory with the same name as the content item, in which case - # we don't need to set metadata.Subdirectory at all - # 3) This might be some other directory name, but still contained within the top-level - # directory, in which case we want to set metadata.Subdirectory to the relative path - - # First, reject anything that isn't within the appropriate directory structure: - base_path = self.path_to_addon.replace("/", os.path.sep) - subdir_path = new_subdir_path.replace("/", os.path.sep) - if not subdir_path.startswith(base_path): - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "{} is not a subdirectory of {}").format( - subdir_path, base_path - ) - + "\n" - ) - return - - relative_path = subdir_path[len(base_path) :] - if not relative_path: - relative_path = "./" - elif relative_path[-1] == os.path.sep: - relative_path = relative_path[:-1] - self.dialog.subdirectoryLineEdit.setText(relative_path) - - def _tags_clicked(self): - """Show the tag editor""" - tags = [] - if not self.metadata: - self.metadata = FreeCAD.Metadata() - if self.metadata: - tags = self.metadata.Tag - dlg = EditTags(tags) - new_tags = dlg.exec() - self.metadata.Tag = new_tags - - def _freecad_versions_clicked(self): - """Show the FreeCAD version editor""" - if not self.metadata: - self.metadata = FreeCAD.Metadata() - dlg = EditFreeCADVersions() - dlg.exec(self.metadata) - - def _dependencies_clicked(self): - """Show the dependencies editor""" - if not self.metadata: - self.metadata = FreeCAD.Metadata() - dlg = EditDependencies() - dlg.exec(self.metadata) # Modifies metadata directly - - -class EditTags: - """A dialog to edit tags""" - - def __init__(self, tags: List[str] = None): - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_tags.ui") - ) - self.original_tags = tags - if tags: - self.dialog.lineEdit.setText(", ".join(tags)) - - def exec(self): - """Execute the dialog, returning a list of tags (which may be empty, but still represents - the expected list of tags to be set, e.g. the user may have removed them all). - """ - result = self.dialog.exec() - if result == QDialog.Accepted: - new_tags: List[str] = self.dialog.lineEdit.text().split(",") - clean_tags: List[str] = [] - for tag in new_tags: - clean_tags.append(tag.strip()) - return clean_tags - return self.original_tags - - -class EditDependencies: - """A dialog to edit dependency information""" - - def __init__(self): - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_dependencies.ui") - ) - self.dialog.addDependencyToolButton.setIcon( - QIcon.fromTheme("add", QIcon(":/icons/list-add.svg")) - ) - self.dialog.removeDependencyToolButton.setIcon( - QIcon.fromTheme("remove", QIcon(":/icons/list-remove.svg")) - ) - self.dialog.addDependencyToolButton.clicked.connect(self._add_dependency_clicked) - self.dialog.removeDependencyToolButton.clicked.connect(self._remove_dependency_clicked) - self.dialog.tableWidget.itemDoubleClicked.connect(self._edit_dependency) - self.dialog.tableWidget.itemSelectionChanged.connect(self._current_index_changed) - - self.dialog.removeDependencyToolButton.setDisabled(True) - self.metadata = None - - def exec(self, metadata: FreeCAD.Metadata): - """Execute the dialog""" - self.metadata = FreeCAD.Metadata(metadata) # Make a copy, in case we cancel - row = 0 - for dep in self.metadata.Depend: - dep_type = dep["type"] - dep_name = dep["package"] - dep_optional = dep["optional"] - self._add_row(row, dep_type, dep_name, dep_optional) - row += 1 - result = self.dialog.exec() - if result == QDialog.Accepted: - metadata.Depend = self.metadata.Depend - - def _add_dependency_clicked(self): - """Callback: The add button was clicked""" - dlg = EditDependency() - dep_type, dep_name, dep_optional = dlg.exec() - if dep_name: - row = self.dialog.tableWidget.rowCount() - self._add_row(row, dep_type, dep_name, dep_optional) - self.metadata.addDepend( - {"package": dep_name, "type": dep_type, "optional": dep_optional} - ) - - def _add_row(self, row, dep_type, dep_name, dep_optional): - """Utility function to add a row to the table.""" - translations = { - "automatic": translate("AddonsInstaller", "Automatic"), - "workbench": translate("AddonsInstaller", "Workbench"), - "addon": translate("AddonsInstaller", "Addon"), - "python": translate("AddonsInstaller", "Python"), - } - if dep_type and dep_name: - self.dialog.tableWidget.insertRow(row) - type_item = QTableWidgetItem(translations[dep_type]) - type_item.setData(Qt.UserRole, dep_type) - self.dialog.tableWidget.setItem(row, 0, type_item) - self.dialog.tableWidget.setItem(row, 1, QTableWidgetItem(dep_name)) - if dep_optional: - self.dialog.tableWidget.setItem( - row, 2, QTableWidgetItem(translate("AddonsInstaller", "Yes")) - ) - - def _remove_dependency_clicked(self): - """Callback: The remove button was clicked""" - items = self.dialog.tableWidget.selectedItems() - if items: - row = items[0].row() - dep_type = self.dialog.tableWidget.item(row, 0).data(Qt.UserRole) - dep_name = self.dialog.tableWidget.item(row, 1).text() - dep_optional = bool(self.dialog.tableWidget.item(row, 2)) - self.metadata.removeDepend( - {"package": dep_name, "type": dep_type, "optional": dep_optional} - ) - self.dialog.tableWidget.removeRow(row) - - def _edit_dependency(self, item): - """Callback: the dependency was double-clicked""" - row = item.row() - dlg = EditDependency() - dep_type = self.dialog.tableWidget.item(row, 0).data(Qt.UserRole) - dep_name = self.dialog.tableWidget.item(row, 1).text() - dep_optional = bool(self.dialog.tableWidget.item(row, 2)) - new_dep_type, new_dep_name, new_dep_optional = dlg.exec(dep_type, dep_name, dep_optional) - if dep_type and dep_name: - self.metadata.removeDepend( - {"package": dep_name, "type": dep_type, "optional": dep_optional} - ) - self.metadata.addDepend( - { - "package": new_dep_name, - "type": new_dep_type, - "optional": new_dep_optional, - } - ) - self.dialog.tableWidget.removeRow(row) - self._add_row(row, dep_type, dep_name, dep_optional) - - def _current_index_changed(self): - if self.dialog.tableWidget.selectedItems(): - self.dialog.removeDependencyToolButton.setDisabled(False) - else: - self.dialog.removeDependencyToolButton.setDisabled(True) - - -class EditDependency: - """A dialog to edit a single piece of dependency information""" - - def __init__(self): - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_edit_dependency.ui") - ) - - self.dialog.typeComboBox.addItem( - translate("AddonsInstaller", "Internal Workbench"), "workbench" - ) - self.dialog.typeComboBox.addItem(translate("AddonsInstaller", "External Addon"), "addon") - self.dialog.typeComboBox.addItem(translate("AddonsInstaller", "Python Package"), "python") - - self.dialog.typeComboBox.currentIndexChanged.connect(self._type_selection_changed) - self.dialog.dependencyComboBox.currentIndexChanged.connect( - self._dependency_selection_changed - ) - - # Expect mostly Python dependencies... - self.dialog.typeComboBox.setCurrentIndex(2) - - self.dialog.layout().setSizeConstraint(QLayout.SetFixedSize) - - def exec(self, dep_type="", dep_name="", dep_optional=False) -> Tuple[str, str, bool]: - """Execute the dialog, returning a tuple of the type of dependency (workbench, addon, or - python), the name of the dependency, and a boolean indicating whether this is optional. - """ - - # If we are editing an existing row, set up the dialog: - if dep_type and dep_name: - index = self.dialog.typeComboBox.findData(dep_type) - if index == -1: - raise RuntimeError(f"Invalid dependency type {dep_type}") - self.dialog.typeComboBox.setCurrentIndex(index) - index = self.dialog.dependencyComboBox.findData(dep_name) - if index == -1: - index = self.dialog.dependencyComboBox.findData("other") - self.dialog.dependencyComboBox.setCurrentIndex(index) - self.dialog.lineEdit.setText(dep_name) - self.dialog.optionalCheckBox.setChecked(dep_optional) - - # Run the dialog (modal) - result = self.dialog.exec() - if result == QDialog.Accepted: - dep_type = self.dialog.typeComboBox.currentData() - dep_optional = self.dialog.optionalCheckBox.isChecked() - dep_name = self.dialog.dependencyComboBox.currentData() - if dep_name == "other": - dep_name = self.dialog.lineEdit.text() - return dep_type, dep_name, dep_optional - return "", "", False - - def _populate_internal_workbenches(self): - """Add all known internal FreeCAD Workbenches to the list""" - self.dialog.dependencyComboBox.clear() - for display_name, name in INTERNAL_WORKBENCHES.items(): - self.dialog.dependencyComboBox.addItem(display_name, name) - # No "other" option is supported for this type of dependency - - def _populate_external_addons(self): - """Add all known addons to the list""" - self.dialog.dependencyComboBox.clear() - # pylint: disable=import-outside-toplevel - from AddonManager import INSTANCE as AM_INSTANCE - - repo_dict = {} - # We need a case-insensitive sorting of all repo types, displayed and sorted by their - # display name, but keeping track of their official name as well (stored in the UserRole) - for repo in AM_INSTANCE.item_model.repos: - repo_dict[repo.display_name.lower()] = (repo.display_name, repo.name) - sorted_keys = sorted(repo_dict) - for item in sorted_keys: - self.dialog.dependencyComboBox.addItem(repo_dict[item][0], repo_dict[item][1]) - self.dialog.dependencyComboBox.addItem(translate("AddonsInstaller", "Other..."), "other") - - def _populate_allowed_python_packages(self): - """Add all allowed python packages to the list""" - self.dialog.dependencyComboBox.clear() - # pylint: disable=import-outside-toplevel - from AddonManager import INSTANCE as AM_INSTANCE - - packages = sorted(AM_INSTANCE.allowed_packages) - for package in packages: - self.dialog.dependencyComboBox.addItem(package, package) - self.dialog.dependencyComboBox.addItem(translate("AddonsInstaller", "Other..."), "other") - - def _type_selection_changed(self, _): - """Callback: The type of dependency has been changed""" - selection = self.dialog.typeComboBox.currentData() - if selection == "workbench": - self._populate_internal_workbenches() - elif selection == "addon": - self._populate_external_addons() - elif selection == "python": - self._populate_allowed_python_packages() - else: - raise RuntimeError("Invalid data found for selection") - - def _dependency_selection_changed(self, _): - selection = self.dialog.dependencyComboBox.currentData() - if selection == "other": - self.dialog.lineEdit.show() - self.dialog.otherNote.show() - else: - self.dialog.lineEdit.hide() - self.dialog.otherNote.hide() - - -class EditFreeCADVersions: - """A dialog to edit minimum and maximum FreeCAD version support""" - - def __init__(self): - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_freecad_versions.ui") - ) - - def exec(self, metadata: FreeCAD.Metadata): - """Execute the dialog""" - if metadata.FreeCADMin != "0.0.0": - self.dialog.minVersionLineEdit.setText(metadata.FreeCADMin) - if metadata.FreeCADMax != "0.0.0": - self.dialog.maxVersionLineEdit.setText(metadata.FreeCADMax) - result = self.dialog.exec() - if result == QDialog.Accepted: - if self.dialog.minVersionLineEdit.text(): - metadata.FreeCADMin = self.dialog.minVersionLineEdit.text() - else: - metadata.FreeCADMin = None - if self.dialog.maxVersionLineEdit.text(): - metadata.FreeCADMax = self.dialog.maxVersionLineEdit.text() - else: - metadata.FreeCADMax = None - - -class EditAdvancedVersions: - """A dialog to support mapping specific git branches, tags, or commits to specific - versions of FreeCAD.""" - - def __init__(self): - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_advanced_freecad_versions.ui") - ) - - def exec(self): - """Execute the dialog""" - self.dialog.exec() diff --git a/src/Mod/AddonManager/addonmanager_devmode_license_selector.py b/src/Mod/AddonManager/addonmanager_devmode_license_selector.py deleted file mode 100644 index 2e6441d9f8..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_license_selector.py +++ /dev/null @@ -1,275 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains a class to manage selection of a license for an Addon.""" - -import os -from datetime import date -from typing import Optional, Tuple - -import FreeCAD -import FreeCADGui - -from PySide.QtWidgets import QFileDialog, QDialog -from PySide.QtGui import QDesktopServices -from PySide.QtCore import QUrl, QFile, QIODevice - -try: - from PySide.QtGui import ( - QRegularExpressionValidator, - ) - from PySide.QtCore import QRegularExpression - - RegexWrapper = QRegularExpression - RegexValidatorWrapper = QRegularExpressionValidator -except ImportError: - QRegularExpressionValidator = None - QRegularExpression = None - from PySide.QtGui import ( - QRegExpValidator, - ) - from PySide.QtCore import QRegExp - - RegexWrapper = QRegExp - RegexValidatorWrapper = QRegExpValidator - -translate = FreeCAD.Qt.translate - - -class LicenseSelector: - """Choose from a selection of licenses, or provide your own. Includes the capability to create - the license file itself for a variety of popular open-source licenses, as well as providing - links to opensource.org's page about the various licenses (which often link to other resources). - """ - - licenses = { - "Apache-2.0": ( - "Apache License, Version 2.0", - "https://opensource.org/licenses/Apache-2.0", - ), - "BSD-2-Clause": ( - "The 2-Clause BSD License", - "https://opensource.org/licenses/BSD-2-Clause", - ), - "BSD-3-Clause": ( - "The 3-Clause BSD License", - "https://opensource.org/licenses/BSD-3-Clause", - ), - "CC0-1.0": ( - "No Rights Reserved/Public Domain", - "https://creativecommons.org/choose/zero/", - ), - "GPL-2.0-or-later": ( - "GNU General Public License version 2", - "https://opensource.org/licenses/GPL-2.0", - ), - "GPL-3.0-or-later": ( - "GNU General Public License version 3", - "https://opensource.org/licenses/GPL-3.0", - ), - "LGPL-2.1-or-later": ( - "GNU Lesser General Public License version 2.1", - "https://opensource.org/licenses/LGPL-2.1", - ), - "LGPL-3.0-or-later": ( - "GNU Lesser General Public License version 3", - "https://opensource.org/licenses/LGPL-3.0", - ), - "MIT": ( - "The MIT License", - "https://opensource.org/licenses/MIT", - ), - "MPL-2.0": ( - "Mozilla Public License 2.0", - "https://opensource.org/licenses/MPL-2.0", - ), - } - - def __init__(self, path_to_addon): - self.other_label = translate( - "AddonsInstaller", - "Other...", - "For providing a license other than one listed", - ) - self.path_to_addon = path_to_addon - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_license.ui") - ) - self.pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - for short_code, details in LicenseSelector.licenses.items(): - self.dialog.comboBox.addItem(f"{short_code}: {details[0]}", userData=short_code) - self.dialog.comboBox.addItem(self.other_label) - self.dialog.otherLineEdit.hide() - self.dialog.otherLabel.hide() - - # Connections: - self.dialog.comboBox.currentIndexChanged.connect(self._selection_changed) - self.dialog.aboutButton.clicked.connect(self._about_clicked) - self.dialog.browseButton.clicked.connect(self._browse_clicked) - self.dialog.createButton.clicked.connect(self._create_clicked) - - # Set up the first selection to whatever the user chose last time - short_code = self.pref.GetString("devModeLastSelectedLicense", "LGPL-2.1-or-later") - self.set_license(short_code) - - def exec(self, short_code: str = None, license_path: str = "") -> Optional[Tuple[str, str]]: - """The main method for executing this dialog, as a modal that returns a tuple of the - license's "short code" and optionally the path to the license file. Returns a tuple - of None,None if the user cancels the operation.""" - - if short_code: - self.set_license(short_code) - self.dialog.pathLineEdit.setText(license_path) - result = self.dialog.exec() - if result == QDialog.Accepted: - new_short_code = self.dialog.comboBox.currentData() - new_license_path = self.dialog.pathLineEdit.text() - if not new_short_code: - new_short_code = self.dialog.otherLineEdit.text() - self.pref.SetString("devModeLastSelectedLicense", new_short_code) - return new_short_code, new_license_path - return None - - def set_license(self, short_code): - """Set the currently-selected license.""" - index = self.dialog.comboBox.findData(short_code) - if index != -1: - self.dialog.comboBox.setCurrentIndex(index) - else: - self.dialog.comboBox.setCurrentText(self.other_label) - self.dialog.otherLineEdit.setText(short_code) - - def _selection_changed(self, _: int): - """Callback: when the license selection changes, the UI is updated here.""" - if self.dialog.comboBox.currentText() == self.other_label: - self.dialog.otherLineEdit.clear() - self.dialog.otherLineEdit.show() - self.dialog.otherLabel.show() - self.dialog.aboutButton.setDisabled(True) - else: - self.dialog.otherLineEdit.hide() - self.dialog.otherLabel.hide() - self.dialog.aboutButton.setDisabled(False) - - def _current_short_code(self) -> str: - """Gets the currently-selected license short code""" - short_code = self.dialog.comboBox.currentData() - if not short_code: - short_code = self.dialog.otherLineEdit.text() - return short_code - - def _about_clicked(self): - """Callback: when the About button is clicked, try to launch a system-default web browser - and display the OSI page about the currently-selected license.""" - short_code = self.dialog.comboBox.currentData() - if short_code in LicenseSelector.licenses: - url = LicenseSelector.licenses[short_code][1] - QDesktopServices.openUrl(QUrl(url)) - else: - FreeCAD.Console.PrintWarning( - f"Internal Error: unrecognized license short code {short_code}\n" - ) - - def _browse_clicked(self): - """Callback: browse for an existing license file.""" - start_dir = os.path.join( - self.path_to_addon, - self.dialog.pathLineEdit.text().replace("/", os.path.sep), - ) - license_path, _ = QFileDialog.getOpenFileName( - parent=self.dialog, - caption=translate( - "AddonsInstaller", - "Select the corresponding license file in your Addon", - ), - dir=start_dir, - ) - if license_path: - self._set_path(self.path_to_addon, license_path) - - def _set_path(self, start_dir: str, license_path: str): - """Sets the value displayed in the path widget to the relative path from - start_dir to license_path""" - license_path = license_path.replace("/", os.path.sep) - base_dir = start_dir.replace("/", os.path.sep) - if base_dir[-1] != os.path.sep: - base_dir += os.path.sep - if not license_path.startswith(base_dir): - FreeCAD.Console.PrintError("Selected file not in Addon\n") - # Eventually offer to copy it? - return - relative_path = license_path[len(base_dir) :] - relative_path = relative_path.replace(os.path.sep, "/") - self.dialog.pathLineEdit.setText(relative_path) - - def _create_clicked(self): - """Asks the users for the path to save the new license file to, then copies our internal - copy of the license text to that file.""" - start_dir = os.path.join( - self.path_to_addon, - self.dialog.pathLineEdit.text().replace("/", os.path.sep), - ) - license_path, _ = QFileDialog.getSaveFileName( - parent=self.dialog, - caption=translate( - "AddonsInstaller", - "Location for new license file", - ), - dir=os.path.join(start_dir, "LICENSE"), - ) - if license_path: - self._set_path(start_dir, license_path) - short_code = self._current_short_code() - qf = QFile(f":/licenses/{short_code}.txt") - if qf.exists(): - qf.open(QIODevice.ReadOnly) - byte_data = qf.readAll() - qf.close() - - string_data = str(byte_data, encoding="utf-8") - - if "<%%YEAR%%>" in string_data or "<%%COPYRIGHT HOLDER%%>" in string_data: - info_dlg = FreeCADGui.PySideUic.loadUi( - os.path.join( - os.path.dirname(__file__), - "developer_mode_copyright_info.ui", - ) - ) - info_dlg.yearLineEdit.setValidator( - RegexValidatorWrapper(RegexWrapper("^[12]\\d{3}$")) - ) - info_dlg.yearLineEdit.setText(str(date.today().year)) - result = info_dlg.exec() - if result != QDialog.Accepted: - return # Don't create the file, just bail out - - holder = info_dlg.copyrightHolderLineEdit.text() - year = info_dlg.yearLineEdit.text() - - string_data = string_data.replace("<%%YEAR%%>", year) - string_data = string_data.replace("<%%COPYRIGHT HOLDER%%>", holder) - - with open(license_path, "w", encoding="utf-8") as f: - f.write(string_data) - else: - FreeCAD.Console.PrintError(f"Cannot create license file of type {short_code}\n") diff --git a/src/Mod/AddonManager/addonmanager_devmode_licenses_table.py b/src/Mod/AddonManager/addonmanager_devmode_licenses_table.py deleted file mode 100644 index 26e29c434c..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_licenses_table.py +++ /dev/null @@ -1,129 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains a wrapper class for a table listing authors and maintainers""" - -import os - -from PySide.QtWidgets import QTableWidgetItem -from PySide.QtGui import QIcon - -import FreeCAD -import FreeCADGui - -from addonmanager_devmode_license_selector import LicenseSelector - -translate = FreeCAD.Qt.translate - -# pylint: disable=too-few-public-methods - - -class LicensesTable: - """A QTableWidget and associated buttons for managing the list of authors and maintainers.""" - - def __init__(self): - self.widget = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_licenses_table.ui") - ) - - self.widget.addButton.setIcon(QIcon.fromTheme("add", QIcon(":/icons/list-add.svg"))) - self.widget.removeButton.setIcon( - QIcon.fromTheme("remove", QIcon(":/icons/list-remove.svg")) - ) - - self.widget.addButton.clicked.connect(self._add_clicked) - self.widget.removeButton.clicked.connect(self._remove_clicked) - self.widget.tableWidget.itemSelectionChanged.connect(self._selection_changed) - self.widget.tableWidget.itemDoubleClicked.connect(self._edit) - self.metadata = None - self.path_to_addon = "" - - def show(self, metadata, path_to_addon): - """Set up the widget based on incoming metadata""" - self.metadata = metadata - self.path_to_addon = path_to_addon - self._populate_from_metadata() - self.widget.removeButton.setDisabled(True) - self.widget.show() - - def _populate_from_metadata(self): - """Use the passed metadata object to populate the maintainers and authors""" - self.widget.tableWidget.setRowCount(0) - row = 0 - for lic in self.metadata.License: - shortcode = lic["name"] - path = lic["file"] - self._add_row(row, shortcode, path) - row += 1 - - def _add_row(self, row, shortcode, path): - """Add this license to the tableWidget at row given""" - self.widget.tableWidget.insertRow(row) - self.widget.tableWidget.setItem(row, 0, QTableWidgetItem(shortcode)) - self.widget.tableWidget.setItem(row, 1, QTableWidgetItem(path)) - - def _add_clicked(self): - """Callback: the Add License button was clicked""" - dlg = LicenseSelector(self.path_to_addon) - shortcode, path = dlg.exec() - if shortcode and path: - self._add_row(self.widget.tableWidget.rowCount(), shortcode, path) - self.metadata.addLicense(shortcode, path) - - def _remove_clicked(self): - """Callback: the Remove License button was clicked""" - items = self.widget.tableWidget.selectedIndexes() - if items: - # We only support single-selection, so can just pull the row # from - # the first entry - row = items[0].row() - shortcode = self.widget.tableWidget.item(row, 0).text() - path = self.widget.tableWidget.item(row, 1).text() - self.widget.tableWidget.removeRow(row) - self.metadata.removeLicense(shortcode, path) - - def _edit(self, item): - """Callback: a row in the tableWidget was double-clicked""" - row = item.row() - shortcode = self.widget.tableWidget.item(row, 0).text() - path = self.widget.tableWidget.item(row, 1).text() - - dlg = LicenseSelector(self.path_to_addon) - new_shortcode, new_path = dlg.exec(shortcode, path) - - if new_shortcode and new_path: - self.widget.tableWidget.removeRow(row) - self.metadata.removeLicense(new_shortcode, new_path) - - self._add_row(row, new_shortcode, new_path) - self.metadata.addLicense(new_shortcode, new_path) - - self.widget.tableWidget.selectRow(row) - - def _selection_changed(self): - """Callback: the current selection in the tableWidget changed""" - items = self.widget.tableWidget.selectedItems() - if items: - self.widget.removeButton.setDisabled(False) - else: - self.widget.removeButton.setDisabled(True) diff --git a/src/Mod/AddonManager/addonmanager_devmode_metadata_checker.py b/src/Mod/AddonManager/addonmanager_devmode_metadata_checker.py deleted file mode 100644 index efae4ab928..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_metadata_checker.py +++ /dev/null @@ -1,184 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Metadata validation functions""" - -from typing import List - -import FreeCAD - -from Addon import Addon -from addonmanager_metadata import Metadata -import NetworkManager - - -class MetadataValidators: - """A collection of tools for validating various pieces of metadata. Prints - validation information to the console.""" - - def validate_all(self, repos): - """Developer tool: check all repos for validity and print report""" - - FreeCAD.Console.PrintMessage("\n\nADDON MANAGER DEVELOPER MODE CHECKS\n") - FreeCAD.Console.PrintMessage("-----------------------------------\n") - - counter = 0 - for addon in repos: - counter += 1 - if addon.metadata is not None: - self.validate_package_xml(addon) - elif addon.repo_type == Addon.Kind.MACRO: - if addon.macro.parsed: - if len(addon.macro.icon) == 0 and len(addon.macro.xpm) == 0: - FreeCAD.Console.PrintMessage( - f"Macro '{addon.name}' does not have an icon\n" - ) - else: - FreeCAD.Console.PrintMessage( - f"Addon '{addon.name}' does not have a package.xml file\n" - ) - - FreeCAD.Console.PrintMessage("-----------------------------------\n\n") - - def validate_package_xml(self, addon: Addon): - """Check the package.xml file for the specified Addon""" - if addon.metadata is None: - return - - # The package.xml standard has some required elements that the basic XML - # reader is not actually checking for. In developer mode, actually make sure - # that all the rules are being followed for each element. - - errors = [] - - errors.extend(self.validate_top_level(addon)) - errors.extend(self.validate_content(addon)) - - if len(errors) > 0: - FreeCAD.Console.PrintError(f"Errors found in package.xml file for '{addon.name}'\n") - for error in errors: - FreeCAD.Console.PrintError(f" * {error}\n") - - def validate_content(self, addon: Addon) -> List[str]: - """Validate the Content items for this Addon""" - errors = [] - contents = addon.metadata.content - - missing_icon = True - if addon.metadata.icon and len(addon.metadata.icon) > 0: - missing_icon = False - else: - if "workbench" in contents: - wb = contents["workbench"][0] - if wb.icon: - missing_icon = False - if missing_icon: - errors.append("No element found, or element is invalid") - - if "workbench" in contents: - for wb in contents["workbench"]: - errors.extend(self.validate_workbench_metadata(wb)) - - if "preferencepack" in contents: - for wb in contents["preferencepack"]: - errors.extend(self.validate_preference_pack_metadata(wb)) - - return errors - - def validate_top_level(self, addon: Addon) -> List[str]: - """Check for the presence of the required top-level elements""" - errors = [] - if not addon.metadata.name or len(addon.metadata.name) == 0: - errors.append("No top-level element found, or element is empty") - if not addon.metadata.version: - errors.append("No top-level element found, or element is invalid") - if not addon.metadata.description or len(addon.metadata.description) == 0: - errors.append( - "No top-level element found, or element " "is invalid" - ) - - maintainers = addon.metadata.maintainer - if len(maintainers) == 0: - errors.append("No top-level found, at least one is required") - for maintainer in maintainers: - if len(maintainer.email) == 0: - errors.append(f"No email address specified for maintainer '{maintainer.name}'") - - licenses = addon.metadata.license - if len(licenses) == 0: - errors.append("No top-level found, at least one is required") - - urls = addon.metadata.url - errors.extend(self.validate_urls(urls)) - return errors - - @staticmethod - def validate_urls(urls) -> List[str]: - """Check the URLs provided by the addon""" - errors = [] - if len(urls) == 0: - errors.append("No elements found, at least a repo url must be provided") - else: - found_repo = False - found_readme = False - for url in urls: - if url.type == "repository": - found_repo = True - if len(url.branch) == 0: - errors.append(" element is missing the 'branch' attribute") - elif url.type == "readme": - found_readme = True - location = url.location - p = NetworkManager.AM_NETWORK_MANAGER.blocking_get(location) - if not p: - errors.append(f"Could not access specified readme at {location}") - else: - p = p.data().decode("utf8") - if "" in p: - pass - else: - errors.append( - f"Readme data found at {location}" - " does not appear to be rendered HTML" - ) - if not found_repo: - errors.append("No repo url specified") - if not found_readme: - errors.append("No readme url specified (not required, but highly recommended)") - return errors - - @staticmethod - def validate_workbench_metadata(workbench: Metadata) -> List[str]: - """Validate the required element(s) for a workbench""" - errors = [] - if not workbench.classname or len(workbench.classname) == 0: - errors.append("No specified for workbench") - return errors - - @staticmethod - def validate_preference_pack_metadata(pack: Metadata) -> List[str]: - """Validate the required element(s) for a preference pack""" - errors = [] - if not pack.name or len(pack.name) == 0: - errors.append("No specified for preference pack") - return errors diff --git a/src/Mod/AddonManager/addonmanager_devmode_people_table.py b/src/Mod/AddonManager/addonmanager_devmode_people_table.py deleted file mode 100644 index 048100bff4..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_people_table.py +++ /dev/null @@ -1,153 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains a wrapper class for a table listing authors and maintainers""" - -import os - -from PySide.QtWidgets import QTableWidgetItem -from PySide.QtGui import QIcon -from PySide.QtCore import Qt - -import FreeCAD -import FreeCADGui - -from addonmanager_devmode_person_editor import PersonEditor - -translate = FreeCAD.Qt.translate - -# pylint: disable=too-few-public-methods - - -class PeopleTable: - """A QTableWidget and associated buttons for managing the list of authors and maintainers.""" - - def __init__(self): - self.widget = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_people_table.ui") - ) - - self.widget.addButton.setIcon(QIcon.fromTheme("add", QIcon(":/icons/list-add.svg"))) - self.widget.removeButton.setIcon( - QIcon.fromTheme("remove", QIcon(":/icons/list-remove.svg")) - ) - - self.widget.addButton.clicked.connect(self._add_clicked) - self.widget.removeButton.clicked.connect(self._remove_clicked) - self.widget.tableWidget.itemSelectionChanged.connect(self._selection_changed) - self.widget.tableWidget.itemDoubleClicked.connect(self._edit) - self.metadata = None - - def show(self, metadata): - """Set up the widget based on incoming metadata""" - self.metadata = metadata - self._populate_from_metadata() - self.widget.removeButton.setDisabled(True) - self.widget.show() - - def _populate_from_metadata(self): - """Use the passed metadata object to populate the maintainers and authors""" - self.widget.tableWidget.setRowCount(0) - row = 0 - for maintainer in self.metadata.Maintainer: - name = maintainer["name"] - email = maintainer["email"] - self._add_row(row, "maintainer", name, email) - row += 1 - for author in self.metadata.Author: - name = author["name"] - email = author["email"] - self._add_row(row, "author", name, email) - row += 1 - - def _add_row(self, row, person_type, name, email): - """Add this person to the tableWidget at row given""" - person_type_translation = { - "maintainer": translate("AddonsInstaller", "Maintainer"), - "author": translate("AddonsInstaller", "Author"), - } - self.widget.tableWidget.insertRow(row) - item = QTableWidgetItem(person_type_translation[person_type]) - item.setData(Qt.UserRole, person_type) - self.widget.tableWidget.setItem(row, 0, item) - self.widget.tableWidget.setItem(row, 1, QTableWidgetItem(name)) - self.widget.tableWidget.setItem(row, 2, QTableWidgetItem(email)) - - def _add_clicked(self): - """Callback: the Add Person button was clicked""" - dlg = PersonEditor() - person_type, name, email = dlg.exec() - if person_type and name: - self._add_row(self.widget.tableWidget.rowCount(), person_type, name, email) - if person_type == "maintainer": - self.metadata.addMaintainer(name, email) - else: - self.metadata.addAuthor(name, email) - - def _remove_clicked(self): - """Callback: the Remove Person button was clicked""" - items = self.widget.tableWidget.selectedIndexes() - if items: - # We only support single-selection, so can just pull the row # from - # the first entry - row = items[0].row() - person_type = self.widget.tableWidget.item(row, 0).data(Qt.UserRole) - name = self.widget.tableWidget.item(row, 1).text() - email = self.widget.tableWidget.item(row, 2).text() - self.widget.tableWidget.removeRow(row) - if person_type == "maintainer": - self.metadata.removeMaintainer(name, email) - else: - self.metadata.removeAuthor(name, email) - - def _edit(self, item): - """Callback: a row in the tableWidget was double-clicked""" - row = item.row() - person_type = self.widget.tableWidget.item(row, 0).data(Qt.UserRole) - name = self.widget.tableWidget.item(row, 1).text() - email = self.widget.tableWidget.item(row, 2).text() - - dlg = PersonEditor() - dlg.setup(person_type, name, email) - new_person_type, new_name, new_email = dlg.exec() - - if new_person_type and new_name: - self.widget.tableWidget.removeRow(row) - if person_type == "maintainer": - self.metadata.removeMaintainer(name, email) - else: - self.metadata.removeAuthor(name, email) - self._add_row(row, new_person_type, new_name, email) - if new_person_type == "maintainer": - self.metadata.addMaintainer(new_name, new_email) - else: - self.metadata.addAuthor(new_name, new_email) - self.widget.tableWidget.selectRow(row) - - def _selection_changed(self): - """Callback: the current selection in the tableWidget changed""" - items = self.widget.tableWidget.selectedItems() - if items: - self.widget.removeButton.setDisabled(False) - else: - self.widget.removeButton.setDisabled(True) diff --git a/src/Mod/AddonManager/addonmanager_devmode_person_editor.py b/src/Mod/AddonManager/addonmanager_devmode_person_editor.py deleted file mode 100644 index 12f5d2a31a..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_person_editor.py +++ /dev/null @@ -1,72 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains a class to handle editing a person (from a Metadata standpoint).""" - -import os -from typing import Tuple # Needed until Py 3.9, when tuple supports this directly - -from PySide.QtWidgets import QDialog - -import FreeCAD -import FreeCADGui - -translate = FreeCAD.Qt.translate - - -class PersonEditor: - """Create or edit a maintainer or author record.""" - - def __init__(self): - - self.dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "developer_mode_people.ui") - ) - self.dialog.comboBox.clear() - self.dialog.comboBox.addItem( - translate("AddonsInstaller", "Maintainer"), userData="maintainer" - ) - self.dialog.comboBox.addItem(translate("AddonsInstaller", "Author"), userData="author") - - def exec(self) -> Tuple[str, str, str]: - """Run the dialog, and return a tuple of the person's record type, their name, and their - email address. Email may be None. If the others are None it's because the user cancelled - the interaction.""" - result = self.dialog.exec() - if result == QDialog.Accepted: - return ( - self.dialog.comboBox.currentData(), - self.dialog.nameLineEdit.text(), - self.dialog.emailLineEdit.text(), - ) - return "", "", "" - - def setup(self, person_type: str = "maintainer", name: str = "", email: str = "") -> None: - """Configure the dialog""" - index = self.dialog.comboBox.findData(person_type) - if index == -1: - FreeCAD.Console.PrintWarning(f"Internal Error: unrecognized person type {person_type}") - index = 0 - self.dialog.comboBox.setCurrentIndex(index) - self.dialog.nameLineEdit.setText(name) - self.dialog.emailLineEdit.setText(email) diff --git a/src/Mod/AddonManager/addonmanager_devmode_predictor.py b/src/Mod/AddonManager/addonmanager_devmode_predictor.py deleted file mode 100644 index 012e0eb6c5..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_predictor.py +++ /dev/null @@ -1,286 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Class to guess metadata based on folder contents. Note that one of the functions -of this file is to guess the license being applied to the new software package based -in its contents. It is up to the user to make the final determination about whether -the selected license is the correct one, and inclusion here shouldn't be construed as -endorsement of any particular license. In addition, the inclusion of those text strings -does not imply a modification to the license for THIS software, which is licensed -under the LGPLv2.1 license (as stated above).""" - -import datetime -import os - -import FreeCAD -from addonmanager_git import initialize_git, GitManager -from addonmanager_utilities import get_readme_url - -translate = FreeCAD.Qt.translate - -# pylint: disable=too-few-public-methods - - -class AddonSlice: - """A tiny class to implement duck-typing for the URL-parsing utility functions""" - - def __init__(self, url, branch): - self.url = url - self.branch = branch - - -class Predictor: - """Guess the appropriate metadata to apply to a project based on various parameters - found in the supplied directory.""" - - def __init__(self): - self.path = None - self.metadata = FreeCAD.Metadata() - self.license_data = None - self.readme_data = None - self.license_file = "" - self.git_manager: GitManager = initialize_git() - if not self.git_manager: - raise Exception("Cannot use Developer Mode without git installed") - - def predict_metadata(self, path: str) -> FreeCAD.Metadata: - """Create a predicted Metadata object based on the contents of the passed-in directory""" - if not os.path.isdir(path): - return None - self.path = path - self._predict_author_info() - self._predict_name() - self._predict_description() - self._predict_contents() - self._predict_icon() - self._predict_urls() - self._predict_license() - self._predict_version() - - return self.metadata - - def _predict_author_info(self): - """Look at the git commit history and attempt to discern maintainer and author - information.""" - - committers = self.git_manager.get_last_committers(self.path) - - # This is a dictionary keyed to the author's name (which can be many - # things, depending on the author) containing two fields, "email" and "count". It - # is common for there to be multiple entries representing the same human being, - # so a passing attempt is made to reconcile: - filtered_committers = {} - for key, committer in committers.items(): - if "github" in key.lower(): - # Robotic merge commit (or other similar), ignore - continue - # Does any other committer share any of these emails? - for other_key, other_committer in committers.items(): - if other_key == key: - continue - for other_email in other_committer["email"]: - if other_email in committer["email"]: - # There is overlap in the two email lists, so this is probably the - # same author, with a different name (username, pseudonym, etc.) - if not committer["aka"]: - committer["aka"] = set() - committer["aka"].add(other_key) - committer["count"] += other_committer["count"] - committer["email"].combine(other_committer["email"]) - committers.pop(other_key) - break - filtered_committers[key] = committer - maintainers = [] - for name, info in filtered_committers.items(): - if "aka" in info: - for other_name in info["aka"]: - # Heuristic: the longer name is more likely to be the actual legal name - if len(other_name) > len(name): - name = other_name - # There is no logical basis to choose one email address over another, so just - # take the first one - email = info["email"][0] - commit_count = info["count"] - maintainers.append({"name": name, "email": email, "count": commit_count}) - - # Sort by count of commits - maintainers.sort(key=lambda i: i["count"], reverse=True) - - self.metadata.Maintainer = maintainers - - def _predict_name(self): - """Predict the name based on the local path name and/or the contents of a - README.md file.""" - - normed_path = self.path.replace(os.path.sep, "/") - path_components = normed_path.split("/") - final_path_component = path_components[-1] - predicted_name = final_path_component.replace("/", "") - self.metadata.Name = predicted_name - - def _predict_description(self): - """Predict the description based on the contents of a README.md file.""" - self._load_readme() - - if not self.readme_data: - return - - lines = self.readme_data.split("\n") - description = "" - for line in lines: - if "#" in line: - continue # Probably not a line of description - if "![" in line: - continue # An image link, probably separate from any description - if not line and description: - break # We're done: this is a blank line, and we've read some data already - if description: - description += " " - description += line - - if description: - self.metadata.Description = description - - def _predict_contents(self): - """Predict the contents based on the contents of the directory.""" - - def _predict_icon(self): - """Predict the icon based on either a class which defines an Icon member, or - the contents of the local directory structure.""" - - def _predict_urls(self): - """Predict the URLs based on git settings""" - - branch = self.git_manager.current_branch(self.path) - remote = self.git_manager.get_remote(self.path) - - addon = AddonSlice(remote, branch) - readme = get_readme_url(addon) - - self.metadata.addUrl("repository", remote, branch) - self.metadata.addUrl("readme", readme) - - def _predict_license(self): - """Predict the license based on any existing license file.""" - - # These are processed in order, so the BSD 3 clause must come before the 2, for example, - # because the only difference between them is the additional clause. - known_strings = { - "Apache-2.0": ( - "Apache License, Version 2.0", - "Apache License\nVersion 2.0, January 2004", - ), - "BSD-3-Clause": ( - "The 3-Clause BSD License", - "3. Neither the name of the copyright holder nor the names of its contributors \ - may be used to endorse or promote products derived from this software without \ - specific prior written permission.", - ), - "BSD-2-Clause": ( - "The 2-Clause BSD License", - "2. Redistributions in binary form must reproduce the above copyright notice, \ - this list of conditions and the following disclaimer in the documentation and/or \ - other materials provided with the distribution.", - ), - "CC0v1": ( - "CC0 1.0 Universal", - "voluntarily elects to apply CC0 to the Work and publicly distribute the Work \ - under its terms", - ), - "GPLv2": ( - "GNU General Public License version 2", - "GNU GENERAL PUBLIC LICENSE\nVersion 2, June 1991", - ), - "GPLv3": ( - "GNU General Public License version 3", - "The GNU General Public License is a free, copyleft license for software and \ - other kinds of works.", - ), - "LGPLv2.1": ( - "GNU Lesser General Public License version 2.1", - "GNU Lesser General Public License\nVersion 2.1, February 1999", - ), - "LGPLv3": ( - "GNU Lesser General Public License version 3", - "GNU LESSER GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007", - ), - "MIT": ( - "The MIT License", - "including without limitation the rights to use, copy, modify, merge, publish, \ - distribute, sublicense, and/or sell copies of the Software", - ), - "MPL-2.0": ( - "Mozilla Public License 2.0", - "https://opensource.org/licenses/MPL-2.0", - ), - } - self._load_license() - if self.license_data: - for shortcode, test_data in known_strings.items(): - if shortcode.lower() in self.license_data.lower(): - self.metadata.addLicense(shortcode, self.license_file) - return - for test_text in test_data: - # Do the comparison without regard to whitespace or capitalization - if ( - "".join(test_text.split()).lower() - in "".join(self.license_data.split()).lower() - ): - self.metadata.addLicense(shortcode, self.license_file) - return - - def _predict_version(self): - """Default to a CalVer style set to today's date""" - year = datetime.date.today().year - month = datetime.date.today().month - day = datetime.date.today().day - version_string = f"{year}.{month:>02}.{day:>02}" - self.metadata.Version = version_string - - def _load_readme(self): - """Load in any existing readme""" - valid_names = ["README.md", "README.txt", "README"] - for name in valid_names: - full_path = os.path.join(self.path, name) - if os.path.exists(full_path): - with open(full_path, encoding="utf-8") as f: - self.readme_data = f.read() - return - - def _load_license(self): - """Load in any existing license""" - valid_names = [ - "LICENSE", - "LICENCE", - "COPYING", - "LICENSE.txt", - "LICENCE.txt", - "COPYING.txt", - ] - for name in valid_names: - full_path = os.path.join(self.path.replace("/", os.path.sep), name) - if os.path.isfile(full_path): - with open(full_path, encoding="utf-8") as f: - self.license_data = f.read() - self.license_file = name - return diff --git a/src/Mod/AddonManager/addonmanager_devmode_validators.py b/src/Mod/AddonManager/addonmanager_devmode_validators.py deleted file mode 100644 index c4c7e71fda..0000000000 --- a/src/Mod/AddonManager/addonmanager_devmode_validators.py +++ /dev/null @@ -1,166 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Validators used for various line edits""" - -import keyword - -from PySide.QtGui import ( - QValidator, -) - -# QRegularExpressionValidator was only added at the very end of the PySide -# development cycle, so make sure to support the older QRegExp version as well. -try: - from PySide.QtGui import ( - QRegularExpressionValidator, - ) - from PySide.QtCore import QRegularExpression - - RegexWrapper = QRegularExpression - RegexValidatorWrapper = QRegularExpressionValidator -except ImportError: - QRegularExpressionValidator = None - QRegularExpression = None - from PySide.QtGui import ( - QRegExpValidator, - ) - from PySide.QtCore import QRegExp - - RegexWrapper = QRegExp - RegexValidatorWrapper = QRegExpValidator - - -# pylint: disable=too-few-public-methods - - -class NameValidator(QValidator): - """Simple validator to exclude characters that are not valid in filenames.""" - - invalid = '/\\?%*:|"<>' - - def validate(self, value: str, _: int): - """Check the value against the validator""" - for char in value: - if char in NameValidator.invalid: - return QValidator.Invalid - return QValidator.Acceptable - - def fixup(self, value: str) -> str: - """Remove invalid characters from value""" - result = "" - for char in value: - if char not in NameValidator.invalid: - result += char - return result - - -class PythonIdentifierValidator(QValidator): - """Validates whether input is a valid Python identifier.""" - - def validate(self, value: str, _: int): - """The function that does the validation.""" - if not value: - return QValidator.Intermediate - - if not value.isidentifier(): - return QValidator.Invalid # Includes an illegal character of some sort - - if keyword.iskeyword(value): - return QValidator.Intermediate # They can keep typing and it might become valid - - return QValidator.Acceptable - - -class SemVerValidator(RegexValidatorWrapper): - """Implements the officially-recommended regex validator for Semantic version numbers.""" - - # https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string - semver_re = RegexWrapper( - r"^(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)" - + r"(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)" - + r"(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?" - + r"(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" - ) - - def __init__(self): - super().__init__() - if hasattr(self, "setRegularExpression"): - self.setRegularExpression(SemVerValidator.semver_re) - else: - self.setRegExp(SemVerValidator.semver_re) - - @classmethod - def check(cls, value: str) -> bool: - """Returns true if value validates, and false if not""" - return cls.semver_re.match(value).hasMatch() - - -class CalVerValidator(RegexValidatorWrapper): - """Implements a basic regular expression validator that makes sure an entry corresponds - to a CalVer version numbering standard.""" - - calver_re = RegexWrapper( - r"^(?P[1-9]\d{3})\.(?P[0-9]{1,2})\.(?P0|[0-9]{0,2})" - + r"(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)" - + r"(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?" - + r"(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" - ) - - def __init__(self): - super().__init__() - if hasattr(self, "setRegularExpression"): - self.setRegularExpression(CalVerValidator.calver_re) - else: - self.setRegExp(CalVerValidator.calver_re) - - @classmethod - def check(cls, value: str) -> bool: - """Returns true if value validates, and false if not""" - return cls.calver_re.match(value).hasMatch() - - -class VersionValidator(QValidator): - """Implements the officially-recommended regex validator for Semantic version numbers, and a - decent approximation of the same thing for CalVer-style version numbers.""" - - def __init__(self): - super().__init__() - self.semver = SemVerValidator() - self.calver = CalVerValidator() - - def validate(self, value: str, position: int): - """Called for validation, returns a tuple of the validation state, the value, and the - position.""" - semver_result = self.semver.validate(value, position) - calver_result = self.calver.validate(value, position) - - if semver_result[0] == QValidator.Acceptable: - return semver_result - if calver_result[0] == QValidator.Acceptable: - return calver_result - if semver_result[0] == QValidator.Intermediate: - return semver_result - if calver_result[0] == QValidator.Intermediate: - return calver_result - return QValidator.Invalid, value, position diff --git a/src/Mod/AddonManager/addonmanager_firstrun.py b/src/Mod/AddonManager/addonmanager_firstrun.py deleted file mode 100644 index 2b8cbeb378..0000000000 --- a/src/Mod/AddonManager/addonmanager_firstrun.py +++ /dev/null @@ -1,66 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Class to display a first-run dialog for the Addon Manager""" - -import os - -from PySide import QtCore, QtWidgets -from PySide.QtGui import QPixmap - -import FreeCAD -import FreeCADGui - -import addonmanager_utilities as utils - -# pylint: disable=too-few-public-methods - - -class FirstRunDialog: - """Manage the display of the Addon Manager's first-run dialog, setting up some user - preferences and making sure they are aware that this connects to the internet, downloads - data, and possibly installs things that run code not affiliated with FreeCAD itself.""" - - def __init__(self): - self.pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - self.readWarning = self.pref.GetBool("readWarning2022", False) - - def exec(self) -> bool: - """Display a first-run dialog if needed, and return True to indicate the Addon Manager - should continue loading, or False if the user cancelled the dialog and wants to exit.""" - if not self.readWarning: - warning_dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "first_run.ui") - ) - - # Set signal handlers for accept/reject buttons - warning_dialog.buttonContinue.clicked.connect(warning_dialog.accept) - warning_dialog.buttonQuit.clicked.connect(warning_dialog.reject) - - # Show the dialog and check whether the user accepted or canceled - if warning_dialog.exec() == QtWidgets.QDialog.Accepted: - # Store warning as read/accepted - self.readWarning = True - self.pref.SetBool("readWarning2022", True) - - return self.readWarning diff --git a/src/Mod/AddonManager/addonmanager_freecad_interface.py b/src/Mod/AddonManager/addonmanager_freecad_interface.py deleted file mode 100644 index 5a087a4efe..0000000000 --- a/src/Mod/AddonManager/addonmanager_freecad_interface.py +++ /dev/null @@ -1,291 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2023 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Classes to encapsulate the Addon Manager's interaction with FreeCAD, and to provide -replacements when the Addon Manager is not run from within FreeCAD (e.g. during unit -testing). - -Usage: -from addonmanager_freecad_interface import Console, DataPaths, Preferences -""" - -import json -import logging -import os -import tempfile - -# pylint: disable=too-few-public-methods - -try: - import FreeCAD - - Console = FreeCAD.Console - ParamGet = FreeCAD.ParamGet - Version = FreeCAD.Version - getUserAppDataDir = FreeCAD.getUserAppDataDir - getUserMacroDir = FreeCAD.getUserMacroDir - getUserCachePath = FreeCAD.getUserCachePath - translate = FreeCAD.Qt.translate - loadUi = None - - if FreeCAD.GuiUp: - import FreeCADGui - - if hasattr(FreeCADGui, "PySideUic"): - loadUi = FreeCADGui.PySideUic.loadUi - else: - FreeCADGui = None - -except ImportError: - FreeCAD = None - FreeCADGui = None - getUserAppDataDir = None - getUserCachePath = None - getUserMacroDir = None - - def translate(_context: str, string: str, _desc: str = "") -> str: - return string - - def Version(): - return 1, 1, 0, "dev" - - class ConsoleReplacement: - """If FreeCAD's Console is not available, create a replacement by redirecting FreeCAD - log calls to Python's built-in logging facility.""" - - @staticmethod - def PrintLog(arg: str) -> None: - logging.log(logging.DEBUG, arg) - - @staticmethod - def PrintMessage(arg: str) -> None: - logging.info(arg) - - @staticmethod - def PrintWarning(arg: str) -> None: - logging.warning(arg) - - @staticmethod - def PrintError(arg: str) -> None: - logging.error(arg) - - Console = ConsoleReplacement() - - class ParametersReplacement: - """Proxy for FreeCAD's Parameters when not running within FreeCAD. NOT - serialized, only exists for the duration of the program's execution. Only - provides the functions used by the Addon Manager, this class is not intended - to be a complete replacement for FreeCAD's preferences system.""" - - parameters = {} - - def GetBool(self, name: str, default: bool) -> bool: - return self._Get(name, default) - - def GetInt(self, name: str, default: int) -> int: - return self._Get(name, default) - - def GetFloat(self, name: str, default: float) -> float: - return self._Get(name, default) - - def GetString(self, name: str, default: str) -> str: - return self._Get(name, default) - - def _Get(self, name, default): - return self.parameters[name] if name in self.parameters else default - - def SetBool(self, name: str, value: bool) -> None: - self.parameters[name] = value - - def SetInt(self, name: str, value: int) -> None: - self.parameters[name] = value - - def SetFloat(self, name: str, value: float) -> None: - self.parameters[name] = value - - def SetString(self, name: str, value: str) -> None: - self.parameters[name] = value - - def RemBool(self, name: str) -> None: - self.parameters.pop(name) - - def RemInt(self, name: str) -> None: - self.parameters.pop(name) - - def RemFloat(self, name: str) -> None: - self.parameters.pop(name) - - def RemString(self, name: str) -> None: - self.parameters.pop(name) - - def ParamGet(_: str): - return ParametersReplacement() - - -class DataPaths: - """Provide access to various data storage paths. If not running within FreeCAD, - all paths are temp directories. If not run within FreeCAD, all directories are - deleted when the last reference to this class is deleted.""" - - data_dir = None - mod_dir = None - macro_dir = None - cache_dir = None - home_dir = None - - reference_count = 0 - - def __init__(self): - if FreeCAD: - if self.data_dir is None: - self.data_dir = getUserAppDataDir() - if self.mod_dir is None: - self.mod_dir = os.path.join(getUserAppDataDir(), "Mod") - if self.cache_dir is None: - self.cache_dir = getUserCachePath() - if self.macro_dir is None: - self.macro_dir = getUserMacroDir(True) - if self.home_dir is None: - self.home_dir = FreeCAD.getHomePath() - else: - self.reference_count += 1 - if self.data_dir is None: - self.data_dir = tempfile.mkdtemp() - if self.mod_dir is None: - self.mod_dir = tempfile.mkdtemp() - if self.cache_dir is None: - self.cache_dir = tempfile.mkdtemp() - if self.macro_dir is None: - self.macro_dir = tempfile.mkdtemp() - if self.home_dir is None: - self.home_dir = os.path.join(os.path.dirname(__file__), "..", "..") - - def __del__(self): - self.reference_count -= 1 - if not FreeCAD and self.reference_count <= 0: - paths = [self.data_dir, self.mod_dir, self.cache_dir, self.macro_dir, self.mod_dir] - for path in paths: - try: - os.rmdir(path) - except FileNotFoundError: - pass - self.data_dir = None - self.mod_dir = None - self.cache_dir = None - self.macro_dir = None - - -class Preferences: - """Wrap access to all user preferences. If run within FreeCAD, user preferences are - persistent, otherwise they only exist per-run. All preferences are controlled by a - central JSON file defining their defaults.""" - - preferences_defaults = {} - - def __init__(self, defaults_data=None): - """Set up the preferences, initializing the class statics if necessary. If - defaults_data is provided it is used as the preferences defaults. If it is not - provided, then the defaults are read in from the standard defaults file, - addonmanager_preferences_defaults.json, located in the same directory as this - Python file.""" - if not self.preferences_defaults: - if defaults_data: - self.preferences_defaults = defaults_data - else: - self._load_preferences_defaults() - self.prefs = ParamGet("User parameter:BaseApp/Preferences/Addons") - - def get(self, name: str): - """Get the preference value for the given key""" - if name not in self.preferences_defaults: - raise RuntimeError( - f"Unrecognized preference {name} -- did you add " - + "it to addonmanager_preferences_defaults.json?" - ) - if isinstance(self.preferences_defaults[name], bool): - return self.prefs.GetBool(name, self.preferences_defaults[name]) - if isinstance(self.preferences_defaults[name], int): - return self.prefs.GetInt(name, self.preferences_defaults[name]) - if isinstance(self.preferences_defaults[name], float): - return self.prefs.GetFloat(name, self.preferences_defaults[name]) - if isinstance(self.preferences_defaults[name], str): - return self.prefs.GetString(name, self.preferences_defaults[name]) - # We don't directly support any other types from the JSON file (e.g. arrays) - type_name = type(self.preferences_defaults[name]) - raise RuntimeError(f"Unrecognized type for {name}: {type_name}") - - def set(self, name: str, value): - """Set the preference value for the given key. Must exist (e.g. must be in the - addonmanager_preferences_defaults.json file).""" - if name not in self.preferences_defaults: - raise RuntimeError( - f"Unrecognized preference {name} -- did you add " - + "it to addonmanager_preferences_defaults.json?" - ) - if isinstance(self.preferences_defaults[name], bool): - self.prefs.SetBool(name, value) - elif isinstance(self.preferences_defaults[name], int): - self.prefs.SetInt(name, value) - elif isinstance(self.preferences_defaults[name], float): - self.prefs.SetFloat(name, value) - elif isinstance(self.preferences_defaults[name], str): - self.prefs.SetString(name, value) - else: - # We don't directly support any other types from the JSON file (e.g. arrays) - type_name = type(self.preferences_defaults[name]) - raise RuntimeError(f"Unrecognized type for {name}: {type_name}") - - def rem(self, name: str): - """Remove the preference. Must have an entry in the - addonmanager_preferences_defaults.json file.""" - if name not in self.preferences_defaults: - raise RuntimeError( - f"Unrecognized preference {name} -- did you add " - + "it to addonmanager_preferences_defaults.json?" - ) - if isinstance(self.preferences_defaults[name], bool): - return self.prefs.RemBool(name) - if isinstance(self.preferences_defaults[name], int): - return self.prefs.RemInt(name) - if isinstance(self.preferences_defaults[name], float): - return self.prefs.RemFloat(name) - if isinstance(self.preferences_defaults[name], str): - return self.prefs.RemString(name) - # We don't directly support any other types from the JSON file (e.g. arrays) - type_name = type(self.preferences_defaults[name]) - raise RuntimeError(f"Unrecognized type for {name}: {type_name}") - - @classmethod - def _load_preferences_defaults(cls, filename=None): - """Loads the preferences defaults JSON file from either a specified file, or - from the standard addonmanager_preferences_defaults.json file.""" - - if filename is None: - json_file = os.path.join( - os.path.dirname(__file__), "addonmanager_preferences_defaults.json" - ) - else: - json_file = filename - with open(json_file, "r", encoding="utf-8") as f: - file_contents = f.read() - cls.preferences_defaults = json.loads(file_contents) diff --git a/src/Mod/AddonManager/addonmanager_git.py b/src/Mod/AddonManager/addonmanager_git.py deleted file mode 100644 index 0cce480db8..0000000000 --- a/src/Mod/AddonManager/addonmanager_git.py +++ /dev/null @@ -1,480 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Wrapper around git executable to simplify calling git commands from Python.""" - -# pylint: disable=too-few-public-methods - -import os -import platform -import shutil -import subprocess -from typing import List, Dict, Optional -import time - -import addonmanager_utilities as utils -import addonmanager_freecad_interface as fci - -translate = fci.translate - - -class NoGitFound(RuntimeError): - """Could not locate the git executable on this system.""" - - -class GitFailed(RuntimeError): - """The call to git returned an error of some kind""" - - -def _ref_format_string() -> str: - return ( - "--format=%(refname:lstrip=2)\t%(upstream:lstrip=2)\t%(authordate:rfc)\t%(" - "authorname)\t%(subject)" - ) - - -def _parse_ref_table(text: str): - rows = text.splitlines() - result = [] - for row in rows: - columns = row.split("\t") - result.append( - { - "ref_name": columns[0], - "upstream": columns[1], - "date": columns[2], - "author": columns[3], - "subject": columns[4], - } - ) - return result - - -class GitManager: - """A class to manage access to git: mostly just provides a simple wrapper around - the basic command-line calls. Provides optional asynchronous access to clone and - update.""" - - def __init__(self): - self.git_exe = None - self._find_git() - if not self.git_exe: - raise NoGitFound() - - def clone(self, remote, local_path, args: List[str] = None): - """Clones the remote to the local path""" - final_args = ["clone", "--recurse-submodules"] - if args: - final_args.extend(args) - final_args.extend([remote, local_path]) - self._synchronous_call_git(final_args) - - def async_clone(self, remote, local_path, progress_monitor, args: List[str] = None): - """Clones the remote to the local path, sending periodic progress updates - to the passed progress_monitor. Returns a handle that can be used to - cancel the job.""" - - def checkout(self, local_path, spec, args: List[str] = None): - """Checks out a specific git revision, tag, or branch. Any valid argument to - git checkout can be submitted.""" - old_dir = os.getcwd() - os.chdir(local_path) - final_args = ["checkout"] - if args: - final_args.extend(args) - final_args.append(spec) - self._synchronous_call_git(final_args) - os.chdir(old_dir) - - def dirty(self, local_path: str) -> bool: - """Check for local changes""" - old_dir = os.getcwd() - os.chdir(local_path) - result = False - final_args = ["diff-index", "HEAD"] - try: - stdout = self._synchronous_call_git(final_args) - if stdout: - result = True - except GitFailed: - result = False - os.chdir(old_dir) - return result - - def detached_head(self, local_path: str) -> bool: - """Check for detached head state""" - old_dir = os.getcwd() - os.chdir(local_path) - result = False - final_args = ["rev-parse", "--abbrev-ref", "--symbolic-full-name", "HEAD"] - try: - stdout = self._synchronous_call_git(final_args) - if stdout == "HEAD": - result = True - except GitFailed: - result = False - os.chdir(old_dir) - return result - - def update(self, local_path): - """Fetches and pulls the local_path from its remote""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - self._synchronous_call_git(["fetch"]) - self._synchronous_call_git(["pull"]) - self._synchronous_call_git(["submodule", "update", "--init", "--recursive"]) - except GitFailed as e: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Basic Git update failed with the following message:", - ) - + str(e) - + "\n" - ) - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Backing up the original directory and re-cloning", - ) - + "...\n" - ) - remote = self.get_remote(local_path) - with open(os.path.join(local_path, "ADDON_DISABLED"), "w", encoding="utf-8") as f: - f.write( - "This is a backup of an addon that failed to update cleanly so " - "was re-cloned. It was disabled by the Addon Manager's git update " - "facility and can be safely deleted if the addon is working " - "properly." - ) - os.chdir("..") - os.rename(local_path, local_path + ".backup" + str(time.time())) - self.clone(remote, local_path) - os.chdir(old_dir) - - def status(self, local_path) -> str: - """Gets the v1 porcelain status""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - status = self._synchronous_call_git(["status", "-sb", "--porcelain"]) - except GitFailed as e: - os.chdir(old_dir) - raise e - - os.chdir(old_dir) - return status - - def reset(self, local_path, args: List[str] = None): - """Executes the git reset command""" - old_dir = os.getcwd() - os.chdir(local_path) - final_args = ["reset"] - if args: - final_args.extend(args) - try: - self._synchronous_call_git(final_args) - except GitFailed as e: - os.chdir(old_dir) - raise e - os.chdir(old_dir) - - def async_fetch_and_update(self, local_path, progress_monitor, args=None): - """Same as fetch_and_update, but asynchronous""" - - def update_available(self, local_path) -> bool: - """Returns True if an update is available from the remote, or false if not""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - self._synchronous_call_git(["fetch"]) - status = self._synchronous_call_git(["status", "-sb", "--porcelain"]) - except GitFailed as e: - os.chdir(old_dir) - raise e - os.chdir(old_dir) - return "behind" in status - - def current_tag(self, local_path) -> str: - """Get the name of the currently checked-out tag if HEAD is detached""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - tag = self._synchronous_call_git(["describe", "--tags"]).strip() - except GitFailed as e: - os.chdir(old_dir) - raise e - os.chdir(old_dir) - return tag - - def current_branch(self, local_path) -> str: - """Get the name of the current branch""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - # This only works with git 2.22 and later (June 2019) - # branch = self._synchronous_call_git(["branch", "--show-current"]).strip() - - # This is more universal (albeit more opaque to the reader): - branch = self._synchronous_call_git(["rev-parse", "--abbrev-ref", "HEAD"]).strip() - except GitFailed as e: - os.chdir(old_dir) - raise e - os.chdir(old_dir) - return branch - - def repair(self, remote, local_path): - """Assumes that local_path is supposed to be a local clone of the given - remote, and ensures that it is. Note that any local changes in local_path - will be destroyed. This is achieved by archiving the old path, cloning an - entirely new copy, and then deleting the old directory.""" - - original_cwd = os.getcwd() - - # Make sure we are not currently in that directory, otherwise on Windows the - # "rename" will fail. To guarantee we aren't in it, change to it, then shift - # up one. - os.chdir(local_path) - os.chdir("..") - backup_path = local_path + ".backup" + str(time.time()) - os.rename(local_path, backup_path) - try: - self.clone(remote, local_path) - except GitFailed as e: - fci.Console.PrintError( - translate("AddonsInstaller", "Failed to clone {} into {} using Git").format( - remote, local_path - ) - ) - os.chdir(original_cwd) - raise e - os.chdir(original_cwd) - shutil.rmtree(backup_path, ignore_errors=True) - - def get_remote(self, local_path) -> str: - """Get the repository that this local path is set to fetch from""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - response = self._synchronous_call_git(["remote", "-v", "show"]) - except GitFailed as e: - os.chdir(old_dir) - raise e - lines = response.split("\n") - result = "(unknown remote)" - for line in lines: - if line.endswith("(fetch)"): - # The line looks like: - # origin https://some/sort/of/path (fetch) - - segments = line.split() - if len(segments) == 3: - result = segments[1] - break - fci.Console.PrintWarning("Error parsing the results from git remote -v show:\n") - fci.Console.PrintWarning(line + "\n") - os.chdir(old_dir) - return result - - def get_branches(self, local_path) -> List[str]: - """Get a list of all available branches (local and remote)""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - stdout = self._synchronous_call_git(["branch", "-a", "--format=%(refname:lstrip=2)"]) - except GitFailed as e: - os.chdir(old_dir) - raise e - os.chdir(old_dir) - branches = [] - for branch in stdout.split("\n"): - branches.append(branch) - return branches - - def get_branches_with_info(self, local_path) -> List[Dict[str, str]]: - """Get a list of branches, where each entry is a dictionary with status information about - the branch.""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - stdout = self._synchronous_call_git(["branch", "-a", _ref_format_string()]) - return _parse_ref_table(stdout) - except GitFailed as e: - os.chdir(old_dir) - raise e - - def get_tags_with_info(self, local_path) -> List[Dict[str, str]]: - """Get a list of branches, where each entry is a dictionary with status information about - the branch.""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - stdout = self._synchronous_call_git(["tag", "-l", _ref_format_string()]) - return _parse_ref_table(stdout) - except GitFailed as e: - os.chdir(old_dir) - raise e - - def get_last_committers(self, local_path, n=10): - """Examine the last n entries of the commit history, and return a list of all - the committers, their email addresses, and how many commits each one is - responsible for. - """ - old_dir = os.getcwd() - os.chdir(local_path) - authors = self._synchronous_call_git(["log", f"-{n}", "--format=%cN"]).split("\n") - emails = self._synchronous_call_git(["log", f"-{n}", "--format=%cE"]).split("\n") - os.chdir(old_dir) - - result_dict = {} - for author, email in zip(authors, emails): - if not author or not email: - continue - if author not in result_dict: - result_dict[author] = {} - result_dict[author]["email"] = [email] - result_dict[author]["count"] = 1 - else: - if email not in result_dict[author]["email"]: - # Same author name, new email address -- treat it as the same - # person with a second email, instead of as a whole new person - result_dict[author]["email"].append(email) - result_dict[author]["count"] += 1 - return result_dict - - def get_last_authors(self, local_path, n=10): - """Examine the last n entries of the commit history, and return a list of all - the authors, their email addresses, and how many commits each one is - responsible for. - """ - old_dir = os.getcwd() - os.chdir(local_path) - authors = self._synchronous_call_git(["log", f"-{n}", "--format=%aN"]) - emails = self._synchronous_call_git(["log", f"-{n}", "--format=%aE"]) - os.chdir(old_dir) - - result_dict = {} - for author, email in zip(authors, emails): - if author not in result_dict: - result_dict[author]["email"] = [email] - result_dict[author]["count"] = 1 - else: - if email not in result_dict[author]["email"]: - # Same author name, new email address -- treat it as the same - # person with a second email, instead of as a whole new person - result_dict[author]["email"].append(email) - result_dict[author]["count"] += 1 - return result_dict - - def migrate_branch(self, local_path: str, old_branch: str, new_branch: str) -> None: - """Rename a branch (used when the remote branch name changed). Assumes that "origin" - exists.""" - old_dir = os.getcwd() - os.chdir(local_path) - try: - self._synchronous_call_git(["branch", "-m", old_branch, new_branch]) - self._synchronous_call_git(["fetch", "origin"]) - self._synchronous_call_git(["branch", "--unset-upstream"]) - self._synchronous_call_git(["branch", f"--set-upstream-to=origin/{new_branch}"]) - self._synchronous_call_git(["pull"]) - except GitFailed as e: - fci.Console.PrintWarning( - translate( - "AddonsInstaller", - "Git branch rename failed with the following message:", - ) - + str(e) - + "\n" - ) - os.chdir(old_dir) - raise e - os.chdir(old_dir) - - def _find_git(self): - # Find git. In preference order - # A) The value of the GitExecutable user preference - # B) The executable located in the same directory as FreeCAD and called "git" - # C) The result of a shutil search for your system's "git" executable - prefs = fci.ParamGet("User parameter:BaseApp/Preferences/Addons") - git_exe = prefs.GetString("GitExecutable", "Not set") - if not git_exe or git_exe == "Not set" or not os.path.exists(git_exe): - fc_dir = fci.DataPaths().home_dir - git_exe = os.path.join(fc_dir, "bin", "git") - if "Windows" in platform.system(): - git_exe += ".exe" - - if platform.system() == "Darwin" and not self._xcode_command_line_tools_are_installed(): - return - - if not git_exe or not os.path.exists(git_exe): - git_exe = shutil.which("git") - - if not git_exe or not os.path.exists(git_exe): - return - - prefs.SetString("GitExecutable", git_exe) - self.git_exe = git_exe - - def _xcode_command_line_tools_are_installed(self) -> bool: - """On Macs, there is *always* an executable called "git", but sometimes it's just a - script that tells the user to install XCode's Command Line tools. So the existence of git - on the Mac actually requires us to check for that installation.""" - try: - subprocess.check_output(["xcode-select", "-p"]) - return True - except subprocess.CalledProcessError: - return False - - def _synchronous_call_git(self, args: List[str]) -> str: - """Calls git and returns its output.""" - final_args = [self.git_exe] - final_args.extend(args) - - try: - proc = utils.run_interruptable_subprocess(final_args) - except subprocess.CalledProcessError as e: - raise GitFailed( - f"Git returned a non-zero exit status: {e.returncode}\n" - + f"Called with: {' '.join(final_args)}\n\n" - + f"Returned stderr:\n{e.stderr}" - ) from e - - return proc.stdout - - -def initialize_git() -> Optional[GitManager]: - """If git is enabled, locate the git executable if necessary and return a new - GitManager object. The executable location is saved in user preferences for reuse, - and git can be disabled by setting the disableGit parameter in the Addons - preference group. Returns None if for any of those reasons we aren't using git.""" - - git_manager = None - pref = fci.ParamGet("User parameter:BaseApp/Preferences/Addons") - disable_git = pref.GetBool("disableGit", False) - if not disable_git: - try: - git_manager = GitManager() - except NoGitFound: - pass - return git_manager diff --git a/src/Mod/AddonManager/addonmanager_installer.py b/src/Mod/AddonManager/addonmanager_installer.py deleted file mode 100644 index 059f0fc0c1..0000000000 --- a/src/Mod/AddonManager/addonmanager_installer.py +++ /dev/null @@ -1,579 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Contains the classes to manage Addon installation: intended as a stable API, safe for external -code to call and to rely upon existing. See classes AddonInstaller and MacroInstaller for details. -""" -import json -from datetime import datetime, timezone -from enum import IntEnum, auto -import os -import shutil -from typing import List, Optional -import tempfile -from urllib.parse import urlparse -import zipfile - -import FreeCAD - -from PySide import QtCore - -from Addon import Addon -import addonmanager_utilities as utils -from addonmanager_metadata import get_branch_from_metadata -from addonmanager_git import initialize_git, GitFailed - -if FreeCAD.GuiUp: - import NetworkManager # Requires an event loop - -translate = FreeCAD.Qt.translate - -# pylint: disable=too-few-public-methods - - -class InstallationMethod(IntEnum): - """For packages installed from a git repository, in most cases it is possible to either use git - or to download a zip archive of the addon. For a local repository, a direct copy may be used - instead. If "ANY" is given, the internal code decides which to use.""" - - GIT = auto() - COPY = auto() - ZIP = auto() - ANY = auto() - - -class AddonInstaller(QtCore.QObject): - """The core, non-GUI installer class. Usually instantiated and moved to its own thread, - otherwise it will block the GUI (if the GUI is running). In all cases in this class, the - generic Python 'object' is intended to be an Addon-like object that provides, at a minimum, - a 'name', 'url', and 'branch' attribute. The Addon manager uses the Addon class for this - purpose, but external code may use any other class that meets those criteria. - - Recommended Usage (when running with the GUI up, so you don't block the GUI thread): - - import functools # With the rest of your imports, for functools.partial - - ... - - addon_to_install = MyAddon() # Some class with name, url, and branch attributes - - self.worker_thread = QtCore.QThread() - self.installer = AddonInstaller(addon_to_install) - self.installer.moveToThread(self.worker_thread) - self.installer.success.connect(self.installation_succeeded) - self.installer.failure.connect(self.installation_failed) - self.installer.finished.connect(self.worker_thread.quit) - self.worker_thread.started.connect(self.installer.run) - self.worker_thread.start() # Returns immediately - - # On success, the connections above result in self.installation_succeeded being called, and - # on failure, self.installation_failed is called. - - - Recommended non-GUI usage (blocks until complete): - - addon_to_install = MyAddon() # Some class with name, url, and branch attributes - installer = AddonInstaller(addon_to_install) - installer.run() - - """ - - # Signal: progress_update - # In GUI mode this signal is emitted periodically during long downloads. The two integers are - # the number of bytes downloaded, and the number of bytes expected, respectively. Note that the - # number of bytes expected might be set to 0 to indicate an unknown download size. - progress_update = QtCore.Signal(int, int) - - # Signals: success and failure - # Emitted when the installation process is complete. The object emitted is the object that the - # installation was requested for (usually of class Addon, but any class that provides a name, - # url, and branch attribute can be used). - success = QtCore.Signal(object) - failure = QtCore.Signal(object, str) - - # Finished: regardless of the outcome, this is emitted when all work that is going to be done - # is done (i.e. whatever thread this is running in can quit). - finished = QtCore.Signal() - - allowed_packages = set() - - def __init__(self, addon: Addon, allow_list: List[str] = None): - """Initialize the installer with an optional list of addons. If provided, then installation - by name is supported, as long as the objects in the list contain a "name" and "url" - property. In most use cases it is expected that addons is a List of Addon objects, but that - is not a requirement. An optional allow_list lets calling code override the allowed Python - packages list with a custom list. It is mostly for unit testing purposes.""" - super().__init__() - self.addon_to_install = addon - - self.git_manager = initialize_git() - - if allow_list is not None: - AddonInstaller.allowed_packages = set(allow_list if allow_list is not None else []) - elif not AddonInstaller.allowed_packages: - AddonInstaller._load_local_allowed_packages_list() - AddonInstaller._update_allowed_packages_list() - - basedir = FreeCAD.getUserAppDataDir() - self.installation_path = os.path.join(basedir, "Mod") - self.macro_installation_path = FreeCAD.getUserMacroDir(True) - self.zip_download_index = None - - def run(self, install_method: InstallationMethod = InstallationMethod.ANY) -> bool: - """Install an addon. Returns True if the addon was installed, or False if not. Emits - either success or failure prior to returning.""" - try: - addon_url = self.addon_to_install.url.replace(os.path.sep, "/") - method_to_use = self._determine_install_method(addon_url, install_method) - success = False - if method_to_use == InstallationMethod.ZIP: - success = self._install_by_zip() - elif method_to_use == InstallationMethod.GIT: - success = self._install_by_git() - elif method_to_use == InstallationMethod.COPY: - success = self._install_by_copy() - if ( - hasattr(self.addon_to_install, "contains_workbench") - and self.addon_to_install.contains_workbench() - ): - self.addon_to_install.enable_workbench() - except utils.ProcessInterrupted: - pass - except Exception as e: - FreeCAD.Console.PrintLog(e + "\n") - success = False - if success: - if ( - hasattr(self.addon_to_install, "contains_workbench") - and self.addon_to_install.contains_workbench() - ): - self.addon_to_install.set_status(Addon.Status.PENDING_RESTART) - else: - self.addon_to_install.set_status(Addon.Status.NO_UPDATE_AVAILABLE) - self.finished.emit() - return success - - @classmethod - def _load_local_allowed_packages_list(cls) -> None: - """Read in the local allow-list, in case the remote one is unavailable.""" - cls.allowed_packages.clear() - allow_file = os.path.join(os.path.dirname(__file__), "ALLOWED_PYTHON_PACKAGES.txt") - if os.path.exists(allow_file): - with open(allow_file, encoding="utf8") as f: - lines = f.readlines() - for line in lines: - if line and len(line) > 0 and line[0] != "#": - cls.allowed_packages.add(line.strip().lower()) - - @classmethod - def _update_allowed_packages_list(cls) -> None: - """Get a new remote copy of the allowed packages list from GitHub.""" - FreeCAD.Console.PrintLog( - "Attempting to fetch remote copy of ALLOWED_PYTHON_PACKAGES.txt...\n" - ) - p = utils.blocking_get( - "https://raw.githubusercontent.com/" - "FreeCAD/FreeCAD-addons/master/ALLOWED_PYTHON_PACKAGES.txt" - ) - if p: - FreeCAD.Console.PrintLog( - "Overriding local ALLOWED_PYTHON_PACKAGES.txt with newer remote version\n" - ) - p = p.decode("utf8") - lines = p.split("\n") - cls.allowed_packages.clear() # Unset the locally-defined list - for line in lines: - if line and len(line) > 0 and line[0] != "#": - cls.allowed_packages.add(line.strip().lower()) - else: - FreeCAD.Console.PrintLog( - "Could not fetch remote ALLOWED_PYTHON_PACKAGES.txt, using local copy\n" - ) - - def _determine_install_method( - self, addon_url: str, install_method: InstallationMethod - ) -> Optional[InstallationMethod]: - """Given a URL and preferred installation method, determine the actual installation method - to use. Will return either None, if installation is not possible for the given url and - method, or a specific concrete method (GIT, ZIP, or COPY) based on the inputs.""" - - # If we don't have access to git, and that is the method selected, return early - if not self.git_manager and install_method == InstallationMethod.GIT: - return None - - parse_result = urlparse(addon_url) - is_git_only = parse_result.scheme in ["git", "ssh", "rsync"] - is_remote = parse_result.scheme in ["http", "https", "git", "ssh", "rsync"] - is_zipfile = parse_result.path.lower().endswith(".zip") - - # Can't use "copy" for a remote URL - if is_remote and install_method == InstallationMethod.COPY: - return None - - if is_git_only: - if ( - install_method in (InstallationMethod.GIT, InstallationMethod.ANY) - ) and self.git_manager: - # If it's a git-only URL, only git can be used for the installation - return InstallationMethod.GIT - # So if it's not a git installation, return None - return None - - if is_zipfile: - if install_method == InstallationMethod.GIT: - # Can't use git on zip files - return None - return InstallationMethod.ZIP # Copy just becomes zip - if not is_remote and install_method == InstallationMethod.ZIP: - return None # Can't use zip on local paths that aren't zip files - - # Whatever scheme was passed in appears to be reasonable, return it - if install_method != InstallationMethod.ANY: - return install_method - - # Prefer to copy, if it's local: - if not is_remote: - return InstallationMethod.COPY - - # Prefer git if we have git - if self.git_manager: - return InstallationMethod.GIT - - # Fall back to ZIP in other cases, though this relies on remote hosts falling - # into one of a few particular patterns - return InstallationMethod.ZIP - - def _install_by_copy(self) -> bool: - """Installs the specified url by copying directly from it into the installation - location. addon_url must be copyable using filesystem operations. Any existing files at - that location are overwritten.""" - addon_url = self.addon_to_install.url - if addon_url.startswith("file://"): - addon_url = addon_url[len("file://") :] # Strip off the file:// part - name = self.addon_to_install.name - shutil.copytree(addon_url, os.path.join(self.installation_path, name), dirs_exist_ok=True) - self._finalize_successful_installation() - return True - - def _can_use_update(self) -> bool: - addon = self.addon_to_install - install_path = os.path.join(self.installation_path, self.addon_to_install.name) - if not os.path.isdir(install_path): - return False - if addon.metadata is None or addon.installed_metadata is None: - return True # We can't check if the branch name changed, but the install path exists - old_branch = get_branch_from_metadata(self.addon_to_install.installed_metadata) - new_branch = get_branch_from_metadata(self.addon_to_install.metadata) - if old_branch != new_branch: - return False # Branch name changed, we have to re-clone - return True # Checkout exists, same branch as last time, update OK - - def _install_by_git(self) -> bool: - """Installs the specified url by using git to clone from it. The URL can be local or remote, - but must represent a git repository, and the url must be in a format that git can handle - (git, ssh, rsync, file, or a bare filesystem path).""" - install_path = os.path.join(self.installation_path, self.addon_to_install.name) - try: - if self._can_use_update(): - self.git_manager.update(install_path) - else: - if os.path.isdir(install_path): - utils.rmdir(install_path) - self.git_manager.clone(self.addon_to_install.url, install_path) - self.git_manager.checkout(install_path, self.addon_to_install.branch) - except GitFailed as e: - self.failure.emit(self.addon_to_install, str(e)) - return False - self._finalize_successful_installation() - return True - - def _install_by_zip(self) -> bool: - """Installs the specified url by downloading the file (if it is remote) and unzipping it - into the appropriate installation location. If the GUI is running the download is - asynchronous, and issues periodic updates about how much data has been downloaded.""" - if self.addon_to_install.url.endswith(".zip"): - zip_url = self.addon_to_install.url - else: - zip_url = utils.get_zip_url(self.addon_to_install) - - FreeCAD.Console.PrintLog(f"Downloading ZIP file from {zip_url}...\n") - parse_result = urlparse(zip_url) - is_remote = parse_result.scheme in ["http", "https"] - - if is_remote: - if FreeCAD.GuiUp: - self._run_zip_downloader_in_event_loop(zip_url) - else: - zip_data = utils.blocking_get(zip_url) - with tempfile.NamedTemporaryFile(delete=False) as f: - tempfile_name = f.name - f.write(zip_data) - self._finalize_zip_installation(tempfile_name) - else: - self._finalize_zip_installation(zip_url) - return True - - def _run_zip_downloader_in_event_loop(self, zip_url: str): - """Runs the zip downloader in a private event loop. This function does not exit until the - ZIP download is complete. It requires the GUI to be up, and should not be run on the main - GUI thread.""" - NetworkManager.AM_NETWORK_MANAGER.progress_made.connect(self._update_zip_status) - NetworkManager.AM_NETWORK_MANAGER.progress_complete.connect(self._finish_zip) - self.zip_download_index = NetworkManager.AM_NETWORK_MANAGER.submit_monitored_get(zip_url) - while self.zip_download_index is not None: - if QtCore.QThread.currentThread().isInterruptionRequested(): - break - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50) - - def _update_zip_status(self, index: int, bytes_read: int, data_size: int): - """Called periodically when downloading a zip file, emits a signal to display the - download progress.""" - if index == self.zip_download_index: - self.progress_update.emit(bytes_read, data_size) - - def _finish_zip(self, index: int, response_code: int, filename: os.PathLike): - """Once the zip download is finished, unzip it into the correct location. Only called if - the GUI is up, and the NetworkManager was responsible for the download. Do not call - directly.""" - if index != self.zip_download_index: - return - self.zip_download_index = None - if response_code != 200: - self.failure.emit( - self.addon_to_install, - translate("AddonsInstaller", "Received {} response code from server").format( - response_code - ), - ) - return - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - - FreeCAD.Console.PrintLog("ZIP download complete. Installing...\n") - self._finalize_zip_installation(filename) - - def _finalize_zip_installation(self, filename: os.PathLike): - """Given a path to a zipfile, extract that file and put its contents in the correct - location. Has special handling for GitHub's zip structure, which places the data in a - subdirectory of the main directory.""" - - destination = os.path.join(self.installation_path, self.addon_to_install.name) - if os.path.exists(destination): - remove_succeeded = utils.rmdir(destination) - if not remove_succeeded: - FreeCAD.Console.PrintError(f"Failed to remove {destination}, aborting update") - raise RuntimeError(f"Failed to remove outdated Addon from {destination}") - - with zipfile.ZipFile(filename, "r") as zfile: - zfile.extractall(destination) - - # GitHub (and possibly other hosts) put all files in the zip into a subdirectory named - # after the branch. If that is the setup that we just extracted, move all files out of - # that subdirectory. - if self._code_in_branch_subdirectory(destination): - actual_path = os.path.join( - destination, f"{self.addon_to_install.name}-{self.addon_to_install.branch}" - ) - FreeCAD.Console.PrintLog( - f"ZIP installation moving code from {actual_path} to {destination}" - ) - self._move_code_out_of_subdirectory(destination) - - FreeCAD.Console.PrintLog("ZIP installation complete.\n") - self._finalize_successful_installation() - - def _code_in_branch_subdirectory(self, destination: str) -> bool: - test_path = os.path.join(destination, self._expected_subdirectory_name()) - FreeCAD.Console.PrintLog(f"Checking for possible zip sub-path {test_path}...") - if os.path.isdir(test_path): - FreeCAD.Console.PrintLog(f"path exists.\n") - return True - FreeCAD.Console.PrintLog(f"path does not exist.\n") - return False - - def _expected_subdirectory_name(self) -> str: - url = self.addon_to_install.url - if url.endswith(".git"): - url = url[:-4] - _, _, name = url.rpartition("/") - branch = self.addon_to_install.branch - return f"{name}-{branch}" - - def _move_code_out_of_subdirectory(self, destination): - subdirectory = os.path.join(destination, self._expected_subdirectory_name()) - for extracted_filename in os.listdir(os.path.join(destination, subdirectory)): - shutil.move( - os.path.join(destination, subdirectory, extracted_filename), - os.path.join(destination, extracted_filename), - ) - os.rmdir(os.path.join(destination, subdirectory)) - - def _finalize_successful_installation(self): - """Perform any necessary additional steps after installing the addon.""" - self._update_metadata() - self._install_macros() - self.success.emit(self.addon_to_install) - - def _update_metadata(self): - """Loads the package metadata from the Addon's downloaded package.xml file.""" - package_xml = os.path.join( - self.installation_path, self.addon_to_install.name, "package.xml" - ) - - if hasattr(self.addon_to_install, "metadata") and os.path.isfile(package_xml): - self.addon_to_install.load_metadata_file(package_xml) - self.addon_to_install.installed_version = self.addon_to_install.metadata.version - self.addon_to_install.updated_timestamp = os.path.getmtime(package_xml) - - def _install_macros(self): - """For any workbenches, copy FCMacro files into the macro directory. Exclude packages that - have preference packs, otherwise we will litter the macro directory with the pre and post - scripts.""" - if ( - isinstance(self.addon_to_install, Addon) - and self.addon_to_install.contains_preference_pack() - ): - return - - if not os.path.exists(self.macro_installation_path): - os.makedirs(self.macro_installation_path) - - installed_macro_files = [] - for root, _, files in os.walk( - os.path.join(self.installation_path, self.addon_to_install.name) - ): - for f in files: - if f.lower().endswith(".fcmacro"): - src = os.path.join(root, f) - dst = os.path.join(self.macro_installation_path, f) - shutil.copy2(src, dst) - installed_macro_files.append(dst) - if installed_macro_files: - with open( - os.path.join( - self.installation_path, - self.addon_to_install.name, - "AM_INSTALLATION_DIGEST.txt", - ), - "a", - encoding="utf-8", - ) as f: - now = datetime.now(timezone.utc) - f.write( - "# The following files were created outside this installation " - f"path during the installation of this Addon on {now}:\n" - ) - for fcmacro_file in installed_macro_files: - f.write(fcmacro_file + "\n") - - @classmethod - def _validate_object(cls, addon: object): - """Make sure the object has the necessary attributes (name, url, and branch) to be - installed.""" - - if not hasattr(addon, "name") or not hasattr(addon, "url") or not hasattr(addon, "branch"): - raise RuntimeError( - "Provided object does not provide a name, url, and/or branch attribute" - ) - - -class MacroInstaller(QtCore.QObject): - """Install a macro.""" - - # Signals: success and failure - # Emitted when the installation process is complete. The object emitted is the object that the - # installation was requested for (usually of class Addon, but any class that provides a macro - # can be used). - success = QtCore.Signal(object) - failure = QtCore.Signal(object) - - # Finished: regardless of the outcome, this is emitted when all work that is going to be done - # is done (i.e. whatever thread this is running in can quit). - finished = QtCore.Signal() - - def __init__(self, addon: object): - """The provided addon object must have an attribute called "macro", and that attribute must - itself provide a callable "install" method that takes a single string, the path to the - installation location.""" - super().__init__() - self._validate_object(addon) - self.addon_to_install = addon - self.installation_path = FreeCAD.getUserMacroDir(True) - - def run(self) -> bool: - """Install a macro. Returns True if the macro was installed, or False if not. Emits - either success or failure prior to returning.""" - - # To try to ensure atomicity, perform the installation into a temp directory - macro = self.addon_to_install.macro - with tempfile.TemporaryDirectory() as temp_dir: - temp_install_succeeded, error_list = macro.install(temp_dir) - if not temp_install_succeeded: - FreeCAD.Console.PrintError( - translate("AddonsInstaller", "Failed to install macro {}").format(macro.name) - + "\n" - ) - for e in error_list: - FreeCAD.Console.PrintError(e + "\n") - self.failure.emit(self.addon_to_install, "\n".join(error_list)) - self.finished.emit() - return False - - # If it succeeded, move all the files to the macro install location, - # keeping a list of all the files we installed, so they can be removed later - # if this macro is uninstalled. - manifest = [] - for item in os.listdir(temp_dir): - src = os.path.join(temp_dir, item) - dst = os.path.join(self.installation_path, item) - shutil.move(src, dst) - manifest.append(dst) - self._write_installation_manifest(manifest) - self.success.emit(self.addon_to_install) - self.addon_to_install.set_status(Addon.Status.NO_UPDATE_AVAILABLE) - self.finished.emit() - return True - - def _write_installation_manifest(self, manifest): - manifest_file = os.path.join( - self.installation_path, self.addon_to_install.macro.filename + ".manifest" - ) - try: - with open(manifest_file, "w", encoding="utf-8") as f: - f.write(json.dumps(manifest, indent=" ")) - except OSError as e: - FreeCAD.Console.PrintWarning( - translate("AddonsInstaller", "Failed to create installation manifest " "file:\n") - ) - FreeCAD.Console.PrintWarning(manifest_file) - - @classmethod - def _validate_object(cls, addon: object): - """Make sure this object provides an attribute called "macro" with a method called - "install" """ - if ( - not hasattr(addon, "macro") - or addon.macro is None - or not hasattr(addon.macro, "install") - or not callable(addon.macro.install) - ): - raise RuntimeError("Provided object does not provide a macro with an install method") diff --git a/src/Mod/AddonManager/addonmanager_installer_gui.py b/src/Mod/AddonManager/addonmanager_installer_gui.py deleted file mode 100644 index c2139f4f05..0000000000 --- a/src/Mod/AddonManager/addonmanager_installer_gui.py +++ /dev/null @@ -1,815 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Classes to manage the GUI presentation of installing an Addon (e.g. the sequence of dialog boxes -that do dependency resolution, error handling, etc.). See AddonInstallerGUI and MacroInstallerGUI -classes for details.""" - -import os -import sys -from typing import List - -import FreeCAD -import FreeCADGui -from PySide import QtCore, QtWidgets - -from addonmanager_installer import AddonInstaller, MacroInstaller -from addonmanager_dependency_installer import DependencyInstaller -import addonmanager_utilities as utils -from Addon import Addon, MissingDependencies - -translate = FreeCAD.Qt.translate -from PySide.QtCore import QT_TRANSLATE_NOOP - -# pylint: disable=c-extension-no-member,too-few-public-methods,too-many-instance-attributes - - -class AddonInstallerGUI(QtCore.QObject): - """GUI functions (sequence of dialog boxes) for installing an addon interactively. The actual - installation is handled by the AddonInstaller class running in a separate QThread. An instance - of this AddonInstallerGUI class should NOT be run in a separate thread, but on the main GUI - thread. All dialogs are modal.""" - - # External classes are expected to "set and forget" this class, but in the event that some - # action must be taken if the addon is actually installed, this signal is provided. Note that - # this class already provides a "Successful installation" dialog, so external code need not - # do so. - success = QtCore.Signal(object) - - # Emitted once all work has been completed, regardless of success or failure - finished = QtCore.Signal() - - def __init__(self, addon: Addon, addons: List[Addon] = None): - super().__init__() - self.addon_to_install = addon - self.addons = [] if addons is None else addons - self.installer = AddonInstaller(addon) - self.dependency_installer = None - self.install_worker = None - self.dependency_dialog = None - self.dependency_worker_thread = None - self.dependency_installation_dialog = None - self.installing_dialog = None - self.worker_thread = None - - # Set up the installer connections - self.installer.success.connect(self._installation_succeeded) - self.installer.failure.connect(self._installation_failed) - - def __del__(self): - self._stop_thread(self.worker_thread) - self._stop_thread(self.dependency_worker_thread) - - @staticmethod - def _stop_thread(thread: QtCore.QThread): - if thread and hasattr(thread, "quit"): - if thread.isRunning(): - FreeCAD.Console.PrintMessage( - "INTERNAL ERROR: a QThread is still running when it should have finished" - ) - - thread.requestInterruption() - thread.wait(100) - thread.quit() - thread.wait(500) - if thread.isRunning(): - FreeCAD.Console.PrintError( - "INTERNAL ERROR: Thread did not quit() cleanly, using terminate()\n" - ) - thread.terminate() - - def run(self): - """Instructs this class to begin displaying the necessary dialogs to guide a user through - an Addon installation sequence. All dialogs are modal.""" - - # Dependency check - deps = MissingDependencies(self.addon_to_install, self.addons) - - # Python interpreter version check - stop_installation = self._check_python_version(deps) - if stop_installation: - self.finished.emit() - return - - # Required Python - if hasattr(deps, "python_requires") and deps.python_requires: - # Disallowed packages: - stop_installation = self._handle_disallowed_python(deps.python_requires) - if stop_installation: - self.finished.emit() - return - # Allowed but uninstalled is handled below - - # Remove any disallowed packages from the optional list - if hasattr(deps, "python_optional") and deps.python_optional: - self._clean_up_optional(deps) - - # Missing FreeCAD workbenches - if hasattr(deps, "wbs") and deps.wbs: - stop_installation = self._report_missing_workbenches(deps.wbs) - if stop_installation: - self.finished.emit() - return - - # If we have any missing dependencies, display a dialog to the user asking if they want to - # install them. - if deps.external_addons or deps.python_requires or deps.python_optional: - # Recoverable: ask the user if they want to install the missing deps, do so, then - # proceed with the installation - self._resolve_dependencies_then_install(deps) - else: - # No missing deps, just install - self.install() - - def _handle_disallowed_python(self, python_requires: List[str]) -> bool: - """Determine if we are missing any required Python packages that are not in the allowed - packages list. If so, display a message to the user, and return True. Otherwise return - False.""" - - bad_packages = [] - for dep in python_requires: - if dep.lower() not in AddonInstaller.allowed_packages: - bad_packages.append(dep) - - for dep in bad_packages: - python_requires.remove(dep) - - if bad_packages: - # pylint: disable=line-too-long - message = ( - "

" - + translate( - "AddonsInstaller", - "This addon requires Python packages that are not installed, and cannot be installed automatically. To use this addon you must install the following Python packages manually:", - ) - + "

    " - ) - if len(bad_packages) < 15: - for dep in bad_packages: - message += f"
  • {dep}
  • " - else: - message += "
  • (" + translate("AddonsInstaller", "Too many to list") + ")
  • " - message += "
" - message += "To ignore this error and install anyway, press OK." - r = QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Missing Requirement"), - message, - QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, - ) - - if r == QtWidgets.QMessageBox.Ok: - # Force the installation to proceed - return False - return True - return False - - def _report_missing_workbenches(self, wbs) -> bool: - """If there are missing workbenches, display a dialog informing the user. Returns True to - stop the installation, or False to proceed.""" - addon_name = self.addon_to_install.name - if len(wbs) == 1: - name = wbs[0] - message = translate( - "AddonsInstaller", - "Addon '{}' requires '{}', which is not available in your copy of FreeCAD.", - ).format(addon_name, name) - else: - # pylint: disable=line-too-long - message = ( - "

" - + translate( - "AddonsInstaller", - "Addon '{}' requires the following workbenches, which are not available in your copy of FreeCAD:", - ).format(addon_name) - + "

    " - ) - for wb in wbs: - message += "
  • " + wb + "
  • " - message += "
" - message += translate("AddonsInstaller", "Press OK to install anyway.") - r = QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Missing Requirement"), - message, - QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, - ) - return r == QtWidgets.QMessageBox.Cancel - - def _resolve_dependencies_then_install(self, missing) -> None: - """Ask the user how they want to handle dependencies, do that, then install.""" - self.dependency_dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "dependency_resolution_dialog.ui") - ) - - for addon in missing.external_addons: - self.dependency_dialog.listWidgetAddons.addItem(addon) - for mod in missing.python_requires: - self.dependency_dialog.listWidgetPythonRequired.addItem(mod) - for mod in missing.python_optional: - item = QtWidgets.QListWidgetItem(mod) - item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) - item.setCheckState(QtCore.Qt.Unchecked) - self.dependency_dialog.listWidgetPythonOptional.addItem(item) - - self.dependency_dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Yes).clicked.connect( - self._dependency_dialog_yes_clicked - ) - self.dependency_dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Ignore).clicked.connect( - self._dependency_dialog_ignore_clicked - ) - self.dependency_dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel).setDefault(True) - self.dependency_dialog.exec() - - def _check_python_version(self, missing: MissingDependencies) -> bool: - """Make sure we have a compatible Python version. Returns True to stop the installation - or False to continue.""" - - # For now only look at the minor version, since major is always Python 3 - minor_required = missing.python_min_version["minor"] - if sys.version_info.minor < minor_required: - # pylint: disable=line-too-long - QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Incompatible Python version"), - translate( - "AddonsInstaller", - "This Addon (or one of its dependencies) requires Python {}.{}, and your system is running {}.{}. Installation cancelled.", - ).format( - missing.python_min_version["major"], - missing.python_min_version["minor"], - sys.version_info.major, - sys.version_info.minor, - ), - QtWidgets.QMessageBox.Cancel, - ) - return True - return False - - def _clean_up_optional(self, missing: MissingDependencies): - good_packages = [] - for dep in missing.python_optional: - if dep in self.installer.allowed_packages: - good_packages.append(dep) - else: - FreeCAD.Console.PrintWarning( - translate( - "AddonsInstaller", - "Optional dependency on {} ignored because it is not in the allow-list", - ).format(dep) - + "\n" - ) - missing.python_optional = good_packages - - def _dependency_dialog_yes_clicked(self) -> None: - # Get the lists out of the dialog: - addons = [] - for row in range(self.dependency_dialog.listWidgetAddons.count()): - item = self.dependency_dialog.listWidgetAddons.item(row) - name = item.text() - for repo in self.addons: - if repo.name == name or ( - hasattr(repo, "display_name") and repo.display_name == name - ): - addons.append(repo) - - python_requires = [] - for row in range(self.dependency_dialog.listWidgetPythonRequired.count()): - item = self.dependency_dialog.listWidgetPythonRequired.item(row) - python_requires.append(item.text()) - - python_optional = [] - for row in range(self.dependency_dialog.listWidgetPythonOptional.count()): - item = self.dependency_dialog.listWidgetPythonOptional.item(row) - if item.checkState() == QtCore.Qt.Checked: - python_optional.append(item.text()) - - self._run_dependency_installer(addons, python_requires, python_optional) - - def _run_dependency_installer(self, addons, python_requires, python_optional): - """Run the dependency installer (in a separate thread) for the given dependencies""" - self.dependency_installer = DependencyInstaller(addons, python_requires, python_optional) - self.dependency_installer.no_python_exe.connect(self._report_no_python_exe) - self.dependency_installer.no_pip.connect(self._report_no_pip) - self.dependency_installer.failure.connect(self._report_dependency_failure) - self.dependency_installer.finished.connect(self._dependencies_finished) - - self.dependency_worker_thread = QtCore.QThread(self) - self.dependency_installer.moveToThread(self.dependency_worker_thread) - self.dependency_worker_thread.started.connect(self.dependency_installer.run) - - self.dependency_installation_dialog = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.Information, - translate("AddonsInstaller", "Installing dependencies"), - translate("AddonsInstaller", "Installing dependencies") + "...", - QtWidgets.QMessageBox.Cancel, - parent=utils.get_main_am_window(), - ) - self.dependency_installation_dialog.rejected.connect(self._cancel_dependency_installation) - self.dependency_installation_dialog.show() - self.dependency_worker_thread.start() - - def _report_no_python_exe(self) -> None: - """Callback for the dependency installer failing to locate a Python executable.""" - if self.dependency_installation_dialog is not None: - self.dependency_installation_dialog.hide() - # pylint: disable=line-too-long - result = QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Cannot execute Python"), - translate( - "AddonsInstaller", - "Failed to automatically locate your Python executable, or the path is set incorrectly. Please check the Addon Manager preferences setting for the path to Python.", - ) - + "\n\n" - + translate( - "AddonsInstaller", - "Dependencies could not be installed. Continue with installation of {} anyway?", - ).format(self.addon_to_install.name), - QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, - ) - if result == QtWidgets.QMessageBox.Yes: - self.install() - else: - self.finished.emit() - - def _report_no_pip(self, command: str) -> None: - """Callback for the dependency installer failing to access pip.""" - if self.dependency_installation_dialog is not None: - self.dependency_installation_dialog.hide() - # pylint: disable=line-too-long - result = QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Cannot execute pip"), - translate( - "AddonsInstaller", - "Failed to execute pip, which may be missing from your Python installation. Please ensure your system " - "has pip installed and try again. The failed command was:", - ) - + f" \n\n{command}\n\n" - + translate( - "AddonsInstaller", - "Continue with installation of {} anyway?", - ).format(self.addon_to_install.name), - QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, - ) - if result == QtWidgets.QMessageBox.Yes: - self.install() - else: - self.finished.emit() - - def _report_dependency_failure(self, short_message: str, details: str) -> None: - """Callback for dependency installation failure.""" - if self.dependency_installation_dialog is not None: - self.dependency_installation_dialog.hide() - if self.dependency_installer and hasattr(self.dependency_installer, "finished"): - self.dependency_installer.finished.disconnect(self._report_dependency_success) - FreeCAD.Console.PrintError(details + "\n") - result = QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Package installation failed"), - short_message - + "\n\n" - + translate("AddonsInstaller", "See Report View for detailed failure log.") - + "\n\n" - + translate( - "AddonsInstaller", - "Continue with installation of {} anyway?", - ).format(self.addon_to_install.name), - QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, - ) - if result == QtWidgets.QMessageBox.Yes: - self.install() - else: - self.finished.emit() - - def _report_dependency_success(self): - """Callback for dependency installation success.""" - if self.dependency_installation_dialog is not None: - self.dependency_installation_dialog.hide() - self.install() - - def _dependencies_finished(self, success: bool): - if success: - self._report_dependency_success() - self.dependency_worker_thread.quit() - - def _dependency_dialog_ignore_clicked(self) -> None: - """Callback for when dependencies are ignored.""" - self.install() - - def _cancel_dependency_installation(self) -> None: - """Cancel was clicked in the dialog. NOTE: Does no cleanup, the state after cancellation is - unknown. In most cases pip can recover from whatever we've done to it.""" - self.dependency_worker_thread.blockSignals(True) - self.dependency_installer.blockSignals(True) - self.dependency_worker_thread.requestInterruption() - self.dependency_installation_dialog.hide() - self.dependency_worker_thread.wait() - self.finished.emit() - - def install(self) -> None: - """Installs or updates a workbench, macro, or package""" - self.worker_thread = QtCore.QThread() - self.installer.moveToThread(self.worker_thread) - self.installer.finished.connect(self.worker_thread.quit) - self.worker_thread.started.connect(self.installer.run) - - self.installing_dialog = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.NoIcon, - translate("AddonsInstaller", "Installing Addon"), - translate("AddonsInstaller", "Installing FreeCAD Addon '{}'").format( - self.addon_to_install.display_name - ), - QtWidgets.QMessageBox.Cancel, - parent=utils.get_main_am_window(), - ) - self.installing_dialog.rejected.connect(self._cancel_addon_installation) - self.installer.finished.connect(self.installing_dialog.hide) - self.installing_dialog.show() - self.worker_thread.start() # Returns immediately - - def _cancel_addon_installation(self): - dlg = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.NoIcon, - translate("AddonsInstaller", "Cancelling"), - translate("AddonsInstaller", "Cancelling installation of '{}'").format( - self.addon_to_install.display_name - ), - QtWidgets.QMessageBox.NoButton, - parent=utils.get_main_am_window(), - ) - dlg.show() - if self.worker_thread.isRunning(): - # Interruption can take a second or more, depending on what was being done. Make sure - # we stay responsive and update the dialog with the text above, etc. - self.worker_thread.requestInterruption() - self.worker_thread.quit() - while self.worker_thread.isRunning(): - self.worker_thread.wait(50) - QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents) - path = os.path.join(self.installer.installation_path, self.addon_to_install.name) - if os.path.exists(path): - utils.rmdir(path) - dlg.hide() - self.finished.emit() - - def _installation_succeeded(self): - """Called if the installation was successful.""" - QtWidgets.QMessageBox.information( - utils.get_main_am_window(), - translate("AddonsInstaller", "Success"), - translate("AddonsInstaller", "{} was installed successfully").format( - self.addon_to_install.name - ), - QtWidgets.QMessageBox.Ok, - ) - self.success.emit(self.addon_to_install) - self.finished.emit() - - def _installation_failed(self, addon, message): - """Called if the installation failed.""" - QtWidgets.QMessageBox.critical( - utils.get_main_am_window(), - translate("AddonsInstaller", "Installation Failed"), - translate("AddonsInstaller", "Failed to install {}").format(addon.name) - + "\n" - + message, - QtWidgets.QMessageBox.Cancel, - ) - self.finished.emit() - - -class MacroInstallerGUI(QtCore.QObject): - """Install a macro, providing feedback about the process via dialog boxes, and then offer to - add the macro to a custom toolbar. Should be run on the main GUI thread: this class internally - launches a QThread for the actual installation process.""" - - # Only success should matter to external code: all user interaction is handled via this class - success = QtCore.Signal(object) - - # Emitted once all work has been completed, regardless of success or failure - finished = QtCore.Signal() - - def __init__(self, addon: object): - """The provided addon object must have an attribute called "macro", and that attribute must - itself provide a callable "install" method that takes a single string, the path to the - installation location.""" - super().__init__() - self.addon_to_install = addon - self.worker_thread = None - self.installer = MacroInstaller(self.addon_to_install) - self.addon_params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") - self.toolbar_params = FreeCAD.ParamGet("User parameter:BaseApp/Workbench/Global/Toolbar") - self.macro_dir = FreeCAD.getUserMacroDir(True) - - def __del__(self): - if self.worker_thread and hasattr(self.worker_thread, "quit"): - self.worker_thread.quit() - self.worker_thread.wait(500) - if self.worker_thread.isRunning(): - FreeCAD.Console.PrintError( - "INTERNAL ERROR: Thread did not quit() cleanly, using terminate()\n" - ) - self.worker_thread.terminate() - - def run(self): - """Perform the installation, including any necessary user interaction via modal dialog - boxes. If installation proceeds successfully to completion, emits the success() signal.""" - - self.worker_thread = QtCore.QThread() - self.installer.moveToThread(self.worker_thread) - self.installer.finished.connect(self.worker_thread.quit) - self.installer.success.connect(self._base_installation_success) - self.worker_thread.started.connect(self.installer.run) - self.worker_thread.start() # Returns immediately - - def _base_installation_success(self): - """Callback for a successful basic macro installation.""" - self.success.emit(self.addon_to_install) - self._ask_to_install_toolbar_button() # Synchronous set of modals - self.finished.emit() - - def _ask_to_install_toolbar_button(self) -> None: - """Presents a dialog to the user asking if they want to install a toolbar button for - a particular macro, and walks through that process if they agree to do so.""" - do_not_show_dialog = self.addon_params.GetBool("dontShowAddMacroButtonDialog", False) - button_exists = self._macro_button_exists() - if not do_not_show_dialog and not button_exists: - add_toolbar_button_dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "add_toolbar_button_dialog.ui") - ) - add_toolbar_button_dialog.buttonYes.clicked.connect(self._install_toolbar_button) - add_toolbar_button_dialog.buttonNever.clicked.connect( - lambda: self.addon_params.SetBool("dontShowAddMacroButtonDialog", True) - ) - add_toolbar_button_dialog.exec() - - def _find_custom_command(self, filename): - """Wrap calls to FreeCADGui.Command.findCustomCommand so it can be faked in testing.""" - return FreeCADGui.Command.findCustomCommand(filename) - - def _macro_button_exists(self) -> bool: - """Returns True if a button already exists for this macro, or False if not.""" - command = self._find_custom_command(self.addon_to_install.macro.filename) - if not command: - return False - toolbar_groups = self.toolbar_params.GetGroups() - for group in toolbar_groups: - toolbar = self.toolbar_params.GetGroup(group) - if toolbar.GetString(command, "*") != "*": - return True - return False - - def _ask_for_toolbar(self, custom_toolbars) -> object: - """Determine what toolbar to add the icon to. The first time it is called it prompts the - user to select or create a toolbar. After that, the prompt is optional and can be configured - via a preference. Returns the pref group for the new toolbar.""" - - # In this one spot, default True: if this is the first time we got to - # this chunk of code, we are always going to ask. - ask = self.addon_params.GetBool("alwaysAskForToolbar", True) - - if ask: - select_toolbar_dialog = FreeCADGui.PySideUic.loadUi( - os.path.join(os.path.dirname(__file__), "select_toolbar_dialog.ui") - ) - - select_toolbar_dialog.comboBox.clear() - - for group in custom_toolbars: - ref = self.toolbar_params.GetGroup(group) - name = ref.GetString("Name", "") - if name: - select_toolbar_dialog.comboBox.addItem(name) - else: - FreeCAD.Console.PrintWarning( - f"Custom toolbar {group} does not have a Name element\n" - ) - new_menubar_option_text = translate("AddonsInstaller", "Create new toolbar") - select_toolbar_dialog.comboBox.addItem(new_menubar_option_text) - - result = select_toolbar_dialog.exec() - if result == QtWidgets.QDialog.Accepted: - selection = select_toolbar_dialog.comboBox.currentText() - if select_toolbar_dialog.checkBox.checkState() == QtCore.Qt.Unchecked: - self.addon_params.SetBool("alwaysAskForToolbar", False) - else: - self.addon_params.SetBool("alwaysAskForToolbar", True) - if selection == new_menubar_option_text: - return self._create_new_custom_toolbar() - return self._get_toolbar_with_name(selection) - return None - - # If none of the above code returned... - custom_toolbar_name = self.addon_params.GetString( - "CustomToolbarName", "Auto-Created Macro Toolbar" - ) - toolbar = self._get_toolbar_with_name(custom_toolbar_name) - if not toolbar: - # They told us not to ask, but then the toolbar got deleted... ask anyway! - ask = self.addon_params.RemBool("alwaysAskForToolbar") - return self._ask_for_toolbar(custom_toolbars) - return toolbar - - def _get_toolbar_with_name(self, name: str) -> object: - """Try to find a toolbar with a given name. Returns the preference group for the toolbar - if found, or None if it does not exist.""" - custom_toolbars = self.toolbar_params.GetGroups() - for toolbar in custom_toolbars: - group = self.toolbar_params.GetGroup(toolbar) - group_name = group.GetString("Name", "") - if group_name == name: - return group - return None - - def _create_new_custom_toolbar(self) -> object: - """Create a new custom toolbar and returns its preference group.""" - - # We need two names: the name of the auto-created toolbar, as it will be displayed to the - # user in various menus, and the underlying name of the toolbar group. Both must be - # unique. - - # First, the displayed name - custom_toolbar_name = QT_TRANSLATE_NOOP("Workbench", "Auto-Created Macro Toolbar") - custom_toolbars = self.toolbar_params.GetGroups() - name_taken = self._check_for_toolbar(custom_toolbar_name) - if name_taken: - i = 2 # Don't use (1), start at (2) - while True: - test_name = custom_toolbar_name + f" ({i})" - if not self._check_for_toolbar(test_name): - custom_toolbar_name = test_name - break - i = i + 1 - - # Second, the toolbar preference group name - i = 1 - while True: - new_group_name = "Custom_" + str(i) - if new_group_name not in custom_toolbars: - break - i = i + 1 - - custom_toolbar = self.toolbar_params.GetGroup(new_group_name) - custom_toolbar.SetString("Name", custom_toolbar_name) - custom_toolbar.SetBool("Active", True) - return custom_toolbar - - def _check_for_toolbar(self, toolbar_name: str) -> bool: - """Returns True if the toolbar exists, otherwise False""" - return self._get_toolbar_with_name(toolbar_name) is not None - - def _install_toolbar_button(self) -> None: - """If the user has requested a toolbar button be installed, this function is called - to continue the process and request any additional required information.""" - custom_toolbar_name = self.addon_params.GetString( - "CustomToolbarName", "Auto-Created Macro Toolbar" - ) - - # Default to false here: if the variable hasn't been set, we don't assume - # that we have to ask, because the simplest is to just create a new toolbar - # and never ask at all. - ask = self.addon_params.GetBool("alwaysAskForToolbar", False) - - # See if there is already a custom toolbar for macros: - top_group = self.toolbar_params - custom_toolbars = top_group.GetGroups() - if custom_toolbars: - # If there are already custom toolbars, see if one of them is the one we used last time - found_toolbar = False - for toolbar_name in custom_toolbars: - test_toolbar = self.toolbar_params.GetGroup(toolbar_name) - name = test_toolbar.GetString("Name", "") - if name == custom_toolbar_name: - custom_toolbar = test_toolbar - found_toolbar = True - break - if ask or not found_toolbar: - # We have to ask the user what to do... - custom_toolbar = self._ask_for_toolbar(custom_toolbars) - if custom_toolbar: - custom_toolbar_name = custom_toolbar.GetString("Name") - self.addon_params.SetString("CustomToolbarName", custom_toolbar_name) - else: - # Create a custom toolbar - custom_toolbar = self.toolbar_params.GetGroup("Custom_1") - custom_toolbar.SetString("Name", custom_toolbar_name) - custom_toolbar.SetBool("Active", True) - - if custom_toolbar: - self._install_macro_to_toolbar(custom_toolbar) - else: - FreeCAD.Console.PrintMessage("In the end, no custom toolbar was set, bailing out\n") - - def _install_macro_to_toolbar(self, toolbar: object) -> None: - """Adds an icon for the given macro to the given toolbar.""" - menuText = self.addon_to_install.display_name - tooltipText = f"{self.addon_to_install.display_name}" - if self.addon_to_install.macro.comment: - tooltipText += f"

{self.addon_to_install.macro.comment}

" - whatsThisText = self.addon_to_install.macro.comment - else: - whatsThisText = translate( - "AddonsInstaller", "A macro installed with the FreeCAD Addon Manager" - ) - statustipText = ( - translate("AddonsInstaller", "Run", "Indicates a macro that can be 'run'") - + " " - + self.addon_to_install.display_name - ) - if self.addon_to_install.macro.icon: - if os.path.isabs(self.addon_to_install.macro.icon): - pixmapText = os.path.normpath(self.addon_to_install.macro.icon) - else: - pixmapText = os.path.normpath( - os.path.join(self.macro_dir, self.addon_to_install.macro.icon) - ) - elif self.addon_to_install.macro.xpm: - icon_file = os.path.normpath( - os.path.join(self.macro_dir, self.addon_to_install.macro.name + "_icon.xpm") - ) - with open(icon_file, "w", encoding="utf-8") as f: - f.write(self.addon_to_install.macro.xpm) - pixmapText = icon_file - else: - pixmapText = None - - # Add this command to that toolbar - self._create_custom_command( - toolbar, - self.addon_to_install.macro.filename, - menuText, - tooltipText, - whatsThisText, - statustipText, - pixmapText, - ) - - # pylint: disable=too-many-arguments - def _create_custom_command( - self, - toolbar, - filename, - menuText, - tooltipText, - whatsThisText, - statustipText, - pixmapText, - ): - """Wrap createCustomCommand so it can be overridden during testing.""" - # Add this command to that toolbar - command_name = FreeCADGui.Command.createCustomCommand( - filename, - menuText, - tooltipText, - whatsThisText, - statustipText, - pixmapText, - ) - toolbar.SetString(command_name, "FreeCAD") - - # Force the toolbars to be recreated - wb = FreeCADGui.activeWorkbench() - wb.reloadActive() - - def _remove_custom_toolbar_button(self) -> None: - """If this repo contains a macro, look through the custom commands and - see if one is set up for this macro. If so, remove it, including any - toolbar entries.""" - - command = FreeCADGui.Command.findCustomCommand(self.addon_to_install.macro.filename) - if not command: - return - custom_toolbars = FreeCAD.ParamGet("User parameter:BaseApp/Workbench/Global/Toolbar") - toolbar_groups = custom_toolbars.GetGroups() - for group in toolbar_groups: - toolbar = custom_toolbars.GetGroup(group) - if toolbar.GetString(command, "*") != "*": - toolbar.RemString(command) - - FreeCADGui.Command.removeCustomCommand(command) - - # Force the toolbars to be recreated - wb = FreeCADGui.activeWorkbench() - wb.reloadActive() diff --git a/src/Mod/AddonManager/addonmanager_licenses.py b/src/Mod/AddonManager/addonmanager_licenses.py deleted file mode 100644 index 46af254959..0000000000 --- a/src/Mod/AddonManager/addonmanager_licenses.py +++ /dev/null @@ -1,187 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2024 FreeCAD Project Association * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Utilities for working with licenses. Based on SPDX info downloaded from -https://github.com/spdx/license-list-data and stored as part of the FreeCAD repo, loaded into a Qt -resource.""" - -import json - -# Get whatever version of PySide we can -try: - import PySide # Use the FreeCAD wrapper -except ImportError: - try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 - except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 - -from PySide import QtCore - -import addonmanager_freecad_interface as fci - - -class SPDXLicenseManager: - """A class that loads a list of licenses from an internal Qt resource and provides access to - some information about those licenses.""" - - def __init__(self): - self.license_data = {} - self._load_license_data() - - def _load_license_data(self): - qf = QtCore.QFile(f":/licenses/spdx.json") - if qf.exists(): - qf.open(QtCore.QIODevice.ReadOnly) - byte_data = qf.readAll() - qf.close() - - string_data = str(byte_data, encoding="utf-8") - raw_license_data = json.loads(string_data) - - self._process_raw_spdx_json(raw_license_data) - - def _process_raw_spdx_json(self, raw_license_data: dict): - """The raw JSON data is a list of licenses, with the ID as an element of the contained - data members. More useful for our purposes is a dictionary with the SPDX IDs as the keys - and the remaining data as the values.""" - for entry in raw_license_data["licenses"]: - self.license_data[entry["licenseId"]] = entry - - def is_osi_approved(self, spdx_id: str) -> bool: - """Check to see if the license is OSI-approved, according to the SPDX database. Returns - False if the license is not in the database, or is not marked as "isOsiApproved".""" - if spdx_id == "UNLICENSED" or spdx_id == "UNLICENCED" or spdx_id.startswith("SEE LIC"): - return False - if spdx_id not in self.license_data: - fci.Console.PrintWarning( - f"WARNING: License ID {spdx_id} is not in the SPDX license " - f"list. The Addon author must correct their metadata.\n" - ) - return False - return ( - "isOsiApproved" in self.license_data[spdx_id] - and self.license_data[spdx_id]["isOsiApproved"] - ) - - def is_fsf_libre(self, spdx_id: str) -> bool: - """Check to see if the license is FSF Free/Libre, according to the SPDX database. Returns - False if the license is not in the database, or is not marked as "isFsfLibre".""" - if spdx_id == "UNLICENSED" or spdx_id == "UNLICENCED" or spdx_id.startswith("SEE LIC"): - return False - if spdx_id not in self.license_data: - fci.Console.PrintWarning( - f"WARNING: License ID {spdx_id} is not in the SPDX license " - f"list. The Addon author must correct their metadata.\n" - ) - return False - return ( - "isFsfLibre" in self.license_data[spdx_id] and self.license_data[spdx_id]["isFsfLibre"] - ) - - def name(self, spdx_id: str) -> str: - if spdx_id == "UNLICENSED": - return "All rights reserved" - if spdx_id.startswith("SEE LIC"): # "SEE LICENSE IN" or "SEE LICENCE IN" - return f"Custom license: {spdx_id}" - if spdx_id not in self.license_data: - return "" - return self.license_data[spdx_id]["name"] - - def url(self, spdx_id: str) -> str: - if spdx_id not in self.license_data: - return "" - return self.license_data[spdx_id]["reference"] - - def details_json_url(self, spdx_id: str): - """The "detailsUrl" entry in the SPDX database, which is a link to a JSON file containing - the details of the license. As of SPDX v3 the fields are: - * isDeprecatedLicenseId - * isFsfLibre - * licenseText - * standardLicenseHeaderTemplate - * standardLicenseTemplate - * name - * licenseId - * standardLicenseHeader - * crossRef - * seeAlso - * isOsiApproved - * licenseTextHtml - * standardLicenseHeaderHtml""" - if spdx_id not in self.license_data: - return "" - return self.license_data[spdx_id]["detailsUrl"] - - def normalize(self, license_string: str) -> str: - """Given a potentially non-compliant license string, attempt to normalize it to match an - SPDX record. Takes a conservative view and tries not to over-expand stated rights (e.g. - it will select 'GPL-3.0-only' rather than 'GPL-3.0-or-later' when given just GPL3).""" - if self.name(license_string): - return license_string - fci.Console.PrintLog( - f"Attempting to normalize non-compliant license '" f"{license_string}'... " - ) - normed = license_string.replace("lgpl", "LGPL").replace("gpl", "GPL") - normed = ( - normed.replace(" ", "-") - .replace("v", "-") - .replace("GPL2", "GPL-2") - .replace("GPL3", "GPL-3") - ) - or_later = "" - if normed.endswith("+"): - normed = normed[:-1] - or_later = "-or-later" - if self.name(normed + or_later): - fci.Console.PrintLog(f"found valid SPDX license ID {normed}\n") - return normed + or_later - # If it still doesn't match, try some other things - while "--" in normed: - normed = normed.replace("--", "-") - - if self.name(normed + or_later): - fci.Console.PrintLog(f"found valid SPDX license ID {normed}\n") - return normed + or_later - normed += ".0" - if self.name(normed + or_later): - fci.Console.PrintLog(f"found valid SPDX license ID {normed}\n") - return normed + or_later - fci.Console.PrintLog(f"failed to normalize (typo in ID or invalid version number??)\n") - return license_string # We failed to normalize this one - - -_LICENSE_MANAGER = None # Internal use only, see get_license_manager() - - -def get_license_manager() -> SPDXLicenseManager: - """Get the license manager. Prevents multiple re-loads of the license list by keeping a - single copy of the manager.""" - global _LICENSE_MANAGER - if _LICENSE_MANAGER is None: - _LICENSE_MANAGER = SPDXLicenseManager() - return _LICENSE_MANAGER diff --git a/src/Mod/AddonManager/addonmanager_macro.py b/src/Mod/AddonManager/addonmanager_macro.py deleted file mode 100644 index 9858076f9c..0000000000 --- a/src/Mod/AddonManager/addonmanager_macro.py +++ /dev/null @@ -1,439 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -# *************************************************************************** -# * * -# * Copyright (c) 2022-2023 FreeCAD Project Association * -# * Copyright (c) 2018 Gaël Écorchard * -# * * -# * This file is part of FreeCAD. * -# * * -# * FreeCAD is free software: you can redistribute it and/or modify it * -# * under the terms of the GNU Lesser General Public License as * -# * published by the Free Software Foundation, either version 2.1 of the * -# * License, or (at your option) any later version. * -# * * -# * FreeCAD is distributed in the hope that it will be useful, but * -# * WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * -# * Lesser General Public License for more details. * -# * * -# * You should have received a copy of the GNU Lesser General Public * -# * License along with FreeCAD. If not, see * -# * . * -# * * -# *************************************************************************** - -"""Unified handler for FreeCAD macros that can be obtained from different sources.""" - -import os -import re -import io -import codecs -import shutil -from html import unescape -from typing import Dict, Tuple, List, Union, Optional -import urllib.parse - -from addonmanager_macro_parser import MacroParser -import addonmanager_utilities as utils - -import addonmanager_freecad_interface as fci - -translate = fci.translate - - -# @package AddonManager_macro -# \ingroup ADDONMANAGER -# \brief Unified handler for FreeCAD macros that can be obtained from -# different sources -# @{ - - -class Macro: - """This class provides a unified way to handle macros coming from different - sources""" - - # Use a stored class variable for this so that we can override it during testing - blocking_get = None - - # pylint: disable=too-many-instance-attributes - def __init__(self, name): - self.name = name - self.on_wiki = False - self.on_git = False - self.desc = "" - self.comment = "" - self.code = "" - self.url = "" - self.raw_code_url = "" - self.wiki = "" - self.version = "" - self.license = "" - self.date = "" - self.src_filename = "" - self.filename_from_url = "" - self.author = "" - self.icon = "" - self.icon_source = None - self.xpm = "" # Possible alternate icon data - self.other_files = [] - self.parsed = False - self._console = fci.Console - if Macro.blocking_get is None: - Macro.blocking_get = utils.blocking_get - - def __eq__(self, other): - return self.filename == other.filename - - @classmethod - def from_cache(cls, cache_dict: Dict): - """Use data from the cache dictionary to create a new macro, returning a - reference to it.""" - instance = Macro(cache_dict["name"]) - for key, value in cache_dict.items(): - instance.__dict__[key] = value - return instance - - def to_cache(self) -> Dict: - """For cache purposes all public members of the class are returned""" - cache_dict = {} - for key, value in self.__dict__.items(): - if key[0] != "_": - cache_dict[key] = value - return cache_dict - - @property - def filename(self): - """The filename of this macro""" - if self.on_git: - return os.path.basename(self.src_filename) - elif self.filename_from_url: - return self.filename_from_url - return (self.name + ".FCMacro").replace(" ", "_") - - def is_installed(self): - """Returns True if this macro is currently installed (that is, if it exists - in the user macro directory), or False if it is not. Both the exact filename - and the filename prefixed with "Macro", are considered an installation - of this macro. - """ - if self.on_git and not self.src_filename: - return False - return os.path.exists( - os.path.join(fci.DataPaths().macro_dir, self.filename) - ) or os.path.exists(os.path.join(fci.DataPaths().macro_dir, "Macro_" + self.filename)) - - def fill_details_from_file(self, filename: str) -> None: - """Opens the given Macro file and parses it for its metadata""" - with open(filename, errors="replace", encoding="utf-8") as f: - self.code = f.read() - self.fill_details_from_code(self.code) - - def fill_details_from_code(self, code: str) -> None: - """Read the passed-in code and parse it for known metadata elements""" - parser = MacroParser(self.name, code) - for key, value in parser.parse_results.items(): - if value: - self.__dict__[key] = value - self.clean_icon() - self.parsed = True - - def fill_details_from_wiki(self, url): - """For a given URL, download its data and attempt to get the macro's metadata - out of it. If the macro's code is hosted elsewhere, as specified by a - "rawcodeurl" found on the wiki page, that code is downloaded and used as the - source.""" - code = "" - p = Macro.blocking_get(url) - if not p: - self._console.PrintWarning( - translate( - "AddonsInstaller", - "Unable to open macro wiki page at {}", - ).format(url) - + "\n" - ) - return - p = p.decode("utf8") - # check if the macro page has its code hosted elsewhere, download if - # needed - if "rawcodeurl" in p: - code = self._fetch_raw_code(p) - if not code: - code = self._read_code_from_wiki(p) - if not code: - self._console.PrintWarning( - translate("AddonsInstaller", "Unable to fetch the code of this macro.") + "\n" - ) - return - - desc = re.findall( - r"(.*?)", - p.replace("\n", " "), - ) - if desc: - desc = desc[0] - else: - self._console.PrintWarning( - translate( - "AddonsInstaller", - "Unable to retrieve a description from the wiki for macro {}", - ).format(self.name) - + "\n" - ) - desc = "No description available" - self.desc = desc - self.comment, _, _ = desc.partition("", "", self.comment) # Strip any tags - self.url = url - if isinstance(code, list): - code = "".join(code) - self.code = code - self.fill_details_from_code(self.code) - if not self.icon and not self.xpm: - self.parse_wiki_page_for_icon(p) - self.clean_icon() - - if not self.author: - self.author = self.parse_desc("Author: ") - if not self.date: - self.date = self.parse_desc("Last modified: ") - - def _fetch_raw_code(self, page_data) -> Optional[str]: - """Fetch code from the raw code URL specified on the wiki page.""" - code = None - self.raw_code_url = re.findall(r'rawcodeurl.*?href="(http.*?)">', page_data) - if self.raw_code_url: - self.raw_code_url = self.raw_code_url[0] - u2 = Macro.blocking_get(self.raw_code_url) - if not u2: - self._console.PrintWarning( - translate( - "AddonsInstaller", - "Unable to open macro code URL {}", - ).format(self.raw_code_url) - + "\n" - ) - return None - code = u2.decode("utf8") - self._set_filename_from_url(self.raw_code_url) - return code - - def _set_filename_from_url(self, url: str): - lhs, slash, rhs = url.rpartition("/") - if rhs.endswith(".py") or rhs.lower().endswith(".fcmacro"): - self.filename_from_url = rhs - - @staticmethod - def _read_code_from_wiki(p: str) -> Optional[str]: - code = re.findall(r"
(.*?)
", p.replace("\n", "--endl--")) - if code: - # take the biggest code block - code = str(sorted(code, key=len)[-1]) - code = code.replace("--endl--", "\n") - # Clean HTML escape codes. - code = unescape(code) - code = code.replace(b"\xc2\xa0".decode("utf-8"), " ") - return code - - def clean_icon(self): - """Downloads the macro's icon from whatever source is specified and stores a local - copy, potentially updating the internal icon location to that local storage.""" - if self.icon.startswith("http://") or self.icon.startswith("https://"): - self._console.PrintLog(f"Attempting to fetch macro icon from {self.icon}\n") - parsed_url = urllib.parse.urlparse(self.icon) - p = Macro.blocking_get(self.icon) - if p: - cache_path = fci.DataPaths().cache_dir - am_path = os.path.join(cache_path, "AddonManager", "MacroIcons") - os.makedirs(am_path, exist_ok=True) - _, _, filename = parsed_url.path.rpartition("/") - base, _, extension = filename.rpartition(".") - if base.lower().startswith("file:"): - self._console.PrintMessage( - f"Cannot use specified icon for {self.name}, {self.icon} " - "is not a direct download link\n" - ) - self.icon = "" - else: - constructed_name = os.path.join(am_path, base + "." + extension) - with open(constructed_name, "wb") as f: - f.write(p) - self.icon_source = self.icon - self.icon = constructed_name - else: - self._console.PrintLog( - f"MACRO DEVELOPER WARNING: failed to download icon from {self.icon}" - f" for macro {self.name}\n" - ) - self.icon = "" - - def parse_desc(self, line_start: str) -> Union[str, None]: - """Get data from the wiki for the value specified by line_start.""" - components = self.desc.split(">") - for component in components: - if component.startswith(line_start): - end = component.find("<") - return component[len(line_start) : end] - return None - - def install(self, macro_dir: str) -> Tuple[bool, List[str]]: - """Install a macro and all its related files - Returns True if the macro was installed correctly. - Parameters - ---------- - - macro_dir: the directory to install into - """ - - if not self.code: - return False, ["No code"] - if not os.path.isdir(macro_dir): - try: - os.makedirs(macro_dir) - except OSError: - return False, [f"Failed to create {macro_dir}"] - macro_path = os.path.join(macro_dir, self.filename) - try: - with codecs.open(macro_path, "w", "utf-8") as macrofile: - macrofile.write(self.code) - except OSError: - return False, [f"Failed to write {macro_path}"] - # Copy related files, which are supposed to be given relative to - # self.src_filename. - warnings = [] - - self._copy_icon_data(macro_dir, warnings) - success = self._copy_other_files(macro_dir, warnings) - - if warnings or not success > 0: - return False, warnings - - self._console.PrintLog(f"Macro {self.name} was installed successfully.\n") - return True, [] - - def _copy_icon_data(self, macro_dir, warnings): - """Copy any available icon data into the install directory""" - base_dir = os.path.dirname(self.src_filename) - if self.xpm: - xpm_file = os.path.join(base_dir, self.name + "_icon.xpm") - with open(xpm_file, "w", encoding="utf-8") as f: - f.write(self.xpm) - if self.icon: - if os.path.isabs(self.icon): - dst_file = os.path.normpath(os.path.join(macro_dir, os.path.basename(self.icon))) - try: - shutil.copy(self.icon, dst_file) - except OSError: - warnings.append(f"Failed to copy icon to {dst_file}") - elif self.icon not in self.other_files: - self.other_files.append(self.icon) - - def _copy_other_files(self, macro_dir, warnings) -> bool: - """Copy any specified "other files" into the installation directory""" - base_dir = os.path.dirname(self.src_filename) - for other_file in self.other_files: - if not other_file: - continue - if os.path.isabs(other_file): - dst_dir = macro_dir - else: - dst_dir = os.path.join(macro_dir, os.path.dirname(other_file)) - if not os.path.isdir(dst_dir): - try: - os.makedirs(dst_dir) - except OSError: - warnings.append(f"Failed to create {dst_dir}") - return False - if os.path.isabs(other_file): - src_file = other_file - dst_file = os.path.normpath(os.path.join(macro_dir, os.path.basename(other_file))) - else: - src_file = os.path.normpath(os.path.join(base_dir, other_file)) - dst_file = os.path.normpath(os.path.join(macro_dir, other_file)) - self._fetch_single_file(other_file, src_file, dst_file, warnings) - try: - shutil.copy(src_file, dst_file) - except OSError: - warnings.append(f"Failed to copy {src_file} to {dst_file}") - return True # No fatal errors, but some files may have failed to copy - - def _fetch_single_file(self, other_file, src_file, dst_file, warnings): - if not os.path.isfile(src_file): - # If the file does not exist, see if we have a raw code URL to fetch from - if self.raw_code_url: - fetch_url = self.raw_code_url.rsplit("/", 1)[0] + "/" + other_file - self._console.PrintLog(f"Attempting to fetch {fetch_url}...\n") - p = Macro.blocking_get(fetch_url) - if p: - with open(dst_file, "wb") as f: - f.write(p) - else: - self._console.PrintWarning( - translate( - "AddonsInstaller", - "Unable to fetch macro-specified file {} from {}", - ).format(other_file, fetch_url) - + "\n" - ) - else: - warnings.append( - translate( - "AddonsInstaller", - "Could not locate macro-specified file {} (expected at {})", - ).format(other_file, src_file) - ) - - def parse_wiki_page_for_icon(self, page_data: str) -> None: - """Attempt to find the url for the icon in the wiki page. Sets 'self.icon' if - found.""" - - # Method 1: the text "toolbar icon" appears on the page, and provides a direct - # link to an icon - - # pylint: disable=line-too-long - # Try to get an icon from the wiki page itself: - # ToolBar Icon - icon_regex = re.compile(r'.*href="(.*?)">ToolBar Icon', re.IGNORECASE) - wiki_icon = "" - if "ToolBar Icon" in page_data: - f = io.StringIO(page_data) - lines = f.readlines() - for line in lines: - if ">ToolBar Icon<" in line: - match = icon_regex.match(line) - if match: - wiki_icon = match.group(1) - if "file:" not in wiki_icon.lower(): - self.icon = wiki_icon - return - break - - # See if we found an icon, but it wasn't a direct link: - icon_regex = re.compile(r'.*img.*?src="(.*?)"', re.IGNORECASE) - if wiki_icon.startswith("http"): - # It's a File: wiki link. We can load THAT page and get the image from it... - self._console.PrintLog(f"Found a File: link for macro {self.name} -- {wiki_icon}\n") - p = Macro.blocking_get(wiki_icon) - if p: - p = p.decode("utf8") - f = io.StringIO(p) - lines = f.readlines() - trigger = False - for line in lines: - if trigger: - match = icon_regex.match(line) - if match: - wiki_icon = match.group(1) - self.icon = "https://wiki.freecad.org/" + wiki_icon - return - elif "fullImageLink" in line: - trigger = True - - #